:root{color-scheme:dark;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;--accent: #3a7bd5}*{box-sizing:border-box}html,body,#root{margin:0;height:100%;width:100%;background:#14181d;color:#e8eaed;overflow:hidden;overscroll-behavior:none}.viewer-root{position:fixed;top:0;right:0;bottom:0;left:0;touch-action:none}.viewer-root canvas{display:block;width:100%!important;height:100%!important}.overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.overlay button{pointer-events:auto}.hud{position:absolute;left:0;right:0;display:flex;align-items:flex-start;justify-content:space-between;gap:.5rem;flex-wrap:wrap;padding-top:max(.75rem,env(safe-area-inset-top));padding-bottom:.75rem;padding-left:max(.9rem,env(safe-area-inset-left));padding-right:max(.9rem,env(safe-area-inset-right))}.hud-top{top:0;background:linear-gradient(to bottom,rgba(0,0,0,.45),transparent)}.hud-left,.hud-right{display:flex;align-items:center;gap:.5rem}.hud-right{flex-wrap:wrap;justify-content:flex-end}.badge{font-size:.68rem;font-weight:700;letter-spacing:.08em;background:var(--accent);color:#fff;padding:.15rem .45rem;border-radius:5px}.project-name{font-weight:600;font-size:.95rem;text-shadow:0 1px 4px rgba(0,0,0,.6)}.seg{display:flex;background:#14181d99;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.12);border-radius:9px;overflow:hidden}.seg-btn{border:0;background:transparent;color:#cdd2d8;font:inherit;font-size:.85rem;padding:.4rem .8rem;cursor:pointer}.seg-btn.active{background:var(--accent);color:#fff}.seg-btn:disabled{color:#6b7178;cursor:not-allowed}.icon-btn{width:38px;height:38px;display:grid;place-items:center;font-size:1.1rem;color:#e8eaed;background:#14181d99;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.12);border-radius:9px;cursor:pointer}.icon-btn:hover{background:#3a7bd540}.icon-btn:active{background:#3a7bd566}.help-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;background:#00000080;pointer-events:auto;padding:1rem}.help-panel{width:min(92vw,420px);max-height:85vh;max-height:85dvh;overflow-y:auto;background:#1b2027;border:1px solid rgba(255,255,255,.14);border-radius:14px;padding:.5rem 1.25rem;padding-bottom:max(1.25rem,env(safe-area-inset-bottom));box-shadow:0 12px 40px #0000008c}.help-head{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;background:#1b2027;padding-top:.75rem}.help-head h2{font-size:1.1rem;margin:0}.help-section h3{font-size:.8rem;letter-spacing:.06em;text-transform:uppercase;color:var(--accent);margin:1rem 0 .35rem}.help-section ul{margin:0;padding-left:1.1rem;display:flex;flex-direction:column;gap:.3rem}.help-section li{font-size:.9rem;color:#cdd2d8}.help-section li b{color:#e8eaed}.help-foot{margin:1.1rem 0 0;font-size:.8rem;color:#8b919a}.vr-btn{font:inherit;font-size:.85rem;font-weight:600;color:#fff;height:38px;padding:0 .9rem;display:inline-flex;align-items:center;gap:.4rem;background:var(--accent);border:1px solid var(--accent);border-radius:9px;cursor:pointer}.vr-btn:before{content:"▢";font-size:.9rem;opacity:.85}.vr-btn:active{background:#2f66b3}.loading{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;justify-items:center;gap:.9rem;background:#14181d59}.spinner{width:34px;height:34px;border:3px solid rgba(255,255,255,.18);border-top-color:var(--accent);border-radius:50%;animation:spin .9s linear infinite}.progress{width:min(60vw,280px);height:6px;background:#ffffff24;border-radius:99px;overflow:hidden}.progress-bar{height:100%;background:var(--accent);transition:width .15s ease}.loading-text{font-size:.85rem;color:#aab0b7}.error-box{max-width:360px;text-align:center;background:#281616eb;border:1px solid #5b2b2b;border-radius:12px;padding:1rem 1.25rem;pointer-events:auto;user-select:text;-webkit-user-select:text}.error-box p{color:#ff9d96;font-size:.9rem;margin:.5rem 0 0;word-break:break-word}.error-box .pill{margin-top:.75rem}.pill{font:inherit;font-size:.85rem;color:#cdd2d8;padding:.4rem .8rem;background:#14181d99;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.12);border-radius:9px;cursor:pointer}.pill.active{background:var(--accent);border-color:var(--accent);color:#fff}.viewer-toast{position:absolute;bottom:max(4rem,env(safe-area-inset-bottom));left:50%;transform:translate(-50%);max-width:340px;text-align:center;font-size:.85rem;color:#fff;background:#281616eb;border:1px solid #5b2b2b;border-radius:10px;padding:.5rem .8rem;pointer-events:none}.render-progress{position:absolute;right:max(1rem,env(safe-area-inset-right));bottom:max(1rem,env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:flex-end;gap:.3rem;font-size:.72rem;color:#e8eaedbf;text-shadow:0 1px 3px rgba(0,0,0,.6);pointer-events:none;opacity:.85}.render-progress-track{width:120px;height:3px;background:#ffffff2e;border-radius:99px;overflow:hidden}.render-progress-fill{height:100%;background:var(--accent);transition:width .2s ease}.measure-readout{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:50%;transform:translate(-50%);display:flex;align-items:center;gap:.5rem;padding:.4rem .6rem;background:#14181db3;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.14);border-radius:11px;pointer-events:auto}.measure-crosshair{position:absolute;top:50%;left:50%;width:18px;height:18px;margin:-9px 0 0 -9px;border:1.5px solid rgba(79,155,255,.9);border-radius:50%;box-shadow:0 0 0 1px #0006;pointer-events:none}.measure-crosshair:after{content:"";position:absolute;top:50%;left:50%;width:3px;height:3px;margin:-1.5px 0 0 -1.5px;background:#4f9bff;border-radius:50%}.measure-value{font-size:.95rem;font-weight:600;color:#e8eaed;min-width:7ch;text-align:center}.walk-hint{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:50%;transform:translate(-50%);font-size:.8rem;color:#cdd2d8;background:#14181d8c;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);padding:.35rem .7rem;border-radius:8px;white-space:nowrap;pointer-events:none}.joystick{position:absolute;left:max(1.25rem,env(safe-area-inset-left));bottom:calc(max(1.25rem,env(safe-area-inset-bottom)) + 2.5rem);width:116px;height:116px;border-radius:50%;background:#14181d66;border:1px solid rgba(255,255,255,.16);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);pointer-events:auto;touch-action:none;display:grid;place-items:center}.joystick-thumb{width:52px;height:52px;border-radius:50%;background:#3a7bd5d9;box-shadow:0 2px 10px #0006}.vert-controls{position:absolute;right:max(1.25rem,env(safe-area-inset-right));bottom:calc(max(1.25rem,env(safe-area-inset-bottom)) + 2.5rem);display:flex;flex-direction:column;gap:.6rem;pointer-events:auto}.vert-btn{width:58px;height:58px;font-size:1.3rem;color:#e8eaed;background:#14181d80;border:1px solid rgba(255,255,255,.16);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:14px;display:grid;place-items:center;touch-action:none;-webkit-user-select:none;user-select:none}.vert-btn:active{background:#3a7bd580}.page-center{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;text-align:center}.page-center a{color:var(--accent)}:root{--ink: #1b2027;--ink-soft: #475160;--ink-muted: #6b7480;--blue: #3a7bd5;--blue-strong: #316bbb;--blue-tint: #eef4fc;--blue-ring: rgba(58, 123, 213, .35);--bg: #f4f6f8;--surface: #ffffff;--surface-soft: #f7f9fb;--surface-chip: #eef1f5;--border: #e3e8ee;--border-strong: #cdd5df;--border-faint: #eef1f5;--danger: #d92d20;--danger-strong: #b42318;--danger-bg: #fee4e2;--danger-border: #fda29b;--ok: #027a48;--ok-bg: #d1fae0;--ok-border: #6ce9a6;--warn: #b54708;--warn-bg: #fef0c7;--sp-1: .25rem;--sp-2: .5rem;--sp-3: .75rem;--sp-4: 1rem;--sp-5: 1.25rem;--sp-6: 1.5rem;--sp-8: 2rem;--r-sm: 6px;--r-md: 8px;--r-lg: 12px;--r-xl: 14px;--r-pill: 99px;--fs-xs: .78rem;--fs-sm: .85rem;--fs-md: .92rem;--fs-base: 1rem;--fs-lg: 1.05rem;--fs-h2: 1.05rem;--fs-h1: 1.4rem;--shadow-sm: 0 1px 2px rgba(20, 30, 50, .04);--shadow-card: 0 4px 14px rgba(20, 30, 50, .07);--shadow-modal: 0 20px 50px rgba(20, 28, 40, .22);--control-h: 2.25rem;--control-h-sm: 1.85rem;--control-pad-x: .85rem;--t-fast: .12s ease}.app,.login-screen{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg);color:var(--ink);overflow:hidden;display:flex;flex-direction:column}.app-main{flex:1;overflow:auto;padding:var(--sp-6)}.app-loading,.app-muted{color:var(--ink-muted);padding:var(--sp-6)}p.app-muted,span.app-muted{padding:0}.app-error,.app-notice{padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);border:1px solid transparent;font-size:var(--fs-sm);margin:0 0 var(--sp-4)}.app-error{color:var(--danger-strong);background:var(--danger-bg);border-color:var(--danger-border)}.app-notice{color:var(--ok);background:var(--ok-bg);border-color:var(--ok-border);cursor:pointer}.page-head,.projects-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap;margin:0 0 var(--sp-6)}.page-head h1,.projects-head h1{margin:0;font-size:var(--fs-h1);font-weight:700;letter-spacing:-.01em}.app-header{display:flex;align-items:center;gap:var(--sp-5);padding:var(--sp-3) var(--sp-5);background:var(--surface);border-bottom:1px solid var(--border)}.app-brand{font-weight:700;font-size:var(--fs-lg);letter-spacing:-.01em;text-decoration:none;color:var(--ink)}.app-brand span{color:var(--blue)}.app-nav{display:flex;gap:var(--sp-1)}.app-nav a{color:var(--ink-soft);text-decoration:none;font-size:var(--fs-md);padding:.35rem var(--sp-3);border-radius:var(--r-md);transition:background var(--t-fast),color var(--t-fast)}.app-nav a:hover{color:var(--blue);background:var(--surface-chip)}.app-user{margin-left:auto;display:flex;align-items:center;gap:var(--sp-3)}.app-whoami{font-size:var(--fs-sm);color:var(--ink-muted)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);font:inherit;font-size:var(--fs-md);font-weight:600;line-height:1;height:var(--control-h);padding:0 var(--control-pad-x);border-radius:var(--r-md);border:1px solid transparent;cursor:pointer;white-space:nowrap;transition:background var(--t-fast),border-color var(--t-fast),color var(--t-fast)}.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--blue-ring)}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--blue);color:#fff}.btn-primary:hover:not(:disabled){background:var(--blue-strong)}.btn-ghost{background:var(--surface);border-color:var(--border-strong);color:var(--ink-soft)}.btn-ghost:hover:not(:disabled){background:var(--surface-chip);border-color:var(--border-strong)}.btn-danger{background:var(--danger);color:#fff}.btn-danger:hover:not(:disabled){background:var(--danger-strong)}.btn-sm{height:var(--control-h-sm);padding:0 var(--sp-3);font-size:var(--fs-sm)}.rename-btn{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--border-strong);color:var(--ink-soft);border-radius:var(--r-sm);height:var(--control-h-sm);padding:0 var(--sp-2);font:inherit;font-size:var(--fs-xs);font-weight:600;cursor:pointer;line-height:1;transition:background var(--t-fast),border-color var(--t-fast)}.rename-btn:hover{background:var(--surface-chip)}.detail-head-actions{display:flex;gap:var(--sp-2)}.field input,.new-project input,.link-row input,.user-form input,.user-form select{font:inherit;font-size:var(--fs-sm);height:var(--control-h);padding:0 .7rem;border:1px solid var(--border-strong);border-radius:var(--r-md);background:var(--surface);color:var(--ink)}.field input:focus,.new-project input:focus,.link-row input:focus,.user-form input:focus,.user-form select:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-ring)}.login-screen{align-items:center;justify-content:center}.login-card{width:min(92vw,360px);background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);padding:var(--sp-8) 1.75rem;box-shadow:var(--shadow-card);display:flex;flex-direction:column;gap:var(--sp-3)}.login-brand{margin:0;font-size:1.5rem;letter-spacing:-.01em}.login-brand span{color:var(--blue)}.login-sub{margin:0 0 var(--sp-2);color:var(--ink-muted);font-size:var(--fs-md)}.login-card .btn{margin-top:var(--sp-1)}.field{display:flex;flex-direction:column;gap:var(--sp-1);font-size:var(--fs-sm);color:var(--ink-soft)}.login-error{color:var(--danger-strong);font-size:var(--fs-sm);margin:0}.new-project{display:flex;gap:var(--sp-2)}.new-project input{min-width:200px}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--sp-4)}.project-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-3);text-decoration:none;color:inherit;box-shadow:var(--shadow-sm);transition:border-color var(--t-fast),box-shadow var(--t-fast)}.project-card:hover{border-color:var(--blue);box-shadow:var(--shadow-card)}.project-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sp-2)}.project-card-top h2{margin:0;font-size:var(--fs-lg);font-weight:600}.project-card-meta{display:flex;justify-content:space-between;font-size:var(--fs-xs);color:var(--ink-muted)}.project-card-meta code{background:var(--surface-chip);padding:.1rem .35rem;border-radius:var(--r-sm)}.project-card-actions{border-top:1px solid var(--border-faint);padding-top:var(--sp-3);min-height:1.5rem}.switch{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--ink-soft);cursor:pointer}.switch input{accent-color:var(--blue)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#141c2873;display:grid;place-items:center;padding:var(--sp-4);z-index:50;animation:modal-fade var(--t-fast)}.modal{width:min(94vw,460px);background:var(--surface);border-radius:var(--r-xl);padding:var(--sp-6);display:flex;flex-direction:column;gap:var(--sp-3);box-shadow:var(--shadow-modal);animation:modal-rise .16s ease}.modal h2{margin:0;font-size:1.15rem;font-weight:700}.modal-actions{display:flex;justify-content:flex-end;gap:var(--sp-2);margin-top:var(--sp-1)}@keyframes modal-fade{0%{opacity:0}}@keyframes modal-rise{0%{opacity:0;transform:translateY(6px)}}.dropzone{border:2px dashed var(--border-strong);border-radius:var(--r-lg);padding:1.4rem var(--sp-4);text-align:center;color:var(--ink-muted);font-size:var(--fs-md);cursor:pointer;background:var(--surface-soft);transition:border-color var(--t-fast),background var(--t-fast)}.dropzone.over{border-color:var(--blue);background:var(--blue-tint)}.dropzone.disabled{opacity:.6;cursor:not-allowed}.dropzone code{background:var(--surface-chip);padding:.05rem .3rem;border-radius:var(--r-sm)}.progress{height:8px;background:var(--border);border-radius:var(--r-pill);overflow:hidden}.progress-bar{height:100%;background:var(--blue);transition:width .15s ease}.detail{max-width:760px}.detail-head{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-4);margin-bottom:var(--sp-4)}.detail-head h1{margin:var(--sp-2) 0 var(--sp-1);font-size:var(--fs-h1);font-weight:700;letter-spacing:-.01em;display:flex;align-items:center;gap:var(--sp-3)}.back-link{color:var(--blue);text-decoration:none;font-size:var(--fs-sm);font-weight:600}.back-link:hover{text-decoration:underline}.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:var(--sp-5);margin-bottom:var(--sp-4);box-shadow:var(--shadow-sm)}.panel h2{margin:0 0 var(--sp-4);font-size:var(--fs-h2);font-weight:700}.link-row{display:flex;gap:var(--sp-2)}.link-row input{flex:1;background:var(--surface-soft)}.link-actions{display:flex;align-items:center;gap:var(--sp-4);margin-top:var(--sp-3)}.file-list{list-style:none;margin:0 0 var(--sp-3);padding:0;display:flex;flex-direction:column;gap:var(--sp-2)}.file-list li{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);background:var(--surface-soft);border:1px solid var(--border-faint);border-radius:var(--r-md);font-size:var(--fs-sm)}.file-list li span:first-child{flex:1;word-break:break-all}.data-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}.data-table th,.data-table td{text-align:left;padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border-faint);vertical-align:middle}.data-table tbody tr:last-child td{border-bottom:none}.data-table th{color:var(--ink-muted);font-weight:600;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.03em}.data-table tbody tr:hover td{background:var(--surface-soft)}.row-inactive{opacity:.5}.stats{display:flex;gap:var(--sp-8);flex-wrap:wrap}.stats div{display:flex;flex-direction:column;gap:var(--sp-1)}.stats strong{font-size:1.2rem;font-weight:700}.stats span{font-size:var(--fs-xs);color:var(--ink-muted)}.user-form{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center}.badge{display:inline-flex;align-items:center;font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.15rem .45rem;border-radius:var(--r-sm);white-space:nowrap}.badge-green{background:var(--ok-bg);color:var(--ok)}.badge-amber{background:var(--warn-bg);color:var(--warn)}.badge-red{background:var(--danger-bg);color:var(--danger-strong)}.badge-gray{background:#eaecf0;color:var(--ink-soft)}@keyframes spin{to{transform:rotate(360deg)}}.spinner{display:inline-block;width:1.1em;height:1.1em;border:2px solid var(--border-strong);border-top-color:var(--blue);border-radius:50%;animation:spin .7s linear infinite;vertical-align:-.2em}.loading-row{display:flex;align-items:center;gap:var(--sp-2);color:var(--ink-muted);padding:var(--sp-6)}.storage-gauge{display:flex;align-items:center;gap:var(--sp-2);margin:-.25rem 0 var(--sp-6);font-size:var(--fs-xs);color:#5b6470}.storage-gauge-track{flex:0 0 200px;height:8px;background:var(--border);border-radius:var(--r-pill);overflow:hidden}.storage-gauge-fill{height:100%;background:var(--blue);transition:width .3s ease}.storage-gauge.over .storage-gauge-fill{background:#c0392b}.convert-progress{margin-top:var(--sp-2);max-width:320px}.convert-progress .progress{margin-top:.35rem}.converting{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-xs);color:var(--warn)}.converting .spinner{width:.8em;height:.8em;border-color:#fddebf;border-top-color:var(--warn)}
