@charset "UTF-8";:root{font-family:Inter,PingFang SC,Microsoft YaHei,system-ui,sans-serif;color:#dce8ee;background:#071017;font-synthesis:none;--panel: #0d1a22;--panel2: #11232d;--line: #203844;--muted: #8499a4;--teal: #31e6c3;--red: #ff486b;--blue: #6aa9ff;--purple: #b57cff;--cyan: #39d7ff;--lime: #b7e36a;--amber: #f3b562}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;min-width:320px;min-height:100vh;overflow:hidden;background:radial-gradient(circle at 70% 0,#102a34 0,transparent 38%),#071017}button,input,select{font:inherit}button{border:1px solid var(--line);background:#132630;color:#cce0e8;border-radius:7px;padding:7px 11px;cursor:pointer}button:hover{border-color:#3d6675;background:#18323e}button:disabled{opacity:.45;cursor:not-allowed}.primary{background:var(--teal);color:#05221d;border-color:var(--teal);font-weight:700}.primary:hover{background:#57f2d4}main{height:100vh;overflow:hidden}header{height:50px;display:flex;align-items:center;justify-content:space-between;padding:6px 16px;border-bottom:1px solid var(--line);background:#071017db;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}h1{font-size:18px;letter-spacing:.01em;margin:0}.header-actions{display:flex;gap:8px;align-items:center}.status{font-size:12px;color:var(--teal);margin-right:7px}.status:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:currentColor;margin-right:7px}.status.busy:before{animation:pulse .8s infinite}@keyframes pulse{50%{opacity:.25}}.layout{display:grid;grid-template-columns:clamp(300px,15.625vw,320px) minmax(340px,.9fr) minmax(420px,1.1fr);grid-template-rows:44px minmax(0,1fr);grid-template-areas:"params scan scan" "params rays image";height:calc(100vh - 50px);min-height:0;overflow:hidden}aside{grid-area:params;border-right:1px solid var(--line);background:#0a171feb;padding:12px;overflow:auto;height:100%}.preset{display:grid;grid-template-columns:1fr 118px;gap:8px;padding:4px 4px 12px}.preset label,.batch label{display:flex;flex-direction:column;gap:5px;font-size:11px;color:var(--muted)}select,input[type=number]{background:#09161d;border:1px solid var(--line);border-radius:5px;color:#dce8ee;padding:7px;width:100%}details{border-top:1px solid var(--line)}summary{list-style:none;cursor:pointer;padding:12px 5px;color:#d9e8ed;font-weight:650;font-size:13px;display:flex;align-items:center;justify-content:space-between}summary:before{content:"+";color:var(--teal);width:20px}details[open]>summary:before{content:"-"}summary button{font-size:10px;padding:3px 7px;color:var(--muted)}.fields{padding:0 5px 14px}.field{display:block;padding:7px 0}.field>span{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.field b{font-size:11px;font-weight:500;color:#a9bbc3}.field small{font-size:10px;color:#637984}.field>div{display:grid;grid-template-columns:1fr 76px;gap:9px;align-items:center}.field input[type=range]{accent-color:var(--teal);width:100%;height:3px}.field input[type=number]{padding:5px;font:11px ui-monospace,monospace;text-align:right}.select-field{font-size:11px;color:#a9bbc3;display:flex;align-items:center;justify-content:space-between;padding:7px 0}.select-field select{width:145px;padding:5px}.surface{padding:7px 0;border-bottom:1px dashed var(--line)}.surface h3{font-size:12px;color:var(--teal);margin:0}.coord{padding:0 10px 13px}.coord svg{width:100%;height:105px}.coord path{stroke:#809aa5;fill:none;stroke-width:2}.coord path.laser{stroke:var(--red);stroke-width:3}.coord path.camera{stroke:var(--blue);stroke-dasharray:5 4}.coord text{fill:#91a7b0;font-size:10px}.coord p,.batch p{font-size:10px;line-height:1.5;color:var(--muted);margin:4px 0}.workspace{min-width:0;min-height:0;height:100%;background:#09151dc2}.ray-workspace{grid-area:rays;border-right:1px solid var(--line);overflow:hidden}.image-workspace{grid-area:image;display:flex;flex-direction:column;padding:0 16px 12px;overflow:hidden}.toolbar{display:grid;grid-template-rows:1fr 1fr;color:var(--muted);font-size:11px;height:52px;flex:0 0 52px;padding:3px 0;box-sizing:border-box;border-bottom:1px solid var(--line)}.toolbar-controls,.toolbar-meta{display:flex;align-items:center;gap:18px;min-width:0}.toolbar label{display:flex;align-items:center;gap:5px;white-space:nowrap}.toolbar-meta{font-family:ui-monospace,monospace}.toolbar-meta span{white-space:nowrap}.ray-hit-preview{height:100%;min-height:0;display:grid;grid-template-rows:48px auto minmax(260px,1fr) auto;background:#09151dc2;overflow:hidden}.ray-hit-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;padding:0 16px;border-bottom:1px solid var(--line)}.ray-hit-heading>div:first-child{display:flex;align-items:baseline;gap:9px}.ray-hit-heading strong{font-size:12px;font-weight:600;white-space:nowrap}.ray-hit-heading span,.ray-live{color:var(--muted);font-size:10px}.ray-live{color:var(--teal);font-family:ui-monospace,monospace;white-space:nowrap}.ray-live:before{content:"";display:inline-block;width:6px;height:6px;margin-right:6px;border-radius:50%;background:currentColor}.ray-live.busy:before{animation:pulse .8s infinite}.ray-hit-preview canvas{display:block;width:100%;height:100%;min-height:0}.ray-geometry-stats{display:flex;flex-wrap:wrap;gap:7px 14px;padding:8px 16px;border-bottom:1px solid #162d38;color:var(--muted);font:10px ui-monospace,monospace}.ray-geometry-stats b{color:var(--teal);font-weight:500}.ray-geometry-stats label{margin-left:auto;display:flex;align-items:center;gap:5px;font-family:inherit}.ray-layer-controls{display:flex;flex-wrap:wrap;gap:6px;padding:8px 12px;border-top:1px solid var(--line);background:#071017d1;font-size:10px}.ray-layer-controls label{display:flex;align-items:center;gap:5px;padding:4px 7px;border:1px solid var(--line);border-radius:5px;background:#09161d;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none}.ray-layer-controls label:has(input:not(:checked)){opacity:.48}.ray-layer-controls input{width:12px;height:12px;margin:0;accent-color:currentColor}.ray-layer-controls i{width:12px;height:2px;display:inline-block;background:currentColor}.ray-layer-controls .incoming,.ray-layer-controls .occluded-ray{color:var(--red)}.ray-layer-controls .reflected-ray{color:var(--amber)}.ray-layer-controls .normal-ray{color:var(--blue)}.ray-layer-controls .plane-footprint{color:var(--purple)}.ray-layer-controls .bump-camera{color:var(--cyan)}.ray-layer-controls .wafer-camera{color:var(--lime)}.tabs{display:flex;flex:0 0 auto;gap:3px;overflow-x:auto;border-bottom:1px solid var(--line);padding-bottom:1px}.tabs button{white-space:nowrap;border:0;border-radius:5px 5px 0 0;background:transparent;color:#8298a2;font-size:11px;padding:9px 10px}.tabs button.active{color:var(--teal);background:#11242d;box-shadow:inset 0 -2px var(--teal)}.canvas-shell{position:relative;flex:1 1 auto;min-height:0;margin-top:12px;display:grid;place-items:center;background:#03070a;border:1px solid #182b34;border-radius:8px;overflow:hidden;background-image:linear-gradient(45deg,#071016 25%,transparent 25%),linear-gradient(-45deg,#071016 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#071016 75%),linear-gradient(-45deg,transparent 75%,#071016 75%);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0}.canvas-shell canvas{display:block;min-width:0;min-height:0;max-width:100%;max-height:100%;object-fit:contain;image-rendering:auto}.pixel-readout{position:absolute;left:12px;bottom:10px;background:#08141dd9;padding:6px 9px;border-radius:4px;color:#a9c1cb;font:10px ui-monospace,monospace}.empty{color:#5a727d;font-size:12px}.histogram{height:64px;flex:0 0 64px;display:flex;align-items:end;gap:2px;margin-top:10px;border-bottom:1px solid var(--line)}.histogram i{display:block;flex:1;background:linear-gradient(var(--teal),#157f73);min-height:2px}.validation{padding-top:15px}.metric-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.metric-grid>div{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:12px;display:flex;flex-direction:column;gap:6px}.metric-grid span{color:var(--muted);font-size:10px}.metric-grid strong{font:12px ui-monospace,monospace;color:#dce9ee}.warning,.error{padding:10px 12px;border:1px solid #7a4a20;background:#291b10;color:#ffc785;border-radius:6px;font-size:12px;margin-bottom:10px}.error{margin:10px 24px}.limitation{font-size:11px;color:var(--muted);border-left:2px solid var(--red);padding:10px;line-height:1.6}.batch{padding:0 6px 14px}.batch{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.batch p,.batch .progress,.batch .warning{grid-column:1/-1}.progress{height:5px;background:#061118;border-radius:9px;overflow:hidden}.progress i{display:block;height:100%;background:var(--teal)}.batch>span{font:10px ui-monospace,monospace;color:var(--teal)}.batch-rules{grid-column:1/-1;display:grid;gap:4px}.batch-rule{display:grid;grid-template-columns:1fr 92px 58px 58px;gap:4px;align-items:center}.batch-rule span{font-size:10px;color:#9eb2ba}.batch-rule select,.batch-rule input{font-size:10px;padding:4px}.batch-rules p{margin-top:6px}.scan-controls{padding:0 6px 14px}.scan-grid{display:grid;grid-template-columns:1fr 1fr;gap:7px}.scan-grid label{display:flex;flex-direction:column;gap:4px;color:var(--muted);font-size:10px}.scan-grid input{padding:5px}.scan-options{display:flex;gap:12px;flex-wrap:wrap;color:var(--muted);font-size:10px}.scan-options label{display:flex;align-items:center;gap:5px}.scan-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.scan-actions button{font-size:11px;padding:6px 8px}.scan-export-state{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px;margin-top:10px;color:var(--teal);font:10px ui-monospace,monospace}.scan-controls>p{color:var(--muted);font-size:10px;line-height:1.5;margin:10px 0 0}.scan-transport{grid-area:scan;min-width:0;display:flex;align-items:center;gap:12px;padding:5px 14px;border-bottom:1px solid var(--line);background:#08131bf0;color:var(--muted);font-size:10px;overflow:hidden}.scan-transport-actions{display:flex;gap:5px;flex:0 0 auto}.scan-transport-actions button{min-width:30px;height:30px;padding:4px 8px;font-size:11px}.scan-transport-position{flex:0 0 auto;display:flex;align-items:center;gap:10px;font-family:ui-monospace,monospace;white-space:nowrap}.scan-transport-position strong{color:var(--teal);font-weight:500}.scan-transport-timeline{min-width:100px;flex:1 1 auto;margin:0;accent-color:var(--teal)}.scan-transport-loop{flex:0 0 auto;display:flex;align-items:center;gap:5px;white-space:nowrap}.config-actions{display:grid;grid-template-columns:1fr 1fr;gap:7px;padding:0 5px 14px}.file-button{border:1px solid var(--line);background:#132630;color:#cce0e8;border-radius:7px;padding:7px 11px;text-align:center;font-size:13px;cursor:pointer}.file-button input{display:none}@media(min-width:1101px){.canvas-shell canvas{width:100%;height:auto}}@media(max-width:1100px){.layout{grid-template-columns:320px minmax(0,1fr);grid-template-rows:44px minmax(0,1fr) minmax(0,1fr);grid-template-areas:"params scan" "params rays" "params image"}.ray-workspace{border-right:0;border-bottom:1px solid var(--line)}.ray-hit-preview{grid-template-rows:40px auto minmax(140px,1fr) auto}.ray-hit-heading{padding:0 10px}.ray-geometry-stats{gap:4px 10px;padding:4px 10px;font-size:9px}.ray-layer-controls{gap:4px;padding:4px 8px}.ray-layer-controls label{padding:2px 5px}.canvas-shell canvas{width:auto!important;height:100%!important;max-width:100%}}@media(max-width:900px){body{overflow:auto}main{height:auto;min-height:100vh;overflow:visible}header{height:auto;align-items:flex-start;gap:12px;flex-direction:column}.header-actions{flex-wrap:wrap}.layout{height:auto;min-height:0;overflow:visible;grid-template-columns:1fr;grid-template-rows:none;grid-template-areas:"scan" "params" "rays" "image"}aside{height:auto;max-height:none;border-right:0}.workspace{padding:12px;height:auto;overflow:visible}.scan-transport{position:sticky;top:0;z-index:20;flex-wrap:wrap;overflow:visible}.scan-transport-timeline{order:4;flex-basis:100%}.ray-hit-preview{height:auto;min-height:580px;border:1px solid var(--line);border-radius:8px}.image-workspace{display:block}.metric-grid{grid-template-columns:1fr 1fr}.canvas-shell{min-height:340px}.toolbar{height:auto;padding:5px 0}.toolbar-controls,.toolbar-meta{flex-wrap:wrap}}@media(max-width:620px){.ray-hit-heading,.ray-hit-heading>div:first-child{align-items:flex-start;flex-direction:column}.ray-geometry-stats label{width:100%;margin-left:0}.ray-hit-preview canvas{height:260px}}@media(max-width:540px){.preset,.batch,.config-actions,.metric-grid{grid-template-columns:1fr}.header-actions .status,.toolbar-meta span{width:100%}}
