:root{--paper:#f8f7fb;--paper-card:#ffffff;--ink:#131418;--ink-soft:#54575f;--ink-faint:#9a9da5;--line:#e1e2e6;--accent:#131418;--accent-soft:#e4e5e8;--accent-wash:#f1f1f3;--on-accent:#ffffff;--code-bg:#16171c;--code-ink:#e7e9ee;--radius-lg:32px;--radius-md:20px;--radius-sm:12px;--shadow-sm:0 4px 12px #00000008;--shadow-md:0 8px 24px #0000000f;--shadow-hover:0 12px 28px #00000014;--font-main:'Hanken Grotesk',system-ui,-apple-system,sans-serif;--font-post:'Source Serif 4',Georgia,serif;--font-display:'Newsreader',Georgia,serif;--font-code:'JetBrains Mono',ui-monospace,monospace;--glass-bg:rgba(255,255,255,0.55);--glass-bg-scrolled:rgba(255,255,255,0.7);--glass-border:rgba(255,255,255,0.7);--glass-highlight:rgba(255,255,255,0.85);--glass-shadow:0 8px 32px rgba(18,19,22,0.12);--glass-shadow-hover:0 12px 40px rgba(18,19,22,0.16);--glass-shine:rgba(255,255,255,0.55)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--paper:#101114;--paper-card:#1a1b1f;--ink:#eceded;--ink-soft:#a3a6ad;--ink-faint:#8a8d96;--line:#2a2c31;--accent:#eceded;--accent-soft:#2a2c31;--accent-wash:#1d1f24;--on-accent:#131418;--code-bg:#0c0d10;--code-ink:#e7e9ee;--shadow-sm:0 4px 12px #00000020;--shadow-md:0 8px 24px #00000030;--shadow-hover:0 12px 28px #00000040;--glass-bg:rgba(26,27,31,0.55);--glass-bg-scrolled:rgba(26,27,31,0.72);--glass-border:rgba(255,255,255,0.1);--glass-highlight:rgba(255,255,255,0.16);--glass-shadow:0 8px 32px rgba(0,0,0,0.45);--glass-shadow-hover:0 12px 40px rgba(0,0,0,0.55);--glass-shine:rgba(255,255,255,0.14)}}:root[data-theme=dark]{--paper:#101114;--paper-card:#1a1b1f;--ink:#eceded;--ink-soft:#a3a6ad;--ink-faint:#8a8d96;--line:#2a2c31;--accent:#eceded;--accent-soft:#2a2c31;--accent-wash:#1d1f24;--on-accent:#131418;--code-bg:#0c0d10;--code-ink:#e7e9ee;--shadow-sm:0 4px 12px #00000020;--shadow-md:0 8px 24px #00000030;--shadow-hover:0 12px 28px #00000040}*{box-sizing:border-box}html{color-scheme:light dark;scrollbar-gutter:stable}body.v2{margin:0;background:var(--paper);color:var(--ink);font-family:var(--font-main);font-size:1.1rem;font-weight:450;line-height:1.55;text-rendering:optimizeLegibility}.v2 ::selection{background:var(--accent-soft)}.v2 a{color:inherit;text-decoration:none}.v2 img{max-width:100%;display:block}.v2-wrap{max-width:1180px;margin:0 auto;padding:0 24px;transition:transform .45s cubic-bezier(.4,0,.2,1),opacity .4s,filter .45s}body.portal-down{overflow:hidden}body.portal-down .v2-wrap{transform:translateY(70px) scale(.94);opacity:0;filter:blur(6px)}body.portal-down::before{content:"";position:fixed;inset:0;z-index:40;background:var(--ink);opacity:0;transition:opacity .45s;pointer-events:none}body.portal-down.portal-fade::before{opacity:.9}@media (prefers-reduced-motion:reduce){.v2-wrap{transition:opacity .2s}body.portal-down .v2-wrap{transform:none;filter:none}}.v2 .navbar{position:sticky;top:16px;z-index:50;display:flex;align-items:center;justify-content:space-between;width:min(1180px,100% - 48px);margin:16px auto 0;padding:17px 26px;gap:16px;border-radius:100px;transition:transform .25s cubic-bezier(.25,.8,.25,1)}.v2 .navbar::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;background:var(--paper-card);box-shadow:var(--glass-shadow);transition:box-shadow .3s ease,background .3s ease}@supports ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.v2 .navbar::before{background:var(--glass-bg);border:1px solid var(--glass-border);-webkit-backdrop-filter:blur(24px) saturate(180%);backdrop-filter:blur(24px) saturate(180%);box-shadow:inset 0 1px 0 var(--glass-highlight),inset 0 -1px 0 rgba(0,0,0,.04),var(--glass-shadow)}.v2 .navbar:hover::before{-webkit-backdrop-filter:blur(30px) saturate(200%);backdrop-filter:blur(30px) saturate(200%);box-shadow:inset 0 1px 0 var(--glass-highlight),inset 0 -1px 0 rgba(0,0,0,.04),var(--glass-shadow-hover)}.v2 .navbar.scrolled::before{background:var(--glass-bg-scrolled);-webkit-backdrop-filter:blur(72px) saturate(200%) contrast(1.1) brightness(1.03);backdrop-filter:blur(72px) saturate(200%) contrast(1.1) brightness(1.03);box-shadow:inset 0 1px 0 var(--glass-highlight),inset 0 -1px 0 rgba(0,0,0,.06),var(--glass-shadow-hover)}}.v2 .navbar::after{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;background:radial-gradient(180px circle at var(--glow-x,50%) var(--glow-y,0),var(--glass-shine),transparent 65%);opacity:0;transition:opacity .4s ease;pointer-events:none;mix-blend-mode:overlay}.v2 .navbar.glow-active::after{opacity:1}@media (prefers-reduced-motion:reduce){.v2 .navbar::after{display:none}}.v2 .navbar .logo{font-family:var(--font-display);font-weight:600;font-size:1.2rem}.v2 .navbar .logo span{color:var(--accent)}.v2 .nav-links{position:relative;display:flex;gap:4px;font-size:.95rem;font-weight:500}.v2 .nav-indicator{position:absolute;top:0;left:0;height:100%;width:0;border-radius:100px;z-index:0;pointer-events:none;opacity:0;background:var(--paper-card);box-shadow:0 1px 2px rgba(0,0,0,.06),0 3px 10px rgba(0,0,0,.08),inset 0 1px 0 var(--glass-highlight);transform:translateX(0);transition:transform .38s cubic-bezier(.22,1,.36,1),width .38s cubic-bezier(.22,1,.36,1),opacity .25s ease}.v2 .nav-indicator.positioned{opacity:1}@media (max-width:760px){.v2 .nav-indicator{display:none}}@media (prefers-reduced-motion:reduce){.v2 .nav-indicator{transition:opacity .2s ease}}.v2 .nav-links a{position:relative;z-index:1;color:var(--ink-soft);padding:7px 14px;border-radius:100px;transition:color .2s cubic-bezier(.25,.8,.25,1)}.v2 .nav-links a:hover{color:var(--accent)}.v2 .nav-links a.active{color:var(--accent);font-weight:700}.v2 .contact-link{border:1px solid var(--line);border-radius:100px;padding:8px 18px;font-size:.9rem;font-weight:600;transition:all .2s cubic-bezier(.25,.8,.25,1)}.v2 .contact-link:hover{border-color:var(--accent);color:var(--on-accent);background:var(--accent);transform:translateY(-1px);box-shadow:var(--shadow-hover)}.v2 .nav-toggle{display:none;background:0 0;border:none;cursor:pointer;padding:6px;color:var(--ink);-webkit-tap-highlight-color:transparent}.v2 .nav-toggle svg{display:block}.v2 .nav-close{display:none}@media (max-width:760px){.v2 .navbar{padding:12px 18px;gap:10px}.v2 .navbar .logo{font-size:1.1rem}.v2 .contact-link{padding:6px 13px;font-size:.78rem;white-space:nowrap;margin-left:auto}.v2 .nav-toggle{display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;margin-right:-6px}.v2 .nav-links{position:fixed;inset:0;top:0;z-index:60;background:var(--paper);flex-direction:column;justify-content:center;align-items:center;gap:26px;font-size:1.4rem;transform:translateX(100%);visibility:hidden;transition:transform .35s cubic-bezier(.25,.8,.25,1),visibility 0s linear .35s;overscroll-behavior:contain}.v2 .nav-links.open{transform:translateX(0);visibility:visible;transition:transform .35s cubic-bezier(.25,.8,.25,1),visibility 0s}.v2 .nav-close{display:none;position:fixed;top:20px;right:18px;z-index:61;width:48px;height:48px;padding:0;font-size:0;line-height:0;background:0 0;border:none;cursor:pointer;color:var(--ink);-webkit-tap-highlight-color:transparent}.v2 .nav-close::after,.v2 .nav-close::before{content:"";position:absolute;left:50%;top:50%;width:26px;height:2.6px;border-radius:2px;background:currentColor}.v2 .nav-close::before{transform:translate(-50%,-50%) rotate(45deg)}.v2 .nav-close::after{transform:translate(-50%,-50%) rotate(-45deg)}.v2 .nav-links.open+.nav-close,.v2 .nav-links.open~.nav-close{display:block}html.menu-open,html.menu-open body{overflow:hidden;overscroll-behavior:none}html.menu-open .reading-progress{display:none}}.v2 main.page-content{display:block;padding-bottom:56px;transition:opacity .22s ease,transform .22s ease}.v2 main.page-content.is-transitioning{opacity:0;transform:translateY(8px)}.v2 .page-header{padding:64px 0 28px;max-width:1180px;margin:0 auto}.v2 .eyebrow{font-family:var(--font-code);font-size:.8rem;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-faint);font-weight:600;display:block;margin-bottom:10px}.v2 h1.page-title{font-family:var(--font-display);font-weight:600;font-size:clamp(2.1rem,5vw,3.1rem);line-height:1.08;margin:0 0 12px;letter-spacing:-.01em}.v2 .page-sub{color:var(--ink-soft);max-width:60ch;margin:0;font-size:1.05rem}.v2 .page-header-row{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:flex-end;justify-content:space-between}.v2 .page-header-row .search-input{margin-left:0;flex:none}.v2 .bento{display:grid;gap:20px;max-width:1180px;margin:40px auto 20px;grid-template-columns:280px 1fr 320px;grid-template-areas:"latest hero intro" "older hero intro"}@media (max-width:980px){.v2 .bento{grid-template-columns:1fr;grid-template-areas:"intro" "hero" "latest" "older"}}.v2 .home-featured{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;max-width:1180px;margin:0 auto;grid-column:1/-1}@media (max-width:760px){.v2 .home-featured{grid-template-columns:1fr}}@media (max-width:980px){.v2 .cell-hero{height:420px}}.v2 .bento-cell{background:var(--paper-card);border:1px solid var(--line);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:22px}.v2 .cell-latest{grid-area:latest;display:flex;flex-direction:column;gap:16px}.v2 .cell-older{grid-area:older}.v2 .intro-stack{grid-area:intro;display:flex;flex-direction:column;gap:20px}.v2 .intro-stack .cell-intro{flex:0 0 auto}.v2 .intro-stack .cell-spotlight{flex:1;display:flex;flex-direction:column}.v2 .cell-hero{grid-area:hero;position:relative;border-radius:var(--radius-lg);overflow:hidden;min-height:420px;background:var(--paper-card);display:flex;align-items:flex-end;padding:0;container-type:size;--ar:1}.v2 .cell-hero .polaroid{--pw:min(72cqw, 340px, calc(80cqh / (0.2686 + 0.89 / var(--ar))));position:absolute;left:50%;top:50%;z-index:1;width:var(--pw);padding:calc(var(--pw) * .055) calc(var(--pw) * .055) 0;box-sizing:border-box;background:#fbfaf6;border-radius:4px;box-shadow:0 10px 28px #00000030,0 1px 3px #00000030;--tilt:-2deg;--tilt-from:-2deg;transform:translate(-50%,-50%) rotate(var(--tilt));transition:transform .35s cubic-bezier(.22,1,.36,1),box-shadow .35s;visibility:hidden;-webkit-tap-highlight-color:transparent}.v2 .cell-hero .polaroid::after{content:"";display:block;height:calc(var(--pw) * .2136)}.v2 .cell-hero .polaroid-photo{position:relative;aspect-ratio:var(--ar);background:#1b1b1b;overflow:hidden;border-radius:2px}.v2 .cell-hero .polaroid-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}.v2 .cell-hero.printed .polaroid,.v2 .cell-hero.printing .polaroid{visibility:visible}.v2 .cell-hero.printing .polaroid{animation:polaroid-feed 1s linear .3s backwards}.v2 .cell-hero.printing .polaroid-photo img{animation:polaroid-develop 1.2s ease-out .75s backwards}.v2 .cell-hero.no-camera.printing .polaroid{animation-delay:0s}.v2 .cell-hero.no-camera.printing .polaroid-photo img{animation-delay:.45s}.v2 .cell-hero.printed .polaroid{cursor:pointer}.v2 .cell-hero.printed .polaroid:focus-visible{outline:2px solid var(--accent);outline-offset:6px}@media (hover:hover) and (pointer:fine){.v2 .cell-hero.printed .polaroid:hover{transform:translate(-50%,-50%) rotate(0) scale(1.02);box-shadow:0 16px 36px #00000038,0 1px 3px #00000030}}.v2 .cell-hero .polaroid.fx-lift{animation:polaroid-lift .8s cubic-bezier(.3,.7,.3,1)}.v2 .cell-hero .polaroid.fx-shake{animation:polaroid-shake .75s ease-in-out}.v2 .cell-hero .polaroid.fx-flip{animation:polaroid-flip .95s cubic-bezier(.45,.05,.3,1)}.v2 .cell-hero .polaroid.fx-spin{animation:polaroid-spin 1s cubic-bezier(.4,.1,.2,1)}.v2 .cell-hero .polaroid.fx-swing{animation:polaroid-swing 1.3s ease-in-out}.v2 .cell-hero .polaroid.fx-drop{animation:polaroid-drop .9s cubic-bezier(.3,0,.5,1)}.v2 .cell-hero .polaroid.fx-pop{animation:polaroid-pop .7s cubic-bezier(.3,.7,.3,1)}.v2 .cell-hero .polaroid.fx-flipx{animation:polaroid-flipx 1s cubic-bezier(.45,.05,.3,1)}.v2 .cell-hero .polaroid.fx-pop .polaroid-photo img,.v2 .cell-hero .polaroid.fx-shake .polaroid-photo img{animation:polaroid-redevelop .9s ease-out}@keyframes polaroid-lift{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from)) scale(1)}30%{transform:translate(-50%,-53.5%) rotate(calc(var(--tilt) * -.5)) scale(1.045);box-shadow:0 18px 34px #00000038,0 2px 4px #00000030}60%{transform:translate(-50%,-49.6%) rotate(calc(var(--tilt) * 1.1)) scale(.99)}80%{transform:translate(-50%,-50.3%) rotate(calc(var(--tilt) * .95)) scale(1.006)}100%{transform:translate(-50%,-50%) rotate(var(--tilt)) scale(1)}}@keyframes polaroid-shake{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from))}12%{transform:translate(-52%,-50%) rotate(-7deg)}24%{transform:translate(-48%,-50.5%) rotate(6deg)}38%{transform:translate(-51.5%,-50%) rotate(-5deg)}52%{transform:translate(-48.5%,-50.4%) rotate(4deg)}68%{transform:translate(-50.8%,-50%) rotate(-2.5deg)}84%{transform:translate(-49.5%,-50.2%) rotate(1.5deg)}100%{transform:translate(-50%,-50%) rotate(var(--tilt))}}@keyframes polaroid-flip{0%{transform:translate(-50%,-50%) perspective(900px) rotateY(0) rotate(var(--tilt-from)) scale(1)}50%{transform:translate(-50%,-53%) perspective(900px) rotateY(180deg) rotate(0) scale(1.08);box-shadow:0 24px 44px #00000040,0 2px 4px #00000030}100%{transform:translate(-50%,-50%) perspective(900px) rotateY(360deg) rotate(var(--tilt)) scale(1)}}@keyframes polaroid-spin{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from)) scale(1)}50%{transform:translate(-50%,-52%) rotate(calc(var(--tilt-from) + 190deg)) scale(1.05)}100%{transform:translate(-50%,-50%) rotate(calc(var(--tilt) + 360deg)) scale(1)}}@keyframes polaroid-swing{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from));transform-origin:50% 0}20%{transform:translate(-50%,-50%) rotate(14deg)}40%{transform:translate(-50%,-50%) rotate(-11deg)}60%{transform:translate(-50%,-50%) rotate(7deg)}80%{transform:translate(-50%,-50%) rotate(-3deg)}100%{transform:translate(-50%,-50%) rotate(var(--tilt));transform-origin:50% 0}}@keyframes polaroid-drop{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from)) scale(1)}25%{transform:translate(-50%,-62%) rotate(var(--tilt-from)) scale(1.06)}55%{transform:translate(-50%,-46%) rotate(var(--tilt)) scale(1.02,.96)}72%{transform:translate(-50%,-53%) rotate(var(--tilt)) scale(1)}86%{transform:translate(-50%,-49%) rotate(var(--tilt)) scale(1.01,.99)}100%{transform:translate(-50%,-50%) rotate(var(--tilt)) scale(1)}}@keyframes polaroid-pop{0%{transform:translate(-50%,-50%) rotate(var(--tilt-from)) scale(1)}35%{transform:translate(-50%,-50%) rotate(var(--tilt-from)) scale(.92)}65%{transform:translate(-50%,-51%) rotate(var(--tilt)) scale(1.12);box-shadow:0 22px 40px #0000003d,0 2px 4px #00000030}100%{transform:translate(-50%,-50%) rotate(var(--tilt)) scale(1)}}@keyframes polaroid-flipx{0%{transform:translate(-50%,-50%) perspective(900px) rotateX(0) rotate(var(--tilt-from)) scale(1)}50%{transform:translate(-50%,-53%) perspective(900px) rotateX(180deg) rotate(0) scale(1.06);box-shadow:0 24px 44px #00000040,0 2px 4px #00000030}100%{transform:translate(-50%,-50%) perspective(900px) rotateX(360deg) rotate(var(--tilt)) scale(1)}}@keyframes polaroid-redevelop{0%{filter:none}20%{filter:brightness(1.45) saturate(.5) blur(1.5px)}55%{filter:brightness(.7) saturate(.6) sepia(.35) blur(1px)}100%{filter:none}}@keyframes polaroid-feed{0%{transform:translate(-50%,-220%) rotate(-2deg);animation-timing-function:cubic-bezier(.4,0,.6,1)}32%{transform:translate(-50%,-128%) rotate(-2deg)}42%{transform:translate(-50%,-128%) rotate(-2deg);animation-timing-function:cubic-bezier(.4,0,.6,1)}68%{transform:translate(-50%,-82%) rotate(-2deg)}76%{transform:translate(-50%,-82%) rotate(-2deg);animation-timing-function:cubic-bezier(.3,0,.2,1)}100%{transform:translate(-50%,-50%) rotate(-2deg)}}@keyframes polaroid-develop{0%{filter:brightness(0) saturate(0);opacity:0}25%{filter:brightness(.35) saturate(0) blur(6px);opacity:1}60%{filter:brightness(.8) saturate(.4) sepia(.5) blur(2px)}100%{filter:none;opacity:1}}.v2 .cell-hero .polaroid-camera{position:absolute;left:50%;top:50%;z-index:1;line-height:0;transform:translate(-50%,-50%);visibility:hidden;opacity:0}.v2 .cell-hero .polaroid-camera svg{display:block;filter:drop-shadow(0 8px 14px #00000026)}.v2 .cell-hero.printing .polaroid-camera,.v2 .cell-hero.waiting .polaroid-camera{visibility:visible}.v2 .cell-hero.waiting .polaroid-camera{animation:cam-in .28s cubic-bezier(.22,1,.36,1) both,cam-whirr .5s ease-in-out .3s infinite}.v2 .cell-hero.printing .polaroid-camera{animation:cam-out .4s cubic-bezier(.5,0,.9,.5) both}.v2 .cell-hero .cam-led{animation:cam-blink .55s steps(1,end) infinite}.v2 .cell-hero .cam-lens{transform-box:fill-box;transform-origin:center;animation:cam-pulse 1.1s ease-in-out infinite}.v2 .cell-hero .cam-sheet{animation:cam-sheet 1.6s ease-in-out infinite}.v2 .cell-hero::after{content:"";position:absolute;inset:0;z-index:3;background:#fff;opacity:0;pointer-events:none}.v2 .cell-hero.waiting::after{animation:cam-flash .5s ease-out .35s 1 both}@keyframes cam-in{from{opacity:0;transform:translate(-50%,-46%) scale(.88)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes cam-whirr{0%,100%{transform:translate(-50%,-50%) rotate(-.7deg)}50%{transform:translate(-50%,-50.6%) rotate(.7deg)}}@keyframes cam-out{from{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,-190%) scale(.96)}}@keyframes cam-blink{0%{fill:#e5484d}50%{fill:#5a1d20}}@keyframes cam-pulse{0%,100%{transform:scale(1)}50%{transform:scale(.9)}}@keyframes cam-sheet{0%,100%{transform:translateY(-6px)}50%{transform:translateY(0)}}@keyframes cam-flash{0%{opacity:0}15%{opacity:.85}100%{opacity:0}}.v2 .cell-hero::before{content:"";position:absolute;z-index:2;top:0;left:14%;right:14%;height:7px;background:#111;border-radius:0 0 8px 8px;opacity:0;transition:opacity .5s ease}.v2 .cell-hero.printing::before{opacity:.8}.v2 .cell-hero .hero-quote{position:relative;z-index:1;padding:28px;color:#fff;font-family:var(--font-main);font-style:italic;font-weight:500;font-size:1.2rem;line-height:1.4}.v2 .cell-hero .hero-credit{position:absolute;z-index:1;right:14px;bottom:14px;font-family:var(--font-code);font-size:.7rem;color:rgba(255,255,255,.9);background:rgba(0,0,0,.4);padding:5px 12px;border-radius:100px;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.v2 .cell-hero .hero-credit a{color:#fff;text-decoration:underline;text-underline-offset:2px}.v2 .cell-intro{display:flex;flex-direction:column;gap:14px}.v2 .cell-intro h1,.v2 .cell-intro h2{font-family:var(--font-main);font-size:2.15rem;font-weight:700;letter-spacing:-.02em;line-height:1.05;margin:0}.v2 .cell-intro .role{color:var(--ink-soft);font-size:.95rem}.v2 .cell-intro .role-now{display:inline;margin-top:0}.v2 .cell-intro .role b{color:var(--ink);font-weight:800}.v2 .role-em{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;text-decoration-color:var(--ink-faint);display:inline-block;transform-origin:left bottom;transition:text-decoration-color .35s ease,text-underline-offset .35s ease,transform .35s ease}.v2 .role-em:hover{transform:skewX(-6deg);text-decoration-color:var(--ink);text-underline-offset:4px}.v2 .cell-intro p{margin:0;font-size:.95rem;color:var(--ink-soft)}.v2 .projects-link{font-weight:600;color:var(--accent);font-size:.92rem}.v2 .social-row{display:flex;flex-wrap:wrap;gap:12px;margin-top:4px}.v2 .social-row a{width:36px;height:36px;border-radius:50%;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;transition:all .2s}.v2 .social-row a:hover{border-color:var(--accent);color:var(--accent)}.v2 .mini-card,.v2 .post-card{position:relative;padding:14px 0;border-top:1px solid var(--line)}.v2 .mini-card:first-child,.v2 .post-card:first-child{border-top:none;padding-top:0}.v2 .post-meta{font-family:var(--font-code);font-size:.75rem;color:var(--ink-faint);letter-spacing:.03em;margin-bottom:6px}.v2 .mini-card h3,.v2 .post-card h3{font-family:var(--font-display);font-size:1.05rem;font-weight:600;margin:0;padding-right:36px}.v2 .mini-card p{margin:6px 36px 0 0;font-size:.85rem;color:var(--ink-soft)}.v2 .post-arrow{position:absolute;right:0;top:14px;width:30px;height:30px;border-radius:50%;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.25,.8,.25,1)}.v2 .mini-card.arrow-play .post-arrow,.v2 .mini-card:hover .post-arrow,.v2 .post-card:hover .post-arrow{background:var(--accent);border-color:var(--accent);color:var(--on-accent);transform:rotate(45deg)}.v2 section.v2-section{max-width:1180px;margin:0 auto 80px}.v2 .grid-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:20px}.v2 .proj-card{background:var(--paper-card);border:1px solid var(--line);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-sm);transition:box-shadow .25s,transform .25s}.v2 .proj-card:hover{box-shadow:var(--shadow-hover);transform:translateY(-3px)}.v2 .proj-cover{background:var(--accent-wash);display:flex;align-items:center;justify-content:center;color:var(--ink-faint);font-family:var(--font-code);font-size:.8rem}.v2 .proj-cover img{display:block;width:100%;height:auto;max-height:280px;object-fit:cover;object-position:center}.v2 .proj-cover.proj-carousel{position:relative;overflow:hidden;display:block}.v2 .proj-carousel .proj-track{display:flex;width:100%;transition:transform .5s cubic-bezier(.4,0,.2,1)}.v2 .proj-cover.proj-carousel img.proj-slide{flex:0 0 100%;min-width:0;opacity:1}.v2 .proj-carousel .proj-dots{position:absolute;left:50%;bottom:8px;transform:translateX(-50%);display:flex;gap:1px;padding:2px 5px;border-radius:999px;background:rgba(0,0,0,.28);backdrop-filter:blur(4px)}.v2 .proj-carousel .proj-dot{display:block;width:12px;height:12px;position:relative;cursor:pointer}.v2 .proj-carousel .proj-dot::after{content:"";position:absolute;inset:3px;border-radius:50%;background:rgba(255,255,255,.55);transition:background .2s,transform .2s}.v2 .proj-carousel .proj-dot.active::after{background:#fff;transform:scale(1.15)}@media (prefers-reduced-motion:reduce){.v2 .proj-carousel .proj-track{transition:none}}.v2 .proj-cover:has(.proj-cover-note){position:relative}.v2 .proj-cover-note{position:absolute;top:10px;right:10px;z-index:2;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:help;background:rgba(0,0,0,.55);color:#fff;font:italic 600 .8rem/1 var(--font-display);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.v2 .proj-cover-tip{position:absolute;top:calc(100% + 6px);right:0;width:200px;padding:8px 10px;border-radius:8px;background:rgba(20,20,20,.92);color:#fff;font:400 .75rem/1.4 var(--font-main);font-style:normal;text-align:left;opacity:0;visibility:hidden;transform:translateY(-3px);transition:opacity .15s ease,transform .15s ease;pointer-events:none}.v2 .proj-cover-note:focus .proj-cover-tip,.v2 .proj-cover-note:hover .proj-cover-tip{opacity:1;visibility:visible;transform:none}.v2 .proj-cover img[data-unsplash-random]{aspect-ratio:16/9;height:auto;max-height:none;object-fit:cover}.v2 .proj-body{padding:22px 20px 26px}.v2 .proj-chip{display:inline-block;font-family:var(--font-code);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;background:var(--accent-wash);color:var(--accent);padding:3px 10px;border-radius:100px;margin-bottom:10px;font-weight:600}.v2 .proj-meta{margin-bottom:6px;font-family:var(--font-code);font-size:.78rem;color:var(--ink-faint)}.v2 .proj-card h2{font-family:var(--font-display);font-size:1.1rem;margin:0 0 6px}.v2 .proj-tech{margin:0 0 8px;color:var(--ink-faint);font-size:.82rem;font-style:italic}.v2 .proj-card p{margin:0;color:var(--ink-soft);font-size:.92rem}.v2 .proj-stats{display:flex;gap:14px;margin-bottom:10px;font-family:var(--font-code);font-size:.78rem;color:var(--ink-faint)}.v2 .gallery-stats{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:center;margin-bottom:24px;padding:10px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);font-family:var(--font-code);font-size:.85rem;color:var(--ink-soft)}.v2 .gallery-stats a{color:var(--accent);font-weight:600;margin-left:auto}.v2 .gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:4px}.v2 .gallery-item{aspect-ratio:1/1;border-radius:0;background:var(--accent-wash);overflow:hidden;cursor:pointer;transition:transform .35s,opacity .3s}.v2 .gallery-item:hover{transform:scale(1.035)}.v2 .gallery-item[hidden]{display:none}.v2 .gallery-item.gallery-ph{background:#e4e4e6;cursor:default}.v2 .gallery-item.gallery-ph:hover{transform:none}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .v2 .gallery-item.gallery-ph{background:#2a2a2d}}:root[data-theme=dark] .v2 .gallery-item.gallery-ph{background:#2a2a2d}.v2 .load-more{display:block;margin:32px auto 48px;padding:12px 28px;border-radius:100px;border:1px solid var(--line);background:var(--paper-card);font-weight:600;cursor:pointer;font-family:var(--font-main);font-size:.95rem;transition:all .2s}.v2 .load-more:hover{border-color:var(--accent);color:var(--accent)}.v2 .load-more[hidden]{display:none}.v2 .lightbox{position:fixed;inset:0;z-index:200;display:flex;opacity:0;transition:opacity .28s ease}.v2 .lightbox[hidden]{display:none}.v2 .lightbox.open{opacity:1}.v2 .lightbox-backdrop{position:absolute;inset:0;background:rgba(10,10,12,.82);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.v2 .lightbox-frame{position:relative;z-index:1;display:flex;width:100%;max-width:1400px;margin:auto;max-height:92vh;transform:scale(.94) translateY(12px);transition:transform .32s cubic-bezier(.22,1,.36,1)}.v2 .lightbox.open .lightbox-frame{transform:scale(1) translateY(0)}@media (prefers-reduced-motion:reduce){.v2 .lightbox,.v2 .lightbox-frame{transition:none}}.v2 .lightbox-media{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;padding:32px}.v2 .lightbox-media img{max-width:100%;max-height:88vh;object-fit:contain;border-radius:var(--radius-sm);box-shadow:0 20px 60px rgba(0,0,0,.5)}.v2 .lightbox-panel{width:300px;flex:none;background:var(--paper-card);color:var(--ink);padding:28px 24px;overflow-y:auto;border-radius:var(--radius-md);display:flex;flex-direction:column;gap:16px}.v2 .lightbox-panel h2{font-family:var(--font-display);font-size:1.2rem;margin:0}.v2 .lightbox-panel p{margin:0;color:var(--ink-soft);font-size:.9rem}.v2 .lightbox-panel p:empty{display:none}.v2 .lightbox-meta{margin:0;display:flex;flex-direction:column;gap:10px}.v2 .lightbox-meta>div{display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:.85rem}.v2 .lightbox-meta>div:not(:first-child){border-top:1px solid var(--line);padding-top:14px}.v2 .lightbox-meta dt{margin:0;color:var(--ink-faint);font-family:var(--font-code);font-size:.72rem;text-transform:uppercase;letter-spacing:.04em}.v2 .lightbox-meta dd{margin:0;font-weight:600}.v2 .lightbox-download{margin-top:auto;text-align:center;padding:12px;border-radius:100px;background:var(--accent);color:var(--on-accent);font-weight:600;transition:opacity .2s}.v2 .lightbox-download:hover{opacity:.85}.v2 .lightbox-close{position:absolute;top:16px;right:16px;z-index:2;width:36px;height:36px;border-radius:50%;background:rgba(0,0,0,.45);color:#fff;border:none;cursor:pointer;font-size:1rem;display:flex;align-items:center;justify-content:center}@media (max-width:760px){.v2 .lightbox{display:block;height:100vh;height:100dvh;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.v2 .lightbox-backdrop{position:fixed}.v2 .lightbox-frame{display:block;max-height:none;height:auto;margin:0;max-width:none}.v2 .lightbox.open .lightbox-frame{transform:none}.v2 .lightbox-media{position:relative;height:100vh;height:100dvh;flex:none;padding:56px 12px 44px}.v2 .lightbox-media img{width:100%;height:100%;max-width:100%;max-height:100%;object-fit:contain;box-shadow:none;border-radius:0;background:0 0}.v2 .lightbox-media::after{content:"Scroll for details ↓";position:absolute;left:0;right:0;bottom:14px;text-align:center;font-family:var(--font-code);font-size:.72rem;letter-spacing:.04em;color:rgba(255,255,255,.7);pointer-events:none}.v2 .lightbox-panel{width:100%;max-height:none;overflow:visible;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:24px 20px calc(28px + env(safe-area-inset-bottom));gap:14px;min-height:40vh}.v2 .lightbox-close{position:fixed;top:max(12px,env(safe-area-inset-top));right:12px}}.v2 .about-grid{display:grid;grid-template-columns:300px 1fr;gap:40px}@media (max-width:860px){.v2 .about-grid{grid-template-columns:minmax(0,1fr)}}.v2 .info-card{background:var(--paper-card);border:1px solid var(--line);border-radius:var(--radius-md);padding:24px;box-shadow:var(--shadow-sm)}.v2 .about-rail{min-width:0;align-self:start;position:sticky;top:24px;display:flex;flex-direction:column;gap:16px}@media (max-width:860px){.v2 .about-rail{position:static;top:auto}}@media (max-width:599px){.v2 .about-rail>aside.info-card{display:grid;grid-template-columns:110px 1px minmax(0,1fr);column-gap:16px;align-items:center}.v2 .about-rail>aside.info-card::before{content:"";grid-column:2;grid-row:1/3;align-self:stretch;background:var(--line)}.v2 .about-rail>aside.info-card .avatar{grid-column:1;grid-row:1/3;margin-bottom:0}.v2 .about-rail>aside.info-card h2{grid-column:3;grid-row:1;align-self:end;margin:0 0 4px}.v2 .about-rail>aside.info-card .role{grid-column:3;grid-row:2;align-self:start;margin-bottom:0}.v2 .about-rail>aside.info-card .info-row,.v2 .about-rail>aside.info-card .social-row{grid-column:1/-1}.v2 .about-rail>aside.info-card .role+.info-row{margin-top:18px;border-top:none}}.v2 .info-card .avatar{width:110px;height:110px;border-radius:50%;object-fit:cover;display:block;margin-bottom:16px}.v2 .info-card h2{font-family:var(--font-main);font-size:1.6rem;font-weight:700;letter-spacing:-.02em;margin:0 0 4px}.v2 .info-card .role{color:var(--ink-soft);font-size:.9rem;margin-bottom:18px}.v2 .info-row{display:flex;gap:10px;font-size:.88rem;padding:9px 0;border-top:1px solid var(--line);color:var(--ink-soft);align-items:flex-start}.v2 .location-stack{display:flex;flex-direction:column;gap:3px}.v2 .info-row:first-of-type{border-top:none}.v2 .info-row b{color:var(--ink);font-weight:600}.v2 .role-list{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:8px}.v2 .role-list li{position:relative;padding-left:14px;font-size:.95rem;color:var(--ink-soft)}.v2 .role-list li::before{content:"–";position:absolute;left:0;color:var(--ink-faint)}.v2 .role-list .role-title{color:var(--ink);font-weight:600}.v2 .role-list a{color:var(--accent);font-weight:600;text-decoration:underline;text-underline-offset:2px;text-decoration-color:var(--line);transition:text-decoration-color .2s}.v2 .role-list a:hover{text-decoration-color:var(--accent)}.v2 .chip-list{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 26px}.v2 .skill-chip{display:inline-block;border:1px solid var(--line);border-radius:100px;padding:6px 14px;font-size:.85rem;background:var(--paper-card);transition:transform .18s cubic-bezier(.22,1,.36,1),border-color .18s ease,color .18s ease,box-shadow .18s ease}.v2 .skill-chip:hover{transform:translateY(-2px);border-color:var(--accent);color:var(--accent);box-shadow:var(--shadow-sm)}@media (prefers-reduced-motion:reduce){.v2 .skill-chip{transition:border-color .18s ease,color .18s ease}.v2 .skill-chip:hover{transform:none}}.v2 .timeline{list-style:none;padding:0;margin:0 0 30px;position:relative}.v2 .timeline::before{content:"";position:absolute;left:5px;top:6px;bottom:6px;width:1px;background:var(--line)}.v2 .timeline>li{position:relative;padding:0 0 0 28px;margin-bottom:22px;border-radius:var(--radius-sm);transition:box-shadow .2s ease,background-color .2s ease}.v2 .timeline>li:last-child{margin-bottom:0}@media (hover:hover){.v2 .timeline>li:hover{background:var(--accent-wash);box-shadow:0 0 0 9px var(--accent-wash),0 0 0 10px var(--line)}}.v2 .timeline>li::before{content:"";position:absolute;left:0;top:4px;width:11px;height:11px;border-radius:50%;border:1px solid var(--ink-faint);background:var(--paper-card);box-sizing:border-box}.v2 .timeline>li::after{content:"";position:absolute;left:3px;top:7px;width:5px;height:5px;border-radius:50%;background:var(--ink-faint)}.v2 .timeline .t-date{font-family:var(--font-code);font-size:.75rem;color:var(--ink-faint);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px}.v2 .timeline h4{font-family:var(--font-display);font-size:1.02rem;margin:0 0 6px}.v2 .timeline p{margin:0;color:var(--ink-soft);font-size:.92rem}.v2 .award{display:inline-flex;align-items:center;gap:4px;margin:0 0 0 8px;vertical-align:2px;padding:1px 8px 1px 6px;border-radius:100px;font-family:var(--font-code);font-size:.62rem;font-weight:600;letter-spacing:.03em;line-height:1.6;text-transform:uppercase;color:var(--award-ink);background:var(--award-bg);border:1px solid var(--award-edge)}.v2 .award::before{font-size:.75rem;line-height:1}.v2 .award.gold::before{content:"🥇"}.v2 .award.silver::before{content:"🥈"}.v2 .award.bronze::before{content:"🥉"}.v2 .award.gold{--award-bg:#fbf0c8;--award-edge:#e0b93a;--award-dot:#e8b923;--award-ink:#6b4f00}.v2 .award.silver{--award-bg:#eceef2;--award-edge:#aeb4bf;--award-dot:#b9bfca;--award-ink:#464c57}.v2 .award.bronze{--award-bg:#f6e2d1;--award-edge:#c98a57;--award-dot:#cd7f46;--award-ink:#6b3a14}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .v2 .award.gold{--award-bg:#3a2f0c;--award-ink:#f2d172}:root:not([data-theme=light]) .v2 .award.silver{--award-bg:#2c2f36;--award-ink:#d3d7de}:root:not([data-theme=light]) .v2 .award.bronze{--award-bg:#38241a;--award-ink:#e6b48c}}:root[data-theme=dark] .v2 .award.gold{--award-bg:#3a2f0c;--award-ink:#f2d172}:root[data-theme=dark] .v2 .award.silver{--award-bg:#2c2f36;--award-ink:#d3d7de}:root[data-theme=dark] .v2 .award.bronze{--award-bg:#38241a;--award-ink:#e6b48c}.v2 .timeline li ul{list-style:disc;margin:6px 0 0;padding:0 0 0 18px}.v2 .timeline li ul li{padding:0;color:var(--ink-soft);font-size:.92rem;margin-bottom:2px}.v2 .filter-bar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:32px}.v2 .pill-group{display:flex;flex-wrap:wrap;gap:10px}.v2 .pill{border:1px solid var(--line);border-radius:100px;padding:8px 16px;font-size:.85rem;font-weight:600;background:var(--paper-card);cursor:pointer;transition:all .2s;color:var(--ink-soft)}.v2 .pill.active,.v2 .pill:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-wash)}.v2 .search-input{margin-left:auto;border:1px solid var(--line);border-radius:100px;padding:8px 16px;font-family:var(--font-main);font-size:.9rem;background:var(--paper-card);color:var(--ink);min-width:220px}.v2 .blog-row{display:flex;gap:18px;align-items:center;padding:20px 14px;margin:0 -14px;border-top:1px solid var(--line);border-radius:var(--radius-sm);transition:background .2s,transform .2s}.v2 .blog-row:first-of-type{border-top:none}.v2 .empty-state{padding:48px 16px;text-align:center;color:var(--ink-faint)}.v2 .blog-row:hover{background:var(--accent-wash);transform:translateX(4px)}.v2 .blog-row:hover h2{color:var(--accent)}.v2 .blog-thumb{position:relative;width:120px;height:88px;flex:none;border-radius:var(--radius-sm);background:var(--accent-wash);display:flex;align-items:center;justify-content:center;color:var(--ink-faint);font-family:var(--font-code);font-size:.72rem;overflow:hidden;transition:transform .25s}.v2 .blog-row:hover .blog-thumb img{transform:scale(1.06)}.v2 .blog-thumb img{transition:transform .25s}.v2 .blog-thumb .thumb-slide{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:var(--radius-sm);opacity:0;transition:opacity .8s ease,transform .25s}.v2 .blog-thumb .thumb-slide.active.loaded{opacity:1}@media (prefers-reduced-motion:reduce){.v2 .blog-thumb .thumb-slide{transition:transform .25s}}.v2 .blog-row .b-body{flex:1;min-width:0}.v2 .blog-row .b-date{font-family:var(--font-code);font-size:.75rem;color:var(--ink-faint);margin-bottom:4px}.v2 .blog-row h2{font-family:var(--font-display);font-size:1.08rem;margin:0 0 4px;transition:color .2s}.v2 .blog-row p{margin:0;color:var(--ink-soft);font-size:.9rem}.v2 .b-tag{font-family:var(--font-code);font-size:.72rem;text-transform:uppercase;color:var(--accent);background:var(--accent-wash);padding:4px 10px;border-radius:100px;flex:none;font-weight:600}@media (max-width:760px){.v2 .blog-row{flex-wrap:wrap;align-items:flex-start}.v2 .blog-thumb{width:100%;height:auto;aspect-ratio:16/9}.v2 .search-input{margin-left:0;width:100%}}.v2 .reading-progress{position:fixed;top:0;left:0;height:3px;background:var(--accent);z-index:100;width:0%}.v2 .post-wrap{max-width:820px;margin:0 auto;padding-top:56px}.v2 .back-link{font-family:var(--font-code);font-size:.85rem;color:var(--ink-soft);display:inline-block;margin-bottom:22px}.v2 .back-link:hover{color:var(--accent)}.v2 article.markdown-body{font-family:var(--font-post);font-size:1.12rem;line-height:1.75}.v2 article.markdown-body h1{font-family:var(--font-display);font-size:2rem}.v2 article.markdown-body h2{font-family:var(--font-display);font-size:1.4rem;margin-top:40px}.v2 article.markdown-body p{margin:0 0 20px}.v2 article.markdown-body pre{background:var(--code-bg);color:var(--code-ink);padding:18px;border-radius:var(--radius-sm);overflow-x:auto;font-family:var(--font-code);font-size:.88rem}.v2 article.markdown-body code{font-family:var(--font-code);background:var(--accent-wash);padding:.1em .4em;border-radius:5px}.v2 article.markdown-body a{color:var(--accent);text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line);transition:text-decoration-color .2s,background .2s;border-radius:3px}.v2 article.markdown-body a:hover{text-decoration-color:var(--accent);background:var(--accent-wash)}.v2 article.markdown-body img{width:100%;border-radius:var(--radius-md);display:block;margin:8px 0}.v2 article.markdown-body u{text-decoration-thickness:1.5px;text-underline-offset:2px}.v2 article.markdown-body del{color:var(--ink-faint)}.v2 article.markdown-body blockquote{margin:0 0 20px;padding:2px 0 2px 18px;border-left:3px solid var(--line);color:var(--ink-soft)}.v2 article.markdown-body blockquote p:last-child{margin-bottom:0}.v2 article.markdown-body .callout{margin:0 0 20px;padding:16px 18px;border-radius:var(--radius-md);border:1px solid var(--line);background:var(--accent-wash)}.v2 article.markdown-body .callout p:last-child{margin-bottom:0}.v2 article.markdown-body .callout-label{font-family:var(--font-code);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;font-weight:700;color:var(--accent);margin-bottom:6px}.v2 article.markdown-body .callout-warning{background:color-mix(in srgb,#e0a030 14%,var(--paper-card))}.v2 article.markdown-body .callout-warning .callout-label{color:#a06a10}.v2 .post-embed{position:relative;width:100%;aspect-ratio:16/9;margin:24px 0;border-radius:var(--radius-md);overflow:hidden}.v2 .post-embed iframe{position:absolute;inset:0;width:100%;height:100%;border:0}.v2 .post-embed-linkedin{aspect-ratio:auto;width:100%;max-width:504px;margin:24px auto;padding:1px;border:1px solid var(--line);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);background:var(--paper-card)}.v2 .post-embed-linkedin iframe{position:static;width:100%;height:700px;border-radius:calc(var(--radius-md) - 1px)}.v2 .post-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin:28px 0}.v2 .photo-nudge{display:inline-flex;align-items:center;gap:7px;margin:0 0 22px;padding:7px 14px;border:1px solid var(--line);border-radius:100px;background:var(--accent-wash);color:var(--ink-soft);font-family:var(--font-code);font-size:.8rem;font-weight:600;cursor:pointer;transition:all .2s}.v2 .photo-nudge:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px);box-shadow:var(--shadow-sm)}.v2 .photo-nudge svg{flex:none}.v2 .post-gallery img{width:100%;height:220px;object-fit:cover;border-radius:var(--radius-sm);margin:0;cursor:zoom-in;transition:transform .25s}.v2 .post-gallery img:hover{transform:scale(1.03)}.v2 .license-block{margin-top:50px;padding:16px 20px;background:var(--accent-wash);border:1px solid var(--line);border-radius:var(--radius-sm);font-size:.85rem;color:var(--ink-soft)}.v2 .related{margin-top:44px}.v2 .related h3{font-family:var(--font-display);font-size:1.15rem;margin-bottom:14px}.v2 footer.v2-footer{border-top:1px solid var(--line);padding:44px 24px 60px;max-width:1180px;margin:0 auto;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;align-items:center;color:var(--ink-faint);font-size:.85rem;font-family:var(--font-code)}.v2 footer.v2-footer a{color:var(--ink-soft)}.v2 footer.v2-footer a:hover{color:var(--accent)}.v2[data-page=projects] .v2-section{margin-bottom:120px}.v2 .footer-links{display:flex;gap:20px}.v2 .footer-ai-note{flex-basis:100%;text-align:center;font-size:.68rem;opacity:.6;margin-top:6px}.v2 .footer-ai-note a{color:inherit}.v2 .fill-me{outline:1.5px dashed var(--accent);outline-offset:3px;border-radius:4px}.v2 .visitors-card{--v-color:#1b9a55;padding-bottom:0}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .v2 .visitors-card{--v-color:#3ddc84}}:root[data-theme=dark] .v2 .visitors-card{--v-color:#3ddc84}.v2 .github-card{--g-color:#1b9a55}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .v2 .github-card{--g-color:#3ddc84}}:root[data-theme=dark] .v2 .github-card{--g-color:#3ddc84}.v2 .github-card h3{padding-right:0}.v2 .github-card .post-meta{margin:3px 0 0}.v2 .github-card{position:relative}.v2 .github-card .g-stat{position:absolute;right:24px;top:24px;text-align:right;line-height:1}.v2 .github-card .g-total{font-family:var(--font-display);font-size:1.7rem;font-weight:600;letter-spacing:-.02em}.v2 .github-card .g-stat small{display:block;margin-top:3px;font-family:var(--font-code);font-size:.68rem;color:var(--ink-faint)}.v2 .g-map{margin-top:12px;aspect-ratio:307/95}.v2 .g-map svg{display:block;width:100%;height:auto}.v2 .g-cell{fill:var(--g-color)}.v2 .github-card:not(.ready):not(.failed) .g-map{background:var(--line);opacity:.4;border-radius:4px}.v2 .github-card.failed{display:none}.v2 .visitors-card h3{padding-right:0}.v2 .visitors-card .post-meta{margin:3px 0 0}.v2 .visitors-card .v-stat{position:absolute;right:0;top:14px;text-align:right;line-height:1}.v2 .visitors-card .v-today{font-family:var(--font-display);font-size:1.7rem;font-weight:600;letter-spacing:-.02em}.v2 .visitors-card .v-stat small{display:block;margin-top:3px;font-family:var(--font-code);font-size:.68rem;color:var(--ink-faint)}.v2 .v-online{display:flex;align-items:center;gap:12px;margin-top:6px;height:1.3rem;font-size:.78rem;line-height:1.3rem;color:var(--ink-soft);opacity:0;transition:opacity .3s}.v2 .v-online.on{opacity:1}.v2 .v-online i{width:8px;height:8px;border-radius:50%;background:var(--v-color);box-shadow:0 0 0 0 var(--v-color);animation:v-live 2s ease-out infinite}@keyframes v-live{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--v-color) 55%,transparent)}100%{box-shadow:0 0 0 8px transparent}}.v2 .v-chart{position:relative;margin-top:12px;border-radius:14px;overflow:hidden;background-image:radial-gradient(color-mix(in srgb,var(--v-color) 22%,transparent) 1px,transparent 1.2px);background-size:14px 14px;aspect-ratio:300/112;touch-action:pan-y}.v2 .v-chart svg{display:block;width:100%;height:auto}.v2 .v-base{stroke:var(--line);stroke-width:1}.v2 .v-stop{stop-color:var(--v-color)}.v2 .v-line{fill:none;stroke:var(--v-color);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1;animation:v-draw 1.1s .1s ease-out forwards}.v2 .v-dot{fill:var(--paper-card);stroke:var(--v-color);stroke-width:2;transition:r .15s}.v2 .v-dot-now{fill:var(--v-color)}.v2 .v-dot.on{fill:var(--v-color);r:4.5}.v2 .v-cross{stroke:var(--v-color);stroke-width:1;stroke-dasharray:2 3;opacity:0}.v2 .v-cross.on{opacity:.6}.v2 .v-axis{font-family:var(--font-code);font-size:8px;fill:var(--ink-faint)}.v2 .v-tip{position:absolute;pointer-events:none;padding:5px 9px;border-radius:8px;white-space:nowrap;background:var(--ink);color:var(--paper-card);font-size:.72rem;line-height:1.3;box-shadow:var(--shadow-md)}.v2 .v-tip b{font-weight:700}.v2 .v-tip span{display:block;opacity:.7;font-size:.66rem}.v2 .v-table{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.v2 .visitors-card:not(.ready):not(.failed) .v-chart{animation:v-pulse 1.4s ease-in-out infinite}.v2 .visitors-card.failed .v-chart::after{content:"Visitor data unavailable right now.";display:block;padding:34px 14px;text-align:center;font-size:.75rem;color:var(--ink-faint)}@keyframes v-draw{to{stroke-dashoffset:0}}@keyframes v-pulse{50%{opacity:.6}}@media (prefers-reduced-motion:reduce){.v2 .v-line{animation:none;stroke-dashoffset:0}.v2 .v-online i{animation:none}.v2 .visitors-card:not(.ready):not(.failed) .v-chart{animation:none}}.v2 .info-card.github-card h3{font-family:var(--font-display);font-size:1.05rem;font-weight:600;letter-spacing:0;margin:0;padding:0}.v2 .info-card.github-card .post-meta{font-family:var(--font-code);font-size:.75rem;letter-spacing:.03em;color:var(--ink-faint);margin:3px 0 0}.v2 .info-card.github-card .g-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.v2 .info-card.github-card .g-stat{position:static;text-align:right}.v2 .info-card.github-card .g-total{font-family:var(--font-display);font-size:1.7rem;font-weight:600;letter-spacing:-.02em;line-height:1}.v2 .info-card.github-card .g-stat small{font-family:var(--font-code);font-size:.68rem;color:var(--ink-faint);margin-top:3px}.v2 .info-card.github-card .g-map{margin-top:16px}.v2 .info-card.github-card .g-map{aspect-ratio:auto;min-height:115px;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;cursor:grab;scrollbar-width:none}.v2 .info-card.github-card .g-map::-webkit-scrollbar{display:none}.v2 .info-card.github-card .g-map.dragging{cursor:grabbing;user-select:none}.v2 .info-card.github-card .g-map svg{display:block;width:auto;max-width:none;height:auto}.v2 .g-month{font-family:var(--font-code);font-size:10px;fill:var(--ink-faint)}.v2 .info-card.sleep-card{--g-color:#6d4fd6;position:relative}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .v2 .info-card.sleep-card{--g-color:#a78bfa}}:root[data-theme=dark] .v2 .info-card.sleep-card{--g-color:#a78bfa}.v2 .info-card.sleep-card h3{font-family:var(--font-display);font-size:1.05rem;font-weight:600;letter-spacing:0;margin:0;padding:0}.v2 .info-card.sleep-card .post-meta{font-family:var(--font-code);font-size:.75rem;letter-spacing:.03em;color:var(--ink-faint);margin:3px 0 0}.v2 .info-card.sleep-card .g-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.v2 .info-card.sleep-card .g-stat{text-align:right}.v2 .info-card.sleep-card .g-total{font-family:var(--font-display);font-size:1.7rem;font-weight:600;letter-spacing:-.02em;line-height:1}.v2 .info-card.sleep-card .g-stat small{display:block;font-family:var(--font-code);font-size:.68rem;color:var(--ink-faint);margin-top:3px}.v2 .s-chart{margin-top:16px;aspect-ratio:252/120}.v2 .s-chart svg{display:block;width:100%;height:auto}.v2 .s-bar{fill:var(--g-color)}.v2 .s-goal{stroke:var(--line);stroke-dasharray:3 4}.v2 .s-day{font-family:var(--font-code);font-size:10px;fill:var(--ink-faint)}.v2 .s-val{font-family:var(--font-code);font-size:10px;fill:var(--ink-soft)}.v2 .sleep-card:not(.ready):not(.failed) .s-chart{background:var(--line);opacity:.4;border-radius:4px}.v2 .sleep-card.failed{display:none}.v2 .info-card.github-card .g-map{max-width:100%}@media (max-width:860px){.v2 .about-grid{row-gap:16px}.v2 .about-rail{display:contents}.v2 .about-rail>aside{order:0}.v2 .about-rail>.github-card{order:1}.v2 .about-grid>.about-content{order:2;margin-top:0}.v2 .about-rail>.sleep-card{order:3;margin-top:0;margin-bottom:40px}}@media (min-width:861px){.v2 .about-grid{padding-bottom:40px}}.v2 .info-card .avatar{opacity:0;transition:opacity .35s ease}.v2 .info-card .avatar.loaded{opacity:1}@media (prefers-reduced-motion:reduce){.v2 .info-card .avatar{transition:none}}.v2 .gallery-item img,.v2 .post-gallery img,.v2 .proj-cover img{opacity:0;transition:opacity .35s ease}.v2 .gallery-item img.loaded,.v2 .post-gallery img.loaded,.v2 .proj-cover img.loaded{opacity:1}@media (prefers-reduced-motion:reduce){.v2 .gallery-item img,.v2 .post-gallery img,.v2 .proj-cover img{transition:none}}.v2 .tl-toggle{display:none}@media (max-width:860px){.v2 .about-content h3:has(> .tl-toggle){display:flex;align-items:center;gap:8px}.v2 .tl-toggle{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;padding:0;border:1px solid var(--line);border-radius:50%;background:var(--paper-card);color:var(--ink-soft);cursor:pointer;transition:transform .3s ease,border-color .2s ease,color .2s ease}.v2 .tl-toggle[aria-expanded=true]{transform:rotate(90deg);color:var(--accent);border-color:var(--accent)}.v2 .timeline.tl-collapsible{overflow:hidden;transition:height .35s cubic-bezier(.22,1,.36,1)}}@media (prefers-reduced-motion:reduce){.v2 .timeline.tl-collapsible,.v2 .tl-toggle{transition:none}}.v2 .s-source{display:flex;align-items:center;gap:6px;margin-top:10px;font-family:var(--font-code);font-size:.68rem;letter-spacing:.02em;color:var(--ink-faint)}.v2 .s-source .health-ico{flex:none;display:block;width:16px;height:16px;border-radius:4px;box-shadow:0 0 0 1px var(--line)}.v2 .tl-more{display:none}@media (max-width:860px){.v2 .about-content h3:has(> .tl-toggle){cursor:pointer;-webkit-tap-highlight-color:transparent}.v2 .tl-more{display:inline-block;margin-left:auto;padding:3px 10px;border-radius:100px;background:var(--accent-wash);color:var(--accent);font-family:var(--font-code);font-size:.72rem;font-weight:600;letter-spacing:.02em;line-height:1.4;transition:opacity .25s ease,transform .25s ease}.v2 .tl-more.hidden{opacity:0;transform:scale(.9);pointer-events:none}}.v2 .chip-list.chip-collapsible{box-sizing:border-box;position:relative;overflow:hidden;overflow-anchor:none;transition:height .4s cubic-bezier(.22,1,.36,1);padding:3px;margin:7px -3px 23px}.v2 .chip-more{font:inherit;font-size:.85rem;font-weight:600;color:var(--accent);background:var(--accent-wash);border-color:transparent;cursor:pointer}.v2 .chip-list.chip-open .chip-more{display:none}.v2 .chip-extra{opacity:0;transform:translateY(8px);pointer-events:none;transition:opacity .35s ease .08s,transform .35s ease .08s,border-color .18s ease,color .18s ease,box-shadow .18s ease}.v2 .chip-list.chip-open .chip-extra{opacity:1;transform:none;pointer-events:auto}@media (prefers-reduced-motion:reduce){.v2 .chip-extra,.v2 .chip-list.chip-collapsible{transition:none}}.v2 .s-chart{max-width:340px;margin-left:auto;margin-right:auto}@media (min-width:600px) and (max-width:860px){.v2 .about-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:16px}.v2 .about-rail>aside{grid-column:1;grid-row:1/span 2;order:0}.v2 .about-rail>.github-card{grid-column:2;grid-row:1;order:0}.v2 .about-rail>.sleep-card{grid-column:2;grid-row:2;order:0;margin-bottom:0}.v2 .about-grid>.about-content{grid-column:1/-1;grid-row:3;order:0;margin-top:0}}@media (min-width:700px) and (max-width:980px){.v2 .bento{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:none;align-items:stretch}.v2 .home-featured,.v2 .intro-stack{display:contents}.v2 .intro-stack .cell-intro{grid-column:1/-1;grid-row:1}.v2 .intro-stack .cell-spotlight{grid-column:1/-1;grid-row:2;flex:none}.v2 .cell-hero{grid-area:auto;grid-column:1;grid-row:3/span 2;height:auto;aspect-ratio:auto;min-height:380px}.v2 .cell-latest{grid-area:auto;grid-column:1;grid-row:5/span 2}.v2 .cell-older{grid-area:auto;grid-column:2;grid-row:3}.v2 .home-featured>.bento-cell:first-child{grid-column:2;grid-row:4}.v2 .home-featured>.bento-cell:nth-child(2){grid-column:2;grid-row:5}.v2 .home-featured>.bento-cell:nth-child(3){grid-column:2;grid-row:6}}@media (max-width:380px){.v2 .about-rail>aside.info-card{grid-template-columns:80px 1px minmax(0,1fr);column-gap:12px;padding:18px}.v2 .info-card .avatar{width:80px;height:80px}.v2 .info-card h2{font-size:1.3rem}.v2 .info-card{padding:18px}}.v2 .grid-cards{grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr))}@media (min-width:600px) and (max-width:860px){.v2 .grid-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.v2 .bento,.v2 .home-featured{gap:16px}.v2 .post-gallery{gap:16px}}@media (min-width:600px) and (max-width:760px){.v2 .blog-row{flex-wrap:nowrap;align-items:center}.v2 .blog-thumb{width:140px;height:100px;aspect-ratio:auto}}@media (max-width:480px){.v2 .cell-hero{height:360px}}@media (max-width:380px){.v2 .navbar{padding:10px 12px;gap:6px}.v2 .navbar .logo{font-size:1rem}.v2 .contact-link{padding:5px 10px;font-size:.72rem}.v2 footer.v2-footer{padding:32px 16px 44px;justify-content:center;text-align:center}.v2 .footer-links{flex-wrap:wrap;justify-content:center;gap:12px 16px}}@media (max-width:860px){.v2 .page-header{padding:40px 0 16px}.v2 h1.page-title{margin-bottom:0}}