.stamp{align-items:center;gap:6px var(--space-6);width:fit-content;padding-left:var(--space-4);border-left:1px solid var(--line-2);font-family:var(--font-mono);font-size:var(--text-mono);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);grid-template-columns:auto auto;margin:0;display:grid}.stamp dd{color:var(--fg-1);overflow-wrap:anywhere;margin:0}.stamp-class{flex-wrap:wrap;align-items:center;gap:6px 14px;min-height:28px;display:flex}.stamp-muted{color:var(--fg-3)}.stamp-link{font:inherit;letter-spacing:inherit;text-transform:inherit;color:var(--accent-text);text-underline-offset:.3em;cursor:pointer;transition:color var(--dur-fast);background:0 0;border:0;padding:2px 0;text-decoration:underline dotted}.stamp-link:hover{color:var(--fg-1)}.stamp-link:disabled{color:var(--fg-3);cursor:default;text-decoration:none}.stamp-link-quiet{color:var(--fg-3)}.stamp-form{flex-wrap:wrap;align-items:center;gap:6px 14px;margin:0;display:flex}.stamp-input{border:0;border-bottom:1px solid var(--accent);width:14ch;color:var(--fg-1);caret-color:var(--accent);font:inherit;letter-spacing:.12em;text-transform:uppercase;background:0 0;border-radius:0;outline:none;padding:2px 0}.stamp-input::placeholder{color:var(--fg-3)}.stamp-input:focus-visible{border-bottom-width:2px;outline:none}.stamp-input[aria-invalid=true]{border-bottom-color:var(--danger)}.stamp-mark{border:var(--stamp-border) solid currentColor;border-radius:var(--radius-xs);color:var(--accent-text);letter-spacing:.12em;transform:rotate(var(--stamp-rotate));animation:ds-stamp var(--dur-stamp) var(--ease-stamp) both;padding:2px 10px;font-weight:500;display:inline-block}.stamp-err{color:var(--accent-text);text-transform:none;letter-spacing:0;font-family:var(--font-body);font-size:var(--text-sm)}.cover[data-astro-cid-ktmu5jp2]{align-items:center;min-height:100svh;display:flex;position:relative;overflow:hidden}.cover-bg[data-astro-cid-ktmu5jp2],.cover-canvas[data-astro-cid-ktmu5jp2]{pointer-events:none;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#000 70%,#0000);mask-image:linear-gradient(#000 70%,#0000)}.cover-canvas[data-astro-cid-ktmu5jp2]{opacity:0;width:100%;height:100%;transition:opacity var(--dur-reveal) var(--ease-out)}.cover-canvas[data-astro-cid-ktmu5jp2].is-ready{opacity:1}[data-astro-cid-ktmu5jp2][data-intro]{animation:ds-reveal var(--dur-reveal) var(--ease-out) var(--d,0s) both}[data-astro-cid-ktmu5jp2][data-intro=blur]{animation-name:ds-reveal-blur}.cover-in[data-astro-cid-ktmu5jp2]{z-index:1;gap:var(--space-12);grid-template-columns:1fr;align-items:end;padding-top:120px;padding-bottom:96px;display:grid;position:relative}@media (width>=860px){.cover-in[data-astro-cid-ktmu5jp2]{grid-template-columns:1fr auto}}.cover-main[data-astro-cid-ktmu5jp2]{gap:var(--space-8);flex-direction:column;grid-column:1/-1;display:flex}.cover-title[data-astro-cid-ktmu5jp2]{font-size:var(--text-display);line-height:var(--leading-display);letter-spacing:var(--tracking-display);max-width:14ch;font-weight:600}.cover-lead[data-astro-cid-ktmu5jp2]{font-size:var(--text-lead);color:var(--fg-2);max-width:52ch;font-weight:300}.cover-ctas[data-astro-cid-ktmu5jp2]{gap:var(--space-3);flex-wrap:wrap;align-items:center;display:flex}.cover-meta[data-astro-cid-ktmu5jp2]{gap:var(--space-8);flex-wrap:wrap;justify-content:flex-end;align-items:flex-end;display:flex}.cover-years[data-astro-cid-ktmu5jp2]{gap:var(--space-1);flex-direction:column;display:flex}.cover-years-num[data-astro-cid-ktmu5jp2]{font-family:var(--font-display);font-size:var(--text-stat);letter-spacing:var(--tracking-display);font-variant-numeric:tabular-nums;font-weight:600;line-height:1}.cover-years-num[data-astro-cid-ktmu5jp2] .accent[data-astro-cid-ktmu5jp2]{color:var(--accent)}.id-photo[data-astro-cid-ktmu5jp2]{background:var(--bg-2);border:1px solid var(--line-2);place-items:center;width:96px;height:124px;margin:0;display:grid;position:relative}.id-photo[data-astro-cid-ktmu5jp2] img[data-astro-cid-ktmu5jp2]{object-fit:cover;width:100%;height:100%;filter:var(--photo-duotone);transition:filter var(--dur-base) var(--ease-out)}.id-photo[data-astro-cid-ktmu5jp2]:hover img[data-astro-cid-ktmu5jp2]{filter:none}.id-photo-empty[data-astro-cid-ktmu5jp2]{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);text-transform:uppercase;text-align:center;color:var(--fg-3)}.crop[data-astro-cid-ktmu5jp2]{width:var(--crop-mark);height:var(--crop-mark);border:0 solid var(--fg-2);position:absolute}.crop[data-astro-cid-ktmu5jp2].tl{border-top-width:1px;border-left-width:1px;top:-6px;left:-6px}.crop[data-astro-cid-ktmu5jp2].tr{border-top-width:1px;border-right-width:1px;top:-6px;right:-6px}.crop[data-astro-cid-ktmu5jp2].bl{border-bottom-width:1px;border-left-width:1px;bottom:-6px;left:-6px}.crop[data-astro-cid-ktmu5jp2].br{border-bottom-width:1px;border-right-width:1px;bottom:-6px;right:-6px}.cover-cue[data-astro-cid-ktmu5jp2]{left:var(--gutter);bottom:var(--space-8);z-index:1;animation:ds-scroll-cue 2s var(--ease-in-out) infinite;text-decoration:none;position:absolute}@media (width>=1024px){.cover-cue[data-astro-cid-ktmu5jp2]{left:calc(var(--gutter) + var(--rail-w))}}@media (prefers-reduced-motion:reduce){.cover-cue[data-astro-cid-ktmu5jp2]{animation:none}}.profile-in[data-astro-cid-h5h4k4bj]{flex-wrap:wrap;flex-direction:row!important}.profile-head[data-astro-cid-h5h4k4bj]{gap:var(--space-4);flex-direction:column;flex:5 320px;align-self:start;display:flex}.profile-title[data-astro-cid-h5h4k4bj]{font-size:var(--text-h1);font-weight:600}.margin-note[data-astro-cid-h5h4k4bj]{font-family:var(--font-serif);color:var(--fg-3);max-width:34ch;padding-left:var(--space-3);border-left:1px solid var(--line-2);font-size:1.125rem;font-style:italic}.profile-body[data-astro-cid-h5h4k4bj]{flex-direction:column;flex:7 480px;gap:56px;min-width:0;display:flex}.blocks[data-astro-cid-h5h4k4bj]{gap:var(--space-10) var(--space-8);grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));display:grid}.block[data-astro-cid-h5h4k4bj]{gap:var(--space-3);border-top:1px solid var(--line-1);padding-top:var(--space-4);flex-direction:column;display:flex}.block[data-astro-cid-h5h4k4bj] h3[data-astro-cid-h5h4k4bj]{font-size:var(--text-h4);font-weight:600}.block[data-astro-cid-h5h4k4bj] p[data-astro-cid-h5h4k4bj]{color:var(--fg-2);line-height:var(--leading-body)}.pull-quote[data-astro-cid-h5h4k4bj]{padding-left:var(--space-6);border-left:2px solid var(--accent);font-family:var(--font-serif);font-style:italic;font-weight:300;font-size:var(--text-quote);line-height:var(--leading-quote);color:var(--fg-1);text-wrap:balance;max-width:24ch;margin:0}.credentials[data-astro-cid-h5h4k4bj]{gap:var(--space-8);border-top:1px solid var(--line-1);padding-top:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));display:grid}.cred[data-astro-cid-h5h4k4bj]{gap:var(--space-2);flex-direction:column;display:flex}.cred-title[data-astro-cid-h5h4k4bj]{color:var(--fg-1);font-weight:600}.cred-line[data-astro-cid-h5h4k4bj],.cred[data-astro-cid-h5h4k4bj] li[data-astro-cid-h5h4k4bj]{color:var(--fg-2);line-height:var(--leading-body)}.cred[data-astro-cid-h5h4k4bj] ul[data-astro-cid-h5h4k4bj]{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.langs[data-astro-cid-h5h4k4bj] li[data-astro-cid-h5h4k4bj]{justify-content:space-between;align-items:center;gap:var(--space-4);display:flex}.dots[data-astro-cid-h5h4k4bj]{gap:4px;display:inline-flex}.dots[data-astro-cid-h5h4k4bj] i[data-astro-cid-h5h4k4bj]{border:1px solid var(--accent);border-radius:50%;width:7px;height:7px}.dots[data-astro-cid-h5h4k4bj] i[data-astro-cid-h5h4k4bj].on{background:var(--accent)}.contact-bg[data-astro-cid-njuidq34]{pointer-events:none;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#0000,#000 30%);mask-image:linear-gradient(#0000,#000 30%)}.contact[data-astro-cid-njuidq34] .container[data-astro-cid-njuidq34]{gap:var(--space-10);position:relative}.contact-head[data-astro-cid-njuidq34]{gap:var(--space-4);flex-direction:column;display:flex}.contact-title[data-astro-cid-njuidq34]{font-size:var(--text-display);letter-spacing:var(--tracking-display);font-weight:600;line-height:var(--leading-display)}.contact-lead[data-astro-cid-njuidq34]{font-size:var(--text-lead);color:var(--fg-2);max-width:48ch;font-weight:300}.contact-actions[data-astro-cid-njuidq34]{gap:var(--space-3);flex-wrap:wrap;align-items:center;display:flex}.tag{border-radius:var(--radius-full);border:1px solid var(--line-2);min-height:26px;color:var(--fg-2);font-family:var(--font-body);font-size:var(--text-xs);cursor:default;transition:color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out), opacity var(--dur-fast) var(--ease-out), transform var(--dur-base) var(--ease-magnetic);background:0 0;align-items:center;gap:6px;padding:0 10px;font-weight:500;line-height:1.2;text-decoration:none;display:inline-flex}.tag-primary{border-color:var(--accent);color:var(--fg-1)}.tag-primary:before{content:"";background:var(--accent);border-radius:50%;flex:none;width:6px;height:6px}.tag-mono{font-family:var(--font-mono);letter-spacing:var(--tracking-mono);text-transform:uppercase;font-size:var(--text-mono-sm)}.tag-interactive{cursor:pointer}.tag-interactive:hover{border-color:var(--fg-1);color:var(--fg-1);text-decoration:none}.tag-selected,.tag-selected:hover{background:var(--fg-1);color:var(--fg-inverse);border-color:var(--fg-1)}.tag-dim{opacity:.35}.tag-count{color:var(--fg-3);font-family:var(--font-mono);font-size:var(--text-mono-sm)}.tag-selected .tag-count{color:inherit;opacity:.85}.tl{font-family:var(--font-body);grid-template-columns:160px 1fr;gap:0 40px;padding-bottom:48px;display:grid;position:relative}.tl-dot{background:var(--bg-0);border:1px solid var(--fg-2);z-index:2;border-radius:50%;width:9px;height:9px;position:absolute;top:6px;left:180px}.tl-current .tl-dot{background:var(--accent);border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft);animation:ds-pulse 2s var(--ease-in-out) infinite}@media (prefers-reduced-motion:reduce){.tl-current .tl-dot{animation:none}}.tl-date{font-family:var(--font-mono);font-size:var(--text-mono);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);text-align:right;font-variant-numeric:tabular-nums;line-height:1.6}.tl-current .tl-date{color:var(--accent-text)}.tl-body{min-width:0;padding-left:24px}.tl-role{font-size:var(--text-h3);font-weight:500;line-height:1.15}.tl-company{color:var(--fg-2);flex-wrap:wrap;align-items:center;gap:10px;margin-top:6px;font-size:15px;display:flex}.tl-company-name{color:var(--fg-1);font-weight:500}.tl-desc{color:var(--fg-2);max-width:62ch;margin-top:14px;font-size:15px;line-height:1.6}.tl-skills{flex-wrap:wrap;gap:6px;margin-top:16px;display:flex}.tl-projects{margin-top:16px}.tl-projects summary{cursor:pointer;font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);transition:color var(--dur-fast);align-items:center;gap:6px;list-style:none;display:inline-flex}.tl-projects summary::-webkit-details-marker{display:none}.tl-projects summary:hover{color:var(--fg-1)}.tl-projects summary .icon{transition:transform var(--dur-base) var(--ease-snap)}.tl-projects[open] summary .icon{transform:rotate(180deg)}.tl-projects ul{flex-wrap:wrap;gap:8px;margin:12px 0 0;padding:0;list-style:none;display:flex}.tl-projects[open] ul{animation:ds-reveal var(--dur-base) var(--ease-out) both}.case-tab{background:var(--bg-2);border:1px solid var(--line-1);border-radius:var(--radius-control) var(--radius-card) var(--radius-control) var(--radius-control);color:var(--fg-1);font-size:var(--text-sm);transition:background var(--dur-fast), border-color var(--dur-fast);align-items:center;gap:10px;padding:8px 14px 8px 10px;text-decoration:none;display:flex}.case-tab:hover{background:var(--bg-3);border-color:var(--line-2);color:var(--fg-1)}.case-tab-code{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);color:var(--accent-text)}@media (width<=720px){.tl{grid-template-columns:1fr;padding-left:28px}.tl-dot{left:0}.tl-date{text-align:left;margin-bottom:6px}.tl-body{padding-left:0}}.pc-wrap{flex-direction:column;padding-top:22px;display:flex;position:relative}.pc-tab{background:var(--bg-2);border:1px solid var(--line-1);border-radius:var(--radius-control) var(--radius-control) 0 0;height:23px;font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);color:var(--accent-text);z-index:1;transition:background var(--dur-base) var(--ease-out);border-bottom:0;align-items:center;padding:0 12px;display:inline-flex;position:absolute;top:0;left:16px}.pc-wrap:has(.pc:hover) .pc-tab{background:var(--bg-3)}.pc{background:var(--bg-2);border:1px solid var(--line-1);border-radius:var(--radius-card);color:var(--fg-1);transition:background var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out);flex-direction:column;flex:1;text-decoration:none;display:flex;position:relative}.pc:hover{background:var(--bg-3);box-shadow:var(--shadow-2), var(--highlight-inset);border-color:var(--line-2);color:var(--fg-1)}.pc:focus-visible{outline-offset:3px;border-radius:var(--radius-card)}.pc-tick{opacity:0;border:0 solid var(--accent);width:10px;height:10px;transition:opacity var(--dur-base) var(--ease-out);pointer-events:none;z-index:2;position:absolute}.pc:hover .pc-tick{opacity:1}.pc-tick.tl{border-top-left-radius:var(--radius-card);border-top-width:1px;border-left-width:1px;top:-1px;left:-1px}.pc-tick.tr{border-top-right-radius:var(--radius-card);border-top-width:1px;border-right-width:1px;top:-1px;right:-1px}.pc-tick.bl{border-bottom-left-radius:var(--radius-card);border-bottom-width:1px;border-left-width:1px;bottom:-1px;left:-1px}.pc-tick.br{border-bottom-right-radius:var(--radius-card);border-bottom-width:1px;border-right-width:1px;bottom:-1px;right:-1px}.pc-media{aspect-ratio:16/10;background:var(--bg-1);border-bottom:1px solid var(--line-1);border-radius:var(--radius-card) var(--radius-card) 0 0;position:relative;overflow:hidden}.pc-media img{object-fit:cover;width:100%;height:100%;transition:transform var(--dur-slow) var(--ease-out)}.pc:hover .pc-media img{transform:scale(1.03)}.pc-nomedia{color:var(--fg-3);background-image:linear-gradient(var(--line-grid) 1px, transparent 1px), linear-gradient(90deg, var(--line-grid) 1px, transparent 1px);transition:color var(--dur-base) var(--ease-out);background-size:32px 32px;place-items:center;display:grid;position:absolute;inset:0}.pc:hover .pc-nomedia{color:var(--fg-2)}.pc-status{position:absolute;top:12px;right:12px}.pc-body{flex-direction:column;flex:1;gap:10px;padding:20px 24px 24px;display:flex}.pc-meta{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);justify-content:space-between;align-items:center;gap:12px;display:flex}.pc-meta span{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:6px;min-width:0;display:flex;overflow:hidden}.pc-meta span:last-child{flex:none}.pc h3{font-size:var(--text-h4);-webkit-line-clamp:3;-webkit-box-orient:vertical;font-weight:500;line-height:1.2;display:-webkit-box;overflow:hidden}.pc p{font-size:var(--text-sm);color:var(--fg-2);-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.55;display:-webkit-box;overflow:hidden}.pc-tags{flex-wrap:wrap;gap:6px;margin-top:auto;padding-top:6px;display:flex}.filter{font-family:var(--font-body);flex-wrap:wrap;align-items:center;gap:20px 32px;display:flex}.filter-group{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.filter-label{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);margin-right:4px}.filter-end{align-items:center;gap:16px;margin-left:auto;display:flex}.filter-count{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);color:var(--fg-3);font-variant-numeric:tabular-nums}.filter-clear{cursor:pointer;color:var(--fg-3);transition:color var(--dur-fast);background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:13px;display:inline-flex}.filter-clear:hover{color:var(--accent-text)}.projects-controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px 32px;display:flex}.projects-controls .filter{flex:600px}.projects-grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr));gap:32px 24px;display:grid}.projects-index{border-top:1px solid var(--line-2);font-size:var(--text-sm);overflow-x:auto}.pi-row{border-bottom:1px solid var(--line-1);min-width:640px;color:var(--fg-1);transition:background var(--dur-fast);grid-template-columns:88px minmax(200px,1fr) 150px 140px 70px;align-items:center;gap:16px;padding:12px;text-decoration:none;display:grid}a.pi-row:hover{background:var(--bg-2);color:var(--fg-1)}.pi-head{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);text-transform:uppercase;color:var(--fg-3);padding-block:10px}.pi-code{font-family:var(--font-mono);font-size:var(--text-mono-sm);letter-spacing:var(--tracking-mono);color:var(--accent-text)}.pi-title{overflow-wrap:anywhere;font-weight:500}.pi-type{color:var(--fg-2);align-items:center;gap:8px;display:flex}.pi-year{text-align:right;font-family:var(--font-mono);font-size:var(--text-mono-sm);color:var(--fg-3)}
