.shell:has(.device-workspace){grid-template-columns:240px 1fr 380px}.device-workspace{font-size:13px}.device-workspace h4{margin:8px 0 4px;font-size:12px;text-transform:uppercase;color:var(--muted)}.device-workspace .hint{font-size:12px;margin:2px 0 6px}.device-panel{display:flex;flex-direction:column;gap:4px}.device-field{margin-bottom:6px;font-weight:400}.device-field>span:first-child{font-weight:600;font-size:12px}.device-field select,.device-field input{font:inherit;padding:3px 6px}.device-field .unit{color:var(--muted);font-weight:400}.device-field input[aria-invalid=true]{border-color:var(--danger)}.field-issue{font-size:12px}.device-fields{display:grid;grid-template-columns:1fr 1fr;gap:0 8px}.device-group{border:1px solid var(--border);border-radius:4px;margin:4px 0 8px;padding:6px 8px}.device-group>legend{font-weight:600;font-size:12px}.device-points .row{margin-bottom:4px}.point-list{margin:2px 0;padding-left:20px;font-size:12px;max-height:140px;overflow:auto}.point-list li{display:flex;align-items:center;justify-content:space-between;gap:6px}.device-progress{width:100%;margin-top:6px}.device-status{margin:6px 0 0}.device-result{border-top:1px solid var(--border);margin-top:8px;padding-top:6px}table.metrics{width:100%;border-collapse:collapse;font-size:12px;margin-bottom:6px}table.metrics th,table.metrics td{text-align:left;padding:2px 4px;border-bottom:1px solid var(--bg)}table.metrics td.num{text-align:right;font-variant-numeric:tabular-nums}.metrics-kv{font-size:12px;margin-bottom:6px}.metric-ok{color:#1a7f37}.metric-bad{color:var(--danger);font-weight:600}details.device-section{border:1px solid var(--border);border-radius:4px;margin:6px 0;padding:4px 8px}details.device-section>summary{cursor:pointer;font-weight:600;padding:2px 0}.locator{border:1px solid var(--border);border-radius:4px;padding:4px 6px;margin:4px 0}.locator.unconfirmed{border-color:#b07800}.locator header{display:flex;align-items:center;gap:6px;justify-content:space-between}.confirm{font-weight:600}.tooth-chips{display:flex;flex-wrap:wrap;gap:2px}.tooth-chips label{margin:0;font-size:11px;padding:1px 4px;border:1px solid var(--border);border-radius:3px;flex-direction:row;gap:2px;font-weight:400}.checks-summary{padding:6px 8px;border-radius:4px;margin:6px 0;font-weight:600}.checks-summary.pass{background:#dafbe1;color:#1a7f37}.checks-summary.fail{background:#ffebe9;color:var(--danger)}.check-group{border:1px solid var(--border);border-radius:4px;margin:6px 0}.check-group>header{display:flex;justify-content:space-between;align-items:center;padding:4px 6px;background:var(--ribbon);font-weight:600}.check-row{display:grid;grid-template-columns:16px 1fr auto;gap:2px 6px;padding:3px 6px;border-top:1px solid var(--bg);font-size:12px;border-left:4px solid transparent}.check-row.sev-block{border-left-color:#d1242f}.check-row.sev-warn{border-left-color:#b07800}.check-row.sev-inform{border-left-color:#6e7781}.check-row.note{border-left-style:dashed}.check-row.note .check-msg{font-style:italic}.check-row .check-msg{grid-column:2 / 4;color:var(--muted)}.check-row.failed.sev-block .check-msg{color:#d1242f}.check-row.failed.sev-warn .check-msg{color:#8a5a00}.sev-badge{font-size:10px;text-transform:uppercase;padding:0 4px;border-radius:3px;color:#fff}.insertion-preview{border:1px solid var(--border);border-radius:4px;padding:6px 8px;margin:6px 0}.insertion-preview input[type=range]{width:100%;padding:0}.insertion-preview .blocked{color:#d1242f;font-weight:600}.ortho-workspace{display:flex;flex-direction:column;gap:4px;min-width:0}.ortho-workspace fieldset{min-width:0}.ortho-panel{display:flex;flex-direction:column;gap:6px}.ortho-panel label{display:flex;flex-direction:column;gap:2px;font-weight:400}.ortho-panel label.inline{flex-direction:row;align-items:center;gap:6px}.ortho-panel select,.ortho-panel input,.ortho-panel textarea{font:inherit;padding:3px 6px;max-width:100%;box-sizing:border-box}.ortho-panel h4{margin:6px 0 2px}.ortho-panel .hint{margin:0;font-size:12px}.ortho-panel .warn{margin:2px 0;color:#b26a00;font-size:12px}.ortho-landmarks ul,.ortho-summary ul,.ortho-checks{list-style:none;margin:0 0 4px;padding:0;font-size:12px}.ortho-landmarks li.ok:before{content:"+ ";color:#2e7d32;font-weight:700}.ortho-landmarks li.missing{color:var(--danger)}.ortho-landmarks li.missing:before{content:"- ";font-weight:700}.ortho-landmarks p{margin:2px 0;font-size:12px}.ortho-summary{border-top:1px solid var(--border);padding-top:4px;font-size:12px}.ortho-fields{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.ortho-num input{width:100%;box-sizing:border-box}.ortho-num span{font-size:11px;color:var(--muted)}.ortho-table{width:100%;border-collapse:collapse;font-size:12px}.ortho-table th{text-align:left;font-weight:400;padding:1px 4px 1px 0}.ortho-table td.num{text-align:right;font-variant-numeric:tabular-nums;padding:1px 4px}.ortho-pairs{align-items:center;flex-wrap:wrap;font-size:12px}.occlusion-confirm{border:1px solid var(--border);border-radius:4px;padding:6px;display:flex;flex-direction:column;gap:4px}.occlusion-confirm.confirmed{border-color:#2e7d32}.occlusion-confirm.stale,.occlusion-confirm.rejected,.occlusion-confirm.self{border-color:#b26a00}.occlusion-confirm h4,.occlusion-confirm p{margin:0}:root{--bg: #f4f5f7;--panel: #ffffff;--border: #d5d9e0;--text: #1c2330;--muted: #6a7384;--accent: #1f6feb;--accent-text: #ffffff;--danger: #b42318;--viewport: #20262f;--ribbon: #e9edf3}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:system-ui,-apple-system,Segoe UI,Noto Sans CJK SC,sans-serif;background:var(--bg);color:var(--text);font-size:14px}h1,h2,h3{margin:0 0 8px}h1{font-size:20px}h2{font-size:15px}h3{font-size:13px;color:var(--muted);text-transform:uppercase}button{font:inherit;padding:5px 12px;border:1px solid var(--border);background:var(--panel);border-radius:4px;cursor:pointer}button.primary{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}button.link{border:0;background:none;padding:0;color:var(--text);text-align:left;flex:1}input{font:inherit;padding:5px 8px;border:1px solid var(--border);border-radius:4px}label{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;font-weight:600}.muted{color:var(--muted)}.error{color:var(--danger)}.spacer{flex:1}.row{display:flex;gap:8px}.auth{display:flex;justify-content:center;padding-top:12vh}.card{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:20px;width:360px;max-width:100%;margin:12px 0}.page{max-width:960px;margin:0 auto;padding:20px}.page-head{display:flex;align-items:center;gap:12px;margin-bottom:12px}table.cases{width:100%;border-collapse:collapse;background:var(--panel);margin-top:12px}table.cases th,table.cases td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--border)}.shell{display:grid;height:100%;grid-template-columns:260px 1fr 300px;grid-template-rows:auto 1fr auto;grid-template-areas:"top top top" "tree main props" "status status status"}.topbar{grid-area:top;display:flex;align-items:center;gap:16px;padding:6px 12px;background:var(--ribbon);border-bottom:1px solid var(--border)}.ribbon{display:flex;gap:4px}.stage{border-radius:4px}.stage.active{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.stage-index{opacity:.7;margin-right:2px}.tree{grid-area:tree;background:var(--panel);border-right:1px solid var(--border);padding:12px;overflow:auto}.tree ul{list-style:none;margin:0;padding:0}.tree-node{display:flex;align-items:center;gap:6px;padding:3px 0}.tree-node.selected{background:var(--ribbon)}.tree-node input[type=color]{width:28px;height:22px;padding:0}.tree-node input[type=range]{width:60px;padding:0}.viewport-wrap{grid-area:main;min-width:0;min-height:0}.viewport{position:relative;width:100%;height:100%;overflow:hidden;background:var(--viewport)}.properties{grid-area:props;background:var(--panel);border-left:1px solid var(--border);padding:12px;overflow:auto}.kv{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;margin:0 0 12px}.kv dt{color:var(--muted)}.kv dd{margin:0}.statusbar{grid-area:status;display:flex;align-items:center;gap:16px;padding:4px 12px;background:var(--ribbon);border-top:1px solid var(--border);font-size:12px}.viewport-canvas{display:block;width:100%;height:100%;touch-action:none}.viewport-tools{position:absolute;top:8px;left:8px;right:8px;display:flex;flex-wrap:wrap;gap:4px;align-items:center;pointer-events:none}.viewport-tools>*{pointer-events:auto}.viewport-tools button,.viewport-tools select{padding:3px 8px;font-size:12px;background:#ffffffe6}.viewport-tools button.active{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.viewport-tools label.inline{color:#e6e9ef;font-size:12px}label.inline{flex-direction:row;align-items:center;gap:6px;margin-bottom:0;font-weight:400}.viewport-labels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden}.measure-label{position:absolute;top:0;left:0;margin:-10px 0 0 6px;padding:1px 6px;border-radius:3px;background:#0a141ecc;color:#5ad1ff;font-size:12px;white-space:nowrap}.orientation{position:absolute;right:44px;bottom:44px;width:0;height:0;pointer-events:none}.orientation span{position:absolute;left:-6px;top:-8px;width:12px;text-align:center;color:#e6e9ef;font-weight:700;font-size:13px}.viewport-status{position:absolute;left:8px;bottom:8px;display:flex;gap:12px;font-size:12px;color:#e6e9ef;pointer-events:none}.viewport-status .muted{color:#a8b0bd}.viewport-status .error{color:#ff8a80}.preview-flag{padding:2px 8px;border-radius:3px;background:#f5b400;color:#1c2330;font-size:12px;font-weight:600}.node-props{border-top:1px solid var(--border);padding-top:10px;margin-bottom:12px}.node-props .unit{color:var(--muted);font-weight:400}.param-json{margin-bottom:10px}.param-json .param-name{font-weight:600}.param-json pre{margin:4px 0 0;max-height:120px;overflow:auto;background:var(--bg);padding:4px 6px;font-size:11px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.imaging-main{grid-area:main;min-width:0;min-height:0;overflow:hidden;padding:6px}.imaging-tools{display:flex;gap:8px;height:100%;min-height:0}.imaging-grid{flex:1 1 0;min-width:0;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:minmax(180px,1fr) minmax(180px,1fr);gap:4px}.imaging-side{flex:0 0 260px;min-height:0;overflow-y:auto;padding-right:4px}.imaging-empty{display:flex;flex-direction:column;gap:8px}.imaging-banner{display:flex;align-items:center;gap:12px;padding:8px 12px;background:var(--panel);border:1px solid var(--border);border-radius:4px}.imaging-full3d{position:relative;flex:1;min-height:320px}.preview3d{position:relative;min-width:0;min-height:180px;overflow:hidden}.preview3d>.viewport-wrap,.imaging-full3d>.viewport-wrap{position:absolute;top:0;right:0;bottom:0;left:0;grid-area:auto}.preview3d .viewport-tools{top:4px;left:4px;right:4px;gap:2px}.preview3d .viewport-tools button,.preview3d .viewport-tools select{padding:1px 5px;font-size:11px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;background:#0f141e73}.modal{width:440px;max-height:80vh;overflow:auto}.modal select,.imaging-panels select{font:inherit;padding:4px 6px}details.panel{border:1px solid var(--border);border-radius:4px;margin:8px 0;padding:6px 8px}details.panel>summary{cursor:pointer;font-weight:600}details.panel label{font-weight:400}button.small{padding:1px 6px;font-size:12px}ul.landmarks{list-style:none;margin:0 0 8px;padding:0;font-size:12px}ul.landmarks li{display:grid;grid-template-columns:1fr auto auto auto;gap:4px;align-items:center;padding:2px 0;border-bottom:1px solid var(--bg)}ul.landmarks li.pending{background:var(--ribbon)}ul.warnings{margin:6px 0;padding-left:18px;color:#8a5a00}.plan-main{grid-area:main;min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:4px;padding:6px}.plan-top{display:flex;flex-direction:column;gap:4px}.plan-body{flex:1;min-height:0;display:flex;gap:8px}.plan-view{position:relative;flex:1 1 0;min-width:0;min-height:320px}.plan-view>.viewport-wrap{position:absolute;top:0;right:0;bottom:0;left:0;grid-area:auto}.plan-side{flex:0 0 320px;min-height:0;overflow-y:auto;padding-right:4px;font-size:13px}.plan-side label{font-weight:400;margin-bottom:6px}.plan-side select,.variants-bar select,.plan-side textarea{font:inherit;padding:4px 6px}.plan-side textarea{border:1px solid var(--border);border-radius:4px;resize:vertical}.plan-side progress{width:100%;margin-top:6px}.plan-side h4{margin:8px 0 4px;font-size:12px}.row.wrap{flex-wrap:wrap;align-items:flex-end;margin:4px 0}.field-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(92px,1fr));gap:0 6px}.field-grid input{width:100%}.vec-row{display:grid;grid-template-columns:1fr repeat(3,64px);gap:4px;align-items:center;margin-bottom:4px}.vec-row input{padding:2px 4px}fieldset.subsection{border:1px dashed var(--border);border-radius:4px;margin:8px 0;padding:4px 8px 8px}fieldset.subsection>legend{font-size:12px;color:var(--muted)}.hint{font-size:12px;margin:4px 0}.inline-flag{display:inline-block;margin:4px 0}ul.plain{list-style:none;margin:4px 0;padding:0}dl.kv.compact{font-size:12px;margin:6px 0}p.warning{color:#8a5a00}table.metrics{width:100%;border-collapse:collapse;font-size:12px;margin:6px 0}table.metrics th,table.metrics td{text-align:left;padding:2px 4px;border-bottom:1px solid var(--bg);vertical-align:top}table.metrics th{font-weight:600;color:var(--muted)}table.metrics tr.sev-block td:first-child{border-left:3px solid #c62828}table.metrics tr.sev-warn td:first-child{border-left:3px solid #e0a100}table.metrics tr.sev-inform td:first-child{border-left:3px solid #9aa1ab}.rules ul.rule-list{list-style:none;margin:4px 0;padding:0}.rules-summary{font-size:12px;margin:0 0 4px}.rule{display:grid;grid-template-columns:auto auto 1fr;gap:2px 6px;align-items:baseline;padding:3px 6px;margin-bottom:3px;border-left:4px solid #9aa1ab;background:var(--bg);border-radius:2px;font-size:12px}.rule .rule-msg{grid-column:1 / -1}.rule .rule-vl{grid-column:1 / -1;color:var(--muted);font-size:11px}.rule-badge{font-weight:700;font-size:11px;text-transform:uppercase}.rule.rule-fail.sev-block{border-left-color:#c62828;background:#fdecea}.rule.rule-fail.sev-block .rule-badge{color:#c62828}.rule.rule-fail.sev-warn{border-left-color:#e0a100;background:#fff6dd}.rule.rule-fail.sev-warn .rule-badge{color:#8a5a00}.rule.rule-fail.sev-inform{border-left-color:#9aa1ab}.rule.rule-fail.sev-inform .rule-badge{color:#5f6672}.rule.rule-pass,.rule.rule-na{opacity:.7}.rule.rule-pass .rule-badge{color:#2e7d32}.signoff{border-top:1px solid var(--border);margin-top:8px;padding-top:6px}.signoff-status{font-size:12px;margin:2px 0 6px}.signoff-status.signed{color:#2e7d32;font-weight:600}.stage-gate{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;padding:2px 4px}.variants-bar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:4px 8px;background:var(--panel);border:1px solid var(--border);border-radius:4px;font-size:12px}.variants-bar label.inline{gap:4px}.variants-bar .variant-table{flex-basis:100%}.variants-bar .confirm{flex-basis:100%;display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:6px;border:1px solid #c79a3a;border-radius:4px;background:#fff8e6}.variants-bar .confirm p{flex-basis:100%;margin:0}ul.warnings.banner{list-style:none;padding:6px 8px;border:1px solid #c79a3a;border-radius:4px;background:#fff8e6}button.chip{padding:1px 8px;border-radius:10px;font-size:12px}button.chip.active{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.split-view{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;grid-template-columns:1fr 1fr;gap:4px}.split-pane{position:relative;display:flex;flex-direction:column;min-width:0;min-height:0}.split-head{display:flex;justify-content:space-between;gap:8px;padding:2px 6px;font-size:12px;background:var(--ribbon);border:1px solid var(--border);border-bottom:0}.split-body{position:relative;flex:1;min-height:0}.split-body>.viewport-wrap{position:absolute;top:0;right:0;bottom:0;left:0;grid-area:auto}.split-body .viewport-tools button{padding:1px 5px;font-size:11px}
