:root{
  --bg:#eef1f5; --bg2:#dfe5ec;
  --panel:rgba(255,255,255,.92);
  --panel-solid:#ffffff;
  --panel-top:rgba(255,255,255,.96);
  --panel-top2:rgba(255,255,255,.80);
  --soft:#eef1f6;          /* 分段控件底、按钮按下 */
  --hair:#f0f2f6;          /* 细分隔线 */
  --line:#e2e6ec;
  --text:#1c2127; --text2:#5c6673; --text3:#8b95a2;
  --pri:#1a6fd4; --pri-soft:#e8f1fd;
  --icon-off:#c3cad4;
  --sh:0 2px 12px rgba(20,30,45,.10);
  --safe:env(safe-area-inset-bottom,0px);
  --tb:52px; --bb:60px;
}
html[data-theme="dark"]{
  --bg:#10151b; --bg2:#0a0e13;
  --panel:rgba(26,32,40,.94);
  --panel-solid:#1a2028;
  --panel-top:rgba(24,30,38,.96);
  --panel-top2:rgba(24,30,38,.84);
  --soft:#232b35;
  --hair:#232b35;
  --line:#2c3641;
  --text:#e8eef6; --text2:#a9b4c1; --text3:#78838f;
  --pri:#4d9eff; --pri-soft:rgba(77,158,255,.18);
  --icon-off:#4a5563;
  --sh:0 2px 14px rgba(0,0,0,.5);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%;overflow:hidden;background:var(--bg);
  font-family:system-ui,-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:var(--text);
  -webkit-user-select:none;user-select:none;transition:background .2s}
#c{position:fixed;inset:0;width:100%;height:100%;display:block;touch-action:none}

/* 顶栏 */
#topbar{position:fixed;left:0;right:0;top:0;padding:0 10px;
  display:flex;align-items:center;gap:8px;z-index:20;
  background:linear-gradient(180deg,var(--panel-top),var(--panel-top2));
  backdrop-filter:saturate(1.4) blur(12px);border-bottom:1px solid var(--line);
  padding-top:env(safe-area-inset-top,0px);height:calc(var(--tb) + env(safe-area-inset-top,0px))}
