:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-panel: #1c2128;--bg-hover: #21262d;--bg-active: #2d333b;--text-primary: #e6edf3;--text-secondary: #8b949e;--text-muted: #6e7681;--accent: #2f81f7;--accent-hover: #388bfd;--accent-muted: #1f3a6e;--success: #3fb950;--warning: #d29922;--danger: #f85149;--border: #30363d;--border-subtle: #21262d;--panel-left-width: 260px;--panel-right-width: 300px;--toolbar-height: 48px;--font: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;--font-mono: "JetBrains Mono", "Fira Code", monospace;--transition: .15s ease}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{width:100%;height:100%;overflow:hidden}body{font-family:var(--font);background:var(--bg-primary);color:var(--text-primary);font-size:13px;line-height:1.5;-webkit-font-smoothing:antialiased}button{font-family:var(--font);cursor:pointer;border:none;background:none;color:inherit}a{color:var(--accent);text-decoration:none}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-active);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.app{display:flex;flex-direction:column;height:100vh}.navbar{height:var(--toolbar-height);background:var(--bg-secondary);border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 16px;gap:12px;flex-shrink:0;z-index:100}.navbar-brand{font-size:15px;font-weight:700;color:var(--text-primary);display:flex;align-items:center;gap:8px}.navbar-brand span{color:var(--accent)}.nav-breadcrumb{display:flex;align-items:center;gap:6px;color:var(--text-secondary);font-size:13px}.nav-breadcrumb a{color:var(--text-secondary);transition:color var(--transition)}.nav-breadcrumb a:hover{color:var(--text-primary)}.nav-breadcrumb .sep{color:var(--text-muted)}.navbar-spacer{flex:1}.nav-user{display:flex;align-items:center;gap:8px;color:var(--text-secondary);font-size:13px;cursor:pointer}.main{display:flex;flex:1;overflow:hidden}.panel-left{width:var(--panel-left-width);min-width:var(--panel-left-width);background:var(--bg-secondary);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}.panel-header{padding:10px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);border-bottom:1px solid var(--border-subtle);display:flex;align-items:center;justify-content:space-between}.panel-header-inline{position:sticky;top:0;background:var(--bg-secondary);z-index:2}.panel-header-btn{width:20px;height:20px;border-radius:4px;color:var(--text-muted);display:flex;align-items:center;justify-content:center;transition:background var(--transition),color var(--transition)}.panel-header-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.panel-body{flex:1;overflow-y:auto}.workflow-card{margin:12px;padding:12px;border-radius:10px;border:1px solid var(--border);background:radial-gradient(circle at top left,rgba(47,129,247,.18),transparent 42%),linear-gradient(180deg,#202b3bf0,#14181ff5)}.workflow-title{font-size:12px;font-weight:600;color:var(--text-primary);margin-bottom:10px}.workflow-grid{display:grid;gap:8px}.workflow-step{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.06);background:#090c1457}.workflow-step.ready{border-color:#3fb95057;background:#0b24136b}.workflow-step-label{font-size:11px;color:var(--text-muted)}.workflow-step-value{font-size:12px;color:var(--text-primary)}.workflow-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}.workflow-diagnostics{margin-top:12px;padding-top:10px;border-top:1px solid rgba(255,255,255,.08)}.workflow-diagnostics-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.workflow-diagnostics-badge{padding:2px 8px;border-radius:999px;background:#2f81f724;border:1px solid rgba(47,129,247,.28);color:#9cc3ff;font-size:11px;white-space:nowrap}.workflow-diagnostics-list{display:grid;gap:6px;margin-top:10px}.workflow-diagnostics-item{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border-radius:8px;background:#090c1457;border:1px solid rgba(255,255,255,.06)}.workflow-diagnostics-item.warning{border-color:#d2992252;background:#2e21086b}.workflow-diagnostics-item.error{border-color:#f8514957;background:#310d0b6b}.workflow-diagnostics-item.info{border-color:#7890ac3d}.workflow-diagnostics-severity{min-width:34px;color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.06em}.workflow-diagnostics-text{font-size:12px;color:var(--text-primary);line-height:1.4}.diagnostics-trigger-btn{display:inline-flex;align-items:center;gap:8px}.diagnostics-popup{position:absolute;top:16px;left:16px;width:min(420px,calc(100% - 32px));max-height:min(72vh,760px);overflow:auto;z-index:18;padding:12px;border-radius:10px;background:#0e141ff7;border:1px solid var(--border-subtle);box-shadow:0 18px 40px #00000059;backdrop-filter:blur(10px)}.diagnostics-popup-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:10px}.diagnostics-popup-title{font-size:14px;font-weight:600;color:var(--text-primary)}.diagnostics-popup-subtitle{margin-top:4px;font-size:11px;line-height:1.4;color:var(--text-muted)}.mini-action-btn{min-height:28px;padding:0 10px;border-radius:7px;border:1px solid var(--border);background:#ffffff0a;color:var(--text-primary);font-size:12px;transition:background var(--transition),border-color var(--transition),opacity var(--transition)}.mini-action-btn:hover:not(:disabled){background:#2f81f729;border-color:#2f81f773}.mini-action-btn:disabled{opacity:.45;cursor:not-allowed}.panel-right{width:var(--panel-right-width);min-width:var(--panel-right-width);background:var(--bg-secondary);border-left:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden;transition:width var(--transition),min-width var(--transition)}.panel-right.compact{width:44px;min-width:44px}.panel-right.compact .panel-header{justify-content:space-between;align-items:stretch;padding:8px 6px 10px;gap:4px}.panel-header-compact-label{writing-mode:vertical-rl;transform:rotate(180deg);color:var(--text-muted);font-size:11px;letter-spacing:.08em;text-transform:uppercase;line-height:1;user-select:none}.viewer-area{flex:1;position:relative;background:#0a0c10;overflow:hidden;display:flex;flex-direction:column}.viewer-area.with-section{background:linear-gradient(180deg,#0a0c10,#0d1119 56%,#0b0f16)}.viewer-stage{flex:1 1 auto;position:relative;min-height:0}.viewer-stage.with-section{flex-basis:55%}.section-workbench{flex:0 0 45%;min-height:290px;display:grid;grid-template-rows:auto minmax(0,1fr);border-top:1px solid var(--border-subtle);background:linear-gradient(180deg,#090e18fa,#080c14fb),radial-gradient(circle at top,rgba(59,130,246,.08),transparent 45%)}.section-workbench-header{padding:10px 12px 8px;border-bottom:1px solid var(--border-subtle);background:#0c121ec2;backdrop-filter:blur(12px)}.section-controls-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;align-items:center}.section-workbench-body{min-height:0;display:grid;grid-template-columns:1fr}.section-workbench-body.with-legend{grid-template-columns:minmax(0,1fr) 220px}.section-canvas-shell{min-width:0;min-height:0;overflow:hidden;position:relative;background:linear-gradient(180deg,#080d16e0,#090d14fa),radial-gradient(circle at top,rgba(96,165,250,.08),transparent 50%);cursor:default}.section-canvas-shell.ready{cursor:grab}.section-canvas-shell.ready:active{cursor:grabbing}.section-canvas-shell svg{display:block;width:100%;height:100%}.section-legend-panel{border-left:1px solid var(--border-subtle);padding:10px 12px;overflow:auto;background:#090d15eb}#viewer-canvas{display:block;width:100%;height:100%}.viewer-toolbar{position:absolute;top:12px;left:50%;transform:translate(-50%);background:var(--bg-panel);border:1px solid var(--border);border-radius:8px;display:flex;align-items:center;padding:4px;gap:2px;box-shadow:0 4px 12px #0006;z-index:50}.toolbar-btn{width:32px;height:32px;border-radius:6px;color:var(--text-secondary);display:flex;align-items:center;justify-content:center;font-size:14px;transition:background var(--transition),color var(--transition);position:relative}.toolbar-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.toolbar-btn.active{background:var(--accent-muted);color:var(--accent)}.toolbar-sep{width:1px;height:20px;background:var(--border);margin:0 4px}.viewer-tool-dock{position:absolute;top:8px;left:8px;z-index:20;display:flex;align-items:flex-start;gap:8px}.viewer-tool-list{width:clamp(30px,2.3vw,38px);display:flex;flex-direction:column;gap:4px}.viewer-tool-group{display:flex;flex-direction:column;align-items:center;gap:4px}.viewer-tool-divider{width:clamp(16px,1.2vw,20px);height:1px;margin:1px 0;background:linear-gradient(90deg,#94a3b800,#94a3b873,#94a3b800)}.viewer-tool-card{width:clamp(28px,2.2vw,36px);height:clamp(28px,2.2vw,36px);padding:0;border-radius:10px;border:none;background:#080d1694;color:#0f172a;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px #0000002e;transition:transform var(--transition),box-shadow var(--transition),background var(--transition)}.viewer-tool-card:hover{transform:translate(1px);background:#0d192bbd;box-shadow:0 6px 14px #0003}.viewer-tool-card.active{background:#123a66d1}.viewer-tool-icon{width:clamp(18px,1.45vw,22px);height:clamp(18px,1.45vw,22px);border-radius:0;border:none;background:transparent;display:flex;align-items:center;justify-content:center;line-height:1}.viewer-tool-tooltip{width:clamp(180px,18vw,240px);min-height:92px;padding:10px 11px;border-radius:10px;border:none;background:#070c14b8;color:#e2e8f0;box-shadow:0 8px 22px #00000038;backdrop-filter:blur(18px)}.viewer-tool-tooltip-title{font-size:clamp(12px,.95vw,14px);font-weight:700;margin-bottom:5px}.viewer-tool-tooltip-text{font-size:clamp(10px,.8vw,11px);line-height:1.35;color:#cbd5e1;margin-bottom:6px}.viewer-tool-tooltip-usage{font-size:clamp(9px,.72vw,10px);line-height:1.3;color:#93c5fd}@media (max-width: 1400px){.viewer-tool-tooltip{display:none}}@media (max-width: 900px){.viewer-tool-dock{top:6px;left:6px}.viewer-tool-list{width:28px}.viewer-tool-card{width:28px;height:28px;border-radius:8px}.viewer-tool-icon{width:18px;height:18px}.section-workbench{min-height:260px}.section-workbench-body.with-legend{grid-template-columns:1fr}.section-legend-panel{border-left:none;border-top:1px solid var(--border-subtle);max-height:120px}}@media (max-width: 640px){.viewer-stage.with-section{flex-basis:52%}.section-workbench{flex-basis:48%;min-height:240px}}.obc-measurement-label{background:var(--bg-panel);color:var(--text-primary);padding:2px 6px;border-radius:4px;font-size:11px;font-family:var(--font-mono);border:1px solid var(--border);white-space:nowrap;pointer-events:none;box-shadow:0 2px 8px #00000080;user-select:none}.obc-measurement-label *{pointer-events:none}.tree-item{display:flex;align-items:center;gap:6px;padding:5px 12px;cursor:pointer;color:var(--text-secondary);font-size:13px;border-radius:0;transition:background var(--transition),color var(--transition);user-select:none}.tree-item:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-item.active{background:var(--bg-active);color:var(--text-primary)}.tree-item .tree-icon{width:16px;text-align:center;flex-shrink:0}.projects-page{padding:32px;overflow-y:auto;flex:1}.projects-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.projects-header h1{font-size:20px;font-weight:600;color:var(--text-primary)}.projects-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.project-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:10px;padding:20px;cursor:pointer;transition:border-color var(--transition),box-shadow var(--transition),transform var(--transition)}.project-card:hover{border-color:var(--accent);box-shadow:0 4px 16px #2f81f726;transform:translateY(-1px)}.project-card-title{font-size:15px;font-weight:600;color:var(--text-primary);margin-bottom:6px}.project-card-meta{font-size:12px;color:var(--text-muted);display:flex;gap:12px}.project-card-footer{margin-top:16px;padding-top:12px;border-top:1px solid var(--border-subtle);display:flex;gap:8px}.badge{font-size:11px;padding:2px 8px;border-radius:12px;background:var(--bg-active);color:var(--text-secondary);border:1px solid var(--border-subtle)}.btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;font-size:13px;font-weight:500;font-family:var(--font);cursor:pointer;border:1px solid transparent;transition:all var(--transition)}.btn-primary{background:var(--accent);color:#fff;border-color:var(--accent)}.btn-primary:hover{background:var(--accent-hover)}.btn-secondary{background:var(--bg-active);color:var(--text-primary);border-color:var(--border)}.btn-secondary:hover{background:var(--bg-hover);border-color:var(--text-muted)}.btn-danger-ghost{background:transparent;color:var(--text-muted);border:none}.btn-danger-ghost:hover{background:#ff4d4f1a;color:#ff4d4f}.prop-section{border-bottom:1px solid var(--border-subtle)}.prop-section-header{display:flex;align-items:center;padding:8px 12px;cursor:pointer;color:var(--text-secondary);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;gap:6px;user-select:none}.prop-section-header:hover{color:var(--text-primary)}.prop-row{display:grid;grid-template-columns:1fr 1.5fr;gap:8px;padding:8px 12px;font-size:12px;border-bottom:1px solid var(--border-subtle);transition:background .2s ease}.prop-row:hover{background:var(--bg-hover)}.prop-key{color:var(--text-muted);font-weight:500;user-select:none}.prop-val{color:var(--text-primary);word-break:break-all;font-family:var(--font-mono);font-size:11px}.toolbar-btn.active{background:var(--btn-primary-bg);border-color:var(--btn-primary-bg);color:#fff;box-shadow:0 0 12px #2f81f766}.toolbar-btn:focus{outline:2px solid var(--btn-primary-bg);outline-offset:2px}.layer-item{display:flex;align-items:center;padding:6px 12px;gap:8px;cursor:pointer;transition:background var(--transition);border-radius:4px;margin:2px 6px}.layer-item:hover{background:var(--bg-hover)}.layer-visibility{width:18px;height:18px;border-radius:4px;color:var(--text-muted);display:flex;align-items:center;justify-content:center;font-size:12px;transition:color var(--transition)}.layer-visibility:hover{color:var(--text-primary)}.layer-visibility.visible{color:var(--accent)}.layer-color{width:10px;height:10px;border-radius:2px;flex-shrink:0}.layer-name{flex:1;font-size:13px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ifc-tree-panel{margin:6px 6px 0;border:1px solid var(--border-subtle);border-radius:8px;background:#0c121d70;overflow:hidden}.ifc-tree-model+.ifc-tree-model{border-top:1px solid var(--border-subtle)}.ifc-tree-model-title{padding:8px 12px 6px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.ifc-tree-node{display:block}.ifc-tree-row{display:flex;align-items:flex-start;gap:6px;padding:5px 10px 5px 8px;transition:background var(--transition)}.ifc-tree-row:hover{background:var(--bg-hover)}.ifc-tree-expander,.ifc-tree-visibility{width:18px;height:18px;border-radius:4px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:11px;line-height:1}.ifc-tree-expander{color:var(--text-muted)}.ifc-tree-expander.leaf{cursor:default;opacity:.45}.ifc-tree-visibility{border:1px solid var(--border-subtle);background:#6ee7b714;color:#bbf7d0eb;font-weight:700}.ifc-tree-visibility.hidden{background:#94a3b814;color:#94a3b8d1}.ifc-tree-visibility.partial{background:#facc1514;color:#fde047eb}.ifc-tree-text{min-width:0;flex:1}.ifc-tree-label{font-size:12px;color:var(--text-primary);line-height:1.25;word-break:break-word}.ifc-tree-meta{margin-top:2px;font-size:10px;color:var(--text-muted);line-height:1.2}.ifc-tree-children{display:block}.auth-page{display:flex;align-items:center;justify-content:center;height:100vh;background:var(--bg-primary)}.auth-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;padding:32px;width:360px}.auth-title{font-size:20px;font-weight:700;margin-bottom:4px;display:flex;align-items:center;gap:8px}.auth-subtitle{color:var(--text-muted);font-size:13px;margin-bottom:28px}.form-group{margin-bottom:16px}.form-label{display:block;font-size:12px;font-weight:500;color:var(--text-secondary);margin-bottom:6px}.form-input{width:100%;padding:8px 12px;background:var(--bg-primary);border:1px solid var(--border);border-radius:6px;color:var(--text-primary);font-size:14px;font-family:var(--font);outline:none;transition:border-color var(--transition)}.form-input:focus{border-color:var(--accent)}.form-error{font-size:12px;color:var(--danger);margin-top:8px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;color:var(--text-muted);text-align:center}.empty-state-icon{font-size:40px;opacity:.5}.empty-state-title{font-size:15px;font-weight:600;color:var(--text-secondary)}.empty-state-text{font-size:13px}.upload-zone{border:2px dashed var(--border);border-radius:8px;padding:32px 16px;text-align:center;cursor:pointer;transition:all var(--transition);color:var(--text-muted)}.upload-zone:hover,.upload-zone.drag-over{border-color:var(--accent);background:var(--accent-muted);color:var(--text-primary)}.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px}.status-dot.ready{background:var(--success)}.status-dot.processing{background:var(--warning)}.status-dot.failed{background:var(--danger)}.status-dot.pending{background:var(--text-muted)}.spinner,.spinner-mini{border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite;display:inline-block}.spinner{width:20px;height:20px}.spinner-mini{width:12px;height:12px;border-width:1.5px;vertical-align:middle}@keyframes spin{to{transform:rotate(360deg)}}[data-tooltip]{position:relative}[data-tooltip]:hover:after{content:attr(data-tooltip);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%);background:var(--bg-panel);border:1px solid var(--border);color:var(--text-primary);padding:4px 8px;border-radius:4px;font-size:11px;white-space:nowrap;pointer-events:none;z-index:1000}
