*{margin:0;padding:0;box-sizing:border-box}html,body{width:100%;height:100%;overflow:hidden;background:#1a1a2e}#app{width:100%;height:100%;position:relative}canvas{width:100%;height:100%;display:block;touch-action:none}#loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;font-family:system-ui,sans-serif;gap:16px;transition:opacity .4s}#loading.hidden{opacity:0;pointer-events:none}.spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.2);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}#error{position:absolute;top:0;right:0;bottom:0;left:0;display:none;flex-direction:column;align-items:center;justify-content:center;color:#ff6b6b;font-family:system-ui,sans-serif;gap:8px;padding:20px;text-align:center}#error.visible{display:flex}#hotspots{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;gap:8px;z-index:10;pointer-events:auto;max-width:calc(100% - 32px)}#hotspots.overflow .hotspot-btn-inline{display:none}#hotspots.overflow .hotspot-toggle{display:flex}.hotspot-toggle{display:none;align-items:center;justify-content:center;width:44px;height:44px;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.15);border-radius:50%;color:#fff;font-size:20px;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .2s,transform .15s}.hotspot-toggle:hover{background:#fff3}.hotspot-toggle:active{transform:scale(.95)}.hotspot-menu{display:none;position:absolute;bottom:56px;left:50%;transform:translate(-50%);flex-direction:column;gap:4px;padding:8px;background:#000000b3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.15);border-radius:16px;max-height:60vh;overflow-y:auto;min-width:160px}.hotspot-menu.open{display:flex}.hotspot-btn{display:flex;align-items:center;gap:6px;padding:6px 14px;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.15);border-radius:20px;color:#fff;font-family:system-ui,sans-serif;font-size:13px;cursor:pointer;transition:background .2s,transform .15s;white-space:nowrap;user-select:none;-webkit-user-select:none}.hotspot-btn:hover{background:#fff3;transform:scale(1.05)}.hotspot-btn:active{transform:scale(.97)}.hotspot-dot{width:8px;height:8px;border-radius:50%;background:#4fc3f7;flex-shrink:0}.viewer-tip{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#000c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.15);border-radius:12px;padding:24px;color:#fff;font-family:system-ui,sans-serif;z-index:100;display:flex;flex-direction:column;gap:14px;box-shadow:0 8px 32px #0000004d;max-width:min(420px,95vw);width:max-content;animation:fadeIn .3s ease-out}.viewer-tip h2{font-size:16px;font-weight:600;margin:0;text-align:center}.viewer-tip h3{font-size:11px;font-weight:600;color:#4fc3f7;margin:6px 0 -2px;letter-spacing:.06em;text-transform:uppercase}.viewer-tip ul{list-style:none;display:flex;flex-direction:column;gap:6px;padding:0;margin:0}.viewer-tip li{display:flex;justify-content:space-between;align-items:center;gap:16px;font-size:13px;line-height:1.4}.viewer-tip .control{background:#ffffff1a;border:1px solid rgba(255,255,255,.15);border-radius:6px;padding:2px 8px;font-family:SF Mono,Menlo,monospace;font-size:11px;white-space:nowrap;flex-shrink:0}.viewer-tip .actions{display:flex;justify-content:center;margin-top:4px}.viewer-tip button{background:#4fc3f7;border:none;border-radius:20px;padding:8px 24px;color:#000;font-weight:700;cursor:pointer;transition:transform .15s,background .2s;font-family:inherit;font-size:14px}.viewer-tip button:hover{background:#29b6f6;transform:scale(1.05)}.viewer-tip button:active{transform:scale(.95)}.viewer-tip.sucking{animation:none;transition:transform .55s cubic-bezier(.6,0,.85,.2),opacity .45s ease-out .05s;pointer-events:none}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%,-45%)}to{opacity:1;transform:translate(-50%,-50%)}}.brand-logo{position:absolute;top:16px;left:16px;display:inline-flex;align-items:center;gap:4px;font-family:Space Mono,SF Mono,Menlo,monospace;font-weight:700;font-size:2em;letter-spacing:.01em;color:#fff;text-decoration:none;text-shadow:0 1px 14px rgba(0,0,0,.45),0 0 2px rgba(0,0,0,.25);z-index:90;transition:transform .15s;-webkit-tap-highlight-color:transparent}.brand-logo img{width:35px;height:35px;margin-bottom:7px;display:block;filter:drop-shadow(0 1px 4px rgba(0,0,0,.45))}.brand-logo:hover{transform:scale(1.03)}.brand-logo:active{transform:scale(.97)}.help-icon{position:absolute;top:16px;right:16px;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.15);border-radius:50%;color:#fff;font-family:system-ui,sans-serif;font-size:22px;font-weight:600;cursor:pointer;user-select:none;-webkit-user-select:none;z-index:90;opacity:0;pointer-events:none;transition:opacity .35s ease-out,background .2s,transform .15s}.help-icon.visible{opacity:1;pointer-events:auto}.help-icon:hover{background:#fff3}.help-icon:active{transform:scale(.95)}
