:root{--bg: #1a1a1a;--panel: #222;--panel-2: #2a2a2a;--text: #eee;--text-dim: #999;--accent: #4a9eff;--accent-hover: #6ab2ff;--danger: #e54a4a;--warning-bg: #4a3a1a;--warning-border: #6a5a2a;--border: #333}*{box-sizing:border-box}html,body,#root{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans TC,PingFang TC,sans-serif;background:var(--bg);color:var(--text);overflow:hidden}button{background:var(--panel-2);color:var(--text);border:1px solid var(--border);padding:6px 12px;cursor:pointer;border-radius:4px;font-size:13px;font-family:inherit}button:hover:not(:disabled){background:#333}button:disabled{opacity:.5;cursor:not-allowed}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}button.danger{background:var(--danger);border-color:var(--danger);color:#fff}button.block{width:100%}input,textarea{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:6px 8px;font-size:13px;font-family:inherit;width:100%}input[type=color]{padding:2px;height:32px;cursor:pointer}input[type=range]{padding:0;accent-color:var(--accent)}textarea{resize:vertical}.app{display:flex;flex-direction:column;height:100%}.header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--panel);border-bottom:1px solid var(--border);flex-shrink:0;z-index:10}.logo{font-weight:600;letter-spacing:.02em}.header-actions{display:flex;gap:8px}.sidebar-toggle{display:none}.main{flex:1;display:flex;min-height:0;position:relative}.canvas-wrap{flex:1;position:relative;min-width:0;background:#000}.three-canvas{width:100%;height:100%;display:block;outline:none}.overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:#00000080;pointer-events:none;font-size:14px}.overlay.error{pointer-events:auto;color:#faa}.banner{position:absolute;top:12px;left:50%;transform:translate(-50%);background:#000000b3;padding:6px 14px;border-radius:16px;font-size:12px;color:var(--text-dim);pointer-events:none;white-space:nowrap}.hint{position:absolute;bottom:12px;left:50%;transform:translate(-50%);background:#0009;padding:4px 12px;border-radius:12px;font-size:11px;color:var(--text-dim);pointer-events:none;white-space:nowrap}.box-select{position:absolute;border:1px dashed #ff5555;background:#ff3c3c1f;pointer-events:none;display:none;z-index:5}.sidebar{width:320px;flex-shrink:0;background:var(--panel);border-left:1px solid var(--border);overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:24px}.sidebar-close{display:none}.sidebar h2{font-size:11px;letter-spacing:.12em;color:var(--text-dim);margin:0 0 8px;text-transform:uppercase}.sidebar section{display:flex;flex-direction:column;gap:8px}.camera-list{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}.camera-list.scrollable{max-height:300px;overflow-y:auto;padding-right:4px}.camera-list.scrollable::-webkit-scrollbar{width:6px}.camera-list.scrollable::-webkit-scrollbar-thumb{background:#444;border-radius:3px}.camera-list li{display:flex;gap:4px;padding:8px;border-radius:4px;border:1px solid var(--border);align-items:center;transition:background .1s}.camera-list li:hover{background:var(--panel-2)}.cam-main{flex:1;cursor:pointer;min-width:0}.cam-name{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cam-note{font-size:11px;color:var(--text-dim);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cam-time{font-size:10px;color:var(--text-dim);margin-top:2px}.cam-actions{display:flex;gap:2px;flex-shrink:0}.cam-actions button{padding:4px 6px;font-size:11px}.empty{color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.5}.display-panel,.parts-panel{display:flex;flex-direction:column;gap:12px}.display-panel label,.parts-panel label{display:flex;flex-direction:column;gap:6px;font-size:11px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.display-panel label .row{display:flex;justify-content:space-between;align-items:center}.display-panel label .val{color:var(--text);text-transform:none}.mesh-name{font-size:12px;color:var(--text-dim)}.mesh-name code{color:var(--text);background:var(--panel-2);padding:2px 6px;border-radius:3px;word-break:break-all;font-size:11px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100;padding:16px}.modal{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:20px;width:100%;max-width:440px;display:flex;flex-direction:column;gap:12px}.modal h3{margin:0}.modal label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-dim)}.modal label span{font-size:12px}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.warning{background:var(--warning-bg);border:1px solid var(--warning-border);padding:10px 12px;border-radius:4px;font-size:12px;line-height:1.5;color:#f6c97a}.dropzone{border:2px dashed var(--border);border-radius:6px;padding:28px 16px;text-align:center;display:flex;flex-direction:column;gap:10px;align-items:center;font-size:13px;color:var(--text-dim)}.file-pick{display:inline-block;padding:6px 14px;background:var(--panel-2);border:1px solid var(--border);border-radius:4px;cursor:pointer;font-size:13px;color:var(--text)}.file-pick:hover{background:#333}.progress-row{display:flex;align-items:center;gap:10px;font-size:12px}.progress-row progress{flex:1;height:8px;accent-color:var(--accent)}.toast-stack{position:fixed;top:16px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;gap:8px;z-index:200;pointer-events:none}.toast{padding:10px 16px;border-radius:4px;font-size:13px;background:var(--danger);color:#fff;box-shadow:0 4px 12px #0006;animation:toast-in .2s ease-out}@keyframes toast-in{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.parts-panel input[type=color]{height:40px}@media (max-width: 768px){.hint{display:none}.sidebar-toggle{display:inline-block}.sidebar{position:absolute;top:0;right:0;bottom:0;width:85%;max-width:360px;transform:translate(100%);transition:transform .2s ease-out;z-index:50;box-shadow:-4px 0 12px #0006}.sidebar.open{transform:translate(0)}.sidebar-close{display:block;align-self:flex-end;background:none;border:none;font-size:18px;color:var(--text-dim);cursor:pointer;padding:0 4px}.banner{font-size:11px;max-width:90%;white-space:normal;text-align:center}}