.tb-left{flex:1;min-width:0}
.tb-title{font-size:15px;font-weight:650;letter-spacing:.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb-sub{font-size:11px;color:var(--text3);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb-btn{width:38px;height:38px;border:1px solid var(--line);border-radius:11px;background:var(--panel-solid);
  display:grid;place-items:center;cursor:pointer;flex:none}
.tb-btn svg{width:20px;height:20px;fill:var(--text2)}
.tb-btn:active{background:var(--soft)}
/* 顶栏加载进度条：渐进加载全程常驻（遮罩消失后仍可见，加载完淡出） */
#tb-prog{position:absolute;left:0;right:0;bottom:-1px;height:2px;overflow:hidden;
  pointer-events:none;transition:opacity .45s}
#tb-prog i{display:block;height:100%;width:0;background:var(--pri);transition:width .3s ease}
#tb-prog.off{opacity:0}

/* 提示（靠左上，给右上角方位立方体让位） */
.hint{position:fixed;left:12px;top:calc(var(--tb) + 14px);z-index:15;
  background:rgba(28,33,39,.82);color:#fff;font-size:12px;padding:7px 12px;border-radius:14px;
  pointer-events:none;transition:opacity .5s;box-shadow:var(--sh);
  max-width:calc(100% - 132px);white-space:normal;line-height:1.45;text-align:left}
html[data-theme="dark"] .hint{background:rgba(62,72,84,.9)}
.hint.off{opacity:0}

/* 信息卡 */
.card{position:fixed;left:8px;right:8px;bottom:calc(var(--bb) + var(--safe) + 8px);z-index:22;
  background:var(--panel);backdrop-filter:blur(14px);border:1px solid var(--line);border-radius:16px;
  box-shadow:var(--sh);padding:12px 13px 10px;max-height:46vh;overflow:auto}
.card.hidden,.hidden{display:none !important}
.ic-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.ic-cat{font-size:11px;font-weight:600;color:#fff;background:var(--pri);padding:3px 9px;border-radius:20px}
.ic-close{margin-left:auto;border:0;background:transparent;font-size:22px;line-height:1;color:var(--text3);padding:0 4px}
.ic-name{font-size:14px;font-weight:620;line-height:1.35;margin-bottom:8px;word-break:break-all}
.ic-grid{display:grid;grid-template-columns:auto 1fr;gap:5px 12px;font-size:12.5px;margin-bottom:10px}
.ic-grid .k{color:var(--text3);white-space:nowrap}
.ic-grid .v{color:var(--text);word-break:break-all}
.ic-actions{display:flex;gap:7px}
.btn{flex:1;border:1px solid var(--line);background:var(--panel-solid);color:var(--text);border-radius:10px;
  padding:9px 6px;font-size:13px;cursor:pointer;font-family:inherit}
.btn:active{background:var(--soft)}
.btn.primary{background:var(--pri);border-color:var(--pri);color:#fff}
.btn.primary:active{filter:brightness(.92)}
.btn.sm{padding:8px 4px;font-size:12.5px}

/* 底部工具栏 */
#tabbar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;
  background:linear-gradient(180deg,var(--panel-top2),var(--panel-top));
  backdrop-filter:blur(14px);border-top:1px solid var(--line);
  padding-bottom:var(--safe)}
.tab{flex:1;border:0;background:transparent;padding:6px 2px 5px;display:flex;flex-direction:column;
  align-items:center;gap:2px;color:var(--text3);font-family:inherit;position:relative;min-height:var(--bb)}
.tab svg{width:22px;height:22px;fill:currentColor}
.tab span{font-size:10.5px;letter-spacing:.2px}
.tab.on{color:var(--pri)}
.tab.on::after{content:"";position:absolute;top:0;left:22%;right:22%;height:2.5px;border-radius:2px;background:var(--pri)}
#mark-badge{position:absolute;top:2px;right:calc(50% - 20px);min-width:15px;height:15px;border-radius:8px;
  background:#d9534f;color:#fff;font-size:10px;line-height:15px;font-style:normal;padding:0 3px;display:none}
#mark-badge.show{display:block}

/* 抽屉 */
#sheet{position:fixed;left:0;right:0;bottom:calc(var(--bb) + var(--safe));z-index:25;
  background:var(--panel);backdrop-filter:blur(16px);border-top:1px solid var(--line);
  border-radius:18px 18px 0 0;box-shadow:0 -4px 20px rgba(20,30,45,.12);
  max-height:62vh;display:flex;flex-direction:column;animation:up .18s ease-out}
html[data-theme="dark"] #sheet{box-shadow:0 -4px 22px rgba(0,0,0,.5)}
@keyframes up{from{transform:translateY(20px);opacity:.6}to{transform:none;opacity:1}}
#sheet-handle{padding:8px 0 4px;display:grid;place-items:center;flex:none}
#sheet-handle i{width:38px;height:4px;border-radius:3px;background:var(--icon-off);display:block}
#sheet-title{flex:none;padding:2px 14px 8px;font-size:13.5px;font-weight:650;border-bottom:1px solid var(--line)}
#sheet-body{overflow:auto;padding:10px 12px calc(12px);-webkit-overflow-scrolling:touch}

/* 面板控件 */
.seg{display:flex;background:var(--soft);border-radius:10px;padding:3px;margin-bottom:10px;gap:2px}
.seg button{flex:1;border:0;background:transparent;border-radius:8px;padding:7px 4px;font-size:12.5px;
  color:var(--text2);font-family:inherit}
.seg button.on{background:var(--panel-solid);color:var(--pri);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.1)}
/* 测量方式：四宫格大按钮 */
.seg.measseg{padding:4px;gap:4px}
.seg.measseg button{padding:11px 2px;font-size:14px;font-weight:500}
.seg.measseg button.on{background:var(--pri);color:#fff;box-shadow:0 2px 8px rgba(26,111,212,.35)}
/* 测量数值标签 */
.mlab{position:fixed;left:0;top:0;z-index:24;pointer-events:none;white-space:nowrap;
  background:rgba(217,83,79,.95);color:#fff;font-size:12px;line-height:1.55;padding:5px 10px;
  border-radius:9px;box-shadow:0 3px 12px rgba(0,0,0,.28);transform:translate(-50%,-128%);
  font-variant-numeric:tabular-nums;letter-spacing:.2px;max-width:64vw}
.mlab.side{transform:translate(12px,-50%);text-align:left;white-space:normal}
.mlab.mult{font-size:11px;line-height:1.5;padding:6px 9px}
.mlab b{font-weight:700}
.mlab .mlab-n{display:block;margin-top:3px;opacity:.72;font-size:10.5px}
html[data-theme="dark"] .mlab{background:rgba(214,69,64,.96);color:#fff}
/* 测量：拾取框（实时投影到物体表面） */
.aperture{position:fixed;left:0;top:0;z-index:23;width:13px;height:13px;transform:translate(-50%,-50%);
  border:1.5px solid var(--pri);border-radius:2px;background:rgba(26,111,212,.15);pointer-events:none;
  box-shadow:0 0 0 1px rgba(255,255,255,.6)}
html[data-theme="dark"] .aperture{box-shadow:0 0 0 1px rgba(0,0,0,.55)}
/* 测量：捕捉类型标记（磁性吸附） */
.snapmark{position:fixed;left:0;top:0;z-index:26;width:0;height:0;pointer-events:none;display:none}
.snapmark i{position:absolute;left:-10px;top:-10px;width:20px;height:20px;border:2px solid #16c46a;
  border-radius:4px;background:rgba(22,196,106,.20);box-shadow:0 0 0 2px rgba(255,255,255,.85);
  animation:snapPulse 1.05s ease-out infinite}
.snapmark b{position:absolute;left:13px;top:-30px;background:#12a150;color:#fff;font-size:10.5px;font-weight:600;
  padding:2px 7px;border-radius:6px;white-space:nowrap;box-shadow:0 2px 8px rgba(0,0,0,.30)}
html[data-theme="dark"] .snapmark i{box-shadow:0 0 0 2px rgba(0,0,0,.6)}
@keyframes snapPulse{0%{transform:scale(1);opacity:1}72%{transform:scale(1.5);opacity:.26}100%{transform:scale(1);opacity:1}}
/* 激光各方向数值（在方向线中点、与线平行） */
.mlab.mini{font-size:10.5px;padding:2px 6px;border-radius:6px;opacity:.96}
.mlab.las{transform-origin:50% 50%;border-radius:6px}
/* 触摸长按拖动测量点时的提示 */
#measTip{position:fixed;left:50%;z-index:27;transform:translateX(-50%);pointer-events:none;
  background:rgba(22,196,106,.94);color:#fff;font-size:11.5px;padding:5px 12px;border-radius:14px;
  box-shadow:0 2px 10px rgba(0,0,0,.28);display:none;white-space:nowrap}
/* 捕捉类型多选 */
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{border:1px solid var(--line);background:var(--soft);color:var(--text2);font-family:inherit;
  font-size:11.5px;padding:5px 9px;border-radius:8px}
.chip.on{background:var(--pri);color:#fff;border-color:transparent;font-weight:600}
.row{display:flex;align-items:center;gap:9px;padding:9px 2px;border-bottom:1px solid var(--hair)}
.row:last-child{border-bottom:0}
.sw{width:14px;height:14px;border-radius:4px;flex:none;border:1px solid rgba(0,0,0,.12)}
html[data-theme="dark"] .sw{border-color:rgba(255,255,255,.18)}
.nm{flex:1;font-size:13.5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct{font-size:11.5px;color:var(--text3);flex:none}
.eye{width:34px;height:30px;border:0;background:transparent;display:grid;place-items:center;flex:none;opacity:.9}
.eye svg{width:17px;height:17px;fill:var(--text2)}
.eye.off svg{fill:var(--icon-off)}
.mini{border:1px solid var(--line);background:var(--panel-solid);border-radius:8px;padding:5px 8px;font-size:11.5px;
  color:var(--text2);font-family:inherit;flex:none}
.mini.on{background:var(--pri-soft);border-color:var(--pri);color:var(--pri)}
.emphbar{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;margin:6px 0 2px;padding:9px 11px;
  border-radius:10px;background:var(--pri-soft);border:1px solid var(--pri);color:var(--pri);font-size:12px}
.emphbar b{font-weight:700}
.emphbar span{flex:1;min-width:0;color:var(--text2)}
.sec{font-size:11.5px;color:var(--text3);margin:12px 0 4px;font-weight:600;letter-spacing:.3px}
.inp{width:100%;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font-size:14px;
  font-family:inherit;background:var(--panel-solid);color:var(--text)}
.res{max-height:38vh;overflow:auto;margin-top:8px}
.res .row{align-items:flex-start}
.res .nm{white-space:normal;font-size:13px;line-height:1.35}
.res .sub{font-size:11px;color:var(--text3);margin-top:2px}
.slider{width:100%;margin:6px 0}
input[type=range]{-webkit-appearance:none;width:100%;height:26px;background:transparent}
input[type=range]::-webkit-slider-runnable-track{height:5px;border-radius:3px;background:var(--line)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;
  background:var(--panel-solid);border:2px solid var(--pri);margin-top:-9px;box-shadow:0 1px 4px rgba(0,0,0,.18)}
.lbl{font-size:12.5px;color:var(--text2);display:flex;justify-content:space-between}
.val{font-variant-numeric:tabular-nums;color:var(--text);font-weight:600}
table.q{width:100%;border-collapse:collapse;font-size:12.5px}
table.q th,table.q td{padding:6px 5px;text-align:right;border-bottom:1px solid var(--hair);white-space:nowrap}
table.q th{color:var(--text3);font-weight:600;font-size:11.5px}
table.q td:first-child,table.q th:first-child{text-align:left}
.note{font-size:11.5px;color:var(--text3);line-height:1.5;margin-top:8px}
.empty{text-align:center;color:var(--text3);font-size:12.5px;padding:18px 0}
.mk{border:1px solid var(--line);border-radius:11px;padding:9px 10px;margin-bottom:8px;background:var(--panel-solid)}
.mk-t{display:flex;align-items:center;gap:6px;font-size:11.5px}
.mk-tag{background:rgba(224,120,26,.14);color:#e0781a;padding:2px 7px;border-radius:20px;font-weight:600}
.mk-n{font-size:13px;font-weight:600;margin:5px 0 3px;line-height:1.35}
.mk-x{font-size:12.5px;color:var(--text2);line-height:1.45}
.mk-a{display:flex;gap:6px;margin-top:7px}
.mk-a .btn{padding:6px 4px;font-size:12px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:7px}
.grid2 .btn{font-size:12.5px;padding:10px 4px}

/* 加载 */
#loading{position:fixed;inset:0;z-index:60;background:linear-gradient(160deg,var(--bg),var(--bg2));
  display:flex;align-items:center;justify-content:center}
#loading.off{display:none}
.lg-box{width:78%;max-width:330px;text-align:center}
.lg-title{font-size:16px;font-weight:650;margin-bottom:16px}
.lg-bar{height:5px;background:var(--line);border-radius:4px;overflow:hidden}
.lg-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--pri),var(--pri));transition:width .25s}
.lg-txt{font-size:12px;color:var(--text3);margin-top:10px}
.err{color:#d9534f;font-size:13px;line-height:1.6}

/* ================= 横屏：工具栏 + 功能卡移到左侧（竖屏仍在下方） ================= */
@media (orientation:landscape) and (min-width:600px){
  :root{--bb:0px}
  #tabbar{left:0;right:auto;top:calc(var(--tb) + env(safe-area-inset-top,0px));bottom:0;width:62px;
    flex-direction:column;justify-content:flex-start;gap:2px;
    padding:6px 0 calc(6px + var(--safe));overflow:auto;border-top:0;border-right:1px solid var(--line);
    background:linear-gradient(90deg,var(--panel-top2),var(--panel-top))}
  .tab{flex:none;width:100%;min-height:0;padding:8px 2px;border-radius:10px}
  .tab svg{width:21px;height:21px}
  .tab span{font-size:9.5px;line-height:1.15}
  #mark-badge{right:9px;top:4px;left:auto}
  .tab.on::after{left:0;right:auto;top:16%;bottom:16%;width:2.5px;height:auto;border-radius:2px}
  #sheet{left:68px;right:auto;top:calc(var(--tb) + env(safe-area-inset-top,0px) + 8px);
    bottom:calc(8px + var(--safe));width:min(348px,42vw);max-height:none;
    border:1px solid var(--line);border-radius:14px;box-shadow:0 6px 26px rgba(20,30,45,.14);
    animation:slidein .18s ease-out}
  html[data-theme="dark"] #sheet{box-shadow:0 6px 26px rgba(0,0,0,.55)}
  #sheet-handle{padding:6px 0 0}
  #sheet-handle i{width:32px}
  #sheet-body{padding:8px 12px 14px}
  .card{left:auto;right:10px;bottom:calc(10px + var(--safe));width:min(336px,40vw)}
  .hint{left:74px;max-width:calc(100% - 200px)}
  @keyframes slidein{from{transform:translateX(-14px);opacity:.4}to{transform:none;opacity:1}}
}
/* 横屏但很矮（手机横放）：压缩顶栏与抽屉内边距 */
@media (orientation:landscape) and (max-height:460px){
  #sheet-title{padding:0 12px 6px;font-size:13px}
  .seg.measseg button{padding:8px 2px;font-size:13px}
  .row{padding:7px 2px}
}

