:root{--ink: #10233d;--ink-soft: #4a5a70;--cream: #ffffff;--surface: #f6f8fc;--surface-edge: #e3e9f2;--glass: rgba(255, 255, 255, .86);--glass-dark: rgba(16, 35, 61, .72);--line: rgba(16, 35, 61, .12);--accent: #2f7de1;--accent-dark: #1d63c4;--blue: #2f7de1;--blue-soft: rgba(47, 125, 225, .12);--blue-ink: #1d5fb8;--gold: #ffc93c;--radius: 18px;--shadow: 0 12px 40px rgba(16, 35, 61, .22);--font: "Sora", system-ui, -apple-system, "Segoe UI", sans-serif}*{box-sizing:border-box}html,body{margin:0;height:100%;overflow:hidden;background:#0b4f96;color:var(--ink);font-family:var(--font);-webkit-font-smoothing:antialiased}#scene{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block}.hidden{display:none!important}button{font:inherit;color:inherit;cursor:pointer}kbd{display:inline-grid;place-items:center;min-width:1.75em;height:1.75em;padding:0 .5em;border-radius:7px;background:linear-gradient(#fff,#eef2f8);border:1px solid #cfd8e6;box-shadow:0 2px #b9c5d8,0 3px 6px #10233d1f,inset 0 1px #fff;color:var(--blue-ink);font:800 .72em/1 var(--font);letter-spacing:.02em;text-align:center;vertical-align:middle;transform:translateY(-1px)}.logo{width:1.15em;height:1.15em;transform:rotate(45deg);color:var(--accent);flex:none}.brand{display:inline-flex;align-items:center;gap:.45em;font-weight:800;letter-spacing:-.02em}.brand [data-avatar]{display:inline-flex}.avatar{width:1.6em;height:1.6em;border-radius:50%;object-fit:cover;flex:none;background:var(--blue-soft);box-shadow:0 0 0 2px #fff,0 2px 8px #10233d40}.chip .avatar{width:26px;height:26px}.brand.big .avatar{width:1.3em;height:1.3em;box-shadow:0 0 0 3px #fff,0 4px 14px #0000004d}.avatar.big{width:64px;height:64px;box-shadow:0 0 0 3px #fff,0 4px 14px #10233d33}.about-head{display:flex;align-items:center;gap:14px;margin-bottom:16px}.about-head strong{display:block;font-size:1.1rem}.about-head span{color:var(--ink-soft);font-size:.9rem}.btn{display:inline-flex;align-items:center;gap:.6em;border:0;border-radius:999px;padding:.85em 1.6em;font-weight:700;transition:transform .15s ease,background .15s ease}.btn.primary{background:var(--accent);color:#fff;box-shadow:0 6px 18px #2f7de166}.btn.primary:hover{background:var(--accent-dark);transform:translateY(-1px)}.btn.primary kbd{background:#ffffff38;border-color:#ffffff73;box-shadow:0 2px #0000002e;color:#fff}.link{background:none;border:0;padding:0;text-decoration:underline;text-underline-offset:3px;font-size:.9rem;color:inherit}#intro{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;padding:clamp(20px,5vw,56px);background:linear-gradient(to top,#10233d8c,#10233d00 55%);z-index:10}.intro-card{color:var(--cream);display:grid;gap:14px;justify-items:start;max-width:420px}.brand.big{font-size:clamp(2rem,6vw,3.2rem)}#intro-tagline{margin:0;font-size:1.1rem;opacity:.92}.intro-card .btn{margin-top:6px;font-size:1.05rem}.intro-card .link{color:var(--cream);opacity:.85}#hud,#labels,#touch{display:none}body.flying #hud,body.flying #labels{display:block}body.photo #hud,body.photo #labels,body.photo #touch,body.photo #toasts,body.photo .modal{display:none!important}#photo-hint{display:none;animation:none;position:fixed;left:50%;bottom:20px;transform:translate(-50%);z-index:20;pointer-events:none;white-space:nowrap}body.photo #photo-hint{display:flex}.chip{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:var(--glass);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow);font-weight:700;font-size:.9rem}.ico{width:18px;height:18px;flex:none}.chip .ico.gold{color:var(--gold)}.chip .ico.accent{color:var(--accent)}.chip{font-variant-numeric:tabular-nums}.clock{border:0;cursor:pointer;font:inherit;font-weight:700;color:inherit}.clock small{color:var(--ink-soft);font-weight:600;font-size:.75rem}.clock:hover{transform:translateY(-1px)}.hud-tl,.hud-tr{position:fixed;top:16px;display:flex;gap:8px;z-index:5}.hud-tl{left:16px}.hud-tr{right:16px}.icon-btn{width:42px;height:42px;display:grid;place-items:center;border:0;border-radius:14px;background:var(--glass);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow);transition:transform .15s ease}.icon-btn:hover{transform:translateY(-2px)}.icon-btn.on{background:var(--glass);color:inherit}.ico.duo{width:22px;height:22px;fill:none;stroke:var(--ink);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.ico.duo .fill{fill:var(--blue-soft);stroke:none}.ico.duo .dot{fill:var(--accent);stroke:none}.icon-btn:hover .ico.duo .fill{fill:#2f7de140}.icon-btn .sound-on{display:none}.icon-btn.on .sound-on{display:block}.icon-btn.on .sound-off{display:none}.icon-btn.on .ico.duo .fill{fill:#2f7de14d}.gauges{position:fixed;left:16px;bottom:16px;gap:16px;z-index:5;font-variant-numeric:tabular-nums}.gauges small{color:var(--ink-soft);font-weight:600;font-size:.7rem;letter-spacing:.08em}.gauges b{display:inline-block;min-width:2.4em;text-align:right}.hud-bottom{position:fixed;left:50%;bottom:16px;transform:translate(-50%);display:flex;flex-wrap:wrap;justify-content:center;gap:4px 14px;padding:8px 16px;border-radius:999px;background:var(--glass);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow);color:var(--ink);font-size:.78rem;font-weight:600;z-index:5;max-width:calc(100vw - 400px)}.hud-bottom span{display:inline-flex;align-items:center;gap:4px}.prompt{position:fixed;left:50%;bottom:84px;transform:translate(-50%);padding:12px 22px;border-radius:999px;background:var(--glass);box-shadow:var(--shadow);font-weight:600;z-index:6;white-space:nowrap;animation:pop .25s ease;display:flex;align-items:center;gap:8px;line-height:1}.prompt kbd{line-height:1.4}@keyframes pop{0%{opacity:0;transform:translate(-50%,8px)}}#labels{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:4}.label{position:absolute;left:0;top:0;display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:999px;background:var(--glass);box-shadow:0 6px 18px #10233d33;font-weight:700;font-size:.85rem;white-space:nowrap;will-change:transform}.label .dot{width:8px;height:8px;border-radius:50%;background:var(--accent)}.label.visited .dot{background:var(--blue)}.label.near{background:var(--accent);color:#fff}.label.near .dot{background:#fff}#toasts{position:fixed;top:72px;left:50%;transform:translate(-50%);display:grid;gap:8px;z-index:20;pointer-events:none}.toast{display:flex;align-items:center;gap:8px;padding:10px 18px;border-radius:999px;background:var(--glass);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--ink);font-weight:700;font-size:.9rem;box-shadow:var(--shadow);text-align:center;animation:drop .3s ease;transition:opacity .4s ease,transform .4s ease}.toast.out{opacity:0;transform:translateY(-8px)}@keyframes drop{0%{opacity:0;transform:translateY(-10px)}}.modal{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:16px;z-index:15;background:#10233d40}#panel{place-items:center end;background:linear-gradient(to left,rgba(16,35,61,.3),transparent 60%);padding:24px}.card{width:min(520px,100%);max-height:calc(100vh - 48px);overflow:auto;padding:28px;border-radius:var(--radius);background:linear-gradient(180deg,#ffffff 0%,var(--surface) 100%);border:1px solid rgba(255,255,255,.9);box-shadow:var(--shadow);animation:slide .35s cubic-bezier(.2,.8,.2,1)}@keyframes slide{0%{opacity:0;transform:translateY(16px)}}.card h2{margin:0 0 14px;font-size:1.8rem;letter-spacing:-.02em}.kicker{color:var(--accent);font-weight:700;font-size:.8rem;letter-spacing:.1em;text-transform:uppercase;margin-bottom:4px}.card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}.card-head h2{margin:0}.x{flex:none;display:grid;place-items:center;width:36px;height:36px;padding:0;border:0;border-radius:50%;background:#10233d14;font-size:1.4rem;line-height:1;transition:background .15s ease}.x:hover{background:#10233d26}.panel-actions{margin-top:22px;display:flex;justify-content:flex-end}.hint{color:var(--ink-soft);font-size:.85rem;margin:12px 0 0}.prose p{line-height:1.65;color:var(--ink-soft);margin:0 0 12px}.prose h3,.plain-section h3{margin:18px 0 8px;font-size:1rem}.chips{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:6px}.chips li{padding:5px 11px;border-radius:999px;background:var(--blue-soft);color:var(--blue-ink);font-size:.8rem;font-weight:600}.projects{display:grid;gap:14px}.project{padding:18px;border-radius:14px;border:1px solid var(--surface-edge);background:#fff;box-shadow:0 2px 8px #10233d0d}.project h3{margin:4px 0 6px!important;font-size:1.1rem}.project p{margin-bottom:10px}.project-meta{font-size:.78rem;color:var(--ink-soft);font-weight:600}.arrow-link{display:inline-block;margin-top:12px;color:var(--accent-dark);font-weight:700;text-decoration:none}.arrow-link:hover{text-decoration:underline}.contact-links{display:grid;gap:10px;margin-top:14px}.contact-links a{display:flex;justify-content:space-between;padding:14px 18px;border-radius:14px;background:#fff;border:1px solid var(--line);color:var(--ink);text-decoration:none}.contact-links a:hover{border-color:var(--accent)}.contact-links span{color:var(--ink-soft)}.controls-grid{display:grid;grid-template-columns:auto 1fr;gap:8px 14px;align-items:center;margin-top:16px;font-size:.9rem}.controls-grid div{display:flex;gap:4px}.map-card{width:min(640px,100%)}#map-canvas{width:100%;height:auto;aspect-ratio:1;border-radius:12px;display:block}.log-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}.log-list li{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:12px;background:#fff;border:1px solid var(--surface-edge);box-shadow:0 2px 8px #10233d0d;font-weight:600}.log-list li>span:nth-child(2){flex:1}.log-list em{color:var(--ink-soft);font-style:normal;font-weight:400;font-size:.85rem}.log-list .check{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;border:2px solid var(--line);font-size:.75rem}.log-list .done .check{background:var(--blue);border-color:var(--blue);color:#fff}.mini{border:0;border-radius:999px;padding:6px 12px;background:var(--accent);color:#fff;font-weight:700;font-size:.8rem}#plain{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;background:linear-gradient(180deg,#fff,#eef3f9);z-index:30}#plain-body{max-width:760px;margin:0 auto;padding:56px 20px 40px}.plain-hero{padding-bottom:32px;border-bottom:1px solid var(--line)}.plain-hero .brand{font-size:1.4rem}.plain-hero h1{font-size:clamp(2.4rem,8vw,4rem);margin:18px 0 6px;letter-spacing:-.03em}.plain-hero p{color:var(--ink-soft);font-size:1.1rem;margin:0 0 22px}body.no-webgl .plain-hero .btn{display:none}.plain-section{padding:32px 0;border-bottom:1px solid var(--line)}.plain-section h2{margin:0 0 14px;font-size:1.6rem}.plain-section p{line-height:1.7;color:var(--ink-soft)}.plain-footer{padding:28px 0;color:var(--ink-soft);font-size:.85rem}@media(pointer:coarse){body.flying #touch{display:flex;position:fixed;left:12px;right:12px;bottom:16px;justify-content:space-between;align-items:flex-end;z-index:6;pointer-events:none}#touch .pad{display:flex;flex-direction:column;gap:10px;pointer-events:auto}#touch .pad:nth-child(3){flex-direction:row}#touch button{width:62px;height:62px;border-radius:50%;border:0;background:var(--glass);box-shadow:var(--shadow);font-size:1.2rem;touch-action:none;user-select:none;-webkit-user-select:none}#touch button.wide{width:86px;height:44px;border-radius:999px;font-size:.85rem;font-weight:700}#touch button.active{background:var(--blue);color:#fff}#touch-e.ready{background:var(--accent);color:#fff}.hud-bottom,.gauges{display:none!important}.prompt{bottom:150px}}@media(max-width:760px){.hud-bottom{display:none}.hud-tr{gap:6px}.icon-btn{width:38px;height:38px}.hud-tl .brand{display:none}#panel{place-items:end center;padding:12px;background:#10233d40}.card{padding:22px;max-height:75vh}.prompt{white-space:normal;text-align:center;width:max-content;max-width:calc(100vw - 32px);flex-wrap:wrap;justify-content:center}.clock small{display:none}}:root{--spring: cubic-bezier(.2, .9, .3, 1.3);--smooth: cubic-bezier(.2, .8, .2, 1)}@keyframes fade-in{0%{opacity:0}}@keyframes fade-out{to{opacity:0}}@keyframes rise{0%{opacity:0;transform:translateY(10px)}}@keyframes card-in{0%{opacity:0;transform:translateY(22px) scale(.95)}}@keyframes card-out{to{opacity:0;transform:translateY(12px) scale(.96)}}@keyframes panel-in{0%{opacity:0;transform:translate(48px)}}@keyframes panel-out{to{opacity:0;transform:translate(36px)}}@keyframes hud-drop{0%{opacity:0;transform:translateY(-18px) scale(.9)}}@keyframes hud-rise{0%{opacity:0;transform:translateY(18px)}}@keyframes hud-rise-center{0%{opacity:0;transform:translate(-50%,24px)}}@keyframes toast-in{0%{opacity:0;transform:translateY(-16px) scale(.9)}}@keyframes hint-in{0%{opacity:0;transform:translate(-50%,16px)}}@keyframes prompt-in{0%{opacity:0;transform:translate(-50%,16px) scale(.9)}}@keyframes key-glow{50%{box-shadow:0 2px #b9c5d8,0 0 0 5px #2f7de138,inset 0 1px #fff}}@keyframes bump{35%{transform:scale(1.16)}70%{transform:scale(.97)}}@keyframes icon-swap{0%{opacity:0;transform:rotate(-120deg) scale(.4)}}@keyframes label-glow{50%{box-shadow:0 0 0 6px #2f7de140,0 6px 18px #10233d33}}@keyframes intro-out{to{opacity:0;transform:translateY(16px)}}.modal{animation:fade-in .25s ease backwards}.modal .card{animation:card-in .42s var(--spring) backwards}.modal.closing{animation:fade-out .24s ease both;pointer-events:none}.modal.closing .card{animation:card-out .24s ease both}#panel .card{animation:panel-in .5s var(--smooth) backwards}#panel.closing .card{animation:panel-out .26s ease both}.card>*,#panel-body>*,.log-list li{animation:rise .5s var(--smooth) backwards}.card>:nth-child(1){animation-delay:.05s}.card>:nth-child(2){animation-delay:.1s}.card>:nth-child(3){animation-delay:.15s}.card>:nth-child(4){animation-delay:.2s}#panel-body>:nth-child(1){animation-delay:.16s}#panel-body>:nth-child(2){animation-delay:.22s}#panel-body>:nth-child(3){animation-delay:.28s}#panel-body>:nth-child(4){animation-delay:.34s}#panel-body>:nth-child(n+5){animation-delay:.4s}.log-list li:nth-child(1){animation-delay:.12s}.log-list li:nth-child(2){animation-delay:.18s}.log-list li:nth-child(3){animation-delay:.24s}.log-list li:nth-child(4){animation-delay:.3s}.log-list li:nth-child(5){animation-delay:.36s}.projects .project{animation:rise .5s var(--smooth) backwards}.projects .project:nth-child(2){animation-delay:.08s}.projects .project:nth-child(3){animation-delay:.16s}body.flying .hud-tl>*,body.flying .hud-tr>*{animation:hud-drop .55s var(--spring) backwards}body.flying .hud-tl>:nth-child(1){animation-delay:.15s}body.flying .hud-tl>:nth-child(2){animation-delay:.22s}body.flying .hud-tl>:nth-child(3){animation-delay:.29s}body.flying .hud-tl>:nth-child(4){animation-delay:.36s}body.flying .hud-tr>:nth-child(1){animation-delay:.2s}body.flying .hud-tr>:nth-child(2){animation-delay:.26s}body.flying .hud-tr>:nth-child(3){animation-delay:.32s}body.flying .hud-tr>:nth-child(4){animation-delay:.38s}body.flying .hud-tr>:nth-child(5){animation-delay:.44s}body.flying .gauges{animation:hud-rise .55s var(--smooth) .5s backwards}body.flying .hud-bottom{animation:hud-rise-center .6s var(--smooth) .6s backwards}.intro-card>*{animation:rise .8s var(--smooth) backwards}.intro-card>:nth-child(1){animation-delay:.1s}.intro-card>:nth-child(2){animation-delay:.22s}.intro-card>:nth-child(3){animation-delay:.34s}.intro-card>:nth-child(4){animation-delay:.44s}#intro.leaving{animation:fade-out .45s ease both;pointer-events:none}#intro.leaving .intro-card{animation:intro-out .45s ease both}.toast{animation:toast-in .45s var(--spring) backwards}#photo-hint{animation:hint-in .45s var(--smooth) backwards}.prompt{animation:prompt-in .42s var(--spring) backwards}.prompt kbd{animation:key-glow 1.6s ease-in-out infinite}#plain:not(.hidden){animation:fade-in .3s ease backwards}#plain.closing{animation:fade-out .25s ease both}.plain-hero>*,.plain-section{animation:rise .6s var(--smooth) backwards}.plain-hero>:nth-child(2){animation-delay:.08s}.plain-hero>:nth-child(3){animation-delay:.14s}.plain-hero>:nth-child(4){animation-delay:.2s}.plain-section:nth-of-type(1){animation-delay:.22s}.plain-section:nth-of-type(2){animation-delay:.3s}.plain-section:nth-of-type(n+3){animation-delay:.38s}.icon-btn,.chip.clock,.btn,.mini,.x{transition:transform .2s var(--spring),box-shadow .2s ease,background .2s ease,color .2s ease}.icon-btn:hover{transform:translateY(-2px) scale(1.06);box-shadow:0 16px 34px #10233d42}.icon-btn:active,.chip.clock:active,.mini:active{transform:scale(.9)}.btn.primary:hover{box-shadow:0 10px 26px #2f7de180}.btn:active{transform:scale(.95)}.x:hover{transform:rotate(90deg)}.mini:hover{transform:translateY(-1px)}.ico.duo .fill,.ico.duo path,.ico.duo circle{transition:fill .2s ease,stroke .2s ease}.project,.log-list li,.contact-links a{transition:transform .2s var(--smooth),box-shadow .2s ease,border-color .2s ease}.project:hover,.contact-links a:hover{transform:translateY(-2px);box-shadow:0 10px 24px #10233d1a}.log-list li:hover{transform:translate(3px)}.chips li{transition:transform .18s var(--spring),background .2s ease}.chips li:hover{transform:translateY(-2px);background:#2f7de133}kbd{transition:transform .08s ease,box-shadow .08s ease,background .12s ease,color .12s ease}kbd.pressed{transform:translateY(1px);background:var(--blue);border-color:var(--blue);color:#fff;box-shadow:0 0 #1d5fb8,0 1px 3px #10233d33}body.flying .hud-tl>.chip.bump{animation:bump .5s var(--spring)}#clock-icon.swap svg{animation:icon-swap .55s var(--spring)}.label{transition:background .25s ease,color .25s ease,opacity .3s ease}.label.near{animation:label-glow 1.4s ease-in-out infinite}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}
