:root{--ink:#2f2419;--ink-soft:#5b4633;--paper:#f7eedb;--paper-deep:#efe2c6;--line:#d9c7a3;--accent:#c0613f;--accent-deep:#9c4b31;--gold:#d9a441;--sage:#5f7c66;--night:#0d1320;--night-soft:#172033;--glass:#141a289e;--glass-line:#ffeccd29;--cream:#f3e7cf;--radius:14px;--ease:cubic-bezier(.22, 1, .36, 1);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{background:var(--night);height:100%;color:var(--cream);font-family:var(--font-body), system-ui, sans-serif;-webkit-font-smoothing:antialiased;margin:0}a{color:inherit}button{font:inherit;color:inherit}kbd{min-width:1.6em;height:1.6em;font-family:var(--font-mono), monospace;border:1px solid #ffeccd59;border-bottom-width:2px;border-radius:6px;place-items:center;padding:0 .35em;font-size:.78em;line-height:1;display:inline-grid}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.hp{opacity:0;width:1px;height:1px;position:absolute;left:-9999px}.btn{cursor:pointer;transition:transform .2s var(--ease), background .2s, color .2s, box-shadow .2s;background:0 0;border:1px solid;border-radius:999px;justify-content:center;align-items:center;gap:.5em;padding:.7em 1.15em;font-size:.95rem;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.4;cursor:default;transform:none}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff7ea;box-shadow:0 6px 18px -8px #c0613fcc}.btn-primary:hover{background:var(--accent-deep);border-color:var(--accent-deep)}.btn-ghost{border-color:#0000}.btn-ghost:hover{background:#2f241912}.link-btn{cursor:pointer;background:0 0;border:0;padding:0;text-decoration:underline}:focus-visible{outline:2px solid var(--gold);outline-offset:3px}.home,.stage{position:fixed;inset:0;overflow:hidden}.canvas{inset:0;position:absolute!important}.loading,.nowebgl{text-align:center;background:radial-gradient(ellipse at 50% 40%, #2a2420 0%, var(--night) 70%);font-family:var(--font-display), serif;place-content:center;justify-items:center;gap:.8rem;padding:24px;display:grid;position:fixed;inset:0}.loading p{margin:0;font-size:1.15rem}.loading a{font-family:var(--font-body), sans-serif;opacity:.6;font-size:.85rem}.loading-lamp{background:#ffcf8f;border-radius:50%;width:14px;height:14px;animation:1.6s ease-in-out infinite lamp;box-shadow:0 0 40px 12px #ffb36b73}@keyframes lamp{50%{opacity:.55;box-shadow:0 0 24px 6px #ffb36b4d}}.nowebgl h1{margin:0}.nowebgl p{max-width:34ch;font-family:var(--font-body), sans-serif;opacity:.8}.intro{transition:opacity .9s var(--ease), visibility .9s;z-index:20;background:linear-gradient(90deg,#0a0d16c7 0%,#0a0d1659 45%,#0a0d1600 70%);align-items:flex-end;padding:clamp(16px,5vw,64px);display:flex;position:absolute;inset:0}.intro.is-hidden{opacity:0;visibility:hidden;pointer-events:none}.intro-card{max-width:30rem;animation:rise 1.2s var(--ease) both}@keyframes rise{0%{opacity:0;transform:translateY(18px)}}.intro-kicker{font-family:var(--font-hand), cursive;color:var(--gold);margin:0 0 .6rem;font-size:1.45rem}.intro-title{font-family:var(--font-display), serif;letter-spacing:-.02em;font-variation-settings:"SOFT" 100;margin:0;font-size:clamp(2.6rem,7vw,4.4rem);font-weight:600;line-height:.95}.intro-role{color:#ffd8a8;margin:.6rem 0 0;font-size:1.1rem;font-weight:600}.intro-tagline{opacity:.8;margin:.4rem 0 1.4rem;line-height:1.5}.intro-actions{flex-wrap:wrap;gap:.6rem;display:flex}.intro-note{opacity:.65;max-width:28rem;margin:1.2rem 0 0;font-size:.85rem;line-height:1.5}.hud{pointer-events:none;z-index:35;position:absolute;inset:0}.hud>*{pointer-events:auto}.hud-brand{top:max(16px, env(safe-area-inset-top));pointer-events:none;text-shadow:0 1px 8px #00000080;line-height:1.2;transition:opacity .4s;display:grid;position:absolute;left:16px}.hud-brand[aria-hidden=true]{opacity:0}.hud-name{font-family:var(--font-display), serif;font-size:1.05rem;font-weight:600}.hud-role{opacity:.65;font-size:.78rem}.hud-tools{top:max(14px, env(safe-area-inset-top));gap:6px;display:flex;position:absolute;right:16px}.icon-btn{border:1px solid var(--glass-line);background:var(--glass);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);cursor:pointer;opacity:.75;border-radius:999px;place-items:center;min-width:36px;height:36px;padding:0 10px;font-size:.85rem;font-weight:700;text-decoration:none;transition:opacity .2s,background .2s;display:inline-grid}.icon-btn:hover{opacity:1}.icon-btn-text{font-size:.78rem;font-weight:600}.hud-help{border-radius:var(--radius);background:var(--glass);border:1px solid var(--glass-line);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);animation:rise .35s var(--ease) both;padding:14px 18px;font-size:.88rem;position:absolute;top:60px;right:16px}.hud-help ul{gap:8px;margin:0 0 10px;padding:0;list-style:none;display:grid}.hud-help kbd{margin-right:3px}.prompt{left:50%;bottom:max(28px, env(safe-area-inset-bottom));-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);cursor:pointer;white-space:nowrap;animation:pop .3s var(--ease) both;background:#141620b3;border:1px solid #ffcf8f59;border-radius:999px;align-items:center;gap:10px;padding:10px 18px 10px 12px;font-weight:600;display:flex;position:absolute;transform:translate(-50%)}.prompt kbd{color:#ffcf8f;background:#ffcf8f26;border-color:#ffcf8f80}.prompt-hint{font-family:var(--font-hand), cursive;color:#ffcf8f;font-size:1.2rem;font-weight:700}@keyframes pop{0%{opacity:0;transform:translate(-50%,8px)scale(.96)}}.hint{left:50%;bottom:max(30px, env(safe-area-inset-bottom));opacity:.7;white-space:nowrap;pointer-events:none;text-shadow:0 1px 8px #0009;margin:0;font-size:.85rem;animation:1s both fadein;position:absolute;transform:translate(-50%)}.hint-low{bottom:max(24px, env(safe-area-inset-bottom))}@keyframes fadein{0%{opacity:0}}.back-btn{top:max(14px, env(safe-area-inset-top));border:1px solid var(--glass-line);background:var(--glass);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);cursor:pointer;z-index:40;border-radius:999px;align-items:center;gap:8px;padding:8px 14px;font-size:.88rem;font-weight:600;animation:.5s both fadein;display:inline-flex;position:absolute;left:16px}.back-btn kbd{opacity:.7;font-size:.68rem}.joystick{left:max(24px, env(safe-area-inset-left));bottom:max(28px, env(safe-area-inset-bottom));border:1px solid var(--glass-line);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);touch-action:none;z-index:11;background:#141a2859;border-radius:50%;place-items:center;width:128px;height:128px;display:grid;position:absolute}.joystick-knob{pointer-events:none;background:#ffeccd8c;border-radius:50%;width:54px;height:54px;box-shadow:0 4px 14px #00000059}.desktop{left:var(--screen-x,10vw);top:var(--screen-y,10vh);width:var(--screen-w,80vw);height:var(--screen-h,80vh);font-size:clamp(9px, calc(var(--screen-h,600px) / 34), 18px);opacity:0;visibility:hidden;transition:opacity .25s, transform .45s var(--ease), visibility .45s;z-index:30;position:absolute;transform:scaleY(.02)}.desktop.is-open{opacity:1;visibility:visible;transform:none}.os{color:#f6ecdd;width:100%;height:100%;font-family:var(--font-mono), monospace;background:radial-gradient(at 70% 0,#ffba7859,#0000 55%),linear-gradient(160deg,#2b3a5c 0%,#4b4467 45%,#a1627a 100%);border-radius:.3em;flex-direction:column;display:flex;overflow:hidden;box-shadow:inset 0 0 3em #00000059}.os-bar{background:#0e101a8c;justify-content:space-between;align-items:center;gap:1em;padding:.35em .9em;font-size:.82em;display:flex}.os-logo{color:#ffcf8f;font-weight:700}.os-bar-title{opacity:.7}.os-body{flex:1;gap:.8em;min-height:0;padding:.8em;display:flex}.os-dock{flex-direction:column;flex-shrink:0;gap:.4em;width:8.5em;display:flex}.os-app{text-align:left;cursor:pointer;background:#ffffff14;border:0;border-radius:.5em;align-items:center;gap:.6em;padding:.55em .7em;font-family:inherit;font-size:.82em;transition:background .2s;display:flex}.os-app:hover,.os-app.is-active{background:#ffeccd38}.os-app-icon{color:#ffd9a8;background:#ffcf8f40;border-radius:.4em;place-items:center;width:1.7em;height:1.7em;display:grid}.os-app-leave{background:#c0613f59;margin-top:auto}.os-window{min-width:0;color:var(--ink);font-family:var(--font-body), sans-serif;background:#faf3e6f5;border-radius:.6em;flex:1;padding:1em 1.2em;overflow:auto;box-shadow:0 1em 2em -1em #00000080}.os-lead{font-family:var(--font-display), serif;margin:0 0 .8em;font-size:1.25em;font-weight:600}.os-form{flex-direction:column;gap:.7em;min-height:100%;display:flex}.os-row{grid-template-columns:1fr 1fr;gap:.7em;display:grid}.os-form label{color:var(--ink-soft);gap:.25em;font-size:.85em;font-weight:700;display:grid}.os-form input,.os-form textarea{border:1px solid var(--line);width:100%;color:var(--ink);font:500 1.05em var(--font-body), sans-serif;resize:none;background:#fffaf0;border-radius:.45em;padding:.55em .7em}.os-form input:focus,.os-form textarea:focus{border-color:var(--accent);outline:2px solid #c0613f73}.os-form [aria-invalid=true]{border-color:#c0413f}.os-form em{color:#b0392e;font-style:normal;font-weight:600}.os-form label.os-grow{flex-direction:column;flex:1;display:flex}.os-grow textarea{flex:1;min-height:5em}.os-actions{flex-wrap:wrap;align-items:center;gap:.6em 1em;display:flex}.os-btn{border:1px solid var(--line);color:var(--ink);cursor:pointer;background:#fff7ea;border-radius:.5em;padding:.55em 1em;font-size:.9em;font-weight:700}.os-btn:hover{background:#fff}.os-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff7ea}.os-btn-primary:hover{background:var(--accent-deep)}.os-btn:disabled{opacity:.6}.os-link{color:var(--ink-soft);font-size:.85em}.os-note{background:#f7e3b8;border-radius:.5em;margin:0;padding:.6em .8em;font-size:.85em}.os-note-error{background:#f5d0c5}.os-done{place-content:center;justify-items:start;gap:.4em;height:100%;display:grid}.os-done-title{font-family:var(--font-display), serif;color:var(--sage);margin:0;font-size:1.6em;font-weight:600}.os-links ul{gap:.5em;margin:0;padding:0;list-style:none;display:grid}.os-links a{border:1px solid var(--line);background:#fff7ea;border-radius:.5em;justify-content:space-between;gap:1em;padding:.7em .9em;text-decoration:none;display:flex;overflow:hidden}.os-links a:hover{border-color:var(--accent)}.os-links-label{font-weight:700}.os-links a span:last-child{color:var(--ink-soft);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.os-jump{flex-wrap:wrap;gap:.5em;margin-top:1em;display:flex}.os-readme{font-family:var(--font-mono), monospace;font-size:.9em;line-height:1.6}.os-readme p{margin:0 0 .7em}.os-readme-title{opacity:.55}.os-readme h2{font-family:var(--font-display), serif;margin:0;font-size:1.5em;line-height:1.2}.os-readme-role{color:var(--accent);font-weight:700}.os-readme h3{letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft);margin:1.1em 0 .4em;font-size:.8em}.os-readme ul{margin:0 0 .7em;padding-left:1.2em}.os-readme li{margin-bottom:.35em}.os-readme .os-jump+.os-dim{margin-top:1.2em}.os-readme a{color:var(--accent-deep);overflow-wrap:anywhere}.os-dim{opacity:.6}.project,.about{z-index:30;color:var(--ink);opacity:0;visibility:hidden;transition:opacity .45s var(--ease), transform .6s var(--ease), visibility .6s;position:absolute}.project{width:min(420px,42vw);top:64px;bottom:24px;right:clamp(16px,3vw,40px);transform:translate(24px)}.project.is-open{opacity:1;visibility:visible;transition-delay:.55s;transform:none}.project-inner{background:var(--paper);background-image:linear-gradient(90deg,#7850281f 0,#0000 14px);border-radius:6px 16px 16px 6px;flex-direction:column;gap:16px;height:100%;padding:26px 26px 18px;animation:.5s both fadein;display:flex;overflow:auto;box-shadow:0 30px 60px -20px #0009,0 0 0 1px #785a3226}.project-index{letter-spacing:.12em;text-transform:uppercase;color:#8a6a45;margin:0;font-size:.75rem;font-weight:700}.project h2{font-family:var(--font-display), serif;margin:4px 0 0;font-size:1.9rem;font-weight:600;line-height:1.05}.project-badge{color:#8a5a25;border:1px dashed #b98a4a;border-radius:999px;margin:10px 0 0;padding:4px 10px;font-size:.78rem;font-weight:700;display:inline-block}.project-summary{color:var(--ink-soft);margin:10px 0 0;line-height:1.5}.project-subtitle{font-family:var(--font-display), serif;color:var(--ink-soft);margin:6px 0 0;font-size:1.05rem;font-style:italic}.project-badge-local{background:var(--paper-deep);color:#6f5639;border-style:solid;border-color:#785a324d}.project-shots{margin:0}.project-shots-empty{aspect-ratio:16/7;border:1px dashed var(--line);color:#8f7a60;font-family:var(--font-hand), cursive;text-align:center;background:repeating-linear-gradient(-45deg,#0000 0 10px,#7850280a 10px 20px);border-radius:8px;place-items:center;padding:0 16px;font-size:1.2rem;display:grid}.project-features ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.project-features li{padding-left:18px;line-height:1.45;position:relative}.project-features li:before{content:"";background:var(--accent);opacity:.7;width:7px;height:7px;position:absolute;top:.6em;left:2px;transform:rotate(45deg)}.project-shot-tag{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:#f3e9d8;letter-spacing:.08em;text-transform:uppercase;pointer-events:none;background:#14100c99;border-radius:999px;padding:3px 9px;font-size:.68rem;font-weight:700;position:absolute;top:10px;left:10px}.project-shot-frame{aspect-ratio:16/10;border:1px solid var(--line);background:#2a2420;border-radius:10px;position:relative;overflow:hidden}.project-shot-frame img{object-fit:contain;width:100%;height:100%;animation:.35s both shot-in;display:block}@keyframes shot-in{0%{opacity:0}to{opacity:1}}.project-shot-arrow{color:#fff7ea;cursor:pointer;opacity:.85;background:#2018128c;border:0;border-radius:50%;place-items:center;width:34px;height:34px;margin-top:-17px;padding:0 0 3px;font-size:1.5rem;line-height:1;transition:background .2s,opacity .2s;display:grid;position:absolute;top:50%}.project-shot-arrow.is-prev{left:8px}.project-shot-arrow.is-next{right:8px}.project-shot-arrow:hover,.project-shot-arrow:focus-visible{opacity:1;background:#201812d9}.project-shot-arrow:focus-visible,.project-dots button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.project-shot-caption{color:var(--ink-soft);text-align:center;margin-top:8px;font-size:.78rem;line-height:1.4}@media (prefers-reduced-motion:reduce){.project-shot-frame img{animation:none}}.project-dots{justify-content:center;gap:6px;margin-top:8px;display:flex}.project-dots button{background:var(--line);cursor:pointer;border:0;border-radius:999px;width:22px;height:8px;padding:0}.project-dots .is-active{background:var(--accent)}.project-body p{margin:0 0 10px;line-height:1.6}.project h3,.about h3{letter-spacing:.12em;text-transform:uppercase;color:#8a6a45;margin:0 0 8px;font-size:.75rem}.project-tech ul,.about-skills ul{flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}.project-tech li,.about-skills li{background:var(--paper-deep);border:1px solid var(--line);border-radius:999px;padding:4px 10px;font-size:.82rem;font-weight:600}.project-muted,.about-muted{color:#8f7a60;margin:0;font-size:.9rem;font-style:italic}.project-links{flex-wrap:wrap;gap:8px;display:flex}.project-links .btn:not(.btn-primary){color:var(--ink)}.project-nav{border-top:1px dashed var(--line);color:var(--ink);justify-content:space-between;margin-top:auto;padding-top:12px;display:flex}.about{pointer-events:none;place-items:center;padding:72px 16px 24px;display:grid;inset:0;transform:translateY(16px)rotate(.6deg)}.about.is-open{opacity:1;visibility:visible;transition-delay:.15s;transform:rotate(-.4deg)}.about-paper{background:var(--paper);pointer-events:auto;background-image:repeating-linear-gradient(#0000 0 31px,#5a82aa29 31px 32px);background-position:0 14px;border-radius:3px;width:min(600px,100%);max-height:100%;padding:34px 34px 26px;position:relative;overflow:auto;box-shadow:0 30px 60px -20px #000000a6}.about-pin{background:radial-gradient(circle at 35% 35%,#ef8a6a,#a33d22);border-radius:50%;width:16px;height:16px;margin-left:-8px;position:absolute;top:12px;left:50%;box-shadow:0 3px 4px #0000004d}.about-greeting{font-family:var(--font-hand), cursive;color:var(--accent);margin:0;font-size:1.6rem;font-weight:700}.about h2{font-family:var(--font-display), serif;margin:2px 0 14px;font-size:2.1rem;font-weight:600;line-height:1.05}.about h2 span{font-family:var(--font-body), sans-serif;color:var(--ink-soft);margin-top:4px;font-size:1rem;font-weight:600;display:block}.about p{margin:0 0 12px;line-height:1.65}.about h3{margin-top:18px}.about-skills{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.about-skills h4{font-family:var(--font-hand), cursive;margin:0 0 6px;font-size:1.3rem}.about-now{background:#f6e3a6;border-radius:2px;padding:10px 12px;transform:rotate(-.6deg)}.about-actions{color:var(--ink);flex-wrap:wrap;gap:8px;margin-top:10px;display:flex}@media (max-width:720px){.desktop{background:#0a0d1699;width:100%;height:100%;padding:56px 8px 8px;font-size:15px;top:0;left:0}.os-body{flex-direction:column}.os-dock{flex-direction:row;width:auto;overflow-x:auto}.os-app span:last-child{white-space:nowrap}.os-app-leave{margin-top:0;margin-left:auto}.os-row{grid-template-columns:1fr}.project{width:auto;height:52%;inset:auto 8px 8px;transform:translateY(24px)}.project-inner{border-radius:16px;padding:20px 18px 14px}.project h2{font-size:1.5rem}.about-paper{padding:28px 20px 20px}.about h2{font-size:1.7rem}.hud-role{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}.classic{background:var(--paper);min-height:100%;color:var(--ink);overflow:auto}body:has(.classic){background:var(--paper);color:var(--ink)}.classic-header{border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:24px;max-width:920px;margin:0 auto;padding:64px 20px 32px;display:flex}.classic-header h1{font-family:var(--font-display), serif;margin:0;font-size:clamp(2.4rem,7vw,3.6rem);font-weight:600;line-height:1}.classic-kicker{font-family:var(--font-hand), cursive;color:var(--accent);margin:0 0 8px;font-size:1.4rem}.classic-role{margin:8px 0 4px;font-weight:700}.classic-header nav{flex-wrap:wrap;gap:16px;font-weight:600;display:flex}.classic-room{color:var(--accent)}.classic main{max-width:920px;margin:0 auto;padding:0 20px 80px}.classic-section{padding:48px 0 8px;line-height:1.65}.classic-section h2{font-family:var(--font-display), serif;margin:0 0 16px;font-size:1.9rem;font-weight:600}.classic-lead{font-family:var(--font-hand), cursive;margin:0;font-size:1.5rem}.classic-skills{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;display:grid}.classic-skills ul{margin:0;padding-left:18px}.classic-muted{color:#8f7a60}.classic-projects{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin:0;padding:0;list-style:none;display:grid}.classic-projects li{border:1px solid var(--line);background:#fffaf0;border-top:6px solid;border-radius:10px;padding:18px}.classic-projects h3{font-family:var(--font-display), serif;margin:0}.classic-shot{aspect-ratio:16/10;object-fit:contain;border:1px solid var(--line);background:#2a2420;border-radius:8px;width:100%;height:auto;margin:10px 0;display:block}.classic-badge{color:#8a5a25;border:1px dashed #b98a4a;border-radius:999px;margin:6px 0 0;padding:2px 8px;font-size:.75rem;font-weight:700;display:inline-block}.classic-links{gap:12px;display:flex}.classic-form{gap:12px;max-width:520px;display:grid}.classic-form label{gap:4px;font-weight:700;display:grid}.classic-form input,.classic-form textarea{border:1px solid var(--line);color:var(--ink);font:inherit;background:#fffaf0;border-radius:8px;padding:10px 12px}.classic-form .btn{justify-self:start}.classic-notice{border-radius:8px;max-width:520px;padding:10px 14px;display:none}.classic-notice:target{scroll-margin-top:24px;display:block}.classic-notice-ok{background:#d8e8d4}.classic-notice-warn{background:#f7e3b8}.classic-social{gap:16px;padding:0;list-style:none;display:flex}.perf{z-index:100;color:#e8e8e8;font:11px/1.35 var(--font-mono), monospace;pointer-events:none;background:#000000b8;border-radius:8px;gap:2px;padding:8px 10px;display:grid;position:fixed;bottom:8px;left:8px}.perf b{font-size:14px}.perf .ok{color:#8fe388}.perf .warn{color:#f2c14e}.perf .bad{color:#ff7a6b}
