@import"https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@300;400;500;700&family=Share+Tech+Mono&display=swap";:root{--bg: #0a0e1a;--panel: #111827;--border: #1e3a5f;--accent: #00d4ff;--accent2: #ff6b35;--text: #e2e8f0;--muted: #64748b}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font-family:Noto Sans TC,sans-serif;overflow:hidden}button{font:inherit}#root{display:flex;flex-direction:column}header{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;background:var(--panel);border-bottom:1px solid var(--border);z-index:10;flex-shrink:0;gap:12px}.route-actions{display:flex;align-items:center;gap:10px}.route-link{display:inline-flex;align-items:center;min-height:24px;padding:0 10px;border:1px solid rgba(0,212,255,.35);border-radius:999px;color:var(--text);text-decoration:none;font:10px Share Tech Mono,monospace;background:#00d4ff0f}.header-left h1{font-size:13px;font-weight:500;color:var(--accent);letter-spacing:.05em}.header-left p{margin-top:2px;color:var(--muted);font:11px Share Tech Mono,monospace}.badge,.upload-status,.pipeline-steps,.vbtn,.ftbtn,#info-bar,.controls-hint,.plan-north{font-family:Share Tech Mono,monospace}.badge{background:linear-gradient(135deg,#1e3a5f,#0a1628);border:1px solid var(--accent);color:var(--accent);font-size:10px;padding:3px 10px;border-radius:2px;letter-spacing:.1em}.upload-bar{display:flex;align-items:center;gap:12px;padding:8px 20px;background:linear-gradient(90deg,#00d4ff0a,#ff6b3508);border-bottom:1px solid var(--border);flex-shrink:0;font-size:11px}.upload-btn{display:inline-flex;align-items:center;gap:6px;background:linear-gradient(135deg,#00d4ff,#09c);color:#0a0e1a;padding:6px 14px;border-radius:3px;cursor:pointer;font-size:11px;font-weight:700;border:0}.generate-btn{padding:6px 14px;border-radius:3px;border:1px solid var(--border);background:#111827eb;color:var(--muted);font-size:11px;font-weight:700;cursor:not-allowed}.generate-btn.ready{border-color:#27ae60;background:linear-gradient(135deg,#1d6f48,#27ae60);color:#ecfff4;cursor:pointer}.generate-btn:disabled{opacity:.75}.upload-status{color:var(--muted);font-size:10px;flex:1}.upload-status.parsing{color:var(--accent)}.upload-status.uploaded{color:#f6c85f}.upload-status.idle{color:#8da1b8}.upload-status.done{color:#27ae60}.pipeline-steps{display:flex;align-items:center;gap:4px;font-size:9px}.pstep{padding:3px 8px;border:1px solid var(--border);border-radius:2px;color:var(--muted)}.pstep.active{border-color:var(--accent);color:var(--accent);background:#00d4ff14;box-shadow:0 0 8px #00d4ff33}.pstep.done{border-color:#27ae60;color:#27ae60}.arrow{color:var(--muted)}.view-tabs{display:flex;background:#0d1420;border-bottom:1px solid var(--border)}.generated-gallery{display:grid;grid-template-columns:1fr;gap:0;padding:0;height:100%;overflow:auto;background:radial-gradient(circle at top,rgba(0,212,255,.08),transparent 38%),#0d1420}.generated-gallery.compact{grid-template-columns:1fr;padding:18px}.plan-output-shell{display:flex;height:100%;flex-direction:column;background:radial-gradient(circle at top,rgba(0,212,255,.08),transparent 38%),#0d1420}.plan-output-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;border-bottom:1px solid rgba(30,58,95,.9)}.plan-output-info{min-width:0}.plan-output-switch{display:inline-flex;border:1px solid rgba(30,58,95,.9);border-radius:6px;overflow:hidden}.mini-tab{padding:7px 12px;border:0;background:#111827eb;color:var(--muted);font:700 10px Share Tech Mono,monospace;cursor:pointer}.mini-tab.active{background:#00d4ff1f;color:var(--accent)}.plan-dxf-wrap{flex:1;min-height:0}.generated-card{padding:0;border:0;border-radius:0;overflow:hidden;background:transparent;cursor:pointer;text-align:left}.generated-card.active{border-color:transparent;box-shadow:none}.generated-card-static{cursor:default}.generated-card img{display:block;width:100%;height:auto;object-fit:contain;background:#fff}.generated-meta{padding:12px 18px 18px}.generated-title{font-size:12px;line-height:1.4;color:var(--text)}.generated-subtitle{margin-top:4px;color:var(--muted);font:10px Share Tech Mono,monospace}.generated-description{margin-top:8px;color:#9ab0c4;font-size:11px;line-height:1.6}.dxf-preview-card{display:flex;flex-direction:column;min-height:100%;background:#111827f0}.dxf-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid rgba(30,58,95,.9);background:#0a0e1ae6}.dxf-toolbar a{color:var(--accent);font-size:11px;text-decoration:none}.dxf-badge{color:var(--accent2);font:700 11px Share Tech Mono,monospace}.dxf-preview{flex:1;min-height:0;margin:0;padding:12px;overflow:auto;color:#c6d7e7;font:11px/1.45 Share Tech Mono,monospace;white-space:pre}.dxf-stage{display:flex;flex:1;min-height:0;flex-direction:column}.dxf-stage-canvas{flex:1;min-height:100%;position:relative;background:linear-gradient(180deg,#0d1420eb,#080b12fa),repeating-linear-gradient(0deg,transparent 0,transparent 27px,rgba(0,212,255,.04) 28px),repeating-linear-gradient(90deg,transparent 0,transparent 27px,rgba(0,212,255,.04) 28px)}.dxf-stage-canvas.compact{min-height:360px}.dxf-text-overlay{position:absolute;inset:0;pointer-events:none;overflow:hidden}.dxf-overlay-text{position:absolute;color:#eef7ff;white-space:pre;font-family:Noto Sans TC,sans-serif;line-height:1;text-shadow:0 0 2px rgba(8,17,29,.95),0 0 6px rgba(8,17,29,.9)}.dxf-stage-status{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-top:1px solid rgba(30,58,95,.9);color:var(--muted);font:10px Share Tech Mono,monospace}.dxf-stage-error{padding:0 12px 10px;color:#ff8d72;font-size:11px}.dxf-stage-note{padding:0 12px 12px;color:#8da1b8;font-size:10px;line-height:1.5}.vtab{flex:1;padding:8px 12px;text-align:center;font-size:11px;font-weight:500;color:var(--muted);cursor:pointer;border:0;border-right:1px solid var(--border);background:transparent}.vtab.active{color:var(--accent);background:#00d4ff0f;box-shadow:inset 0 -2px 0 var(--accent)}.main{display:flex;flex:1;min-height:0}.view-stack{flex:1;position:relative;overflow:hidden}.view-pane{position:absolute;inset:0;display:none}.view-pane.active{display:block}.plan-svg,#canvas-wrap{width:100%;height:100%;display:block}.plan-svg{background:#0d1420}.empty-viewer{position:relative;width:100%;height:100%;overflow:hidden;background:#0d1420}.empty-viewer-grid{position:absolute;inset:0;background:radial-gradient(circle at top,rgba(0,212,255,.08),transparent 38%),repeating-linear-gradient(0deg,transparent 0,transparent 39px,rgba(0,212,255,.05) 40px),repeating-linear-gradient(90deg,transparent 0,transparent 39px,rgba(0,212,255,.05) 40px)}.empty-viewer-card{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:min(420px,calc(100% - 48px));padding:20px 22px;border:1px solid rgba(0,212,255,.28);border-radius:10px;background:#090d16e0;box-shadow:0 0 28px #00d4ff14;text-align:center}.empty-viewer-title{color:var(--accent);font-size:16px}.empty-viewer-copy{margin-top:10px;color:#90a7bd;font-size:12px;line-height:1.7}.loading-viewer{position:relative;width:100%;height:100%;background:radial-gradient(circle at top,rgba(0,212,255,.08),transparent 38%),#0d1420}.loading-ring{position:absolute;top:50%;left:50%;width:72px;height:72px;margin:-88px 0 0 -36px;border-radius:50%;border:3px solid rgba(0,212,255,.16);border-top-color:var(--accent);animation:spin .9s linear infinite}.plan-room-fill{fill:#1a2336;stroke:#2a3f5f;stroke-width:1.5}.plan-room-fill.highlighted{fill:#243352;animation:scanline 1.2s ease-in-out infinite}.plan-room-label{fill:#94a3b8;font-size:11px;font-family:Noto Sans TC,sans-serif}.plan-wall{stroke:#475569;stroke-width:2;fill:none}.plan-device{cursor:pointer}.plan-conduit{stroke-dasharray:4 3;opacity:.55;fill:none;stroke-width:1.2}.spec-overlay,#tooltip,#info-bar,.controls-hint{position:absolute;z-index:5}.spec-overlay{left:14px;bottom:14px;background:#111827f2;border:1px solid var(--accent);border-radius:4px;padding:10px 12px;max-width:280px;font-size:10px;box-shadow:0 0 20px #00d4ff26}.spec-overlay h4{color:var(--accent);font-size:10px;margin-bottom:6px;letter-spacing:.1em}.spec-line{line-height:1.7}.spec-tag{color:var(--accent2);font-size:9px}#canvas-wrap{position:relative;overflow:hidden}canvas{display:block;width:100%;height:100%}.view-btns{position:absolute;top:14px;left:14px;display:flex;flex-direction:column;gap:6px;z-index:5}.view-btns.compact{top:36px}.vbtn{background:var(--panel);border:1px solid var(--border);color:var(--text);font-size:10px;padding:5px 10px;border-radius:3px;cursor:pointer;white-space:nowrap}.vbtn.active{border-color:var(--accent);color:var(--accent);background:#00d4ff0d}#tooltip{display:none;max-width:180px;padding:8px 12px;background:#111827f5;border:1px solid var(--accent);border-radius:4px;font-size:11px;pointer-events:none;line-height:1.7;box-shadow:0 0 20px #00d4ff33}.tt-name{color:var(--accent);font-size:12px;font-weight:700}.tt-sys{color:var(--muted);font-size:10px}#info-bar{top:14px;right:14px;background:#111827e6;border:1px solid var(--border);padding:8px 12px;border-radius:4px;font-size:10px;color:var(--muted)}#info-bar.compact{top:auto;right:10px;bottom:56px}.ib-highlight{color:var(--accent2)}.controls-hint{left:50%;bottom:14px;transform:translate(-50%);display:flex;gap:16px;background:#0a0e1ad9;border:1px solid var(--border);padding:6px 16px;border-radius:4px;font-size:10px;color:var(--muted);pointer-events:none}.controls-hint span{color:var(--accent);margin-right:4px}.controls-hint.compact{display:none}.side-panel{width:220px;background:var(--panel);border-left:1px solid var(--border);overflow-y:auto;flex-shrink:0}.side-section{border-bottom:1px solid var(--border);padding:12px 14px}.side-section h3{font-size:10px;letter-spacing:.12em;color:var(--muted);text-transform:uppercase;margin-bottom:10px;font-family:Share Tech Mono,monospace}.legend-row,.room-item{display:flex;align-items:center;gap:8px;cursor:pointer;border-radius:3px}.legend-row{margin-bottom:8px;padding:4px 6px}.legend-row.hidden{opacity:.35}.legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;box-shadow:0 0 6px currentColor}.lname{font-size:11px;line-height:1.3}.lcount,.rcount{margin-left:auto;color:var(--muted);font:10px Share Tech Mono,monospace}.room-item{justify-content:space-between;padding:5px 6px;margin-bottom:4px}.rname{font-size:11px}.side-empty{color:var(--muted);font-size:11px;line-height:1.7}.source-list{display:grid;gap:8px}.source-item{display:flex;gap:8px;align-items:center;min-width:0}.source-type{min-width:42px;padding:2px 6px;border:1px solid rgba(0,212,255,.35);border-radius:999px;color:var(--accent);font:700 9px Share Tech Mono,monospace;text-align:center}.source-name{min-width:0;color:#c7d5e4;font-size:11px;word-break:break-all}.rcount{color:var(--accent);background:#00d4ff1a;padding:1px 6px;border-radius:10px}.stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.stat-card{background:#0000004d;border:1px solid var(--border);border-radius:4px;padding:8px;text-align:center}.sval{color:var(--accent);font:700 20px Share Tech Mono,monospace;line-height:1}.slabel{margin-top:3px;color:var(--muted);font-size:9px}.floor-toggle{display:flex;gap:6px}.ftbtn{flex:1;padding:5px;font-size:10px;border-radius:3px;border:1px solid var(--border);background:transparent;color:var(--muted);text-align:center}.ftbtn.active{border-color:var(--accent);color:var(--accent);background:#00d4ff14}.ftbtn:disabled{opacity:.35;cursor:not-allowed}.export-list{display:flex;flex-direction:column;gap:6px}.export-btn{text-align:left}.split-layout{display:grid;grid-template-columns:1fr 1fr;height:100%;gap:1px;background:var(--border)}.split-panel{background:#0d1420;position:relative}.split-title{position:absolute;top:8px;left:8px;z-index:2;font:10px Share Tech Mono,monospace;color:var(--accent)}.split-placeholder{background:var(--bg);display:flex;align-items:center;justify-content:center;flex-direction:column;gap:12px}.split-glyph{font-size:48px;opacity:.3}.split-copy{max-width:240px;color:var(--muted);font-size:11px;text-align:center;line-height:1.6}@keyframes scanline{0%{opacity:.3}50%{opacity:.7}to{opacity:.3}}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1100px){body{overflow:auto}#root{min-height:100%}.main{flex-direction:column}.side-panel{width:100%;border-left:0;border-top:1px solid var(--border)}.controls-hint,.spec-overlay{display:none}.split-layout,.generated-gallery{grid-template-columns:1fr}.upload-bar,.pipeline-steps,header{flex-wrap:wrap}}
