@font-face{font-family:GeistSans;src:url(/fonts/geist-sans.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:GeistSans Fallback;src:local(Arial);ascent-override:94.56%;descent-override:27.76%;line-gap-override:0%;size-adjust:106.28%}:root{color-scheme:light;--primary: #171717;--secondary: #626262;--divider: #e2e2e2;--hover: #f2f2f2;font-family:GeistSans,GeistSans Fallback,Arial,sans-serif;font-size:14px;color:var(--primary);background:#fff;-webkit-font-smoothing:antialiased}*{box-sizing:border-box}body{margin:0}html{scroll-behavior:smooth;scroll-padding-top:24px}a{color:inherit;text-decoration:none}#app{max-width:600px;margin:0 auto;padding:24px}.gutter{padding-left:6px;padding-right:6px}.header{display:flex;align-items:center;justify-content:space-between;height:28px;margin-bottom:16px}.personal-mark{display:block;width:28px;height:28px;border-radius:50%}.avatar{display:block;width:28px;height:28px;object-fit:cover;border-radius:50%}.language-button{display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:44px;min-height:36px;padding:8px 5px;margin-right:-5px;background:transparent;border:0;border-radius:5px;color:var(--secondary);font:inherit;font-size:11px;line-height:16px;cursor:pointer;transition:color .14s ease,background-color .14s ease}.language-button svg{display:block;width:16px;height:16px}.language-button:hover{color:var(--primary);background:var(--hover)}h1{font-size:20px;line-height:28px;font-weight:600;margin:0 0 16px;letter-spacing:-.35px}p{font-size:14px;line-height:21px;color:var(--secondary);margin:0 0 12px}.intro{padding-bottom:20px}.intro p{text-align:left;text-wrap:pretty}.intro p:last-child{margin-bottom:0}strong{color:var(--primary);font-weight:400}.icon{width:16px;height:16px;fill:currentColor;display:block;flex-shrink:0}.inline-tech{display:inline;white-space:nowrap}.inline-tech strong{color:var(--primary);font-weight:400}.inline-tech .icon{display:inline-block;width:13px;height:13px;vertical-align:-2px;margin-right:3px;color:var(--tech-color)}.inline-company,.inline-social{white-space:nowrap}.inline-company img{display:inline-block;width:14px;height:14px;vertical-align:-2px;margin-right:4px;object-fit:contain}.inline-social .icon{display:inline-block;width:13px;height:13px;vertical-align:-2px;margin-right:4px}.text-link{color:var(--primary)}.inline-social{text-decoration:underline;text-underline-offset:3px;text-decoration-color:#b8b8b8}.text-link:hover{text-decoration:underline;text-underline-offset:3px}.section{position:relative;padding:22px 0}.section.gutter{padding-inline:6px}.section:before,footer:before{content:"";position:absolute;height:1px;background:var(--divider);top:0;left:6px;right:6px}h2{font-size:14px;line-height:21px;color:var(--secondary);font-weight:500;margin:0 0 12px}.plain-list{padding:0;margin:0;list-style:none}.row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 6px;border-radius:6px;font-size:14px;line-height:20px;min-height:28px}.row{transition:background-color .14s ease}.project-row:focus-visible{background:var(--hover)}@media(hover:hover){.row:hover{background:var(--hover)}}.row-copy{display:flex;align-items:baseline;gap:4px;min-width:0}.row-mark,.work-mark{width:14px;flex:0 0 14px;align-self:center}.row-mark .icon{width:14px;height:14px}.work-mark{display:flex;align-items:center}.work-mark svg{display:block;width:14px;height:14px}.description,.dates{color:var(--secondary)}.dates{white-space:nowrap;font-variant-numeric:tabular-nums;flex-shrink:0}.project-meta{position:relative;flex:0 0 60px;height:20px;overflow:hidden}.technologies,.repository-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;transition:opacity .16s ease,transform .18s ease}.technologies{gap:4px;color:#777;opacity:1;transform:translateY(0)}.repository-label{color:var(--secondary);font-size:14px;white-space:nowrap;opacity:0;transform:translateY(4px)}.project-row:focus-visible .technologies{opacity:0;transform:translateY(-4px)}.project-row:focus-visible .repository-label{opacity:1;transform:translateY(0)}@media(hover:hover)and (pointer:fine){.project-row:hover .technologies{opacity:0;transform:translateY(-4px)}.project-row:hover .repository-label{opacity:1;transform:translateY(0)}}footer{position:relative;display:flex;align-items:center;justify-content:space-between;padding-top:20px}footer nav{display:flex;align-items:center}.social-link{display:flex;align-items:center;padding:0 12px;height:16px;border-right:1px solid var(--divider)}.social-link:first-child{padding-left:0}.social-link:last-child{padding-right:0;border-right:0}.social-link .icon{width:16px;height:16px}.follow-link{font-size:12px;line-height:16px;font-weight:500}.follow-link span[aria-hidden]{color:var(--secondary);margin-left:3px}.follow-link:hover{text-decoration:underline}a:focus-visible,button:focus-visible{outline:2px solid #387a94;outline-offset:4px;border-radius:3px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.skip-link{position:fixed;top:8px;left:8px;padding:8px;background:#fff;z-index:2;transform:translateY(-150%)}.skip-link:focus{transform:translateY(0)}@media(max-width:767px){.gutter,.section.gutter{padding-left:0;padding-right:0}.section:before,footer:before{left:0;right:0}.row{padding-left:0;padding-right:0}}@media(max-width:540px){.intro p{text-align:left}.row-copy{align-items:flex-start}.row-mark,.work-mark{align-self:auto;margin-top:3px}.row{flex-direction:column;align-items:flex-start;gap:3px;padding-top:6px;padding-bottom:6px}.dates,.project-meta{margin-left:18px;font-size:12px}.project-meta{flex-basis:auto;width:60px;height:20px}.technologies,.repository-label{justify-content:flex-start}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{transition:none!important}}.company-brands{display:inline-flex;align-items:center;gap:5px}.company-brand{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}.company-logo{display:block;width:14px;height:14px;object-fit:contain;filter:grayscale(1)}.company-logo-wide{width:30px}.company-slash{color:var(--secondary)}.work-row .row-copy{align-items:center}.work-label{display:flex;align-items:center;flex-wrap:wrap;column-gap:3px}.work-meta{display:flex;align-items:center;gap:7px;flex-shrink:0}.disclosure-indicator{display:flex;align-items:center;width:12px;height:12px;color:var(--secondary);transition:transform .16s ease}.disclosure-indicator svg{display:block;width:12px;height:12px}.work-details[data-expanded=true] .disclosure-indicator,.work-details[open]:not([data-expanded=false]) .disclosure-indicator{transform:rotate(180deg)}.work-details summary{list-style:none;cursor:pointer}.work-details summary::-webkit-details-marker{display:none}.work-details summary:focus-visible{outline:2px solid #387a94;outline-offset:2px}.work-details summary:focus-visible{background:var(--hover)}.work-detail-content{padding-top:7px;padding-bottom:9px}.work-detail-content p{font-size:14px;line-height:21px;margin:0 0 6px}.work-detail-content p:last-child{margin-bottom:0}@media(max-width:540px){.work-meta{margin-left:0}.work-meta .dates{margin-left:0;font-size:14px}}.work-label{min-width:0}.row-copy>span:last-child{min-width:0;overflow-wrap:break-word}@media(max-width:540px){.language-button{min-height:44px}.work-label{row-gap:1px}}.section-link{display:inline-block;font-size:13px;line-height:20px;text-decoration:underline;text-underline-offset:3px}h1{text-wrap:balance}.focus-word{display:inline-block}@media(prefers-reduced-motion:no-preference){.focus-title.is-settled .focus-word{animation:heading-settle .38s cubic-bezier(.2,.7,.2,1) both;animation-delay:var(--word-delay, 0ms)}}@keyframes heading-settle{0%{transform:translateY(3px);color:#555}to{transform:translateY(0);color:var(--primary)}}@media(prefers-reduced-motion:reduce),print{.focus-word{animation:none!important;transform:none!important}}.project-row{flex-direction:row;align-items:center;padding-block:7px}.project-row .row-copy{align-items:baseline}.project-row .row-mark{align-self:baseline;margin-top:0}.project-row .row-mark .icon{display:inline-block;vertical-align:-2px}.project-row .project-meta{flex:0 0 60px;margin-left:0}.project-row .technologies,.project-row .repository-label{justify-content:flex-end}.projects>.section-link{margin-top:10px}.protocol-words{display:none}.protocol-list{color:var(--secondary)}@media(prefers-reduced-motion:no-preference){.protocol-list{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.protocol-words{display:inline-grid;vertical-align:bottom;overflow:hidden;color:#315b78;font-weight:500}.protocol-words>span{grid-area:1 / 1;white-space:nowrap;animation:protocol-swap 12s cubic-bezier(.22,1,.36,1) infinite;animation-delay:calc(var(--word-index) * 3s - 12s)}.protocol-words .inline-tech{display:inline}.protocol-swap:hover .protocol-words>span{animation-play-state:paused}}@keyframes protocol-swap{0%,22%{opacity:1;transform:translateY(0)}25%,97%{opacity:0;transform:translateY(-100%)}97.01%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@media print{.protocol-list{position:static;width:auto;height:auto;margin:0;clip-path:none;white-space:normal}.protocol-words{display:none}}
