:root{--color-page:#fff;--color-text:#292929;--color-secondary:#676767;--color-rule:#e9e9e9;--color-surface:#f6f6f6;--color-link:#325a78;--color-focus:#325a78;--color-selection:#e1edf5;--color-brand-bloomberg:#000;--font-body:-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--text-caption:.8125rem;--text-small:.875rem;--text-body:1rem;--text-title:1.5rem;--text-case-title:clamp(1.75rem, 1.5rem + 1vw, 2.25rem);--weight-body:400;--weight-heading:600;--leading-tight:1.3;--leading-ui:1.5;--leading-body:1.65;--tracking-title:-.025em;--underline-offset:.2em;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:2.5rem;--space-8:3rem;--space-9:4rem;--space-10:5rem;--layout-width:44rem;--layout-gutter:var(--space-5);--layout-top:var(--space-10);--layout-bottom:var(--space-9);--section-gap:var(--space-7);--section-heading-gap:var(--space-3);--row-gap:var(--space-4);--row-padding:var(--space-3);--skills-label-width:12rem;--project-nav-height:var(--space-9);--project-title-space:var(--space-7);--prose-measure:66ch;--project-thumb-width:5.5rem;--project-thumb-height:4.5rem;--case-media-height:22rem;--case-media-width:36rem;--case-media-wide-height:28rem;--case-media-compact-width:22rem;--case-pair-height:24rem;--experience-logo-size:1.75rem;--logo-scale-default:1;--logo-scale-apple:1.3;--logo-scale-bloomberg:1.3;--logo-scale-research:1.15;--border-width:1px;--radius-image:.25rem;--focus-width:2px;--focus-offset:4px;--control-height:2.75rem;--duration-feedback:.14s;--duration-disclosure:.16s;--ease-feedback:ease;--ease-motion:cubic-bezier(.23, 1, .32, 1);--layer-nav:5;--layer-skip:10}@media (max-width:40em){:root{--layout-top:var(--space-8);--layout-gutter:var(--space-5);--project-thumb-width:4.5rem;--project-thumb-height:4rem;--project-title-space:var(--space-6)}}@media (max-width:25em){:root{--layout-gutter:var(--space-4);--project-thumb-width:3.5rem;--project-thumb-height:3.5rem}}
*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padding-top:var(--space-5)}body{color:var(--color-text);background:var(--color-page);font:var(--weight-body) var(--text-body)/var(--leading-body) var(--font-body);-webkit-font-smoothing:antialiased;margin:0}h1,h2,h3,p,ul,ol,dl,dd,figure{margin:0}ul,ol{padding:0;list-style:none}h1,h2,h3{font-size:inherit;font-weight:var(--weight-heading)}img,video{max-width:100%;height:auto;display:block}a{color:inherit;text-decoration-thickness:var(--border-width);text-underline-offset:var(--underline-offset)}a:hover{color:var(--color-link)}.external-link{text-decoration:none}.external-link__text{text-decoration:underline;text-decoration-thickness:var(--border-width);text-underline-offset:var(--underline-offset);text-decoration-skip-ink:none}a,button,summary{transition:color var(--duration-feedback) var(--ease-feedback)}button{font:inherit;color:inherit;cursor:pointer}:focus-visible{outline:var(--focus-width) solid var(--color-focus);outline-offset:var(--focus-offset)}::selection{background:var(--color-selection)}[hidden]{display:none!important}.portfolio,.container{width:min(var(--layout-width), calc(100% - 2 * var(--layout-gutter)));margin-inline:auto}.portfolio{padding-block:var(--layout-top) var(--layout-bottom)}.portfolio-section{margin-top:var(--section-gap)}.section-title,.label{font-size:var(--text-small);font-weight:var(--weight-heading);line-height:var(--leading-ui)}.section-title{margin-bottom:var(--section-heading-gap)}.quiet,.date{color:var(--color-secondary)}.date{font-size:var(--text-caption);font-variant-numeric:tabular-nums;white-space:nowrap}.intro h1{font-size:var(--text-title);letter-spacing:var(--tracking-title);line-height:var(--leading-tight)}.intro__credential{margin-top:var(--space-1);font-size:var(--text-small);color:var(--color-secondary)}.intro__copy{margin-top:var(--space-5);max-width:var(--prose-measure)}.intro__copy p+p{margin-top:var(--space-3)}.contact-links{gap:var(--space-5);margin-top:var(--space-3);font-size:var(--text-small);flex-wrap:wrap;display:flex}.contact-links a{min-height:var(--control-height);align-items:center;display:inline-flex}.project-list>li+li{border-top:var(--border-width) solid var(--color-rule)}.project-link{grid-template-columns:var(--project-thumb-width) minmax(0, 1fr) auto;gap:var(--row-gap);padding-block:var(--row-padding);align-items:center;text-decoration:none;display:grid}.project-link>span:not(.date){min-width:0}.project-thumb{width:var(--project-thumb-width);height:var(--project-thumb-height);padding:var(--space-1);border-radius:var(--radius-image);background:var(--color-surface);place-items:center;display:grid}.project-thumb img{object-fit:contain;width:100%;height:100%}.project-thumb .image-crop{width:min(100%, calc((var(--project-thumb-height) - 2 * var(--space-1)) * var(--crop-aspect)))}.project-name{font-size:var(--text-body);font-weight:var(--weight-heading);line-height:var(--leading-ui)}.project-description{margin-top:var(--space-1);font-size:var(--text-small);line-height:var(--leading-ui);color:var(--color-secondary);display:block}.project-link .date{padding-top:var(--space-1);align-self:start}.project-link:hover .project-name,.project-link:focus-visible .project-name{text-decoration:underline}.disclosure{margin-top:var(--space-2)}.disclosure>summary{justify-content:space-between;align-items:center;gap:var(--row-gap);width:100%;min-height:var(--control-height);padding-block:var(--space-3);font-size:var(--text-small);font-weight:var(--weight-heading);cursor:pointer;list-style:none;display:flex}.disclosure>summary:hover{color:var(--color-link)}.disclosure>summary::-webkit-details-marker{display:none}.disclosure__meta{align-items:center;gap:var(--space-3);flex-shrink:0;display:inline-flex}.disclosure__count{color:var(--color-secondary);font-size:var(--text-caption);font-weight:var(--weight-body);font-variant-numeric:tabular-nums}.disclosure__indicator{width:var(--space-4);height:var(--space-4);color:var(--color-secondary);display:inline-block;position:relative}.disclosure__indicator:before,.disclosure__indicator:after{content:"";width:var(--space-3);height:var(--border-width);background:currentColor;margin:auto;position:absolute;inset:0}.disclosure__indicator:after{transition:opacity var(--duration-feedback) var(--ease-feedback);transform:rotate(90deg)}.disclosure[open] .disclosure__indicator:after{opacity:0;transform:rotate(0)}.disclosure[data-motion=instant] .disclosure__indicator:after{transition:none}.disclosure[data-motion=pointer] .disclosure__content{transition:height var(--duration-disclosure) var(--ease-motion);overflow:hidden}.disclosure>summary:hover .disclosure__indicator{color:var(--color-link)}.disclosure--projects,.project-list--more{border-top:var(--border-width) solid var(--color-rule)}.experience-row{grid-template-columns:var(--experience-logo-size) minmax(0, 1fr) auto;gap:var(--row-gap);padding-block:var(--row-padding);display:grid}.experience-row+.experience-row{border-top:var(--border-width) solid var(--color-rule)}.experience-logo{width:var(--experience-logo-size);height:var(--experience-logo-size);justify-content:center;align-items:center;display:flex;overflow:hidden}.experience-logo img{object-fit:contain;width:100%;height:100%;transform:scale(var(--logo-scale-default))}.experience-logo--apple img{transform:scale(var(--logo-scale-apple))}.experience-logo--bloomberg{background:var(--color-brand-bloomberg);border-radius:var(--radius-image)}.experience-logo--bloomberg img{transform:scale(var(--logo-scale-bloomberg))}.experience-logo--research img{transform:scale(var(--logo-scale-research))}.experience-row h3{font-size:var(--text-small);line-height:var(--leading-ui)}.experience-role{font-size:var(--text-small);color:var(--color-secondary);line-height:var(--leading-ui)}.skills-list{border-top:var(--border-width) solid var(--color-rule);font-size:var(--text-small);line-height:var(--leading-ui)}.skills-list__row{grid-template-columns:var(--skills-label-width) minmax(0, 1fr);gap:var(--row-gap);padding-block:var(--row-padding);display:grid}.skills-list__row+.skills-list__row{border-top:var(--border-width) solid var(--color-rule)}.skills-list dt{color:var(--color-secondary);font-weight:var(--weight-heading)}.skills-list__items{gap:var(--space-1) var(--space-2);flex-wrap:wrap;display:flex}.skills-list__items li:not(:last-child):after,.tools__list .chip:not(:last-child):after{content:"·";margin-left:var(--space-2);color:var(--color-secondary)}.publication{padding-block:var(--row-padding)}.publication+.publication{border-top:var(--border-width) solid var(--color-rule)}.publication h3{font-size:var(--text-small);line-height:var(--leading-ui)}.publication .external-link__text{text-decoration:none}.publication a:hover .external-link__text,.publication a:focus-visible .external-link__text{text-decoration:underline}.publication__meta,.publication__authors{margin-top:var(--space-1);color:var(--color-secondary);font-size:var(--text-caption);line-height:var(--leading-ui)}.project-page{scroll-margin-top:var(--project-nav-height)}.project-nav{z-index:var(--layer-nav);background:var(--color-page);border-bottom:var(--border-width) solid var(--color-rule);position:sticky;top:0}.project-nav>.container{justify-content:space-between;align-items:center;gap:var(--row-gap);min-height:var(--project-nav-height);display:flex}.project-nav__back{min-height:var(--control-height);font-size:var(--text-small);flex-shrink:0;align-items:center;text-decoration:none;display:inline-flex}.project-nav__back:hover span,.project-nav__back:focus-visible span{text-decoration-skip-ink:none;text-decoration:underline}.project-nav__title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-caption);color:var(--color-secondary);overflow:hidden}.cs-hero{padding-top:var(--project-title-space);padding-bottom:var(--space-6)}.cs-hero__title{font-size:var(--text-case-title);line-height:var(--leading-tight);letter-spacing:var(--tracking-title)}.cs-hero__deck{margin-top:var(--space-3);color:var(--color-secondary);max-width:var(--prose-measure)}.cs-body{padding-bottom:var(--layout-bottom)}.cs-body h2{margin-top:var(--space-8);padding-top:var(--space-5);border-top:var(--border-width) solid var(--color-rule);line-height:var(--leading-tight)}.cs-body h2:first-child{margin-top:0}.cs-body p{margin-top:var(--space-4)}.cs-body ul{padding-left:var(--space-5);margin-top:var(--space-4);list-style:outside}.cs-body li+li{margin-top:var(--space-2)}.fig{--figure-width-limit:var(--case-media-width);--figure-height-limit:var(--case-media-height);width:min(100%, var(--figure-native-width,var(--layout-width)), var(--figure-width-limit), calc(var(--figure-height-limit) * var(--figure-aspect,2)));margin-top:var(--space-5);min-width:0;margin-inline:auto}.project-image{display:block}.image-crop{width:100%;aspect-ratio:var(--crop-ratio);display:block;position:relative;overflow:hidden}.project-image .image-crop img{width:var(--crop-width);max-width:none;height:auto;left:var(--crop-left);top:var(--crop-top);position:absolute}.fig .project-image{width:100%;aspect-ratio:var(--figure-aspect);border:var(--border-width) solid var(--color-rule);border-radius:var(--radius-image);overflow:hidden}.fig .project-image img{border:0;border-radius:0}.fig .project-image>img{object-fit:contain;height:100%}.fig .image-crop{height:100%}.fig--compact{--figure-width-limit:var(--case-media-compact-width)}.fig--wide{--figure-width-limit:var(--layout-width);--figure-height-limit:var(--case-media-wide-height)}.fig img,.fig video{background:var(--color-page);border:var(--border-width) solid var(--color-rule);border-radius:var(--radius-image);width:100%}.fig figcaption,.data-table caption{margin-top:var(--space-2);color:var(--color-secondary);font-size:var(--text-caption);line-height:var(--leading-ui);text-align:left;text-wrap:pretty}.data-table caption{caption-side:bottom;padding-top:var(--space-2)}.fig__num{margin-right:var(--space-2);font-variant-numeric:tabular-nums;white-space:nowrap;display:inline-block}.fig-pair{--pair-height:min(var(--case-pair-height), var(--pair-native-height));justify-content:center;align-items:flex-start;gap:var(--space-4);display:flex}.fig-pair>.fig{flex:var(--figure-aspect) 1 0;width:0;max-width:calc(var(--pair-height) * var(--figure-aspect));margin-inline:0}.concept-grid{gap:var(--space-4);padding:var(--space-3);border:var(--border-width) solid var(--color-rule);border-radius:var(--radius-image);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.concept-grid .project-image{aspect-ratio:auto;border:0;height:10rem}.cs-body .concept-grid__name{margin-top:var(--space-2);font-size:var(--text-small);line-height:var(--leading-ui);text-align:center;text-wrap:balance}.case-table{margin-top:var(--space-5)}.table-scroll{overflow-x:auto}.data-table{border-collapse:collapse;width:100%;font-size:var(--text-caption);line-height:var(--leading-ui);text-align:left}.data-table th,.data-table td{padding:var(--space-2);border-bottom:var(--border-width) solid var(--color-rule);vertical-align:top}.data-table th{font-weight:var(--weight-heading)}.data-table tbody th{font-weight:var(--weight-body)}.data-table .num{white-space:nowrap;font-variant-numeric:tabular-nums;font-weight:var(--weight-body)}.data-table .is-chosen{background:var(--color-surface)}.data-table tfoot{font-weight:var(--weight-heading)}.tools,.files,.deck{margin-top:var(--space-8);padding-top:var(--space-5);border-top:var(--border-width) solid var(--color-rule)}.tools__list,.files__list{gap:var(--space-2) var(--space-4);margin-top:var(--space-3);flex-wrap:wrap;display:flex}.tools__list{gap:var(--space-1) var(--space-2)}.chip{font-size:var(--text-small);color:var(--color-secondary)}.files__list a{min-height:var(--control-height);align-items:center;display:inline-flex}.files+.tools,.deck+.files{margin-top:var(--space-5);border-top:0;padding-top:0}.pager{justify-content:space-between;gap:var(--space-5);margin-top:var(--space-8);padding-top:var(--space-5);border-top:var(--border-width) solid var(--color-rule);font-size:var(--text-small);display:flex}.pager__link{min-height:var(--control-height);align-items:center;display:inline-flex}.pager__next{text-align:right;margin-left:auto}.deck__frame{margin-top:var(--space-3);border:var(--border-width) solid var(--color-rule)}.deck__slide{width:100%}.deck__frame[data-enhanced=true] .deck__slide{display:none}.deck__frame[data-enhanced=true] .deck__slide.is-active{display:block}.deck__controls{align-items:center;gap:var(--space-2);margin-top:var(--space-2);flex-wrap:wrap;display:flex}.deck__nav{min-width:var(--control-height);min-height:var(--control-height);padding:var(--space-2) var(--space-3);border:var(--border-width) solid var(--color-rule);border-radius:var(--radius-image);background:var(--color-page);font-size:var(--text-small)}.deck__nav:hover:not(:disabled){color:var(--color-link);border-color:var(--color-link)}.deck__nav:disabled{color:var(--color-secondary);cursor:default}.deck .deck__count{margin:0 0 0 var(--space-2);color:var(--color-secondary);font-size:var(--text-caption);font-variant-numeric:tabular-nums}.skip-link{top:var(--space-3);left:var(--layout-gutter);padding:var(--space-2) var(--space-3);background:var(--color-page);z-index:var(--layer-skip);transform:translateY(calc(-100% - var(--space-3) - var(--focus-offset)));position:absolute}.skip-link:focus{transform:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (max-width:40em){.concept-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.project-link{grid-template-columns:var(--project-thumb-width) minmax(0, 1fr);gap:var(--space-1) var(--row-gap)}.project-thumb{grid-area:1/1/3}.project-link>span:not(.date){grid-area:1/2}.project-link .date{grid-area:2/2;padding-top:0}.experience-row{grid-template-columns:var(--experience-logo-size) minmax(0, 1fr);gap:var(--space-1) var(--row-gap)}.experience-logo{grid-row:1/3}.experience-row .date{grid-column:2}.skills-list__row{gap:var(--space-1);grid-template-columns:minmax(0,1fr)}}@media (max-width:25em){.fig-pair{flex-direction:column;align-items:center;gap:0}.fig-pair>.fig{width:min(100%, calc(var(--pair-height) * var(--figure-aspect)));flex:none}}@media (prefers-reduced-motion:reduce){.disclosure[data-motion=pointer] .disclosure__content{transition:none}}@media print{:root{--layout-top:var(--space-4);--layout-bottom:var(--space-4)}.skip-link,.pager,.project-nav,.deck__controls{display:none}.project-link,.experience-row,.publication,.fig{break-inside:avoid}.disclosure__content{height:auto!important;transition:none!important}.disclosure__indicator:after{transition:none!important}}
