*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg: #0f1117;--surface: #1a1d27;--surface2: #232636;--border: #2e3148;--accent: #4f8ef7;--accent2: #7c5cbf;--success: #3ecf8e;--warning: #f5a623;--danger: #e94f4f;--text: #e8eaf0;--text2: #9096b0;--text3: #5a6080;--radius: 8px;--radius-lg: 14px}html,body,#root{height:100%;background:var(--bg);color:var(--text);font-family:Segoe UI,system-ui,-apple-system,sans-serif;font-size:14px;line-height:1.5}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--surface)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}.app{display:flex;flex-direction:column;height:100%}.app-header{display:flex;align-items:center;gap:12px;padding:0 24px;height:52px;background:var(--surface);border-bottom:1px solid var(--border);flex-shrink:0}.app-header h1{font-size:16px;font-weight:600;letter-spacing:.02em}.app-header .version{font-size:11px;color:var(--text3);background:var(--surface2);padding:2px 7px;border-radius:10px}.phase-indicator{margin-left:auto;display:flex;gap:8px}.phase-step{font-size:12px;color:var(--text3);padding:3px 10px;border-radius:12px;border:1px solid var(--border)}.phase-step.active{color:var(--accent);border-color:var(--accent);background:#4f8ef714}.phase-step.done{color:var(--success);border-color:var(--success);background:#3ecf8e0f}.app-body{flex:1;overflow:hidden;display:flex}.btn{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border-radius:var(--radius);border:none;font-size:13px;font-weight:500;cursor:pointer;transition:opacity .15s,background .15s}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover:not(:disabled){background:#3a7de8}.btn-success{background:var(--success);color:#0a1a10}.btn-success:hover:not(:disabled){background:#31b87a}.btn-ghost{background:transparent;color:var(--text2);border:1px solid var(--border)}.btn-ghost:hover:not(:disabled){background:var(--surface2)}.btn-danger{background:var(--danger);color:#fff}.btn-danger:hover:not(:disabled){background:#d03e3e}.btn-sm{padding:4px 12px;font-size:12px}.upload-view{flex:1;display:flex;align-items:center;justify-content:center}.upload-card{width:480px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:40px;text-align:center}.upload-card h2{font-size:20px;margin-bottom:8px}.upload-card p{color:var(--text2);margin-bottom:28px}.drop-zone{border:2px dashed var(--border);border-radius:var(--radius);padding:40px 20px;cursor:pointer;transition:border-color .2s,background .2s;margin-bottom:20px}.drop-zone:hover,.drop-zone.dragging{border-color:var(--accent);background:#4f8ef70d}.drop-zone .icon{font-size:36px;margin-bottom:10px}.drop-zone .hint{color:var(--text2);font-size:13px}.upload-error{color:var(--danger);font-size:13px;margin-top:12px}.boundary-view{flex:1;display:flex;flex-direction:column;overflow:hidden}.boundary-toolbar{display:flex;align-items:center;gap:12px;padding:10px 20px;background:var(--surface);border-bottom:1px solid var(--border);flex-shrink:0}.boundary-toolbar .instructions{flex:1;color:var(--text2);font-size:13px}.status-bar{padding:6px 20px;background:var(--surface);border-top:1px solid var(--border);font-size:11px;color:var(--text3);display:flex;gap:20px;flex-shrink:0}.loading-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0f1117bf;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:999;gap:14px}.spinner{width:36px;height:36px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-overlay p{color:var(--text2);font-size:14px}.field{margin-bottom:12px}.field label{display:block;font-size:11px;color:var(--text3);margin-bottom:4px;text-transform:uppercase;letter-spacing:.05em}.field input,.field select{width:100%;background:var(--surface);border:1px solid var(--border);color:var(--text);padding:6px 10px;border-radius:var(--radius);font-size:13px}.field input:focus,.field select:focus{outline:none;border-color:var(--accent)}.field select option{background:var(--surface2)}
