.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2)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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-wght-normal.DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-ext-wght-normal.DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-wght-normal.CkhJZR-_.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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-vietnamese-wght-normal.CBcvBZtf.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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-ext-wght-normal.DO1Apj_S.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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-wght-normal.Dx4kXJAl.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:Grape Nuts;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/grape-nuts-vietnamese-400-normal.B75LrBfV.woff2)format("woff2"),url(/_astro/grape-nuts-vietnamese-400-normal.BA-pxHRP.woff)format("woff");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:Grape Nuts;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/grape-nuts-latin-ext-400-normal.lZ2OBIzh.woff2)format("woff2"),url(/_astro/grape-nuts-latin-ext-400-normal.CItS5gE_.woff)format("woff");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:Grape Nuts;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/grape-nuts-latin-400-normal.B8_WUMbs.woff2)format("woff2"),url(/_astro/grape-nuts-latin-400-normal.nwHSSyND.woff)format("woff");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{--bg:#fafafa;--fg:#111;--muted:#737373;--link-dot:#b3b3b3;--code-bg:#f4f4f4;--pile-bg:#eef1f4;--pile-border:oklab(25.3758% -.00603297 -.02727/.1);--pile-shine:oklab(100% 0 5.96046e-8/.7);--font:"Inter Variable", Inter, "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", system-ui, sans-serif;--font-mono:"SF Mono", ui-monospace, Menlo, Consolas, monospace;--measure:640px;--page:32px}[data-theme=dark]{--bg:#111110;--fg:#ededec;--muted:#a3a29e;--link-dot:#5c5c59;--code-bg:#1c1c1a;--pile-bg:#1a1b1d;--pile-border:oklab(100% 0 5.96046e-8/.1);--pile-shine:oklab(100% 0 5.96046e-8/.06)}*{box-sizing:border-box}html{color-scheme:light dark;background:var(--bg);scrollbar-gutter:stable}html,body{background:var(--bg);min-height:100%;color:var(--fg);margin:0}body{font-family:var(--font);-webkit-font-smoothing:antialiased;font-size:15px;font-weight:400;line-height:1.7}a{color:inherit;text-decoration:none}img{max-width:100%;height:auto}code,pre{font-family:var(--font-mono);font-size:13px}:not(pre)>code{background:var(--code-bg);border-radius:4px;padding:.1em .35em}pre{background:var(--code-bg);border-radius:10px;padding:16px 18px;line-height:1.6;overflow:auto}pre .astro-code{background:0 0!important}.wrap{width:min(var(--measure), calc(100% - var(--page) * 2));margin:0 auto}main.wrap{padding-bottom:120px}.site-header{padding:56px 0 48px}.avatar-link{line-height:0;display:inline-block}.avatar-frame{border-radius:50%;width:56px;height:56px;display:block;position:relative;overflow:hidden}.avatar{object-fit:cover;background:#eee;border-radius:50%;width:56px;height:56px;display:block}.avatar-eye{pointer-events:none;background:#1a0508;border-radius:50%;width:15.5%;height:15.5%;position:absolute;top:47.4%;left:40.4%;overflow:hidden;transform:translate(-50%,-50%);box-shadow:inset 0 0 0 .5px #00000059}.avatar-sharingan{will-change:transform;place-items:center;display:grid;position:absolute;inset:10%}.avatar-sharingan svg{width:100%;height:100%;display:block}.avatar-lid{z-index:2;transform-origin:50% 15%;pointer-events:none;background:#2a0a10;border-radius:50%;position:absolute;inset:0;transform:scaleY(0)}.avatar-eye.is-blink .avatar-lid{animation:.16s ease-in-out avatar-blink}.avatar-eye.is-blink-double .avatar-lid{animation:.42s ease-in-out avatar-blink-double}@keyframes avatar-blink{0%,to{transform:scaleY(0)}40%,58%{transform:scaleY(1)}}@keyframes avatar-blink-double{0%,to{transform:scaleY(0)}18%,28%{transform:scaleY(1)}40%{transform:scaleY(0)}58%,72%{transform:scaleY(1)}}.site-dock{z-index:60;left:50%;bottom:max(20px, env(safe-area-inset-bottom,0px));pointer-events:none;will-change:transform;position:fixed;transform:translate(-50%)}.site-dock-nav{pointer-events:auto;border:1px solid color-mix(in oklab, var(--fg) 8%, transparent);background:color-mix(in oklab, var(--bg) 86%, #fff);box-shadow:0 12px 32px color-mix(in oklab, var(--fg) 10%, transparent), 0 1px 2px color-mix(in oklab, var(--fg) 6%, transparent);-webkit-backdrop-filter:blur(16px)saturate(1.2);border-radius:999px;align-items:center;gap:8px;padding:8px;display:flex}[data-theme=dark] .site-dock-nav{background:color-mix(in oklab, var(--bg) 78%, #2a2a28)}.site-dock-group{align-items:center;gap:2px;display:flex}.site-dock-group--aside{border-left:1px solid color-mix(in oklab, var(--fg) 10%, transparent);padding-left:8px}.site-dock-item{width:42px;height:42px;color:color-mix(in oklab, var(--fg) 62%, transparent);cursor:pointer;appearance:none;background:0 0;border:0;border-radius:999px;justify-content:center;align-items:center;transition:color .15s,background .15s,transform .15s;display:inline-flex;position:relative}.site-dock-item svg{display:block}.site-dock-dot{background:var(--fg);opacity:0;border-radius:50%;width:4px;height:4px;transition:opacity .15s,transform .15s;position:absolute;bottom:5px;left:50%;transform:translate(-50%)scale(.6)}.site-dock-item:hover,.site-dock-item:focus-visible{color:var(--fg);background:color-mix(in oklab, var(--fg) 6%, transparent);outline:none}.site-dock-item.is-current,.site-dock-item[aria-current=page]{color:var(--fg);background:color-mix(in oklab, var(--fg) 8%, transparent)}.site-dock-item.is-current .site-dock-dot,.site-dock-item[aria-current=page] .site-dock-dot{opacity:1;transform:translate(-50%)scale(1)}.site-dock-item:after{content:attr(data-tooltip);z-index:2;color:#fff;letter-spacing:.01em;white-space:nowrap;opacity:0;pointer-events:none;background:#111;border-radius:8px;padding:6px 10px;font-size:12px;font-weight:500;line-height:1.2;transition:opacity .14s,transform .14s;position:absolute;bottom:calc(100% + 14px);left:50%;transform:translate(-50%,4px)}.site-dock-item:before{content:"";z-index:2;opacity:0;pointer-events:none;border:5px solid #0000;border-top-color:#111;transition:opacity .14s,transform .14s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%,4px)}@media (hover:hover) and (pointer:fine){.site-dock-item:hover:after,.site-dock-item:hover:before,.site-dock-item:focus-visible:after,.site-dock-item:focus-visible:before{opacity:1;transform:translate(-50%)}}.theme-toggle{appearance:none;font:inherit}.hero h1,.page-title{color:var(--fg);margin:0 0 20px;font-size:16px;font-weight:600;line-height:1.4}.hero p{color:var(--muted);margin:0 0 18px}.hero-role-trigger,.hero-hop-trigger,.hero-wave-trigger,.hero-shutter-trigger,.hero-drive-trigger{white-space:nowrap;touch-action:manipulation;cursor:default;align-items:baseline;display:inline-flex}.hero-role{color:var(--fg);font-weight:600;transition:color .2s}.hero-hop-units{align-items:baseline;display:inline-flex}.hero-hop-unit{color:inherit;font-weight:inherit;transform-origin:bottom;display:inline-block}.hero-wave{color:inherit;font-weight:inherit;display:inline-block;position:relative}.hero-wave:after{content:"";pointer-events:none;opacity:0;background-color:color-mix(in oklch, var(--fg) 35%, #4aa8ff);height:.42em;transition:opacity .2s;position:absolute;bottom:-.08em;left:0;right:0;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 12' preserveAspectRatio='none'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' d='M0 7c5-6 10-6 15 0s10 6 15 0 10-6 10 0'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 12' preserveAspectRatio='none'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' d='M0 7c5-6 10-6 15 0s10 6 15 0 10-6 10 0'/%3E%3C/svg%3E");-webkit-mask-position:0;mask-position:0;-webkit-mask-size:1.15em 100%;mask-size:1.15em 100%;-webkit-mask-repeat:repeat-x;mask-repeat:repeat-x}.hero-shutter{color:inherit;font-weight:inherit;display:inline-block;position:relative}.hero-shutter:before,.hero-shutter:after{content:"";pointer-events:none;opacity:0;z-index:1;position:absolute;left:-.1em;right:-.1em}.hero-shutter:before{background:color-mix(in oklab, var(--fg) 82%, #000);transform-origin:top;top:-.06em;bottom:50%;transform:scaleY(0)}.hero-shutter:after{background:color-mix(in oklab, var(--fg) 82%, #000);transform-origin:bottom;top:50%;bottom:-.06em;transform:scaleY(0)}.hero-shutter-trigger.is-shutter .hero-shutter{animation:4.2s cubic-bezier(.4,0,.2,1) infinite hero-shutter-flash}.hero-shutter-trigger.is-shutter .hero-shutter:before,.hero-shutter-trigger.is-shutter .hero-shutter:after{animation:4.2s cubic-bezier(.4,0,.2,1) infinite hero-shutter-blade}.hero-drive{color:inherit;font-weight:inherit;display:inline-block;position:relative;overflow:visible}.hero-drive-text{transform-origin:50%;will-change:transform;transition:transform .18s;display:inline-block;transform:translateZ(0)}.hero-drive-line{width:var(--lw,1em);height:var(--lh,2px);pointer-events:none;opacity:0;background:linear-gradient(90deg, color-mix(in oklab, var(--fg) 55%, transparent), color-mix(in oklab, var(--muted) 45%, transparent) 55%, transparent);clip-path:polygon(0 15%,100% 45%,100% 55%,0 85%);transform:translate(80%, calc(-50% + var(--ly,0px)));position:absolute;top:50%;left:50%}.hero-drive-trigger.is-drive .hero-drive-text{transform:skew(-7deg)translateZ(0)}.hero-drive-trigger.is-drive .hero-drive-line{opacity:1;animation:hero-drive-wind var(--speed,.22s) linear infinite;animation-delay:var(--delay,0s)}@keyframes hero-drive-wind{0%{opacity:0;transform:translate(95%, calc(-50% + var(--ly,0px))) scaleX(.55)}12%{opacity:1}to{opacity:0;transform:translate(-160%, calc(-50% + var(--ly,0px))) scaleX(1.35)}}@media (hover:hover) and (pointer:fine){.hero-role-trigger:hover .hero-role{color:#0000;background-image:linear-gradient(100deg, color-mix(in oklch, var(--fg) 28%, #ff5c5c), color-mix(in oklch, var(--fg) 28%, #f6b73c), color-mix(in oklch, var(--fg) 28%, #44c77a), color-mix(in oklch, var(--fg) 28%, #4aa8ff), color-mix(in oklch, var(--fg) 28%, #b56cff), color-mix(in oklch, var(--fg) 28%, #ff5c5c));-webkit-text-fill-color:transparent;background-size:220% 100%;-webkit-background-clip:text;background-clip:text;animation:2.8s linear infinite hero-role-flow}.hero-hop-trigger:hover .hero-hop-unit{animation:1s cubic-bezier(.34,1.56,.64,1) hero-hop}.hero-hop-trigger:hover .hero-hop-unit:nth-child(2){animation-delay:80ms}.hero-hop-trigger:hover .hero-hop-unit:nth-child(3){animation-delay:.16s}.hero-wave-trigger:hover .hero-wave:after{opacity:1;animation:.85s linear infinite hero-wave-scroll}}.hero-role-trigger.is-tap .hero-role{color:#0000;background-image:linear-gradient(100deg, color-mix(in oklch, var(--fg) 28%, #ff5c5c), color-mix(in oklch, var(--fg) 28%, #f6b73c), color-mix(in oklch, var(--fg) 28%, #44c77a), color-mix(in oklch, var(--fg) 28%, #4aa8ff), color-mix(in oklch, var(--fg) 28%, #b56cff), color-mix(in oklch, var(--fg) 28%, #ff5c5c));-webkit-text-fill-color:transparent;background-size:220% 100%;-webkit-background-clip:text;background-clip:text;animation:2.8s linear infinite hero-role-flow}.hero-hop-trigger.is-tap .hero-hop-unit{animation:1s cubic-bezier(.34,1.56,.64,1) hero-hop}.hero-hop-trigger.is-tap .hero-hop-unit:nth-child(2){animation-delay:80ms}.hero-hop-trigger.is-tap .hero-hop-unit:nth-child(3){animation-delay:.16s}.hero-wave-trigger.is-tap .hero-wave:after{opacity:1;animation:.85s linear infinite hero-wave-scroll}@keyframes hero-role-flow{to{background-position:220% 0}}@keyframes hero-hop{0%{transform:translateY(0)scale(1)}28%{transform:translateY(-5px)scale(1.03)}to{transform:translateY(0)scale(1)}}@keyframes hero-wave-scroll{to{-webkit-mask-position:-1.15em;mask-position:-1.15em}}@keyframes hero-shutter-blade{0%,14%,to{opacity:0;transform:scaleY(0)}4%,9%{opacity:1;transform:scaleY(1)}}@keyframes hero-shutter-flash{0%,8%,14%,to{filter:brightness()}11%{filter:brightness(1.28)}}.hero p a,.inline-link{color:var(--fg);text-underline-offset:4px;text-decoration:underline 1px dotted;text-decoration-color:var(--link-dot)}.hero p a:hover,.inline-link:hover{text-decoration-color:var(--fg)}.socials{flex-wrap:wrap;gap:18px 22px;margin:28px 0 0;padding:0;list-style:none;display:flex}.socials a{color:var(--fg);text-underline-offset:4px;text-decoration:underline 1px dotted;text-decoration-color:var(--link-dot)}.socials a:hover{text-decoration-color:var(--fg)}.section-title{color:var(--muted);margin:80px 0 28px;font-size:15px;font-weight:500}.post-list,.contrib-list,.project-list{margin:0;padding:0;list-style:none}.post-list li{justify-content:space-between;align-items:baseline;gap:24px;padding:10px 0;display:flex}.post-list a.post-title,.contrib-list a{width:fit-content;max-width:100%;color:var(--fg)}.post-list a.post-title:hover,.contrib-list a:hover .contrib-repo{text-underline-offset:4px;text-decoration:underline dotted}.post-title,.contrib-repo{min-width:0}.contrib-list li{flex-direction:column;align-items:flex-start;gap:4px;padding:10px 0;display:flex}.contrib-repo{align-items:center;gap:5px;display:inline-flex}.contrib-ext{width:.72em;height:.72em;color:color-mix(in oklab, var(--fg) 55%, transparent);flex:none;transition:color .18s,transform .18s}.contrib-list a:hover .contrib-ext{color:var(--fg);transform:translate(1px,-1px)}.post-list time{color:var(--muted);font-variant-numeric:tabular-nums;text-align:right;flex:none}.contrib-note{color:var(--muted);font-size:13px;line-height:1.45}.see-all{color:var(--muted);margin-top:20px;display:inline-flex}.see-all:hover{color:var(--fg)}.project-list{flex-direction:column;gap:64px;display:flex}.project-card{color:var(--fg)}.project-cover{width:100%;height:max(120px, calc(min(100vw - 2 * var(--page), var(--measure)) * 10 / 16 - 100px));background:var(--cover,#e8e8e6);color:color-mix(in oklab, var(--fg) 45%, transparent);letter-spacing:.04em;border-radius:12px;place-items:center;margin-bottom:16px;font-size:28px;font-weight:600;display:grid;overflow:hidden}.project-cover--image{width:100%;height:max(120px, calc(min(100vw - 2 * var(--page), var(--measure)) * 10 / 16 - 100px));object-fit:cover;object-position:center;color:#0000;background:#e8e8e6;font-size:0;display:block}.project-card .project-name{align-items:center;gap:5px;width:fit-content;max-width:100%;margin-bottom:6px;font-size:15px;font-weight:600;display:inline-flex}a.project-name:hover{text-underline-offset:4px;text-decoration:underline dotted}.project-ext{width:.72em;height:.72em;color:color-mix(in oklab, var(--fg) 55%, transparent);flex:none;transition:color .18s,transform .18s}a.project-name:hover .project-ext{color:var(--fg);transform:translate(1px,-1px)}.project-card .desc{color:var(--muted);line-height:1.65;display:block}.tech-pile-scene{border:1px solid var(--pile-border);background:linear-gradient(180deg, var(--pile-shine), transparent 28%), var(--pile-bg);width:min(650px,100%);height:300px;box-shadow:inset 0 1px 0 oklab(100% 0 5.96046e-8/.55), inset 0 -18px 36px color-mix(in oklab, var(--fg) 4%, transparent), 0 10px 28px color-mix(in oklab, var(--fg) 6%, transparent);touch-action:pan-y;cursor:default;user-select:none;border-radius:14px;margin:56px auto 0;position:relative;overflow:hidden}.tech-pile-slogan{z-index:0;pointer-events:none;letter-spacing:.03em;text-align:center;width:max-content;max-width:calc(100% - 48px);color:color-mix(in oklab, var(--fg) 42%, transparent);margin:0;font-family:Grape Nuts,cursive;font-size:clamp(1.9rem,4.5vw,2.6rem);font-weight:400;line-height:1.1;position:absolute;top:50%;left:50%;translate:-50% calc(-50% - 28px);rotate:-8deg}.tech-pile-slogan svg{opacity:.55;width:auto;height:auto;position:absolute;bottom:-.7rem;left:-.2rem;right:-.2rem;rotate:3deg}.tech-pile-layer{z-index:1;position:absolute;inset:0}.tech-pile-scene.is-static .tech-pile-layer{display:contents;position:relative;inset:auto}.tech-pile-scene.is-dragging,.tech-pile-scene.is-dragging .tech-pile-icon{cursor:grabbing;touch-action:none}.tech-pile-icon{z-index:1;border:1px solid color-mix(in oklab, var(--fg) 6%, transparent);width:44px;height:44px;box-shadow:0 1px 0 oklab(100% 0 5.96046e-8/.8), 0 8px 18px color-mix(in oklab, var(--fg) 10%, transparent);cursor:grab;appearance:none;will-change:transform;touch-action:pan-y;background:#fff;border-radius:14px;margin:0;padding:8px;position:absolute;top:0;left:0}[data-theme=dark] .tech-pile-icon{background:#2a2a28;border-color:oklab(100% 0 5.96046e-8/.08)}.tech-pile-icon img{object-fit:contain;pointer-events:none;width:100%;height:100%;display:block}.tech-pile-scene.is-static{cursor:default;flex-wrap:wrap;place-content:flex-end center;gap:10px;padding:24px 12px 12px;display:flex}.tech-pile-scene.is-static .tech-pile-icon{position:relative;transform:none!important}.site-footer{height:24px}.prose{color:var(--muted)}.prose h1{letter-spacing:-.02em;color:var(--fg);margin:8px 0 12px;font-size:22px;font-weight:600;line-height:1.35}.prose h2,.prose h3{color:var(--fg);margin:36px 0 12px;font-size:16px;font-weight:600}.prose p{margin:0 0 18px}.prose a{color:var(--fg);text-underline-offset:4px;text-decoration:underline 1px dotted;text-decoration-color:var(--link-dot)}.meta{color:var(--muted);margin:0 0 36px}.photo-peek{vertical-align:-7px;cursor:zoom-in;background:0 0;border:0;width:52px;height:30px;margin:0 8px 0 10px;padding:0;transition:opacity .28s;display:inline-block;position:relative;overflow:visible}.photo-peek.is-hidden{opacity:0;pointer-events:none;transition:none}.polaroid{background:#fff;box-shadow:0 6px 16px #00000029}.polaroid img{object-fit:contain;width:100%;height:auto;display:block}.polaroid-peek{--i:0;width:28px;height:24px;transform:rotate(calc(var(--i) * 9deg - 9deg)) translateX(calc(var(--i) * 16px - 16px));border-radius:1px;margin-left:-14px;padding:2px 2px 5px;transition:transform .3s cubic-bezier(.34,1.56,.64,1);position:absolute;top:2px;left:50%;overflow:hidden}.polaroid-peek.is-portrait{width:20px;height:28px;margin-left:-10px;padding:2px 2px 4px}.polaroid-peek img{object-fit:cover;width:100%;height:100%}@media (hover:hover) and (pointer:fine){.photo-peek:hover:not(.is-busy) .polaroid-peek{transform:rotate(calc(var(--i) * 15deg - 15deg)) translateX(calc(var(--i) * 24px - 24px)) translateY(calc((1 - var(--i)) * (1 - var(--i)) * 2px - 3px))}}.photo-modal{--ox:0px;--oy:0px;--os:.12;z-index:80;flex-direction:column;justify-content:center;align-items:center;gap:28px;padding:24px;display:flex;position:fixed;inset:0}.photo-modal-backdrop{z-index:-1;background:color-mix(in oklab, var(--bg) 55%, transparent);-webkit-backdrop-filter:blur(14px);opacity:0;transition:opacity .4s;position:absolute;inset:0}.photo-modal.is-open .photo-modal-backdrop{opacity:1}.photo-modal.is-leaving .photo-modal-backdrop{opacity:0;transition:opacity .32s}.photo-modal-stack{width:min(320px,82vw);height:min(520px,74vh);transform:translate3d(var(--ox), var(--oy), 0) scale(var(--os));transform-origin:50%;opacity:1;will-change:transform;transition:transform .42s cubic-bezier(.22,1,.36,1);position:relative}.photo-modal.is-open .photo-modal-stack{transform:none}.photo-modal.is-leaving .photo-modal-stack{transform:translate3d(var(--ox), var(--oy), 0) scale(var(--os));opacity:0;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .22s .14s}.polaroid-modal{--ar:4 / 3;appearance:none;cursor:grab;touch-action:none;user-select:none;will-change:transform;border:0;width:min(280px,72vw);height:fit-content;max-height:min(68vh,500px);margin:auto;padding:10px 10px 14px;position:absolute;inset:0}.polaroid-modal.is-portrait{width:min(210px,56vw)}.polaroid-modal.is-drag{cursor:grabbing;transition:none}.polaroid-modal.is-snap{transition:transform .35s cubic-bezier(.2,.8,.2,1)}.polaroid-modal.is-fly{pointer-events:none;opacity:0;transition:transform .32s cubic-bezier(.4,0,1,1),opacity .22s}.polaroid-modal.is-incoming{opacity:0;pointer-events:none;transition:none}.polaroid-modal.is-settle{pointer-events:none;transition:transform .5s cubic-bezier(.22,1,.36,1),opacity .4s}.polaroid-modal img{width:100%;height:auto;max-height:min(58vh,420px);aspect-ratio:var(--ar);object-fit:contain;pointer-events:none;background:oklab(0% none none/.04)}.polaroid-modal.is-portrait img{max-height:min(62vh,460px)}.polaroid-modal span{color:#222;opacity:0;padding:12px 4px 4px;font-family:Segoe Script,Snell Roundhand,KaiTi,STKaiti,cursive;font-size:15px;transition:opacity .18s,transform .18s;display:block;transform:translateY(6px)}.photo-modal.is-open .polaroid-modal span{opacity:1;transition:opacity .32s .18s,transform .32s .18s;transform:none}.photo-close{appearance:none;background:color-mix(in oklab, var(--fg) 8%, var(--bg));color:var(--fg);font:inherit;cursor:pointer;opacity:0;border:0;border-radius:999px;padding:8px 18px;font-size:14px;transition:opacity .18s,transform .18s,background .2s;transform:translateY(10px)}.photo-close:hover{background:color-mix(in oklab, var(--fg) 14%, var(--bg))}.photo-modal.is-open .photo-close{opacity:1;transition:opacity .32s .16s,transform .32s cubic-bezier(.22,1,.36,1) .16s,background .2s;transform:none}.photo-modal.is-leaving .polaroid-modal span,.photo-modal.is-leaving .photo-close{opacity:0;transition:opacity .12s;transform:none}@media (prefers-reduced-motion:reduce){.photo-peek,.polaroid-peek,.photo-modal-backdrop,.photo-modal-stack,.polaroid-modal.is-snap,.polaroid-modal.is-fly,.polaroid-modal.is-settle,.polaroid-modal span,.photo-close{transition:none}.hero-role-trigger:hover .hero-role,.hero-role-trigger.is-tap .hero-role,.hero-hop-trigger:hover .hero-hop-unit,.hero-hop-trigger.is-tap .hero-hop-unit,.hero-wave-trigger:hover .hero-wave:after,.hero-wave-trigger.is-tap .hero-wave:after,.hero-shutter-trigger.is-shutter .hero-shutter,.hero-shutter-trigger.is-shutter .hero-shutter:before,.hero-shutter-trigger.is-shutter .hero-shutter:after,.hero-drive-trigger.is-drive .hero-drive-line{animation:none}.hero-drive-text{transition:none}.hero-drive-trigger.is-drive .hero-drive-text{transform:none}.hero-role-trigger:hover .hero-role,.hero-role-trigger.is-tap .hero-role{color:var(--fg);-webkit-text-fill-color:currentColor;background:0 0}.hero-wave-trigger:hover .hero-wave:after,.hero-wave-trigger.is-tap .hero-wave:after{opacity:1}.avatar-eye.is-blink .avatar-lid,.avatar-eye.is-blink-double .avatar-lid{animation:none}}@media (width<=640px){.site-header{padding:36px 0}main.wrap{padding-bottom:108px}.site-dock{bottom:max(14px, env(safe-area-inset-bottom,0px))}.section-title{margin:56px 0 24px}.project-list{gap:48px}.post-list li,.contrib-list li{padding:12px 0}.post-list li{flex-direction:column;align-items:flex-start;gap:4px}}
