@font-face{font-family:'Space Grotesk';src:url('assets/space-grotesk-latin-400-normal.woff2') format('woff2');font-weight:400;font-display:swap}@font-face{font-family:'Space Grotesk';src:url('assets/space-grotesk-latin-600-normal.woff2') format('woff2');font-weight:600;font-display:swap}@font-face{font-family:'Source Sans 3';src:url('assets/source-sans-3-latin-400-normal.woff2') format('woff2');font-weight:400;font-display:swap}@font-face{font-family:'Source Sans 3';src:url('assets/source-sans-3-latin-600-normal.woff2') format('woff2');font-weight:600;font-display:swap}
:root{color-scheme:dark;--page:#0c0b13;--nav:#100d19;--surface:linear-gradient(140deg,#191320,#141019);--border:#30223c;--text:#f2edf8;--muted:#9a91ac;--accent:#a755f7;--heading:'Space Grotesk',sans-serif;--body:'Source Sans 3',sans-serif;font-family:var(--body);font-size:16px;color:var(--text);background:var(--page)}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:30px;scrollbar-color:#5d3c70 #100d19}body{margin:0;font-size:1.125rem;line-height:1.55}::selection{background:#63318a;color:#f2edf8}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-track{background:#100d19}::-webkit-scrollbar-thumb{background:#5d3c70;border:2px solid #100d19;border-radius:8px}a{color:inherit;text-decoration:none}a,summary{touch-action:manipulation}a:focus-visible,summary:focus-visible{outline:2px solid #d29bff;outline-offset:6px;border-radius:2px}h1,h2,h3,p,figure{margin:0}h1,h2,h3{font-family:var(--heading);font-weight:400;line-height:1.12;letter-spacing:-.045em}h2{font-size:2.25rem}h3{font-size:1.75rem}p{color:var(--muted)}.wrap{width:min(1224px,calc(100% - 96px));margin-inline:auto}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;left:20px;top:-100px;padding:12px 18px;background:#a755f7;color:#fff;z-index:10}.skip-link:focus{top:16px}.header{background:var(--nav);border-bottom:1px solid var(--border)}.header-inner{display:flex;justify-content:space-between;align-items:center;gap:30px;min-height:92px}.brand{display:flex;align-items:center;gap:12px;font:600 1.1rem var(--heading);letter-spacing:-.05em;min-height:44px}.brand svg{width:32px;height:32px;color:var(--accent);flex-shrink:0}.brand-tail{color:var(--muted);font-weight:400}.header nav{display:flex;align-items:center;gap:30px;font-size:1rem}.header nav>a{display:flex;align-items:center;gap:10px;min-height:44px;color:#c8bdd7}.header nav>a:hover{color:#d6a5ff}.header .index-link{margin-left:22px;color:var(--text)}.index-link>span{font-size:.75rem;color:#c5a2df;border:1px solid #553562;border-radius:3px;padding:0 5px}.intro{display:grid;grid-template-columns:1.45fr 1fr;align-items:center;gap:80px;padding-block:56px 60px}.intro h1{font-size:clamp(2.55rem,4.05vw,3.8rem);font-weight:600;line-height:1.1;letter-spacing:-.055em}.intro h1>span{color:#c890f6}.intro-copy>p:first-child{color:#c1b6d1;font-size:1.125rem;line-height:1.65}.intro-note{font-size:.9375rem;line-height:1.6;margin-top:15px;max-width:370px}.sys-section{border-top:1px solid #68407e;padding-top:29px;padding-bottom:80px}.sys-heading{display:flex;align-items:center;gap:25px}.sys-heading h2{font-size:2.55rem;font-weight:600;letter-spacing:-.065em}.title-period{color:#dc5481}.section-number{font:400 .875rem var(--heading);color:#ab86bf;align-self:flex-start;padding-top:7px}.project-kind{font-size:.9375rem;line-height:1.5;color:#ab9bbb;margin-top:9px}.separator{color:#674b7a;padding:0 8px}.sys-heading>.status{margin-left:auto}.status{display:inline-flex;align-items:center;justify-content:center;align-self:start;font-size:.875rem;font-weight:600;line-height:1.3;color:#d6b1ef;border:1px solid #573663;background:#21152c;padding:6px 10px;border-radius:3px;white-space:nowrap}.status.working{color:#d5b6f7;background:#22172d;border-color:#4b305f}.status.playable{color:#a6d3ba;background:#15291f;border-color:#365344}.status.packaged{color:#e1c099;background:#2b201a;border-color:#65472e}.status.private{color:#d5aacb;background:#2a1926;border-color:#5c3752}.sys-layout{display:grid;grid-template-columns:1fr 1.16fr;gap:100px;padding:40px 0 30px}.sys-copy .lead{font:400 clamp(1.65rem,2.4vw,2.1rem)/1.3 var(--heading);letter-spacing:-.035em;color:#d8cde6}.lead strong{font-weight:400;color:#f2edf8}.sys-copy>p:not(.lead):not(.access-note){margin-top:20px;max-width:440px;line-height:1.7}.button{display:inline-flex;align-items:center;justify-content:space-between;gap:30px;min-height:48px;padding:12px 18px;font:600 1rem var(--body);border-radius:4px}.button.primary{background:linear-gradient(110deg,#863bef,#c43668);border:1px solid #be73e040}.button.primary:hover{background:linear-gradient(110deg,#9548ff,#dc3f6b)}.button>span[aria-hidden]{font-size:21px}.sys-copy .button{margin-top:25px}.access-note{font-size:.875rem;margin-top:10px}.sys-capabilities{border-top:1px solid var(--border)}.sys-capabilities>div{display:grid;grid-template-columns:54px 1fr;gap:22px;padding:25px 0;border-bottom:1px solid var(--border)}.cap-code{font:600 .8125rem var(--heading);letter-spacing:.08em;color:#b982dd;padding-top:4px}.sys-capabilities h3{font-size:1.25rem;letter-spacing:-.03em;color:#e5d8f1}.sys-capabilities p{font-size:1rem;line-height:1.65;margin-top:7px;max-width:370px}.build-notes{border-top:1px solid var(--border);margin-top:22px}.build-notes summary{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:48px;padding:10px 0;list-style:none;font-weight:600;font-size:1rem;color:#c8a6e4}.build-notes summary::-webkit-details-marker{display:none}.build-notes summary:hover{color:#e2b9ff}.plus{font-family:var(--heading);font-weight:400;font-size:22px;line-height:1;transition:transform .18s}.build-notes[open] .plus{transform:rotate(45deg)}.detail-body{padding:8px 0 20px;font-size:1rem;color:#bfb0ce;line-height:1.65}.detail-body ul{margin:0;padding-left:20px;max-width:800px}.detail-body li{margin-bottom:7px}.detail-body .next{font-size:.9375rem;line-height:1.6;margin-top:18px;padding-left:15px;border-left:2px solid #69427d;max-width:800px;color:#a998b9}.sys-project>.build-notes{margin-top:0}.sys-project>.build-notes summary{justify-content:flex-start;gap:25px}.sys-project>.build-notes .detail-body{margin-left:46px}.games-section{background:var(--surface);border-block:1px solid var(--border);padding:62px 0 70px}.section-heading{display:grid;grid-template-columns:1.1fr 1fr;gap:110px;align-items:end;margin-bottom:44px}.section-heading h2{font-size:2.35rem;line-height:1.18}.section-heading>p{max-width:420px;line-height:1.65}.hunt-project{display:grid;grid-template-columns:1.65fr 1fr;gap:48px;align-items:center}.game-image{overflow:hidden}.game-image img{display:block;width:100%;height:auto;aspect-ratio:1.6;object-fit:cover}.game-image figcaption{display:flex;justify-content:space-between;gap:15px;padding-top:10px;font-size:.8125rem;color:#b0a0be}.game-image figcaption>span:first-child{color:#d4c6e1}.game-copy .project-kind{font-size:.9375rem;margin:0 0 15px}.game-copy h3{font-size:2.45rem;letter-spacing:-.055em}.game-copy .project-hook{font:400 1.125rem var(--heading);letter-spacing:-.03em;color:#dbcbe9;margin:14px 0 17px}.game-copy>p:not(.project-kind):not(.project-hook){font-size:1.0625rem;line-height:1.75}.game-copy>.status{margin-top:22px}.camp-project{display:grid;grid-template-columns:1fr 1.28fr;gap:80px;align-items:center;margin-top:70px;padding-left:102px}.camp-project .game-copy h3{font-size:2rem}.camp-project .game-copy>p{max-width:395px}.engineering-section{padding:85px 0 75px}.project-row{display:grid;grid-template-columns:1fr 1.5fr auto;gap:40px;align-items:start;border-top:1px solid var(--border);padding:29px 0}.project-row:last-child{border-bottom:1px solid var(--border)}.row-title h3{font-size:1.625rem;letter-spacing:-.045em;line-height:1.25}.row-title .project-kind{font-size:.875rem;max-width:240px;margin-top:10px}.row-content>p{font-size:1.0625rem;line-height:1.75;max-width:550px}.row-content .build-notes{border-top:0;margin-top:9px}.row-content .build-notes summary{justify-content:flex-start;gap:30px;font-size:.9375rem;min-height:44px}.project-row>.status{font-size:.8125rem;margin-top:3px}.web-section{padding-bottom:85px}.web-section>.section-heading{border-top:1px solid #67447a;padding-top:44px;margin-bottom:45px}.python-project{display:grid;grid-template-columns:.8fr 1.35fr 1fr;gap:48px;padding-bottom:50px;align-items:start}.python-heading h3{font-size:2rem;letter-spacing:-.055em}.small-title{display:block;font:400 1rem var(--body);letter-spacing:0;color:var(--muted);margin-top:9px}.python-heading>.status{margin-top:20px}.python-copy .project-hook{font:400 1.6rem/1.3 var(--heading);letter-spacing:-.045em;color:#dfd3ea}.python-copy>p:not(.project-hook){margin-top:19px;font-size:1.0625rem;line-height:1.75}.text-link{display:inline-flex;align-items:center;gap:15px;font-size:1rem;font-weight:600;color:#d1a7f3;min-height:44px;padding:7px 0;border-bottom:1px solid #573369}.text-link:hover{color:#efb6d1;border-color:#c43668}.python-copy>.text-link{margin-top:14px}.curriculum{list-style:none;padding:0;margin:0;border-top:1px solid var(--border)}.curriculum li{padding:16px 0;border-bottom:1px solid var(--border)}.curriculum span{display:block;font:400 1.125rem var(--heading);letter-spacing:-.03em;color:#c6a1e6}.curriculum small{display:block;font-size:.875rem;color:var(--muted);margin-top:7px}.hearthwood-project{display:grid;grid-template-columns:1.55fr 1fr;gap:60px;align-items:center;padding:43px 0 50px;border-top:1px solid var(--border)}.hearthwood-project figure img{display:block;width:100%;height:auto;aspect-ratio:1.65;object-fit:cover}.hearthwood-project figcaption{font-size:.8125rem;color:#a695b6;margin-top:10px}.hearthwood-project h3{font-size:2.3rem;letter-spacing:-.055em;margin:14px 0 18px}.hearthwood-project p{font-size:1.0625rem;line-height:1.7;margin-bottom:15px}.hearthwood-project .project-kind{font-size:.875rem;margin:0}.hearthwood-project .status{margin-top:5px}.hearthwood-project .text-link{margin-top:8px}.personal-section{background:var(--nav);border-block:1px solid var(--border);padding:64px 0}.personal-layout{display:grid;grid-template-columns:1fr 1.2fr;gap:95px}.personal-heading h2{font-size:2.35rem;line-height:1.17}.personal-heading>p{margin-top:24px;font-size:1.0625rem;line-height:1.75}.personal-projects>article+article{margin-top:25px;border-top:1px solid var(--border);padding-top:30px}.personal-title{display:flex;justify-content:space-between;align-items:start;gap:20px;margin-bottom:18px}.personal-title h3{font-size:1.8rem}.personal-projects>article>p{font-size:1.0625rem;line-height:1.75}.personal-projects>article>.project-kind{font-size:.875rem;margin-top:17px;color:#b7a2c8}.personal-projects .build-notes{margin-top:15px}.project-index{display:grid;grid-template-columns:1fr 1.45fr;gap:70px;padding:60px 0}.index-title h2{font-size:1.4rem;line-height:1.4;letter-spacing:-.035em}.index-title>p{font-size:.9375rem;margin-top:10px}.project-index ol{list-style:none;counter-reset:project;display:grid;grid-template-columns:1fr 1fr;column-gap:45px;margin:0;padding:0}.project-index li{counter-increment:project;display:flex;align-items:center;gap:15px;font-size:1rem}.project-index li:before{content:counter(project,decimal-leading-zero);font:400 .75rem var(--heading);color:#8b759e;min-width:20px}.project-index a{display:block;min-height:44px;align-content:center;color:#c0b0cf}.project-index a:hover{color:#d5a4fa}footer{display:flex;gap:30px;align-items:center;justify-content:space-between;padding:28px 0;border-top:1px solid var(--border);font-size:.9375rem}.footer-brand{font:600 1rem var(--heading);letter-spacing:-.05em}footer a{min-height:44px;display:flex;align-items:center;gap:14px;color:#bbaac9}footer a:hover{color:#d2a2f6}footer p{font-size:.875rem}
@media(max-width:1150px){.wrap{width:calc(100% - 64px)}.header nav{gap:22px}.header .index-link{margin-left:0}.intro{gap:40px}.intro h1{font-size:3rem}.sys-layout{gap:60px}.section-heading{gap:60px}.hunt-project{grid-template-columns:1.3fr 1fr;gap:30px}.camp-project{padding-left:60px;gap:50px}.project-row{grid-template-columns:1fr 1.5fr;gap:22px 40px}.project-row>.status{grid-column:1;grid-row:2;margin-top:0;justify-self:start}.row-content{grid-row:1 / span 2;grid-column:2}.python-project{grid-template-columns:1fr 1.5fr;gap:30px 50px}.curriculum{grid-column:1;grid-row:2}.python-copy{grid-column:2;grid-row:1 / span 2}.hearthwood-project{gap:40px}.personal-layout{gap:60px}.project-index{grid-template-columns:1fr 1.6fr;gap:40px}.project-index ol{column-gap:20px}}
@media(max-width:850px){.header-inner{flex-wrap:wrap;gap:6px;padding:20px 0 11px}.header nav{justify-content:space-between;width:100%;gap:20px;font-size:.9375rem}.intro{gap:35px;grid-template-columns:1.1fr 1fr;padding-block:40px}.intro h1{font-size:2.4rem}.intro-copy>p:first-child{font-size:1rem}.intro-note{font-size:.875rem}.sys-layout{gap:35px;grid-template-columns:1fr 1fr}.sys-heading h2{font-size:2.3rem}.sys-capabilities>div{grid-template-columns:36px 1fr;gap:12px}.sys-capabilities h3{font-size:1.1rem}.section-heading{gap:35px}.section-heading h2,.personal-heading h2{font-size:2rem}.section-heading>p{font-size:1rem}.hunt-project{grid-template-columns:1fr;gap:25px}.hunt-project .game-copy{display:grid;grid-template-columns:1fr 1.2fr;gap:0 35px}.hunt-project .project-kind,.hunt-project h3,.hunt-project .project-hook,.hunt-project .status{grid-column:1}.hunt-project .game-copy>p:not(.project-kind):not(.project-hook){grid-column:2;grid-row:1 / span 3}.hunt-project .status{justify-self:start;margin-top:10px}.hunt-project .build-notes{grid-column:2;grid-row:4;align-self:start;margin-top:0}.camp-project{padding-left:0;gap:35px;margin-top:48px}.game-copy h3{font-size:2rem}.camp-project .game-copy h3{font-size:1.8rem}.game-image figcaption{font-size:.75rem}.project-row{gap:18px 35px}.row-title h3{font-size:1.4rem}.hearthwood-project{grid-template-columns:1.2fr 1fr;gap:30px;align-items:start}.hearthwood-project figure img{aspect-ratio:1.1}.hearthwood-project h3{font-size:1.8rem}.personal-layout{gap:40px;grid-template-columns:1fr 1.3fr}.personal-title{flex-wrap:wrap;gap:12px}.project-index{grid-template-columns:1fr;gap:20px}.project-index ol{grid-template-columns:repeat(3,minmax(0,1fr))}footer{flex-wrap:wrap;gap:15px}footer>p{order:3;flex-basis:100%}}
@media(max-width:620px){.wrap{width:calc(100% - 40px)}.header-inner{padding-top:17px}.brand{font-size:1.08rem}.brand svg{width:28px;height:28px}.header nav{gap:10px;font-size:.875rem}.header .index-link{gap:6px}.intro{grid-template-columns:1fr;gap:22px;padding:35px 0}.intro h1{font-size:clamp(2.1rem,7.3vw,2.8rem);line-height:1.14}.intro-copy>p:first-child{font-size:1.0625rem;line-height:1.65;max-width:450px}.intro-note{display:none}.sys-section{padding-top:22px;padding-bottom:45px}.sys-heading{gap:12px;flex-wrap:wrap;align-items:start}.sys-heading h2{font-size:2.2rem}.section-number{padding-top:6px;font-size:.75rem}.sys-heading>.status{margin-left:31px;margin-top:3px}.sys-heading>div:nth-child(2){flex:1;min-width:250px}.sys-heading .project-kind{font-size:.875rem}.sys-layout{grid-template-columns:1fr;gap:25px;padding:27px 0 15px}.sys-copy .lead{font-size:1.75rem}.sys-copy>p:not(.lead):not(.access-note){margin-top:17px;font-size:1.0625rem}.sys-copy .button{margin-top:20px}.sys-capabilities>div{padding:19px 0;grid-template-columns:40px 1fr;gap:19px}.sys-capabilities h3{font-size:1.1875rem}.sys-capabilities p{font-size:1rem;max-width:none}.sys-project>.build-notes .detail-body{margin-left:0}.section-heading{grid-template-columns:1fr;gap:18px;margin-bottom:29px}.section-heading h2,.personal-heading h2{font-size:2rem;line-height:1.15}.section-heading>p{font-size:1.0625rem;max-width:480px}.games-section{padding:39px 0}.hunt-project{gap:23px}.hunt-project .game-copy{display:block}.game-copy .project-kind{margin-bottom:11px}.game-copy h3{font-size:2.1rem}.game-copy .project-hook{font-size:1.125rem;margin-top:11px}.game-copy>.status,.hunt-project .status{margin-top:18px}.hunt-project .build-notes{margin-top:17px}.game-image figcaption{gap:10px;align-items:start;line-height:1.5;font-size:.75rem}.game-image figcaption>span:last-child{max-width:160px;text-align:right}.camp-project{display:flex;flex-direction:column-reverse;gap:23px;margin-top:37px;padding-top:32px;border-top:1px solid #402b4e;align-items:stretch}.camp-project .game-copy h3{font-size:2.1rem}.camp-project .game-copy>p{max-width:none}.game-copy>p:not(.project-kind):not(.project-hook){font-size:1.0625rem}.engineering-section{padding:45px 0}.project-row{display:flex;flex-direction:column;gap:16px;padding:25px 0}.project-row>.status{order:2}.project-row>.row-content{order:3}.row-title h3{font-size:1.65rem}.row-title .project-kind{max-width:none;margin-top:8px}.row-content>p{font-size:1.0625rem}.row-content .build-notes{margin-top:9px}.row-content .build-notes summary{font-size:1rem}.web-section{padding-bottom:45px}.web-section>.section-heading{padding-top:32px;margin-bottom:30px}.python-project{display:flex;flex-direction:column;gap:23px;padding-bottom:30px}.python-heading{display:flex;align-items:start;justify-content:space-between;width:100%;gap:20px}.python-heading h3{font-size:1.85rem}.python-heading>.status{margin-top:4px}.python-copy .project-hook{font-size:1.6rem}.python-copy>p:not(.project-hook){margin-top:13px}.curriculum{width:100%;display:block}.curriculum li{padding:12px 0}.curriculum span{font-size:1.0625rem}.curriculum small{margin-top:3px}.hearthwood-project{display:flex;flex-direction:column;gap:24px;padding:30px 0;align-items:stretch}.hearthwood-project figure img{aspect-ratio:1.65}.hearthwood-project h3{font-size:2rem}.hearthwood-project p{font-size:1.0625rem}.hearthwood-project figcaption{font-size:.75rem}.personal-section{padding:39px 0}.personal-layout{grid-template-columns:1fr;gap:30px}.personal-heading>p{margin-top:17px}.personal-title{flex-wrap:nowrap;gap:15px}.personal-title h3{font-size:1.75rem}.personal-projects>article+article{margin-top:22px;padding-top:25px}.project-index{padding:37px 0;gap:16px}.project-index ol{grid-template-columns:1fr 1fr;gap:0 18px}.project-index li{font-size:.9375rem;gap:8px;align-items:start}.project-index li:before{padding-top:13px;font-size:.6875rem;min-width:18px}.project-index a{line-height:1.4;padding:10px 0}footer{padding:20px 0;gap:12px}.footer-brand{font-size:.9375rem}footer>a{font-size:.9375rem}}
@media(max-width:360px){.wrap{width:calc(100% - 32px)}.header nav{gap:8px;font-size:.8125rem}.index-link>span{display:none}.sys-heading>div:nth-child(2){min-width:210px}.sys-heading .project-kind{font-size:.8125rem}.intro h1{font-size:2.05rem}.personal-title{flex-wrap:wrap}.python-heading{flex-wrap:wrap}.project-index ol{grid-template-columns:1fr}.project-index a{padding:8px 0}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}
