@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-400.woff2) format("woff2")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-500.woff2) format("woff2")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-600.woff2) format("woff2")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-700.woff2) format("woff2")}@font-face{font-family:DM Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/dm-mono-latin-400.woff2) format("woff2")}.portfolio{--page: #eef5fc;--ink: #172c38;--muted: #506371;--panel: #f7fbff;--rule: #c8d7df;--accent: #076d69;--accent-strong: #076d69;--tint: #dfefef;margin:0;color:var(--ink);background:var(--page);font-family:IBM Plex Sans,system-ui,sans-serif;font-size:16px;line-height:1.65;-webkit-font-smoothing:antialiased;overflow-x:clip}html.dark .portfolio{--page: #0d1117;--ink: #e5edf2;--muted: #a0b1bc;--panel: #141b23;--rule: #2c3a45;--accent: #2bdcd2;--accent-strong: #7cece5;--tint: #132b2f}.portfolio *,.portfolio *:before,.portfolio *:after{box-sizing:border-box}.portfolio [hidden]{display:none!important}.portfolio ::selection{color:var(--page);background:var(--accent)}.portfolio .shell{width:min(1120px,calc(100% - 48px));margin-inline:auto}.portfolio main{min-height:65vh;padding-block:0 72px}.portfolio .content-narrow{max-width:800px;padding-top:64px}.portfolio :is(h1,h2,h3,h4,p,ul,figure,dl){margin:0}.portfolio :is(h1,h2,h3,h4){font-weight:500;line-height:1.16;text-wrap:balance}.portfolio h2{font-size:clamp(1.9rem,4vw,2.65rem);letter-spacing:-.045em}.portfolio a{color:inherit;text-underline-offset:.23em;text-decoration-thickness:1px}.portfolio a:hover{color:var(--accent-strong)}.portfolio .skip-link-main,.portfolio .skip-link-main:hover{color:#fff}.portfolio a:focus-visible,.portfolio button:focus-visible{outline:3px solid var(--accent);outline-offset:5px;border-radius:2px}.portfolio section[id]{scroll-margin-top:32px}.portfolio .site-header{display:flex;flex-wrap:wrap;align-items:center;gap:12px 24px;min-height:100px;padding-block:24px;border-bottom:1px solid var(--rule)}.portfolio .wordmark{display:inline-flex;align-items:center;gap:0;font-size:18px;letter-spacing:-.5px;font-weight:600;text-decoration:none}.portfolio .wordmark-symbol{display:grid;place-items:center;margin-right:10px;width:30px;height:30px;background:var(--ink);color:var(--page);border-radius:7px;font-size:24px;line-height:1}.portfolio .wordmark-domain{color:var(--muted);font-weight:400}.portfolio .site-nav{order:3;display:flex;justify-content:space-between;width:100%;gap:6px}.portfolio .site-nav a{display:inline-flex;align-items:center;min-height:44px;font-size:14px;text-decoration:none;color:var(--muted)}.portfolio .site-nav a:hover,.portfolio .site-nav a[aria-current]{color:var(--accent-strong)}.portfolio .theme-toggle{display:grid;place-items:center;width:44px;height:44px;margin-left:auto;border:1px solid var(--rule);border-radius:50%;background:transparent;color:var(--ink);cursor:pointer}.portfolio .theme-toggle:hover{background:var(--tint)}.theme-sun,html.dark .theme-moon{display:none}html.dark .theme-sun{display:block}.portfolio .eyebrow{display:flex;align-items:center;gap:10px;color:var(--accent-strong);font:400 11px/1.6 DM Mono,monospace;letter-spacing:.08em;text-transform:uppercase}.portfolio .eyebrow>span:first-child{color:var(--muted)}.portfolio .hero{display:grid;gap:40px;padding-block:62px 64px}.portfolio .hero-eyebrow{margin-bottom:22px}.portfolio .hero h1{font-size:clamp(3.05rem,7.2vw,5.8rem);font-weight:500;line-height:1.04;letter-spacing:-.065em}.portfolio .name-dot{color:var(--accent)}.portfolio .hero-role{margin-top:20px;font-size:clamp(1.35rem,3vw,1.8rem);line-height:1.35;letter-spacing:-.035em}.portfolio .hero-focus{margin-top:6px;color:var(--accent-strong);font:14px/1.6 DM Mono,monospace}.portfolio .hero-intro{max-width:550px;margin-top:18px;color:var(--muted);font-size:17px;line-height:1.75}.portfolio .hero-links{display:flex;flex-wrap:wrap;gap:12px 28px;margin-top:27px}.portfolio .hero-links a{display:inline-flex;align-items:center;gap:12px;min-height:44px;font-size:14px;font-weight:500;text-decoration:none;border-bottom:1px solid var(--rule)}.portfolio .hero-links a span{color:var(--accent)}.portfolio .hero-aside{display:none}.portfolio .portfolio-section{padding-block:42px 48px;border-top:1px solid var(--rule)}.portfolio .section-heading{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:18px;margin-bottom:28px}.portfolio .section-heading h2,.portfolio .about-section h2{margin-top:8px}.portfolio .section-heading>p{color:var(--muted);font-size:14px}.portfolio .text-link,.portfolio .back-link{display:inline-flex;gap:14px;align-items:center;min-height:44px;font-weight:500;font-size:14px;text-decoration:none}.portfolio .text-link:hover,.portfolio .back-link:hover{text-decoration:underline}.portfolio .app-card{display:grid;overflow:hidden;border:1px solid var(--rule);border-radius:12px;background:var(--panel);min-height:0}.portfolio .app-copy{padding:28px}.portfolio .app-name{display:flex;align-items:center;gap:15px}.portfolio .app-name img{border:1px solid var(--rule);border-radius:14px;width:60px;height:60px}.portfolio .app-name .eyebrow{font-size:10px;letter-spacing:.05em}.portfolio .app-name h3{margin-top:4px;font-size:32px;letter-spacing:-.04em}.portfolio .app-copy h4{margin-top:26px;font-size:23px;letter-spacing:-.025em}.portfolio .app-copy>p{margin-top:12px;color:var(--muted);font-size:15px;line-height:1.75}.portfolio .app-copy>.app-platforms{color:var(--accent-strong);font-size:13px;font-weight:500}.portfolio .app-links{display:flex;flex-wrap:wrap;align-items:center;gap:10px 20px;margin-top:24px}.portfolio .button-link{display:inline-flex;align-items:center;justify-content:center;gap:16px;min-height:46px;border:1px solid var(--ink);border-radius:5px;background:var(--ink);padding:9px 16px;color:var(--page);font-weight:500;font-size:13px;text-decoration:none}.portfolio .button-link:hover{background:var(--accent-strong);border-color:var(--accent-strong);color:var(--page)}.portfolio .button-secondary{color:var(--ink);background:transparent;border-color:var(--rule)}.portfolio .app-engineering{margin-top:28px;padding-top:20px;border-top:1px solid var(--rule)}.portfolio .tech-list{display:flex;flex-wrap:wrap;gap:6px;list-style:none;padding:0;margin-top:10px}.portfolio .tech-list li{padding:3px 8px;border:1px solid var(--rule);border-radius:3px;font:11px/1.6 DM Mono,monospace}.portfolio .app-engineering>p:last-child{margin-top:10px;color:var(--muted);font-size:13px;line-height:1.7}.portfolio .app-screenshots{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px;align-items:end;justify-content:center;align-content:center;padding:28px 20px;background:var(--tint);border-top:1px solid var(--rule)}.portfolio .app-screenshots figure{min-width:0}.portfolio .screenshot-label{grid-column:1 / -1}.portfolio .app-screenshots .app-watch{grid-column:1 / -1;width:120px;justify-self:center}.portfolio .app-screenshot{display:block;position:relative;isolation:isolate}.portfolio .app-screenshot img{display:block;width:100%;height:auto}.portfolio .app-screenshot--iphone{aspect-ratio:1470 / 3000}.portfolio .app-screenshot--iphone .app-screenshot__screen{position:absolute;left:5.1020408163%;top:2.2%;width:89.7959183673%;height:95.6%;border-radius:14%/6.5%}.portfolio .app-screenshot--pixel{aspect-ratio:1198 / 2539}.portfolio .app-screenshot--pixel .app-screenshot__screen{position:absolute;left:4.7579298831%;top:2.244978338%;width:90.1502504174%;height:94.5254037022%}.portfolio .app-screenshot--watch{aspect-ratio:520 / 800}.portfolio .app-screenshot--watch .app-screenshot__screen{position:absolute;left:14.0384615385%;top:22.125%;width:71.9230769231%;height:55.75%;object-fit:contain;background:#000}.portfolio .app-screenshot .app-screenshot__bezel{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none}.portfolio .app-screenshots figcaption{margin-top:12px;color:var(--muted);font:10px/1.5 DM Mono,monospace;text-align:center}.portfolio .talk-row{display:grid;grid-template-columns:50px minmax(0,1fr);gap:14px 22px;align-items:center;min-height:0;padding-block:22px;border-block:1px solid var(--rule)}.portfolio .talk-date{color:var(--accent-strong);text-align:center;font:13px/1.5 DM Mono,monospace}.portfolio .talk-date span{display:block;color:var(--muted);font-size:11px}.portfolio .talk-copy h3{margin-top:5px;font-size:24px;letter-spacing:-.035em}.portfolio .talk-copy>p:last-child{margin-top:8px}.portfolio .talk-details{margin-top:8px;color:var(--muted);font-size:13px}.portfolio .talk-title,.portfolio .talk-summary{max-width:48ch;margin-top:12px;font-size:14px;line-height:1.6}.portfolio .talk-summary{color:var(--muted)}.portfolio .talk-session{margin-top:8px;color:var(--muted);font:11px/1.7 DM Mono,monospace}.portfolio .talk-row+.talk-row{border-top:0}.portfolio .talk-video{grid-column:2}.portfolio .label-pill{display:inline-block;border:1px solid var(--rule);border-radius:30px;padding:4px 10px;color:var(--muted);font:11px/1.5 DM Mono,monospace}.portfolio .todo{color:var(--muted);font:11px/1.7 DM Mono,monospace}.portfolio .talk-video .todo{margin-top:6px}.portfolio .section-footnote{margin-top:18px;color:var(--muted);font-size:13px}.portfolio .home-post-list{list-style:none;padding:0;border-top:1px solid var(--rule)}.portfolio .home-post-list li{border-bottom:1px solid var(--rule)}.portfolio .home-post-list a{display:grid;grid-template-columns:1fr 22px;gap:8px 16px;align-items:center;padding-block:22px;text-decoration:none}.portfolio .home-post-list time{color:var(--muted);font:11px/1.5 DM Mono,monospace}.portfolio .home-post-list h3{font-size:18px;letter-spacing:-.02em}.portfolio .post-arrow{grid-column:2;grid-row:1 / span 2;color:var(--accent)}.portfolio .rss-link{display:inline-flex;align-items:center;gap:10px;min-height:44px;margin-top:12px;color:var(--muted);font-size:12px;text-decoration:none}.portfolio .about-section{display:grid;gap:24px}.portfolio .about-copy{max-width:630px;color:var(--muted)}.portfolio .about-copy p+p{margin-top:15px}.portfolio .about-copy a{margin-top:15px;color:var(--ink)}.portfolio .contact-section{display:flex;justify-content:space-between;align-items:end;flex-wrap:wrap;gap:26px;border:1px solid var(--rule);border-radius:10px;background:var(--tint);padding:28px}.portfolio .contact-section h2{margin-top:8px;font-size:clamp(1.7rem,4vw,2.4rem)}.portfolio .contact-section h2+p{margin-top:12px;color:var(--muted);font-size:14px}.portfolio .contact-email{display:inline-block;padding-block:10px;margin-top:7px;font-size:clamp(1.3rem,4vw,1.75rem);letter-spacing:-.03em;text-decoration:none}.portfolio .contact-email span{color:var(--accent)}.portfolio .contact-cv .todo{margin-top:10px}.portfolio .site-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 24px;border-top:1px solid var(--rule);padding-block:24px 36px;color:var(--muted);font-size:11px}.portfolio .site-footer div{display:flex;gap:24px}.portfolio .site-footer a{display:inline-flex;align-items:center;gap:5px;min-height:44px;text-decoration:none}.portfolio .footer-note{display:none}.portfolio .page-heading{padding-bottom:28px;margin-bottom:32px;border-bottom:1px solid var(--rule)}.portfolio .page-heading h1,.portfolio .post-header h1{font-size:clamp(2.1rem,6vw,3.4rem);line-height:1.13;letter-spacing:-.045em;margin-block:10px 18px}.portfolio .muted,.portfolio .post-meta{color:var(--muted)}.portfolio .post-meta{display:flex;gap:8px 18px;flex-wrap:wrap;font:11px/1.7 DM Mono,monospace;margin-top:14px}.portfolio .post-list{padding:0;list-style:none}.portfolio .post-row{padding-block:26px;border-bottom:1px solid var(--rule)}.portfolio .post-row h2{font-size:23px;letter-spacing:-.03em}.portfolio .post-row h2 a{text-decoration:none}.portfolio .post-row p{margin-top:10px}.portfolio .post-header{margin-block:24px 36px}.portfolio .article-end{margin-top:48px;padding-top:24px;border-top:1px solid var(--rule)}.portfolio .prose{max-width:100%;min-height:0;margin:0;font-size:16px;line-height:1.8;overflow-wrap:anywhere}.portfolio .prose p{margin-block:1.2em}.portfolio .prose h1{font-size:clamp(2rem,6vw,3.4rem);letter-spacing:-.045em}.portfolio .prose :is(h2,h3,h4){margin-block:1.6em .7em;letter-spacing:-.025em;line-height:1.3}.portfolio .prose h2{font-size:1.65rem}.portfolio .prose h3{font-size:1.25rem}.portfolio .prose h4{font-size:1.05rem}.portfolio .prose a{color:var(--accent-strong);white-space:normal;text-decoration:underline;border:0}.portfolio .prose :is(ul,ol){margin-block:1em;padding-left:1.4em}.portfolio .prose ul{list-style:disc}.portfolio .prose ol{list-style:decimal}.portfolio .prose li{padding:0;margin-block:.4em}.portfolio .prose li:before{display:none}.portfolio .prose img{max-width:100%;height:auto;border:1px solid var(--rule);border-radius:6px}.portfolio .prose code{font-family:DM Mono,monospace;font-size:.83em;font-weight:400}.portfolio .prose :not(pre)>code{background:var(--tint);padding:.15em .35em;border-radius:3px}.portfolio .prose code:before,.portfolio .prose code:after{content:none}.portfolio .prose pre{overflow-x:auto;max-width:100%;margin-block:1.6em;padding:22px;border:1px solid var(--rule);border-radius:7px;line-height:1.8;white-space:pre;overflow-wrap:normal}.portfolio .prose pre code{display:block;min-width:max-content;white-space:inherit}.portfolio .prose blockquote{border-left:2px solid var(--accent);color:var(--muted);font-style:normal;padding-left:20px}.portfolio .prose blockquote p:before,.portfolio .prose blockquote p:after{content:none}.portfolio .prose table{display:block;overflow-x:auto;max-width:100%;border-collapse:collapse;margin-block:24px}.portfolio .prose :is(th,td){padding:10px 14px;border:1px solid var(--rule);text-align:left}@media (min-width: 640px){.portfolio .shell{width:min(1120px,calc(100% - 80px))}.portfolio .site-header{flex-wrap:nowrap}.portfolio .site-nav{order:0;width:auto;margin-left:auto;gap:24px}.portfolio .theme-toggle{margin-left:6px}.portfolio .hero{padding-block:80px}.portfolio .app-screenshots{grid-template-columns:minmax(0,220px) minmax(0,220px) minmax(0,130px);gap:24px 18px;padding:38px}.portfolio .app-screenshots .app-watch{grid-column:auto;width:100%}.portfolio .talk-row{grid-template-columns:70px minmax(0,1fr) auto;gap:24px;padding-block:28px}.portfolio .talk-video{grid-column:auto;text-align:right}.portfolio .home-post-list a{grid-template-columns:130px minmax(0,1fr) 24px;gap:20px}.portfolio .post-arrow{grid-column:auto;grid-row:auto}.portfolio .footer-note{display:inline}.portfolio .contact-section{padding:36px}}@media (min-width: 900px){.portfolio .hero{grid-template-columns:minmax(0,1fr) 250px;align-items:center;gap:60px;padding-block:88px 84px}.portfolio .hero-aside{display:block;border-left:1px solid var(--rule);padding-left:32px}.portfolio .abstract-mark{position:relative;display:flex;align-items:end;width:145px;height:84px;margin-bottom:26px}.portfolio .abstract-mark>span{position:relative;color:var(--accent);font-size:94px;line-height:.95;font-weight:500;letter-spacing:-.1em}.portfolio .abstract-mark i{position:absolute;width:78px;height:78px;border:1px solid var(--rule);border-radius:50%;left:34px;top:2px}.portfolio .abstract-mark b{z-index:1;margin-left:28px;margin-bottom:12px;font-weight:400;color:var(--accent);font-size:30px}.portfolio .hero-aside dl{display:grid;gap:14px}.portfolio .hero-aside dt{color:var(--muted);font:10px/1.6 DM Mono,monospace}.portfolio .hero-aside dd{margin:3px 0 0;font-size:13px}.portfolio .hero-aside a{text-decoration:none}.portfolio .portfolio-section{padding-block:48px 56px}.portfolio .app-copy{padding:36px}.portfolio .about-section{grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);gap:60px}}@media (min-width: 1100px){.portfolio .app-card{grid-template-columns:minmax(0,.94fr) minmax(0,1.06fr)}.portfolio .app-screenshots{grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,.65fr);border-top:0;border-left:1px solid var(--rule);padding:32px 24px;gap:24px 12px}}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}}.portfolio .arrow{display:inline-block;flex-shrink:0;vertical-align:middle;width:16px;height:16px}.portfolio .hero-links .arrow,.portfolio .contact-email .arrow,.portfolio .hero-aside .arrow{color:var(--accent)}.portfolio .abstract-mark .arrow{width:32px;height:32px}.portfolio .contact-email{display:inline-flex;align-items:center;gap:12px}.portfolio .post-row .post-meta:first-child{margin-top:0;margin-bottom:8px}.portfolio .article-end{display:flex;flex-wrap:wrap;justify-content:space-between;gap:16px}
