.hero[data-astro-cid-bbe6dxrz]{position:relative;width:100%;min-height:100svh;margin-top:-7rem;padding-top:7rem;overflow:clip;display:flex;align-items:center;justify-content:center}.hero-layer[data-astro-cid-bbe6dxrz]{position:absolute;inset:-12% 0;display:flex;align-items:center;justify-content:center}.hero-back[data-astro-cid-bbe6dxrz]{background:radial-gradient(58% 50% at 50% 42%,var(--accent-soft),transparent 70%)}.hero-ghost[data-astro-cid-bbe6dxrz]{font-family:var(--font-serif);font-weight:400;font-size:clamp(10rem,34vw,28rem);line-height:1;letter-spacing:-.04em;color:var(--ink);opacity:.05;white-space:nowrap}.hero-mid[data-astro-cid-bbe6dxrz]{flex-direction:column;text-align:center;padding:0 24px}.hero-headline[data-astro-cid-bbe6dxrz]{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.6rem,7vw,5rem);line-height:1.02;letter-spacing:-.02em}.hero-sub[data-astro-cid-bbe6dxrz]{color:var(--ink-dim);font-size:clamp(1rem,1.4vw,1.25rem);max-width:480px;margin:18px auto 0;line-height:1.5}.hero-front[data-astro-cid-bbe6dxrz]{inset:-12% 0 0;align-items:flex-end;padding-bottom:11vh}.hero-pills[data-astro-cid-bbe6dxrz]{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0}.hero-pill[data-astro-cid-bbe6dxrz]{font-family:var(--font-mono);font-size:.82rem;color:var(--ink);padding:10px 18px;border-radius:999px;background:var(--glass-bg);border:1px solid var(--glass-brd);box-shadow:0 6px 20px #1a1a1c12}@media(max-width:641px){.hero-ghost[data-astro-cid-bbe6dxrz]{font-size:38vw}}.section-title[data-astro-cid-v2cbyr3p]{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.75rem,1.5vw + 1.25rem,2.5rem);line-height:1.15;letter-spacing:-.01em;margin-bottom:22px}.about-body[data-astro-cid-v2cbyr3p]{font-size:1rem;line-height:1.7;color:var(--ink-dim);max-width:64ch}.bento-section[data-astro-cid-f44o672t]{--gap: 18px;width:100%}.bento-card{--morph-dur: .52s;--ease-snappy: cubic-bezier(.77, 0, .175, 1)}.bento-grid[data-astro-cid-f44o672t]{display:flex;flex-direction:column;gap:var(--gap)}.bento-card{width:100%;aspect-ratio:4 / 1}@media(max-width:540px){.bento-card{aspect-ratio:1 / 1}}.bento-card{position:relative;background:var(--paper);border:0;border-radius:32px;box-shadow:0 1px 3px #0000000a,0 1px 2px #0000000a,inset 0 -1px #00000005;overflow:hidden;transition:box-shadow .24s var(--ease, cubic-bezier(.22, 1, .36, 1));cursor:pointer;outline:none}.bento-card:focus,.bento-card:focus-visible{outline:none}.bento-card:hover{box-shadow:0 6px 24px #0000000f,0 2px 6px #0000000a}.project-card .cover{position:absolute;inset:0;border-radius:inherit}.bento-card .card-body{position:relative;z-index:1;padding:28px;height:100%;display:flex;flex-direction:column;justify-content:flex-start;gap:12px;text-align:left}.bento-card .card-eyebrow{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-dim);opacity:0;transition:opacity .32s ease}.bento-card.is-expanded .card-eyebrow{opacity:1;transition-delay:calc(var(--morph-dur) * .65)}.bento-card .card-title{font-family:var(--font-serif);font-weight:400;font-size:24px;line-height:1.15;letter-spacing:-.01em;color:var(--ink);width:fit-content;max-width:100%;align-self:flex-start;transform:translateY(var(--title-rest-y, 0))}.bento-card.is-expanding .card-title{transition:transform var(--morph-dur) var(--ease-snappy)}.bento-card.is-expanded .card-title{transform:translate(var(--title-center-x, 0))}.bento-card .card-title em{font-style:italic;color:var(--accent)}.bento-card.pretext-title .card-title{position:relative;width:100%}.bento-card.pretext-title .card-title .word{position:absolute;top:0;left:0;display:inline-block;white-space:nowrap;font-family:var(--font-serif);font-size:inherit;font-weight:400;line-height:1.15;letter-spacing:-.01em;color:var(--ink);transform-origin:top left;will-change:transform}.bento-card.pretext-title .card-title em.word{font-style:italic;color:var(--accent)}.bento-card.is-expanding.pretext-title .card-title .word{transition:transform var(--morph-dur) var(--ease-snappy)}.bento-card.pretext-title.is-expanded .card-title{transform:translateY(0)}@media(prefers-reduced-motion:reduce){.bento-card.is-expanding.pretext-title .card-title .word{transition:none}}.bento-card .bento-card-body{display:none}.cs-expand{position:absolute;top:16px;right:16px;width:40px;height:40px;border-radius:999px;background:#ffffff8c;-webkit-backdrop-filter:blur(10px) saturate(140%);backdrop-filter:blur(10px) saturate(140%);box-shadow:0 1px 2px #00000014,0 2px 8px #00000014,inset 0 0 0 1px #ffffff4d;color:var(--ink);display:grid;place-items:center;z-index:2;opacity:0;transform:scale(.8);pointer-events:none;transition:opacity .2s ease,transform .2s ease,background .2s var(--ease)}.cs-expand svg{width:16px;height:16px}@media(hover:hover)and (pointer:fine){.bento-card:hover .cs-expand{opacity:1;transform:scale(1);pointer-events:auto}}.bento-card:focus-visible .cs-expand{opacity:1;transform:scale(1);pointer-events:auto}.cs-expand:hover{background:#ffffffc7}html.dark .cs-expand{background:#ffffff14;box-shadow:0 1px 2px #0003,0 2px 8px #0003,inset 0 0 0 1px #ffffff1f}html.dark .cs-expand:hover{background:#ffffff29}@media(prefers-reduced-motion:reduce){.cs-expand{transform:none;transition:opacity .2s ease}}.bento-card.is-expanding .cs-expand,.bento-card.is-expanded .cs-expand,.bento-card.is-collapsing .cs-expand{opacity:0!important;transform:scale(.8)!important;pointer-events:none!important}.bento-card.is-expanding{z-index:201;transition:top var(--morph-dur) var(--ease-snappy),left var(--morph-dur) var(--ease-snappy),width var(--morph-dur) var(--ease-snappy),height var(--morph-dur) var(--ease-snappy),border-radius var(--morph-dur) var(--ease-snappy)}.bento-card.is-expanding,.bento-card.is-expanded,.bento-card.is-collapsing{cursor:default;box-shadow:none;border-color:transparent}.bento-card.is-expanding,.bento-card.is-expanded,.bento-card.is-collapsing{border-radius:0}.bento-card.is-expanding .card-body{transition:padding var(--morph-dur) var(--ease-snappy)}.bento-card.is-expanded .card-body{padding:88px 48px;justify-content:flex-start;overflow-y:auto;overscroll-behavior:contain}.bento-card.is-collapsing .card-body{overflow-y:auto}.bento-card.is-expanded .card-eyebrow,.bento-card.is-collapsing .card-eyebrow,.bento-card.is-expanded .card-title,.bento-card.is-collapsing .card-title,.bento-card.is-expanded .cs-mode-toggle,.bento-card.is-collapsing .cs-mode-toggle,.bento-card.is-expanded .cs-sticky-header,.bento-card.is-collapsing .cs-sticky-header{flex-shrink:0}.cs-sticky-header{--scroll-progress: 0}.bento-card.is-expanded .cs-sticky-header .card-eyebrow{opacity:calc(1 - clamp(0,var(--scroll-progress) / .6,1))}.bento-card.is-expanded .cs-sticky-header .cs-mode-toggle{opacity:calc(1 - clamp(0,(var(--scroll-progress) - .3) / .5,1))}.bento-card.is-expanded .cs-sticky-header .card-title{transform-origin:top center;transform:translateY(calc(var(--scroll-progress) * -54px)) scale(calc(1 - var(--scroll-progress) * .3));will-change:transform}.bento-card.is-expanded .cs-sticky-header,.bento-card.is-collapsing .cs-sticky-header{position:sticky;top:-56px;margin-top:-56px;padding-top:56px;z-index:6;background:transparent;display:flex;flex-direction:column;gap:12px}@media(max-width:540px){.bento-card.is-expanded .cs-sticky-header,.bento-card.is-collapsing .cs-sticky-header{top:-48px;margin-top:-48px;padding-top:48px;position:static}.bento-card.is-expanded .cs-sticky-header .card-title{transform:none!important}.bento-card.is-expanded .cs-sticky-header .card-eyebrow,.bento-card.is-expanded .cs-sticky-header .cs-mode-toggle{opacity:1!important}}.bento-card.is-expanded .card-body,.bento-card.is-collapsing .card-body{text-align:center}@media(max-width:540px){.bento-card.is-expanded .card-body{padding:68px 22px}}.card-blur{position:absolute;left:0;right:0;height:80px;z-index:2;pointer-events:none}.card-blur>div{position:absolute;inset:0;pointer-events:none;-webkit-backdrop-filter:blur(0px);backdrop-filter:blur(0px);transition:-webkit-backdrop-filter 0ms cubic-bezier(.22,1,.36,1),backdrop-filter 0ms cubic-bezier(.22,1,.36,1)}@media(prefers-reduced-motion:reduce){.card-blur>div{transition:none}}.card-blur-top{top:0}.card-blur-bottom{bottom:0}.card-blur.is-on>div:nth-child(1){-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.card-blur.is-on>div:nth-child(2){-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.card-blur.is-on>div:nth-child(3){-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.card-blur-top>div:nth-child(1){-webkit-mask-image:linear-gradient(to bottom,black 0 66%,transparent 100%);mask-image:linear-gradient(to bottom,black 0 66%,transparent 100%)}.card-blur-top>div:nth-child(2){-webkit-mask-image:linear-gradient(to bottom,black 0 33%,transparent 70%);mask-image:linear-gradient(to bottom,black 0 33%,transparent 70%)}.card-blur-top>div:nth-child(3){-webkit-mask-image:linear-gradient(to bottom,black 0 8%,transparent 36%);mask-image:linear-gradient(to bottom,black 0 8%,transparent 36%)}.card-blur-bottom>div:nth-child(1){-webkit-mask-image:linear-gradient(to top,black 0 66%,transparent 100%);mask-image:linear-gradient(to top,black 0 66%,transparent 100%)}.card-blur-bottom>div:nth-child(2){-webkit-mask-image:linear-gradient(to top,black 0 33%,transparent 70%);mask-image:linear-gradient(to top,black 0 33%,transparent 70%)}.card-blur-bottom>div:nth-child(3){-webkit-mask-image:linear-gradient(to top,black 0 8%,transparent 36%);mask-image:linear-gradient(to top,black 0 8%,transparent 36%)}@media(max-width:540px){.card-blur{height:60px}}.bento-card.is-resizing{transition:none!important}.bento-card-placeholder{visibility:hidden;pointer-events:none;width:100%;aspect-ratio:4 / 1}@media(max-width:540px){.bento-card-placeholder{aspect-ratio:1 / 1}}.bento-card .bento-card-body-rendered{font-size:15px;line-height:1.55;color:var(--ink-dim);max-width:60ch;margin:0 auto;text-align:left}.bento-card .body-para{margin:14px 0}.bento-card.is-collapsing .bento-card-body-rendered{opacity:0;transition:opacity .18s ease}.bento-card .bento-card-body-rendered :is(h2,h3){font-family:var(--font-serif);color:var(--ink);font-weight:400;letter-spacing:-.01em;margin:1.4em 0 .5em}.bento-card .bento-card-body-rendered :is(ul,ol){margin:.8em 0 .8em 1.2em}.bento-card .bento-card-body-rendered li{margin-bottom:.4em}.bento-card .bento-card-body-rendered code{font-family:var(--font-mono);font-size:.92em;background:#1a1a1c14;padding:1px 5px;border-radius:4px}.bento-card .bento-card-body-rendered a{color:var(--accent);text-decoration:underline;text-underline-offset:3px}.bento-card-body-rendered{transition:opacity .16s ease-out;will-change:opacity;transform:translateZ(0)}.bento-card-body-rendered.is-swapping{opacity:0}@keyframes cs-detail-enter{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes cs-detail-leave{0%{opacity:1;transform:none}to{opacity:0;transform:translateY(-4px)}}.bento-card-body-rendered.cs-mode-entering[data-mode=detailed] h2+blockquote~*:not(h2):not(blockquote){animation:cs-detail-enter .22s ease-out both}.bento-card-body-rendered.cs-mode-leaving[data-mode=detailed] h2+blockquote~*:not(h2):not(blockquote){animation:cs-detail-leave .18s ease-in forwards}@media(prefers-reduced-motion:reduce){.bento-card-body-rendered.cs-mode-entering[data-mode=detailed] h2+blockquote~*:not(h2):not(blockquote),.bento-card-body-rendered.cs-mode-leaving[data-mode=detailed] h2+blockquote~*:not(h2):not(blockquote){animation:none}}.bento-card-body-rendered[data-mode=tldr] h2+blockquote~*{display:none}.bento-card-body-rendered[data-mode=tldr] h2+blockquote~h2,.bento-card-body-rendered[data-mode=tldr] h2+blockquote~blockquote{display:block}.bento-card-body-rendered blockquote{border-left:none;padding:0;margin:0 0 14px;font-style:normal;color:var(--ink);font-size:15px;line-height:1.55}.cs-mode-toggle{position:relative;display:grid;grid-template-columns:1fr 1fr;gap:4px;margin:24px auto 18px;width:fit-content;background:#1a1a1c0f;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-radius:999px;padding:4px}.cs-mode-toggle__thumb{position:absolute;top:4px;bottom:4px;left:4px;width:calc(50% - 6px);background:var(--paper);border-radius:999px;box-shadow:0 0 40px #0000001a;transition:transform .62s cubic-bezier(.34,1.56,.64,1);pointer-events:none}.cs-mode-toggle[data-active=detailed] .cs-mode-toggle__thumb{transform:translate(calc(100% + 4px))}.cs-mode-toggle button{position:relative;z-index:1;text-align:center;background:transparent;border:0;color:var(--ink-dim);font:500 14px/1 var(--font-sans, -apple-system, system-ui, sans-serif);padding:8px 24px;border-radius:999px;cursor:pointer;transition:color .2s ease}.cs-mode-toggle button:not([aria-selected=true]):hover{color:var(--accent)}.cs-mode-toggle button[aria-selected=true]{color:var(--ink)}.cs-mode-toggle button:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:999px}.bento-card.is-collapsing .cs-mode-toggle{opacity:0;pointer-events:none;transition:opacity .18s ease}.bento-card-body-rendered .cs-nerds-footer{margin:32px 0 0;text-align:right;font-size:13px;color:var(--ink-dim)}.bento-card-body-rendered[data-mode=tldr] .cs-nerds-footer{display:none}.bento-card-body-rendered .cs-nerds-footer a{color:var(--ink-dim);text-decoration:underline;text-underline-offset:3px;text-decoration-color:#1a1a1c40;transition:color .2s ease}.bento-card-body-rendered .cs-nerds-footer a:hover{color:var(--ink)}.cs-close{position:absolute;top:16px;right:16px;width:40px;height:40px;border-radius:999px;background:#fff9;-webkit-backdrop-filter:blur(12px) saturate(140%);backdrop-filter:blur(12px) saturate(140%);box-shadow:0 1px 2px #0000001a,0 2px 10px #0000001a,inset 0 0 0 1px #ffffff52;color:var(--ink);display:grid;place-items:center;cursor:pointer;z-index:3;border:0;opacity:0;pointer-events:none;transition:background .2s var(--ease),opacity .24s ease}.bento-card.is-expanded .cs-close{opacity:1;pointer-events:auto;transition-delay:0ms,.28s;animation:cs-close-in .26s var(--ease) backwards}@keyframes cs-close-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.bento-card.is-expanded .cs-close{animation:none}}.bento-card.is-collapsing .cs-close{opacity:0;pointer-events:none;transition:opacity .18s ease,background .2s ease;transition-delay:0ms}.cs-close:hover{background:#ffffffd1}.cs-close svg{width:16px;height:16px}html.dark .cs-close{background:#ffffff14;box-shadow:0 1px 2px #0000003d,0 2px 10px #0000003d,inset 0 0 0 1px #ffffff24}html.dark .cs-close:hover{background:#ffffff2e}.bento-backdrop[data-astro-cid-f44o672t]{position:fixed;inset:0;z-index:200;background:#1a1a1c66;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);opacity:0;pointer-events:none;transition:opacity .6s ease;cursor:pointer}.bento-backdrop[data-astro-cid-f44o672t].is-open{opacity:1;pointer-events:auto}body.bento-open{overflow:hidden}html:has(body.bento-open){overflow-y:hidden}.bento-card.has-cover{--morph-dur: .76s;--content-reveal-dur: .42s;--content-close-dur: .28s;--fade-ease: cubic-bezier(.22, 1, .36, 1)}.bento-card.has-cover .cover{overflow:hidden;background:var(--paper)}.bento-card.has-cover .cover-img{position:absolute;left:0;top:-56px;width:100%;height:calc(100% + 112px);object-fit:cover;object-position:center 42%}.bento-card.has-cover .cover-overlay{position:absolute;inset:0;background:linear-gradient(to bottom,#00000057,#0000001f 38%,#00000038 62%,#0009)}.bento-card.has-cover .cover-img,.bento-card.has-cover .cover-overlay{transition:opacity 456ms var(--fade-ease)}.bento-card.has-cover.is-expanding .cover-img,.bento-card.has-cover.is-expanding .cover-overlay{opacity:0}.bento-card.has-cover .cover-resttitle{position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;text-align:center;padding:0 28px;pointer-events:none;font-family:var(--font-serif);font-weight:400;font-size:24px;line-height:1.15;letter-spacing:-.01em;color:#fff;opacity:1;filter:blur(0px);transition:opacity .42s var(--fade-ease),filter .42s var(--fade-ease)}.bento-card.has-cover .cover-resttitle em{font-style:normal;color:inherit}.bento-card.has-cover.is-expanding .cover-resttitle{opacity:0;filter:blur(14px);transition:opacity .34s var(--fade-ease),filter .34s var(--fade-ease)}.bento-card.has-cover .card-body{text-align:center;align-items:center;padding:88px 48px}@media(max-width:540px){.bento-card.has-cover .card-body{padding:68px 22px}}.bento-card.has-cover .card-eyebrow,.bento-card.has-cover .card-title,.bento-card.has-cover .cs-mode-toggle,.bento-card.has-cover .bento-card-body-rendered>*{opacity:0;transform:none;transition:opacity var(--morph-dur) var(--fade-ease)}.bento-card.has-cover .card-title{color:var(--ink);width:var(--modal-w, 100%);max-width:none;text-align:center;align-self:auto}.bento-card.has-cover .card-eyebrow{width:var(--modal-w, 100%)}.bento-card.has-cover .bento-card-body-rendered{width:var(--modal-w, 100%);max-width:60ch}.bento-card.has-cover .card-title em{font-style:normal;color:inherit}.bento-card.has-cover.is-content-in .card-eyebrow,.bento-card.has-cover.is-content-in .card-title,.bento-card.has-cover.is-content-in .cs-mode-toggle,.bento-card.has-cover.is-content-in .bento-card-body-rendered>*{opacity:1;transform:none;transition:opacity var(--content-reveal-dur) var(--fade-ease)}.bento-card.has-cover.is-closing-content .card-eyebrow,.bento-card.has-cover.is-closing-content .card-title,.bento-card.has-cover.is-closing-content .cs-mode-toggle,.bento-card.has-cover.is-closing-content .bento-card-body-rendered>*{opacity:0;transform:none;transition:opacity var(--content-close-dur) var(--fade-ease)}@media(prefers-reduced-motion:reduce){.bento-card.has-cover .cover-img,.bento-card.has-cover .cover-overlay,.bento-card.has-cover .cover-resttitle,.bento-card.has-cover .card-eyebrow,.bento-card.has-cover .card-title,.bento-card.has-cover .cs-mode-toggle,.bento-card.has-cover .bento-card-body-rendered>*{transition:none!important;filter:none!important;transform:none!important}}.section-title[data-astro-cid-7xft3v3r]{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.75rem,1.5vw + 1.25rem,2.5rem);line-height:1.15;letter-spacing:-.01em;margin-bottom:24px}.tech-pill[data-astro-cid-ocna4zj6]{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;color:var(--ink);background:#1a1a1c0d;border:1px solid var(--rule);transition:transform .25s var(--ease),background .25s var(--ease),border-color .25s var(--ease)}html.dark .tech-pill[data-astro-cid-ocna4zj6]{background:#ffffff0f}.tech-pill[data-astro-cid-ocna4zj6]:hover{transform:translateY(-2px)}.tech-pill__logo[data-astro-cid-ocna4zj6]{flex:none;display:grid;place-items:center}.tech-pill__logo[data-astro-cid-ocna4zj6] svg{width:18px;height:18px;display:block}.tech-pill__logo--dark[data-astro-cid-ocna4zj6],html.dark .tech-pill__logo--light[data-astro-cid-ocna4zj6]{display:none}html.dark .tech-pill__logo--dark[data-astro-cid-ocna4zj6]{display:grid}.tech-pill__label[data-astro-cid-ocna4zj6]{font-family:var(--font-mono);font-size:13px;color:var(--ink);white-space:nowrap}.tech-pill[data-astro-cid-ocna4zj6].is-featured{background:var(--accent-soft);border-color:transparent;box-shadow:inset 0 0 0 1px var(--accent-soft)}@media(prefers-reduced-motion:reduce){.tech-pill[data-astro-cid-ocna4zj6]{transition:none}.tech-pill[data-astro-cid-ocna4zj6]:hover{transform:none}}.section-title[data-astro-cid-nupyg6k6]{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.75rem,1.5vw + 1.25rem,2.5rem);line-height:1.15;letter-spacing:-.01em;margin:0 0 32px}.stack-groups[data-astro-cid-nupyg6k6]{display:flex;flex-direction:column;gap:28px}.stack-group-label[data-astro-cid-nupyg6k6]{font-family:var(--font-mono);font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-dim);margin:0 0 12px}.stack-pill-row[data-astro-cid-nupyg6k6]{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:10px}.section-title[data-astro-cid-xmivup5a]{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.75rem,1.5vw + 1.25rem,2.5rem);line-height:1.15;letter-spacing:-.01em;margin-bottom:28px}.contact-links[data-astro-cid-xmivup5a]{display:flex;flex-wrap:wrap;gap:12px 18px}.contact-link[data-astro-cid-xmivup5a]{display:inline-flex;align-items:center;gap:10px;color:var(--ink-dim);font-size:.95rem;transition:color .2s ease}.contact-link[data-astro-cid-xmivup5a]:hover{color:var(--accent)}.page[data-astro-cid-j7pv25f6]{max-width:880px;margin:0 auto;padding:0 24px;display:flex;flex-direction:column;gap:64px}@media(min-width:720px){.page[data-astro-cid-j7pv25f6]{padding:0 40px;gap:88px}}
