:root{--paper:#e9e7e1;--portfolio-line:#303137}.portfolio-body{background:#121316}.portfolio-body h1,.portfolio-body h2,.portfolio-body h3{letter-spacing:-.045em}.intro{min-height:94svh;padding-top:130px;padding-bottom:70px;display:grid;grid-template-columns:1.05fr .72fr;gap:clamp(55px,9vw,130px);align-items:center}.availability{display:flex;align-items:center;gap:10px;margin:0 0 34px;color:#9c9da4;font:500 .72rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.08em}.availability span{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 10px rgba(80,198,97,.55)}.intro h1{margin:0;font-size:clamp(4.5rem,9vw,9.5rem);line-height:.84}.role{margin:30px 0 0;font:500 clamp(1.3rem,2.2vw,1.8rem) "Space Grotesk",sans-serif}.role a{color:var(--green);border-bottom:1px solid rgba(80,198,97,.5)}.bio{max-width:660px;margin:28px 0 0;color:#a9aab1;font-size:1.05rem;line-height:1.8}.intro-links{display:flex;flex-wrap:wrap;gap:25px;margin-top:38px}.intro-links a,.case-link{padding-bottom:5px;border-bottom:1px solid #606168;font-size:.85rem;font-weight:700}.intro-links a:hover,.case-link:hover{color:var(--green);border-color:var(--green)}.intro-photo{margin:0;align-self:end;border:1px solid var(--portfolio-line);background:#1a1b1f}.intro-photo img{width:100%;aspect-ratio:.83;object-fit:cover;object-position:center bottom;background:#243329;filter:saturate(.85)}.intro-photo figcaption{display:flex;justify-content:space-between;gap:15px;padding:13px 15px;color:#888991;font:400 .64rem "IBM Plex Mono",monospace;text-transform:uppercase}.quick-info{display:grid;grid-template-columns:repeat(4,1fr);border-block:1px solid var(--portfolio-line)}.quick-info div{padding:25px 22px;border-right:1px solid var(--portfolio-line)}.quick-info div:last-child{border:0}.quick-info span{display:block;margin-bottom:8px;color:#74757c;font:400 .66rem "IBM Plex Mono",monospace;text-transform:uppercase}.quick-info strong{font-size:.9rem}.selected,.notes,.history{padding-block:130px}.plain-heading{display:grid;grid-template-columns:.35fr 1fr;gap:35px;align-items:baseline;margin-bottom:75px}.plain-heading>p{margin:0;color:var(--green);font:500 .7rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.09em}.plain-heading h2{margin:0;font-size:clamp(2.8rem,5.5vw,5rem)}.case-study{display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(40px,7vw,95px);align-items:center;padding-block:70px;border-top:1px solid var(--portfolio-line)}.case-study:last-child{border-bottom:1px solid var(--portfolio-line)}.case-study.flip .case-image{order:2}.case-image{display:block;overflow:hidden;background:#090a0c}.case-image img{width:100%;aspect-ratio:16/10;object-fit:cover;filter:saturate(.9);transition:.4s}.case-image:hover img{transform:scale(1.025);filter:saturate(1.05)}.case-image.ds-case img{object-fit:contain;background:#21222a}.case-meta{margin:0 0 15px;color:#777880;font:400 .68rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.06em}.case-copy h3{margin:0 0 20px;font-size:clamp(2.4rem,4vw,4rem)}.case-copy>p:not(.case-meta){color:#a2a3aa;line-height:1.75}.case-copy ul{display:flex;flex-wrap:wrap;gap:7px;margin:24px 0 30px;padding:0;list-style:none}.case-copy li{padding:7px 10px;border:1px solid var(--portfolio-line);color:#a4a5ac;font:400 .65rem "IBM Plex Mono",monospace}.notes{background:#18191d;color:var(--white);max-width:none;width:100%;padding-inline:max(20px,calc((100% - 1180px)/2))}.notes .plain-heading>p{color:#267d35}.notes-grid{display:grid;grid-template-columns:repeat(2,1fr);border-top:1px solid #383940}.notes-grid>div{padding:42px 45px 42px 0;border-bottom:1px solid #383940}.notes-grid>div:nth-child(odd){border-right:1px solid #383940}.notes-grid>div:nth-child(even){padding-left:45px}.notes-grid h3{margin:0 0 13px;font-size:1.35rem}.notes-grid p{max-width:440px;margin:0;color:#a6a7ae;line-height:1.7}.history{display:grid;grid-template-columns:.8fr 1.2fr;gap:80px}.history .plain-heading{display:block;margin:0}.history .plain-heading p{margin-bottom:22px}.history-list{border-top:1px solid var(--portfolio-line)}.history-list>div{display:grid;grid-template-columns:100px 1fr;gap:30px;padding:25px 0;border-bottom:1px solid var(--portfolio-line)}.history-list time{color:var(--green);font:500 .76rem "IBM Plex Mono",monospace}.history-list p{margin:0;color:#b5b5bb}.contact{margin-bottom:110px;padding-block:60px;border-block:1px solid var(--portfolio-line)}.contact>p{margin:0 0 14px;color:#777880;font:400 .72rem "IBM Plex Mono",monospace}.contact>a{font:600 clamp(1.6rem,4vw,3.5rem) "Space Grotesk",sans-serif;letter-spacing:-.04em}.contact>div{display:flex;gap:24px;margin-top:40px}.contact>div a{color:#96979e;font-size:.8rem;border-bottom:1px solid #4a4b51}.contact a:hover{color:var(--green)}@media(max-width:900px){.intro{grid-template-columns:1fr;padding-top:140px}.intro-photo{width:min(100%,560px)}.quick-info{grid-template-columns:repeat(2,1fr)}.quick-info div:nth-child(2){border-right:0}.quick-info div:nth-child(-n+2){border-bottom:1px solid var(--portfolio-line)}.case-study{grid-template-columns:1fr}.case-study.flip .case-image{order:0}.history{grid-template-columns:1fr}.history .plain-heading{margin-bottom:15px}}@media(max-width:700px){.intro h1{font-size:clamp(4rem,19vw,6.5rem)}.intro-photo figcaption{flex-direction:column}.selected,.notes,.history{padding-block:85px}.plain-heading{grid-template-columns:1fr;gap:15px;margin-bottom:45px}.case-study{padding-block:45px}.notes-grid{grid-template-columns:1fr}.notes-grid>div,.notes-grid>div:nth-child(even){padding:30px 0;border-right:0!important}.contact>div{flex-wrap:wrap}}@media(max-width:460px){.quick-info{grid-template-columns:1fr}.quick-info div{border-right:0!important;border-bottom:1px solid var(--portfolio-line)}.history-list>div{grid-template-columns:70px 1fr;gap:15px}.contact>a{font-size:1.35rem}}

.github-work{padding-block:130px}.github-work .plain-heading{margin-bottom:60px}.repo-grid{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--portfolio-line);border-left:1px solid var(--portfolio-line)}.repo-card{min-height:280px;display:flex;flex-direction:column;padding:28px;border-right:1px solid var(--portfolio-line);border-bottom:1px solid var(--portfolio-line);transition:background .2s,transform .2s}.repo-card:hover{background:#191a1f;transform:translateY(-3px)}.repo-top{display:flex;justify-content:space-between;align-items:center;color:#74757d;font:400 .66rem "IBM Plex Mono",monospace}.repo-top span:before{content:"";display:inline-block;width:7px;height:7px;margin-right:8px;border-radius:50%;background:var(--green)}.repo-top b{color:#a1a2a8;font-size:1rem}.repo-card h3{margin:38px 0 14px;font-size:1.35rem}.repo-card p{margin:0;color:#9d9ea5;font-size:.88rem;line-height:1.7}.repo-card small{margin-top:auto;padding-top:25px;color:#65666d;font:400 .62rem "IBM Plex Mono",monospace}.all-repos{display:inline-block;margin-top:28px;padding-bottom:5px;border-bottom:1px solid #55565c;font-size:.82rem;font-weight:700}.all-repos:hover{color:var(--green);border-color:var(--green)}.professional{padding-block:120px;background:#1a1b20;border-block:1px solid var(--portfolio-line)}.professional-layout{display:grid;grid-template-columns:.75fr 1.25fr;gap:clamp(60px,10vw,140px)}.professional-intro{position:sticky;top:120px;align-self:start}.professional-intro h2{margin:0 0 25px;font-size:clamp(2.8rem,5vw,4.8rem);line-height:.95}.professional-intro>p:not(.availability){color:#9fa0a7;line-height:1.75}.professional-intro>a{display:inline-block;margin-top:25px;padding-bottom:5px;border-bottom:1px solid var(--green);font-size:.82rem;font-weight:700}.professional-list{border-top:1px solid #3b3c42}.professional-list article{display:grid;grid-template-columns:105px 1fr;gap:28px;padding:32px 0;border-bottom:1px solid #3b3c42}.professional-list time{color:var(--green);font:500 .67rem "IBM Plex Mono",monospace}.professional-list h3{margin:0 0 10px;font-size:1.25rem}.professional-list p{margin:0;color:#96979e;font-size:.9rem;line-height:1.7}@media(max-width:900px){.repo-grid{grid-template-columns:repeat(2,1fr)}.professional-layout{grid-template-columns:1fr}.professional-intro{position:static}}@media(max-width:700px){.github-work,.professional{padding-block:85px}}@media(max-width:560px){.repo-grid{grid-template-columns:1fr}.repo-card{min-height:240px}.professional-list article{grid-template-columns:1fr;gap:12px}}

.skills{padding-block:130px}.skills .plain-heading{margin-bottom:28px}.skills-intro{max-width:610px;margin:0 0 55px 35%;color:#9899a1;line-height:1.75}.skills-grid{display:grid;grid-template-columns:repeat(5,1fr);border-top:1px solid var(--portfolio-line);border-left:1px solid var(--portfolio-line)}.skill-card{min-height:205px;display:flex;flex-direction:column;justify-content:space-between;padding:24px;border-right:1px solid var(--portfolio-line);border-bottom:1px solid var(--portfolio-line);background:#15161a;transition:background .2s,transform .2s}.skill-card:hover{background:#1b1c21;transform:translateY(-3px)}.skill-logo{width:58px;height:58px;color:#a8a9af}.skill-logo svg{display:block;width:100%;height:100%;overflow:visible}.skill-logo path,.skill-logo rect{fill:currentColor}.skill-logo text{fill:#15161a;font:700 15px "Space Grotesk",sans-serif;text-anchor:middle}.skill-logo .logo-mark{fill:#15161a}.skill-logo .logo-line{fill:none;stroke:#15161a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.skill-logo.text-logo{display:grid;place-items:center;border:3px solid currentColor;border-radius:10px;font:700 1.3rem "Space Grotesk",sans-serif}.skill-card h3{margin:24px 0 5px;font-size:1.08rem;letter-spacing:-.025em}.skill-card p{margin:0;color:#74757d;font:400 .64rem "IBM Plex Mono",monospace}.skill-cpp .skill-logo{color:#659ad2}.skill-c .skill-logo{color:#a8b9cc}.skill-html .skill-logo{color:#e44d26}.skill-css .skill-logo{color:#1572b6}.skill-js .skill-logo{color:#f0db4f}.skill-three .skill-logo{color:#e7e7e7}.skill-three .skill-logo path{fill:none;stroke:currentColor;stroke-width:2;stroke-linejoin:round}.skill-ar .skill-logo{color:#5bcf73}.skill-blender .skill-logo{color:#ea7600}.skill-esp .skill-logo{color:#e73546}.skill-git .skill-logo{color:#f05032}@media(max-width:900px){.skills-grid{grid-template-columns:repeat(3,1fr)}.skills-intro{margin-left:0}}@media(max-width:700px){.skills{padding-block:85px}}@media(max-width:560px){.skills-grid{grid-template-columns:repeat(2,1fr)}.skill-card{min-height:180px;padding:20px}.skill-logo{width:50px;height:50px}}@media(max-width:370px){.skills-grid{grid-template-columns:1fr}}

/* Local brand artwork used by the portfolio skills grid. */
.skill-logo img{display:block;width:100%;height:100%;object-fit:contain}.skill-logo-wide{width:76px}.skill-three .skill-logo img,.skill-github .skill-logo img{filter:invert(1)}.skill-ar .skill-logo{width:82px}.skill-ar .skill-logo img{object-fit:contain}.skill-card:hover .skill-logo img{transform:scale(1.06)}.skill-logo img{transition:transform .2s ease}@media(max-width:560px){.skill-logo-wide{width:68px}.skill-ar .skill-logo{width:72px}}

/* Additional portfolio tools and platform marks. */
.skill-unity .skill-logo img,.skill-gamemaker .skill-logo img{filter:invert(1)}

/* Native game-development marks. */
.skill-6502 .skill-logo img{filter:invert(1)}

/* Compact skills grid: keeps the large toolkit easy to scan. */
.skills-grid{grid-template-columns:repeat(6,1fr)}.skill-card{min-height:160px;padding:18px}.skill-logo{width:44px;height:44px}.skill-logo-wide{width:60px}.skill-ar .skill-logo{width:62px}.skill-card h3{margin:16px 0 4px;font-size:.98rem}.skill-card p{font-size:.58rem;line-height:1.45}@media(max-width:1100px){.skills-grid{grid-template-columns:repeat(5,1fr)}}@media(max-width:900px){.skills-grid{grid-template-columns:repeat(4,1fr)}}@media(max-width:700px){.skills-grid{grid-template-columns:repeat(3,1fr)}.skill-card{min-height:150px}}@media(max-width:500px){.skills-grid{grid-template-columns:repeat(2,1fr)}.skill-card{min-height:145px;padding:16px}.skill-logo{width:40px;height:40px}.skill-logo-wide{width:55px}.skill-ar .skill-logo{width:58px}}@media(max-width:340px){.skills-grid{grid-template-columns:1fr}}

/* Nintendo DS hardware illustration. */
.skill-logo-console{width:78px;height:58px}.skill-logo-console img{filter:none}@media(max-width:500px){.skill-logo-console{width:68px;height:52px}}

/* Extra-compact skills layout. */
.skills-grid{grid-template-columns:repeat(7,1fr)}.skill-card{min-height:132px;padding:14px}.skill-logo{width:36px;height:36px}.skill-logo-wide{width:50px}.skill-logo-console{width:58px;height:42px}.skill-ar .skill-logo{width:52px}.skill-card h3{margin:12px 0 3px;font-size:.88rem;line-height:1.15}.skill-card p{font-size:.53rem;line-height:1.35}@media(max-width:1100px){.skills-grid{grid-template-columns:repeat(6,1fr)}}@media(max-width:900px){.skills-grid{grid-template-columns:repeat(5,1fr)}}@media(max-width:700px){.skills-grid{grid-template-columns:repeat(4,1fr)}.skill-card{min-height:128px}}@media(max-width:520px){.skills-grid{grid-template-columns:repeat(2,1fr)}.skill-card{min-height:125px;padding:13px}.skill-logo{width:34px;height:34px}.skill-logo-wide{width:46px}.skill-logo-console{width:54px;height:40px}.skill-ar .skill-logo{width:48px}}

/* AR.js Studio mark needs a light plate for its black wordmark. */
.skill-ar .skill-logo{box-sizing:border-box;width:56px;height:44px;padding:3px;background:#fff;border-radius:2px}.skill-ar .skill-logo img{filter:none}@media(max-width:520px){.skill-ar .skill-logo{width:52px;height:41px}}

/* Dense toolkit grid with larger marks and smaller cards. */
.skills-grid{grid-template-columns:repeat(9,1fr)}.skill-card{min-height:112px;padding:10px}.skill-logo{width:46px;height:46px}.skill-logo-wide{width:58px}.skill-logo-console{width:64px;height:46px}.skill-ar .skill-logo{width:58px;height:46px;padding:3px}.skill-card h3{margin:8px 0 2px;font-size:.8rem;line-height:1.1}.skill-card p{font-size:.49rem;line-height:1.25}@media(max-width:1100px){.skills-grid{grid-template-columns:repeat(8,1fr)}}@media(max-width:900px){.skills-grid{grid-template-columns:repeat(6,1fr)}}@media(max-width:700px){.skills-grid{grid-template-columns:repeat(4,1fr)}.skill-card{min-height:112px}}@media(max-width:520px){.skills-grid{grid-template-columns:repeat(2,1fr)}.skill-card{min-height:110px;padding:10px}.skill-logo{width:42px;height:42px}.skill-logo-wide{width:54px}.skill-logo-console{width:60px;height:44px}.skill-ar .skill-logo{width:54px;height:43px}}

/* Tailscale's monochrome mark sits on its own app-style tile. */
.skill-tailscale .skill-logo{box-sizing:border-box;padding:7px;border-radius:10px;background:#24252b}

/* User-selected Texas Instruments mark. */
.skill-ti .skill-logo{width:46px;height:46px;overflow:hidden;background:#ef1520;border-radius:2px}
.skill-ti .skill-logo img{width:195px;height:72px;max-width:none;object-fit:fill;object-position:left top;margin:-1px 0 0 -1px;filter:brightness(0) invert(1);transform:none}
.skill-ti:hover .skill-logo img{transform:none}
@media(max-width:520px){.skill-ti .skill-logo{width:42px;height:42px}.skill-ti .skill-logo img{width:178px;height:66px}}

/* In-house PlatanoTeam technology and production tools. */
.platano-tools{padding-block:130px;border-top:1px solid var(--portfolio-line)}
.platano-tools .plain-heading{margin-bottom:28px}
.platano-tools-intro{max-width:660px;margin:0 0 55px 35%;color:#9899a1;line-height:1.75}
.platano-tools-grid{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--portfolio-line);border-left:1px solid var(--portfolio-line)}
.platano-tool-card{min-height:300px;display:flex;flex-direction:column;justify-content:space-between;gap:38px;padding:26px;border-right:1px solid var(--portfolio-line);border-bottom:1px solid var(--portfolio-line);background:#15161a;transition:background .2s,transform .2s}
.platano-tool-card:hover{background:#1b1c21;transform:translateY(-3px)}
.platano-tool-mark{width:78px;height:78px;display:grid;place-items:center;border:1px solid #3b3c42;background:#0f1013;color:var(--green);font:700 1.15rem "Space Grotesk",sans-serif;letter-spacing:0;overflow:hidden}
.platano-tool-mark img{display:block;width:100%;height:100%;object-fit:contain;padding:9px;box-sizing:border-box;transition:transform .2s}
.platano-tool-mark.engine-mark{width:132px;height:88px}
.platano-tool-mark.engine-mark img{padding:5px}
.platano-tool-card:hover .platano-tool-mark img{transform:scale(1.06)}
.platano-tool-card span{display:block;margin-bottom:18px;color:#686970;font:500 .62rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.1em}
.platano-tool-card h3{margin:0 0 14px;font-size:1.35rem;line-height:1.05}
.platano-tool-card p{margin:0;color:#9d9ea5;font-size:.9rem;line-height:1.7}
@media(max-width:1100px){.platano-tools-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:980px){.platano-tools-grid{grid-template-columns:1fr 1fr}.platano-tools-intro{margin-left:0}.platano-tool-card:last-child{grid-column:auto}}
@media(max-width:700px){.platano-tools{padding-block:85px}.platano-tool-card{min-height:260px}}
@media(max-width:560px){.platano-tools-grid{grid-template-columns:1fr}.platano-tool-card:last-child{grid-column:auto}.platano-tool-mark{width:62px;height:62px}.platano-tool-mark.engine-mark{width:116px;height:78px}}

/* The fifth curiosity spans the grid so the section remains balanced. */
.notes-grid>.music-note{grid-column:1/-1;padding-left:0;border-right:0}
@media(max-width:700px){.notes-grid>.music-note{grid-column:auto}}

/* Music, social, and professional profiles. */
.contact>.contact-groups{display:grid;grid-template-columns:.75fr 1.5fr .75fr;gap:32px;margin-top:45px}
.contact-group{padding-top:16px;border-top:1px solid var(--portfolio-line)}
.contact-group>span{display:block;margin-bottom:15px;color:#686970;font:500 .62rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.1em}
.contact-group>div{display:flex;flex-wrap:wrap;gap:12px 18px}
.contact>.contact-groups a{color:#96979e;font-size:.78rem;border-bottom:1px solid #4a4b51}
@media(max-width:800px){.contact>.contact-groups{grid-template-columns:1fr 1fr}.contact-group:last-child{grid-column:1/-1}}
@media(max-width:520px){.contact>.contact-groups{grid-template-columns:1fr}.contact-group:last-child{grid-column:auto}}

/* Smaller personal and learning projects kept outside the main case studies. */
.project-archives{padding-block:130px;border-top:1px solid var(--portfolio-line)}
.project-archives .plain-heading{margin-bottom:28px}
.archives-intro{max-width:680px;margin:0 0 55px 35%;color:#9899a1;line-height:1.75}
.archive-grid{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--portfolio-line);border-left:1px solid var(--portfolio-line)}
.archive-card{min-height:100%;display:flex;flex-direction:column;background:#15161a;border-right:1px solid var(--portfolio-line);border-bottom:1px solid var(--portfolio-line);transition:background .2s,transform .2s}
.archive-card:hover{background:#1b1c21;transform:translateY(-3px)}
.archive-card figure{margin:0;background:#0b0c0f;border-bottom:1px solid var(--portfolio-line);overflow:hidden}
.archive-card img{display:block;width:100%;aspect-ratio:16/10;object-fit:cover;filter:saturate(.9) contrast(.96);transition:transform .3s,filter .3s}
.archive-card:hover img{transform:scale(1.025);filter:saturate(1.05) contrast(1)}
.archive-copy{display:flex;flex:1;flex-direction:column;padding:22px}
.archive-copy time{color:var(--green);font:500 .68rem "IBM Plex Mono",monospace}
.archive-copy h3{margin:16px 0 12px;font-size:1.25rem;line-height:1.05;letter-spacing:-.035em}
.archive-copy p{margin:0;color:#9d9ea5;font-size:.86rem;line-height:1.65}
.archive-copy span{width:max-content;max-width:100%;margin-top:auto;padding:22px 0 0;color:#66676f;font:500 .62rem "IBM Plex Mono",monospace;text-transform:uppercase;letter-spacing:.08em}
@media(max-width:980px){.archive-grid{grid-template-columns:repeat(2,1fr)}.archives-intro{margin-left:0}}
@media(max-width:700px){.project-archives{padding-block:85px}.archive-copy{padding:18px}.archive-copy h3{font-size:1.12rem}}
@media(max-width:560px){.archive-grid{grid-template-columns:1fr}.archive-card img{aspect-ratio:16/9}}