/* ================= 欢迎页 / 上传（无模型时） ================= */
#welcome{position:fixed;inset:0;z-index:18;display:flex;align-items:center;justify-content:center;
  padding:calc(var(--tb) + 16px) 14px calc(var(--bb) + var(--safe) + 14px);
  background:linear-gradient(160deg,var(--bg),var(--bg2));overflow:auto}
.wl-card{width:100%;max-width:420px;background:var(--panel);backdrop-filter:blur(14px);
  border:1px solid var(--line);border-radius:18px;box-shadow:var(--sh);padding:18px 16px 14px}
.wl-title{font-size:17px;font-weight:680;letter-spacing:.2px;margin-bottom:4px}
.wl-sub{font-size:12px;color:var(--text3);line-height:1.5;margin-bottom:14px}
.wl-drop{border:1.5px dashed var(--line);border-radius:14px;padding:20px 12px;text-align:center;
  background:var(--soft);transition:border-color .15s,background .15s}
.wl-drop.hot{border-color:var(--pri);background:var(--pri-soft)}
.wl-drop svg{width:34px;height:34px;stroke:var(--pri);fill:none;stroke-width:1.6;margin-bottom:6px}
.wl-drop b{display:block;font-size:13.5px;font-weight:620;margin-bottom:3px}
.wl-drop span{display:block;font-size:11.5px;color:var(--text3);line-height:1.5}
.wl-drop .btn{margin-top:12px;width:100%}
.wl-sec{font-size:11.5px;color:var(--text3);font-weight:600;letter-spacing:.3px;margin:16px 0 6px;display:flex;align-items:center;gap:8px}
.wl-sec i{flex:1;height:1px;background:var(--line);font-style:normal}
.wl-list{max-height:32vh;overflow:auto}
.wl-row{display:flex;align-items:center;gap:9px;padding:9px 2px;border-bottom:1px solid var(--hair)}
.wl-row:last-child{border-bottom:0}
.wl-row .nm{font-size:13px}
.wl-row .ct{font-size:11px}
.wl-tips{font-size:11px;color:var(--text3);line-height:1.6;margin-top:12px;
  border-top:1px solid var(--hair);padding-top:10px}
