:root{--ink:#111;--muted:#565656;--paper:#faf9f6;--line:#d0cfca;--accent:#0039a6;--route:#0039a6}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:Helvetica,"Helvetica Neue",Arial,sans-serif;-webkit-font-smoothing:antialiased;font-size:16px;line-height:1.5}a{color:inherit;text-decoration:none}button{font:inherit}a,button{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible{outline:3px solid #006cca;outline-offset:5px}::selection{background:#fccc0a;color:#111}.container{width:min(1240px,calc(100% - 80px));margin-inline:auto}.skip-link{position:fixed;top:-100px;left:20px;background:#fff;padding:12px;z-index:20}.skip-link:focus{top:10px}.masthead{background:#111;color:#fff;padding:26px 0 0}.topbar{display:flex;flex-wrap:wrap;align-items:center;border-top:2px solid #fff}.wordmark{font-size:clamp(36px,5vw,68px);font-weight:700;letter-spacing:-.055em;line-height:1.05;padding:21px 0 25px;width:100%;display:flex;align-items:baseline;justify-content:space-between}.wordmark span{font-size:15px;letter-spacing:0;font-weight:400}.nav-wrap{width:100%;border-top:1px solid #666}.tabs{display:flex;justify-content:space-between;gap:16px}.tabs a{display:flex;align-items:center;gap:12px;padding:18px 0 22px;position:relative;font-size:16px;font-weight:700}.tabs a:after{position:absolute;bottom:0;left:0;right:0;height:5px;background:#fff;content:"";transform:scaleX(0)}.tabs a.active:after,.tabs a:hover:after{transform:scaleX(1)}.route-bullet{display:inline-flex;justify-content:center;align-items:center;flex-shrink:0;width:38px;height:38px;border-radius:50%;background:var(--route);color:#fff;font-size:25px;font-weight:700;line-height:1;letter-spacing:-.04em}.route-0,.route-about{--route:#0039a6}.route-1{--route:#ff6319}.route-2{--route:#00933c}.route-3{--route:#fccc0a}.route-4{--route:#b933ad}.route-1 .route-bullet,.route-3 .route-bullet{color:#111}.section-projects{--accent:#c84400}.section-cv{--accent:#007b32}.section-blog{--accent:#a77b00}.section-misc{--accent:#a02796}.menu-toggle{display:none}.location-strip{display:flex;justify-content:space-between;gap:20px;border-bottom:1px solid var(--line);padding-block:16px;font-size:12px;font-weight:700}.location-end{white-space:nowrap}.location-end span{margin-left:16px;font-size:18px}.page-grid{display:grid;grid-template-columns:220px minmax(0,1fr);gap:70px;padding-block:54px 80px}.sidebar{padding-top:6px}.profile-photo{display:block;width:160px;height:160px;object-fit:cover;border-radius:50%;filter:grayscale(1);border:6px solid #fff;box-shadow:0 4px 12px #0002;margin:0 0 22px}.profile-name{font-size:25px;letter-spacing:-.04em;font-weight:700;line-height:1.2;margin:0 0 8px}.profile-role{font-size:15px;margin:0 0 26px;color:var(--muted)}.side-link{display:flex;align-items:center;gap:9px;font-size:13px;padding:9px 0}.side-link svg{width:18px;height:18px}.side-link span:last-child{margin-left:auto}.side-link:hover{text-decoration:underline}.line-guide{border-top:5px solid #111;margin-top:30px;padding-top:8px}.line-guide p{font-size:12px;font-weight:700;margin:0 0 20px}.line-guide a{display:flex;align-items:center;gap:12px;position:relative;font-size:13px;font-weight:700;padding:12px 0}.line-guide a:before{content:"";position:absolute;left:6px;top:0;bottom:0;width:3px;background:#111}.line-guide a:first-of-type:before{top:50%}.line-guide a:last-of-type:before{bottom:50%}.stop{width:15px;height:15px;border:3px solid var(--route);background:var(--paper);border-radius:50%;z-index:1;flex-shrink:0}.line-guide a:hover{color:var(--route)}main{min-width:0}.paper{background:none;border:0;box-shadow:none;border-radius:0;padding:0}.platform-label{display:flex;gap:12px;align-items:center;font-size:13px;font-weight:700;border-top:8px solid #111;padding-top:18px;margin-bottom:28px}.direction-arrow{font-size:38px;line-height:1;margin-left:auto}.platform-label .route-bullet{width:30px;height:30px;font-size:21px}h1{font-size:clamp(44px,6vw,80px);font-weight:700;letter-spacing:-.06em;line-height:1.02;margin:0 0 32px}h2,h3{font-weight:700;line-height:1.15;letter-spacing:-.035em}.prose{font-size:18px;line-height:1.65;max-width:760px}.prose p{margin:0 0 24px}.prose strong{font-weight:700}.prose h2{font-size:28px;margin:40px 0 16px;border-top:2px solid #111;padding-top:16px}.prose h3{font-size:23px;margin:28px 0 12px}.prose a{text-decoration:underline;text-underline-offset:3px}.prose img{max-width:100%;height:auto}.prose pre{overflow:auto;padding:20px;background:#eae9e5;font-size:14px}.prose blockquote{border-left:5px solid var(--accent);margin:28px 0;padding:0 22px}.prose table{border-collapse:collapse;width:100%;font-size:15px}.prose td,.prose th{border-bottom:1px solid var(--line);text-align:left;padding:10px}.about-actions{display:flex;gap:14px;flex-wrap:wrap;margin-top:32px}.button{border:2px solid #111;border-radius:0;display:inline-flex;align-items:center;justify-content:space-between;gap:36px;padding:13px 20px;font-size:15px;font-weight:700;cursor:pointer}.raised{color:#fff;background:#111}.flat{background:transparent}.button:hover{background:var(--accent);border-color:var(--accent);color:#fff}.explore{margin-top:58px}.section-heading{border-top:5px solid #111;padding-top:12px;display:flex;align-items:baseline;justify-content:space-between;gap:20px;margin-bottom:23px}.section-heading h2{font-size:24px;margin:0}.section-heading>span{font-size:12px}.explore-grid{display:block}.explore-card{display:flex;align-items:center;gap:22px;padding:22px 0;border-top:1px solid var(--line)}.explore-card:last-child{border-bottom:1px solid var(--line)}.explore-card .route-bullet{width:52px;height:52px;font-size:35px}.explore-card h3{font-size:29px;margin:0}.text-action{margin-left:auto;font-size:36px;line-height:1}.explore-card:hover h3{text-decoration:underline;text-underline-offset:5px}.explore-card:hover .text-action{transform:translateX(3px)}.list-paper,.document-paper{border-top:8px solid #111;padding-top:28px}.entry-list{margin-top:34px}.entry{display:block;border-top:2px solid #111;padding:24px 0 30px}.entry:last-child{border-bottom:2px solid #111}.entry-meta{font-size:12px;font-weight:700;display:flex;gap:12px;align-items:center;text-transform:uppercase;letter-spacing:.04em;color:var(--accent)}.badge{display:inline-block;background:#e7e6e0;color:#333;padding:3px 7px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.entry-title{display:flex;gap:20px;justify-content:space-between;align-items:baseline}.entry-title h2{font-size:32px;margin:15px 0 10px}.entry-title>span{font-size:30px}.entry:hover h2{text-decoration:underline;text-underline-offset:4px}.entry p{font-size:16px;color:var(--muted);margin:0 0 18px}.chips{display:flex;flex-wrap:wrap;gap:8px}.chips span{border:1px solid #aaa;font-size:11px;padding:3px 8px}.back-link{display:inline-block;margin-top:30px;font-size:14px;font-weight:700;text-decoration:underline}.page-description{font-size:20px;color:var(--muted);margin-bottom:24px}.article-meta{font-size:12px;padding-bottom:20px;border-bottom:1px solid var(--line)}.document-paper>.badge{margin-bottom:20px}.footer{border-top:8px solid #111;padding-block:20px 35px;display:flex;justify-content:space-between;font-size:12px;font-weight:700}.footer a{text-decoration:underline}.empty-state{padding:25px 0;color:var(--muted)}
@media(min-width:1400px){.page-grid{gap:100px;grid-template-columns:240px minmax(0,1fr)}}
@media(max-width:1000px){.container{width:calc(100% - 48px)}.page-grid{grid-template-columns:180px minmax(0,1fr);gap:40px}.tabs a{font-size:13px;gap:9px}.route-bullet{width:32px;height:32px;font-size:23px}.explore-card h3{font-size:25px}}
@media(max-width:900px){.masthead{padding-top:16px}.topbar{justify-content:space-between}.wordmark{width:auto;font-size:36px;padding:20px 0}.wordmark span{display:none}.menu-ready .menu-toggle{display:flex;align-items:center;justify-content:center;background:transparent;border:1px solid #777;color:#fff;width:46px;height:46px}.menu-ready .nav-wrap{display:none}.menu-ready .nav-wrap.is-open{display:block}.tabs{flex-direction:column;gap:0;padding:0 0 12px}.tabs a{padding:12px 0;font-size:17px}.tabs a:after{left:auto;width:6px;height:6px;bottom:50%;border-radius:50%}.page-grid{padding-top:36px;gap:32px;grid-template-columns:160px minmax(0,1fr)}.profile-photo{width:136px;height:136px}.profile-name{font-size:23px}.prose{font-size:17px}.section-heading>span{display:none}}
@media(max-width:600px){.container{width:calc(100% - 36px)}.wordmark{font-size:32px}.location-strip{font-size:11px}.page-grid{display:flex;flex-direction:column;gap:32px;padding-top:28px;padding-bottom:48px}.sidebar{display:grid;grid-template-columns:76px 1fr;column-gap:18px;padding:0;align-items:center}.profile-photo{width:76px;height:76px;border:3px solid #fff;grid-row:1/4;margin:0}.profile-name{font-size:23px;margin:0;align-self:end}.profile-role{font-size:13px;margin:3px 0}.side-link{font-size:12px;padding:3px 0}.side-link svg{width:14px;height:14px}.side-link span:last-child{margin-left:0}.line-guide{display:none}.platform-label{margin-bottom:22px;padding-top:14px;border-top-width:6px}h1{font-size:54px;margin-bottom:24px}.prose{font-size:17px}.about-actions{gap:10px}.button{font-size:13px;padding:12px 14px;gap:16px}.explore{margin-top:38px}.explore-card{gap:16px;padding:19px 0}.explore-card h3{font-size:23px}.explore-card .route-bullet{width:42px;height:42px;font-size:29px}.text-action{font-size:28px}.entry-title h2{font-size:28px}.footer{border-top-width:6px;font-size:11px}.list-paper,.document-paper{border-top-width:6px}.location-end{display:none}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}@media print{.masthead,.sidebar,.location-strip,.footer,.about-actions,.back-link{display:none}.container{width:100%}.page-grid{display:block;padding:0}body{background:#fff;font-size:12px}.prose{font-size:12px}.document-paper{border:0}h1{font-size:32px}a{text-decoration:none}}
.prose h1{font-size:34px;line-height:1.15;margin:36px 0 20px;letter-spacing:-.035em}.prose{overflow-wrap:anywhere}.prose table{display:block;overflow-x:auto}.document-paper>h1{font-size:clamp(38px,4.5vw,64px)}.prose code{overflow-wrap:anywhere}.location-strip>span:first-child{min-width:0;overflow-wrap:anywhere}
/* Transit wayfinding arrows: a solid shaft, square corners, and 45-degree head. */
.mta-arrow{display:inline-block;width:1em;height:1em;vertical-align:-.12em;flex-shrink:0;overflow:visible}.side-link .mta-arrow{width:16px;height:16px}.line-guide .mta-arrow{width:15px;height:15px}.direction-arrow .mta-arrow{width:34px;height:34px}.button .mta-arrow{width:19px;height:19px}.text-action .mta-arrow{width:30px;height:30px}.entry-title>span{flex-shrink:0}.back-link .mta-arrow{width:17px;height:17px}.section-heading .mta-arrow{margin-left:6px}

/* A schematic route with rounded changes of direction between stops. */
.route-map{position:relative}.route-track{position:absolute;top:0;left:0;width:52px;height:240px;pointer-events:none}.line-guide .route-map a{height:48px;padding:0 0 0 56px;line-height:1.2;font-size:12px}.line-guide .route-map a:before{content:none}.route-map .stop{position:absolute;left:.5px;top:16.5px}.route-map a:nth-of-type(2) .stop,.route-map a:nth-of-type(3) .stop,.route-map a:nth-of-type(5) .stop{left:26.5px}

/* Keep each label 8px from its station circle along the curved route. */
.line-guide .route-map a{padding-left:23.5px}
.line-guide .route-map a:nth-of-type(2),.line-guide .route-map a:nth-of-type(3),.line-guide .route-map a:nth-of-type(5){padding-left:49.5px}
/* Motion follows the signage: short, deliberate movements, never a blank page. */
:root{--ease-out:cubic-bezier(.22,1,.36,1)}
.button,.menu-toggle,.side-link,.back-link,.footer a,.prose a{transition:background-color .2s ease,color .2s ease,border-color .2s ease,transform .22s var(--ease-out),box-shadow .22s ease}
.tabs a:after{transform-origin:left;transition:transform .24s var(--ease-out)}
.route-bullet,.stop{transition:transform .24s var(--ease-out),box-shadow .24s ease,background-color .2s ease}
.text-action,.entry-title>span{transition:transform .25s var(--ease-out)}
.explore-card,.entry,.line-guide a{transition:background-color .2s ease,color .2s ease}
.profile-photo{transition:box-shadow .3s ease,transform .3s var(--ease-out)}
@media(hover:hover){.button:hover{transform:translateY(-2px);box-shadow:0 4px 0 #1112}.profile-photo:hover{transform:translateY(-3px);box-shadow:0 8px 20px #0002}.tabs a:hover .route-bullet,.explore-card:hover .route-bullet{transform:scale(1.07)}.line-guide a:hover .stop{transform:scale(1.2);box-shadow:0 0 0 3px color-mix(in srgb,var(--route) 15%,transparent)}.entry:hover .entry-title>span{transform:translate(2px,-2px)}.explore-card:hover{background:#00000003}}
.button:active,.menu-toggle:active{transform:translateY(1px);box-shadow:none}.tabs a:active .route-bullet,.explore-card:active .route-bullet{transform:scale(.96)}
.button:focus-visible,.explore-card:focus-visible,.entry:focus-visible{outline-offset:5px}
@media(prefers-reduced-motion:no-preference){
 @view-transition{navigation:auto}
 .masthead{view-transition-name:site-header}.sidebar{view-transition-name:site-profile}main{view-transition-name:page-content}
 ::view-transition-group(*){animation-duration:280ms;animation-timing-function:var(--ease-out)}
 ::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}
 ::view-transition-old(site-header),::view-transition-old(site-profile){animation:none}
 ::view-transition-new(site-header),::view-transition-new(site-profile){animation:soft-reveal 180ms ease both}
 ::view-transition-old(page-content){animation:page-leave 180ms ease both}
 ::view-transition-new(page-content){animation:page-arrive 280ms var(--ease-out) both}
 @keyframes soft-reveal{from{opacity:0}to{opacity:1}}
 @keyframes page-leave{to{opacity:0;transform:translateY(-6px)}}
 @keyframes page-arrive{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
}
@media(max-width:900px){
 .menu-ready .nav-wrap{display:grid;grid-template-rows:0fr;opacity:0;visibility:hidden;border-top-color:transparent;transition:grid-template-rows .26s var(--ease-out),opacity .2s ease,visibility .26s,border-color .2s ease}
 .menu-ready .nav-wrap .tabs{overflow:hidden;min-height:0;padding:0;transition:padding .26s var(--ease-out)}
 .menu-ready .nav-wrap.is-open{display:grid;grid-template-rows:1fr;opacity:1;visibility:visible;border-top-color:#666}
 .menu-ready .nav-wrap.is-open .tabs{padding-bottom:12px}
 .menu-toggle svg{transition:transform .25s var(--ease-out)}.menu-toggle[aria-expanded=true] svg{transform:rotate(90deg)}
}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}

.profile-socials{display:grid;gap:3px;margin-top:-8px}.profile-socials .side-link{padding:6px 0;gap:9px;min-width:0}.profile-socials .icon{flex-shrink:0;width:18px;height:18px}.profile-socials .side-link span{margin-left:0;overflow-wrap:anywhere}.profile-socials .side-link:hover{color:var(--accent)}@media(max-width:600px){.profile-socials{grid-column:1/-1;margin-top:16px;gap:4px}}

.profile-socials .social-placeholder{color:var(--muted)}

/* Route lettering uses a fixed SVG baseline instead of browser-dependent line boxes. */
.route-bullet{letter-spacing:0}.route-letter{display:block;width:100%;height:100%;flex-shrink:0;overflow:visible}

/* Keep the mobile portrait and contact links at opposite ends of one row. */
@media (max-width:600px) {
  .sidebar { grid-template-columns:76px minmax(0,1fr); align-items:center; }
  .sidebar .profile-name,.sidebar .profile-role { display:none; }
  .sidebar .profile-photo { grid-column:1; grid-row:1; margin:0; }
  .sidebar .profile-socials { grid-column:2; grid-row:1; justify-self:end; margin:0; gap:2px; }
}

/* Personal routes use station dots and continuous colored track. */
.personal-routes{columns:2;column-gap:36px;margin-top:28px}
.personal-route{--route:#b933ad;display:inline-block;width:100%;break-inside:avoid;vertical-align:top;margin-bottom:28px;border-top:5px solid var(--ink);padding-top:14px;min-width:0}
.bike-route{--route:#00933c}
.personal-route-heading{display:flex;align-items:center;gap:10px}
.personal-route-heading .route-bullet{width:44px;height:44px}
.personal-route-heading h2{font-size:27px;margin:0}
.personal-stops{list-style:none;padding:0 0 0 10px;margin:8px 0 0}
.personal-stops li{position:relative;display:flex;align-items:center;gap:14px;padding:9px 0;font-size:20px;font-weight:700;line-height:1.2}
.personal-stops li:before{content:"";position:absolute;left:9px;top:0;bottom:0;width:6px;background:var(--route)}
.personal-stops li:first-child:before{top:50%}
.personal-stops li:last-child:before{bottom:50%}
.personal-station{position:relative;flex:none;width:24px;height:24px;border:5px solid var(--route);border-radius:50%;background:var(--paper)}
.personal-stops li>span:last-child{overflow-wrap:anywhere}
.route-pending{color:var(--muted);padding:24px 0}

/* The 24px stations and 6px track share the 44px route icon's center at x=22px. */
.cities-route{--route:#0039a6}

@media(max-width:700px){.personal-routes{columns:1}}

.games-route{--route:#ff6319}.games-route .route-bullet{color:#111}
