.Button-module__8RiFmG__button{justify-content:center;align-items:center;gap:var(--space-2);border-radius:var(--radius-full);font:inherit;font-size:var(--text-md);white-space:nowrap;cursor:pointer;appearance:none;transition:background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast);border:1px solid #0000;font-weight:600;line-height:1;text-decoration:none;display:inline-flex}.Button-module__8RiFmG__button:hover{transform:translateY(-1px)}.Button-module__8RiFmG__button:disabled,.Button-module__8RiFmG__button[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none;box-shadow:none;transform:none}.Button-module__8RiFmG__primary{background:var(--accent);color:#fff}.Button-module__8RiFmG__primary:hover{background:var(--accent-hover)}.Button-module__8RiFmG__secondary{color:var(--foreground-1);border-color:var(--border);background:0 0}.Button-module__8RiFmG__secondary:hover{background:var(--surface-2);border-color:var(--foreground-2)}.Button-module__8RiFmG__surface{background:var(--surface-2);color:var(--foreground-1);border-color:var(--border)}.Button-module__8RiFmG__surface:hover{background:var(--surface-3);border-color:var(--foreground-2)}.Button-module__8RiFmG__ghost{color:var(--foreground-2);background:0 0}.Button-module__8RiFmG__ghost:hover{background:var(--surface-2);color:var(--foreground-1)}.Button-module__8RiFmG__sm{min-height:32px;padding:8px var(--space-4);font-size:var(--text-sm)}.Button-module__8RiFmG__md{min-height:48px;padding:14px var(--space-7)}.Button-module__8RiFmG__lg{min-height:56px;padding:16px var(--space-8);font-size:var(--text-lg)}.Button-module__8RiFmG__icon{width:40px;height:40px;padding:0}.Button-module__8RiFmG__fab{width:56px;height:56px;box-shadow:var(--shadow-md);border-radius:50%;padding:0}.Button-module__8RiFmG__fab:hover{box-shadow:var(--shadow-lg);transform:scale(1.05)}.Button-module__8RiFmG__fullWidth{width:100%}
.Card-module__b6YjYG__card{border:1px solid var(--border);border-radius:var(--radius-lg)}.Card-module__b6YjYG__none{padding:0}.Card-module__b6YjYG__panel{background:var(--surface-1);box-shadow:var(--shadow-lg)}.Card-module__b6YjYG__elevated{background:var(--surface-3)}.Card-module__b6YjYG__md{padding:var(--space-6)}.Card-module__b6YjYG__lg{padding:var(--space-8)}.Card-module__b6YjYG__interactive{transition:transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base)}.Card-module__b6YjYG__interactive:hover{box-shadow:var(--shadow-lg);border-color:var(--accent-soft);transform:translateY(-4px)}
.AskJohn-module__WCZ-RG__fab{bottom:var(--space-7);right:var(--space-7);z-index:200;font-size:var(--text-3xl);position:fixed}.AskJohn-module__WCZ-RG__panel{bottom:100px;right:var(--space-7);z-index:200;width:380px;max-height:520px;animation:AskJohn-module__WCZ-RG__slideUp var(--transition-base);flex-direction:column;display:flex;position:fixed;overflow:hidden}@keyframes AskJohn-module__WCZ-RG__slideUp{0%{opacity:0;transform:translateY(var(--space-3))}to{opacity:1;transform:translateY(0)}}.AskJohn-module__WCZ-RG__header{padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;display:flex}.AskJohn-module__WCZ-RG__headerTitle{font-size:var(--text-md);color:var(--foreground-1);align-items:center;gap:var(--space-2);font-weight:650;display:flex}.AskJohn-module__WCZ-RG__headerDot{width:var(--space-2);height:var(--space-2);background:var(--success);border-radius:50%}.AskJohn-module__WCZ-RG__closeBtn{width:32px;height:32px}.AskJohn-module__WCZ-RG__messages{padding:var(--space-5);gap:var(--space-4);flex-direction:column;flex:1;min-height:280px;display:flex;overflow-y:auto}.AskJohn-module__WCZ-RG__message{max-width:85%;padding:10px var(--space-4);border-radius:var(--radius-md);font-size:var(--text-base);line-height:1.6}.AskJohn-module__WCZ-RG__bot{background:var(--surface-2);color:var(--foreground-1);border-bottom-left-radius:var(--space-1);align-self:flex-start}.AskJohn-module__WCZ-RG__user{background:var(--accent);color:#fff;border-bottom-right-radius:var(--space-1);align-self:flex-end}.AskJohn-module__WCZ-RG__typing{background:var(--surface-2);padding:10px var(--space-4);border-radius:var(--radius-md);border-bottom-left-radius:var(--space-1);align-self:flex-start;gap:var(--space-1);align-items:center;display:flex}.AskJohn-module__WCZ-RG__typingDot{background:var(--foreground-2);border-radius:50%;width:6px;height:6px;animation:1.4s infinite AskJohn-module__WCZ-RG__typingBounce}.AskJohn-module__WCZ-RG__typingDot:nth-child(2){animation-delay:.2s}.AskJohn-module__WCZ-RG__typingDot:nth-child(3){animation-delay:.4s}@keyframes AskJohn-module__WCZ-RG__typingBounce{0%,60%,to{opacity:.4;transform:translateY(0)}30%{transform:translateY(calc(-1 * var(--space-1)));opacity:1}}.AskJohn-module__WCZ-RG__inputRow{padding:var(--space-3);border-top:1px solid var(--border);gap:var(--space-2);display:flex}.AskJohn-module__WCZ-RG__input{border:1px solid var(--border);border-radius:var(--radius-full);background:var(--surface-2);color:var(--foreground-1);font-size:var(--text-base);transition:border-color var(--transition-fast);outline:none;flex:1;padding:10px 14px;font-family:inherit}.AskJohn-module__WCZ-RG__input::placeholder{color:var(--foreground-2)}.AskJohn-module__WCZ-RG__input:focus{border-color:var(--accent)}.AskJohn-module__WCZ-RG__sendBtn{width:var(--space-10);height:var(--space-10);flex-shrink:0}@media (max-width:640px){.AskJohn-module__WCZ-RG__panel{right:var(--space-3);left:var(--space-3);width:auto;max-height:60vh;bottom:92px}.AskJohn-module__WCZ-RG__fab{bottom:var(--space-5);right:var(--space-5)}}
.Container-module__DjgGgG__container{width:100%;max-width:var(--max-width);margin:0 auto}
.Section-module__BZ7-0a__section{padding:var(--section-padding)}.Section-module__BZ7-0a__surface{background:var(--surface-2)}.Section-module__BZ7-0a__centered{text-align:center;flex-direction:column;align-items:center;display:flex}@media (max-width:640px){.Section-module__BZ7-0a__section{padding:var(--section-padding-mobile)}}
.SectionHeader-module__1WsNmG__header{margin-bottom:var(--space-16)}.SectionHeader-module__1WsNmG__label{font-size:var(--text-sm);letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:var(--space-3);font-weight:600;font-family:var(--font-geist-mono)}.SectionHeader-module__1WsNmG__heading{letter-spacing:-.025em;color:var(--foreground-1);font-size:clamp(28px,4vw,44px);font-weight:700}
.Contact-module__jrtZaW__subtitle{font-size:clamp(16px, 2vw, var(--text-lg));color:var(--foreground-2);max-width:520px;margin-top:calc(-1 * var(--space-10));margin-bottom:var(--space-12);line-height:1.7}.Contact-module__jrtZaW__links{gap:var(--space-4);flex-wrap:wrap;justify-content:center;align-items:flex-start;display:flex}.Contact-module__jrtZaW__linkIcon{font-size:var(--text-lg);display:inline-flex}.Contact-module__jrtZaW__githubMenu{position:relative}.Contact-module__jrtZaW__githubSummary{cursor:pointer;align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-5);border-radius:var(--radius-pill);border:1px solid var(--line-soft);background:color-mix(in srgb, var(--surface-elev-1) 90%, transparent);color:var(--foreground);font-weight:600;line-height:1;list-style:none;display:inline-flex}.Contact-module__jrtZaW__githubSummary::-webkit-details-marker{display:none}.Contact-module__jrtZaW__caret{font-size:var(--text-xs);opacity:.8;transition:transform .18s}.Contact-module__jrtZaW__githubMenu[open] .Contact-module__jrtZaW__caret{transform:rotate(180deg)}.Contact-module__jrtZaW__githubOptions{top:calc(100% + var(--space-2));z-index:12;gap:var(--space-2);min-width:260px;padding:var(--space-3);border-radius:var(--radius-lg);border:1px solid var(--line-soft);background:var(--surface-elev-2);box-shadow:var(--shadow-md);display:grid;position:absolute;left:0}.Contact-module__jrtZaW__githubOption{justify-content:flex-start}@media (max-width:640px){.Contact-module__jrtZaW__links{flex-direction:column;align-items:stretch;width:100%}.Contact-module__jrtZaW__githubMenu{width:100%}.Contact-module__jrtZaW__githubSummary{justify-content:center;width:100%}.Contact-module__jrtZaW__githubOptions{margin-top:var(--space-2);width:100%;min-width:0;position:static}}
.Tag-module__1yBGQG__tag{padding:var(--space-1) var(--space-3);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:500;line-height:1;font-family:var(--font-geist-mono);justify-content:center;align-items:center;display:inline-flex}.Tag-module__1yBGQG__subtle{background:var(--surface-3);color:var(--foreground-2)}.Tag-module__1yBGQG__outline{background:var(--surface-2);color:var(--foreground-2);border:1px solid var(--border)}
.Experience-module__LTrrqW__timeline{--line-width:3px;--line-color:var(--surface-hairline);--trunk-x:14px;--curve-width:52px;--curve-height:32px;--node-size:14px;--node-y:18px;--node-center-y:calc(var(--node-y) + (var(--node-size) / 2));--rail-width:calc(var(--trunk-x) + var(--curve-width) + var(--node-size) + var(--space-4));flex-direction:column;gap:0;display:flex}.Experience-module__LTrrqW__entry{min-height:72px;padding-left:var(--rail-width);padding-bottom:var(--space-12);position:relative}.Experience-module__LTrrqW__last{padding-bottom:0}.Experience-module__LTrrqW__node,.Experience-module__LTrrqW__nodeActive{left:calc(var(--trunk-x) + var(--curve-width) - (var(--node-size) / 2));top:var(--node-y);width:var(--node-size);height:var(--node-size);background:var(--surface-1);border:var(--line-width) solid var(--accent);z-index:1;border-radius:50%;position:absolute}.Experience-module__LTrrqW__nodeActive{background:var(--accent);box-shadow:0 0 0 var(--space-1) var(--accent-soft)}.Experience-module__LTrrqW__gap{left:var(--trunk-x);top:var(--node-center-y);bottom:calc(-1 * var(--node-center-y));width:var(--curve-width);box-sizing:border-box;pointer-events:none;position:absolute}.Experience-module__LTrrqW__gap:before{content:"";inset:calc(-.5 * var(--line-width));border-left:var(--line-width) solid var(--line-color);border-top:var(--line-width) solid var(--line-color);border-bottom:var(--line-width) solid var(--line-color);border-top-left-radius:calc(var(--curve-height) + (.5 * var(--line-width)));border-bottom-left-radius:calc(var(--curve-height) + (.5 * var(--line-width)));position:absolute}.Experience-module__LTrrqW__role{font-size:var(--text-xl);color:var(--foreground-1);margin-bottom:var(--space-1);font-weight:650}.Experience-module__LTrrqW__company{font-size:var(--text-md);color:var(--accent);margin-bottom:var(--space-1);font-weight:500}.Experience-module__LTrrqW__companyLink{font-size:var(--text-md);color:var(--accent);margin-bottom:var(--space-1);transition:color var(--transition-base), opacity var(--transition-base);font-weight:500;text-decoration:none;display:inline-block}.Experience-module__LTrrqW__companyLink:hover,.Experience-module__LTrrqW__companyLink:focus-visible{color:var(--foreground-1)}.Experience-module__LTrrqW__period{font-size:var(--text-sm);color:var(--foreground-2);margin-bottom:var(--space-3);font-family:var(--font-geist-mono)}.Experience-module__LTrrqW__description{font-size:var(--text-md);color:var(--foreground-2);max-width:560px;line-height:1.7}.Experience-module__LTrrqW__tags{gap:var(--space-2);margin-top:var(--space-4);flex-wrap:wrap;display:flex}@media (max-width:640px){.Experience-module__LTrrqW__heading{margin-bottom:var(--space-12)}.Experience-module__LTrrqW__timeline{--trunk-x:10px;--curve-width:40px;--curve-height:26px;--node-size:12px;--node-y:16px}.Experience-module__LTrrqW__entry{min-height:64px;padding-left:var(--rail-width)}}
.Hero-module__V8GbHW__hero{min-height:100vh;padding:var(--space-30) var(--space-6) var(--space-20);justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.Hero-module__V8GbHW__hero:before{content:"";background:radial-gradient(circle, var(--accent-soft) 0%, transparent 70%);pointer-events:none;border-radius:50%;width:600px;height:600px;animation:20s ease-in-out infinite Hero-module__V8GbHW__drift;position:absolute;top:-40%;right:-20%}@keyframes Hero-module__V8GbHW__drift{0%,to{transform:translate(0)}50%{transform:translate(-40px,30px)}}.Hero-module__V8GbHW__inner{gap:var(--space-8);flex-direction:column;display:flex}.Hero-module__V8GbHW__heading{letter-spacing:-.03em;color:var(--foreground-1);max-width:720px;font-size:clamp(40px,6vw,72px);font-weight:700;line-height:1.05}.Hero-module__V8GbHW__highlight{background:linear-gradient(135deg, var(--accent), var(--info));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.Hero-module__V8GbHW__subtitle{font-size:clamp(17px, 2vw, var(--text-xl));color:var(--foreground-2);max-width:560px;line-height:1.7}.Hero-module__V8GbHW__actions{gap:var(--space-4);padding-top:var(--space-2);flex-wrap:wrap;display:flex}@media (max-width:640px){.Hero-module__V8GbHW__hero{padding:100px var(--space-5) 60px}.Hero-module__V8GbHW__actions{flex-direction:column}}
.TextLink-module__0J5utG__link{transition:color var(--transition-fast), opacity var(--transition-fast);align-items:center;gap:6px;font-weight:500;text-decoration:none;display:inline-flex;position:relative}.TextLink-module__0J5utG__muted{color:var(--foreground-2)}.TextLink-module__0J5utG__muted:hover{color:var(--foreground-1)}.TextLink-module__0J5utG__accent{color:var(--accent);font-weight:600}.TextLink-module__0J5utG__accent:hover{opacity:.8}.TextLink-module__0J5utG__foreground{color:var(--foreground-1)}.TextLink-module__0J5utG__foreground:hover{color:var(--accent)}.TextLink-module__0J5utG__sm{font-size:var(--text-sm)}.TextLink-module__0J5utG__md{font-size:var(--text-base)}.TextLink-module__0J5utG__lg{font-size:var(--text-md)}.TextLink-module__0J5utG__underlineNone:after,.TextLink-module__0J5utG__underlineSlide:after{content:"";border-radius:1px;height:2px;position:absolute;bottom:-4px;left:0;right:0}.TextLink-module__0J5utG__underlineNone:after{display:none}.TextLink-module__0J5utG__underlineSlide:after{transition:transform var(--transition-fast);background:currentColor;transform:scaleX(0)}.TextLink-module__0J5utG__underlineSlide:hover:after{transform:scaleX(1)}.TextLink-module__0J5utG__endIcon{transition:transform var(--transition-fast);display:inline-flex}.TextLink-module__0J5utG__animateEndIcon:hover .TextLink-module__0J5utG__endIcon{transform:translate(3px)}
.Projects-module__pLryWq__grid{gap:var(--space-6);grid-template-columns:repeat(auto-fill,minmax(340px,1fr));display:grid}.Projects-module__pLryWq__card{gap:var(--space-4);flex-direction:column;display:flex}.Projects-module__pLryWq__cardTitle{font-size:var(--text-xl);color:var(--foreground-1);font-weight:650}.Projects-module__pLryWq__cardDescription{font-size:var(--text-md);color:var(--foreground-2);flex:1;line-height:1.7}.Projects-module__pLryWq__cardTags{gap:var(--space-2);flex-wrap:wrap;display:flex}.Projects-module__pLryWq__cardLinks{gap:var(--space-4);padding-top:var(--space-2);display:flex}.Projects-module__pLryWq__cardLink{font-weight:600}@media (max-width:640px){.Projects-module__pLryWq__grid{grid-template-columns:1fr}}
.Publications-module__SbNDlW__grid{gap:var(--space-6);grid-template-columns:repeat(auto-fill,minmax(340px,1fr));display:grid}.Publications-module__SbNDlW__card{gap:var(--space-4);flex-direction:column;display:flex}.Publications-module__SbNDlW__status{font-size:var(--text-xs);letter-spacing:.12em;text-transform:uppercase;color:var(--accent);font-family:var(--font-geist-mono)}.Publications-module__SbNDlW__cardTitle{font-size:var(--text-xl);color:var(--foreground-1);font-weight:650}.Publications-module__SbNDlW__cardDescription{font-size:var(--text-md);color:var(--foreground-2);flex:1;line-height:1.7}.Publications-module__SbNDlW__cardTags{gap:var(--space-2);flex-wrap:wrap;display:flex}.Publications-module__SbNDlW__cardLinks{gap:var(--space-4);padding-top:var(--space-2);display:flex}.Publications-module__SbNDlW__cardLink{font-weight:600}@media (max-width:640px){.Publications-module__SbNDlW__grid{grid-template-columns:1fr}}
.IconLink-module__d7stFW__link{transition:color var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);justify-content:center;align-items:center;line-height:1;display:inline-flex}.IconLink-module__d7stFW__link:hover{transform:translateY(-1px)}.IconLink-module__d7stFW__muted{color:var(--foreground-2)}.IconLink-module__d7stFW__muted:hover{color:var(--foreground-1)}.IconLink-module__d7stFW__accent{color:var(--accent)}.IconLink-module__d7stFW__accent:hover{color:var(--accent-hover)}.IconLink-module__d7stFW__surface{color:var(--foreground-2);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-full)}.IconLink-module__d7stFW__surface:hover{color:var(--foreground-1);background:var(--surface-3);border-color:var(--foreground-2)}.IconLink-module__d7stFW__sm{width:28px;height:28px}.IconLink-module__d7stFW__md{width:36px;height:36px}.IconLink-module__d7stFW__lg{width:44px;height:44px}
.SiteFooter-module__ANLC9q__footer{padding:var(--space-12) var(--space-6) var(--space-10);border-top:1px solid var(--border)}.SiteFooter-module__ANLC9q__footerInner{align-items:center;gap:var(--space-5);flex-direction:column;display:flex}.SiteFooter-module__ANLC9q__footerLinks{gap:var(--space-6);display:flex}.SiteFooter-module__ANLC9q__footerSocial{gap:var(--space-4);display:flex}.SiteFooter-module__ANLC9q__footerCopy{font-size:var(--text-sm);color:var(--foreground-2);font-family:var(--font-geist-mono)}
.SiteNav-module__Y-OJpq__nav{z-index:100;padding:0 var(--space-6);transition:background var(--transition-base), box-shadow var(--transition-base);position:fixed;top:0;left:0;right:0}.SiteNav-module__Y-OJpq__scrolled{background:var(--glass);-webkit-backdrop-filter:blur(16px);box-shadow:var(--shadow-sm);border-bottom:1px solid var(--border)}.SiteNav-module__Y-OJpq__inner{height:var(--nav-height);justify-content:space-between;align-items:center;display:flex}.SiteNav-module__Y-OJpq__logo{font-weight:700;font-size:var(--text-lg);color:var(--foreground-1);letter-spacing:-.02em}.SiteNav-module__Y-OJpq__logoAccent{color:var(--accent)}.SiteNav-module__Y-OJpq__links{gap:var(--space-8);display:flex}.SiteNav-module__Y-OJpq__link{font-size:var(--text-base)}.SiteNav-module__Y-OJpq__mobileToggle{display:none}.SiteNav-module__Y-OJpq__actions{align-items:center;gap:var(--space-3);display:flex}@media (max-width:640px){.SiteNav-module__Y-OJpq__links{display:none}.SiteNav-module__Y-OJpq__linksOpen{top:var(--nav-height);background:var(--glass);-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--border);padding:var(--space-4) var(--space-6);gap:var(--space-5);flex-direction:column;display:flex;position:absolute;left:0;right:0}.SiteNav-module__Y-OJpq__mobileToggle{display:block}}
.ThemeToggle-module__jVUVKq__toggle{view-transition-name:ThemeToggle-module__jVUVKq__theme-toggle;flex-shrink:0;width:36px;height:36px;overflow:hidden}.ThemeToggle-module__jVUVKq__iconWrap{width:var(--text-lg);height:var(--text-lg);transform-origin:50% 27.5px;transition:transform 1s cubic-bezier(.4,0,.2,1);position:relative}.ThemeToggle-module__jVUVKq__sun,.ThemeToggle-module__jVUVKq__moon{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.ThemeToggle-module__jVUVKq__moon{transform:translateY(36px)rotate(180deg)}
@property --reveal{syntax:"<angle>";inherits:false;initial-value:0deg}::view-transition-old(root){animation-duration:.675s;animation-timing-function:linear}::view-transition-new(root){animation-duration:.675s;animation-timing-function:linear}::view-transition-old(theme-toggle){animation:none}::view-transition-new(theme-toggle){animation:none}::view-transition-old(root){z-index:-1;animation-name:vt-hold}::view-transition-new(root){-webkit-mask:conic-gradient(from 280deg at 50% 200%, #000 0deg, #000 var(--reveal), transparent calc(var(--reveal) + 30deg), transparent 360deg);mask:conic-gradient(from 280deg at 50% 200%, #000 0deg, #000 var(--reveal), transparent calc(var(--reveal) + 30deg), transparent 360deg);animation:.675s linear forwards arc-sweep,.675s vt-hold}@keyframes arc-sweep{0%{--reveal:0deg}to{--reveal:130deg}}@keyframes vt-hold{0%{opacity:1}to{opacity:1}}