.wl-tips b{color:var(--text2);font-weight:600}

/* 加载遮罩里的转换日志 */
.lg-log{margin-top:12px;max-height:112px;overflow:auto;text-align:left;font-size:10.5px;line-height:1.55;
  color:var(--text3);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  background:var(--soft);border-radius:8px;padding:8px 10px;white-space:pre-wrap}
.lg-log:empty{display:none}
.lg-btn{margin-top:14px}

/* 未加载模型时工具栏置灰（保持外壳可见但不误导） */
#tabbar.disabled{opacity:.42;pointer-events:none}
#tabbar.disabled .tab{color:var(--text3)}

/* toast */
.toast-wrap{position:fixed;left:0;right:0;bottom:calc(var(--bb) + var(--safe) + 16px);z-index:80;
  display:flex;flex-direction:column;align-items:center;gap:8px;pointer-events:none}
.toast{background:rgba(28,33,39,.9);color:#fff;font-size:12.5px;padding:9px 15px;border-radius:20px;
  box-shadow:var(--sh);animation:tin .18s ease-out}
.toast.err{background:rgba(200,60,55,.94)}
@keyframes tin{from{transform:translateY(8px);opacity:0}to{transform:none;opacity:1}}

/* 图层色块 + 数值 */
.sw{cursor:pointer}
.cat-dim{opacity:.45}
.qty-wrap{overflow:auto}
