/* ═══════════════ 0925 句子带 + 九格小地图 + 样张小章 + 产品行面板(fe1) ═══════════════
   设计权威: design/proto_0925/_align.json(D1 / D7 / D9 / D13 / palette / minimap)。
   · 3C 一种蓝, 按行深浅: 想法 #588bde / 原型 #2f6fd6 / 产品 #265baf; 蓝砖上一律白色小图(内联 SVG)。
   · 红 #e0453a 只给 Cube 这个角色; 黄 #f2b705 只给「下一步」(全界面同一时刻一个); 绿 #1f8a4c 只给 ✓ Seen。
   · 状态(D7, 不引入新色相, 用「砖翻到哪一步」画): filled 实心蓝 / partial 右下斜切露素砖 #d8b48e /
     designed 蓝虚线空框 / empty 灰(10x grayf) / none 素砖 + 45° 墨 15% 斜纹(不可点)。
   · 这份文件在 3c.css 之后加载: ★ .main 的高度覆盖只能写在 @media (min-width:901px) 里,
     否则会压掉 3c.css ≤900 的 height:auto(手机堆叠版面塌掉)。test52 有反事实守卫。
   · 3c.css 一个字不改。 */

:root{
  --sb-b0:#588bde; --sb-b1:#2f6fd6; --sb-b2:#265baf;
  --sb-red:#e0453a; --sb-yel:#f2b705; --sb-ink:#1d1d1f; --sb-grn:#1f8a4c; --sb-paper:#fffdf8;
  --sb-brick0:#e8d2ad; --sb-brick1:#d8b48e; --sb-brick2:#c4966a;
  --sb-grayf:#cfd3da;
  --sb-hatch:repeating-linear-gradient(45deg,rgba(29,29,31,.15) 0 1.5px,transparent 1.5px 6px);
}

/* ---------- [hidden] 守卫: 下面这些都是 flex / grid 容器, display 会压掉 hidden ---------- */
#sentence [hidden],#sentence[hidden],
.sb-quote[hidden],.sb-mapdrawer[hidden],.sb-seen[hidden],.sb-runnote[hidden],.sb-more[hidden],.sb-tags>[hidden],
.prodpanel[hidden],.simstamp[hidden]{display:none!important}

/* 顶栏里那两个下拉菜单(📄 Docs)要盖过句子带: 顶栏有 backdrop-filter(自成层叠上下文), 给它一个比带子高的层 */
.nav{position:relative;z-index:60}

/* ---------- 句子带 ---------- */
.sbar{position:relative;z-index:45;background:var(--sb-paper);border-bottom:1px solid rgba(29,29,31,.14);
  padding:0 10px;color:var(--sb-ink)}
.sb-quote{padding:3px 2px 0;font-size:12px;line-height:16px;color:rgba(29,29,31,.7);font-style:italic;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-row{display:flex;align-items:center;gap:8px;height:44px;min-width:0}
.sb-mapicon{display:none}
.sb-3c{flex:none;background:var(--sb-b1);color:#fff;font-weight:900;font-size:12px;letter-spacing:.02em;
  padding:2px 7px;border-radius:5px;box-shadow:2px 2px 0 #1c4b98;cursor:default;user-select:none}
.sb-cells{flex:1 1 auto;min-width:0;display:flex;gap:8px;align-items:center}

/* 一格 = 左边动词块(行蓝 + 白小图 + 白字) + 右边奶白卡面 */
.sb-cell{flex:1 1 0;min-width:0;position:relative;display:flex;align-items:stretch;height:34px;padding:0;
  background:var(--sb-paper);color:var(--sb-ink);border:1px solid rgba(29,29,31,.32);border-radius:7px;
  box-shadow:2px 2px 0 rgba(29,29,31,.55);cursor:pointer;text-align:left;font:inherit}
.sb-cell:hover:not(:disabled){background:#fff;border-color:var(--sb-ink)}
.sb-cell:focus-visible{outline:2px solid var(--sb-b1);outline-offset:2px}
.sb-verb{flex:none;display:flex;align-items:center;gap:5px;padding:0 8px;border-radius:6px 0 0 6px;
  background:var(--rb,var(--sb-b1));color:#fff;font-size:12px;font-weight:900;letter-spacing:.01em}
.sb-verb b{font-weight:900}
.sb-g{width:15px;height:15px;flex:none;color:#fff}
.sb-body{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:5px;padding:0 7px;overflow:hidden;white-space:nowrap}
.sb-lbl{min-width:0;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;font-weight:700}
.sb-thumb{flex:none;width:28px;height:28px;object-fit:contain;background:#fff;border-radius:4px;border:1px solid rgba(29,29,31,.12)}
.sb-mo{flex:none;font-size:11px;line-height:17px;padding:0 6px;border-radius:9px;border:1px solid var(--sb-b1);color:var(--sb-b1);font-weight:700}
.sb-q{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;
  border:1.5px dashed var(--sb-b1);color:var(--sb-ink);font-weight:900;font-size:13px}
/* 空格: 蓝虚线框 + 墨色「?」(palette 句子带那条) */
.sb-cell[data-state="empty"] .sb-body{margin:3px 3px 3px 4px;padding:0 5px;border:1.5px dashed var(--sb-b1);border-radius:5px}
.sb-cell[data-state="empty"] .sb-lbl{font-weight:600;color:rgba(29,29,31,.72)}
/* 部分: 动词砖右下角斜切掉一个三角, 露出素砖 */
.sb-cell[data-state="partial"] .sb-verb{background:linear-gradient(135deg,var(--rb,var(--sb-b1)) 0 70%,var(--sb-brick1) 70%)}
/* 小标签 */
.sb-tag{flex:none;display:inline-block;font-size:10.5px;line-height:16px;padding:0 6px;border-radius:8px;white-space:nowrap;
  border:1px solid rgba(29,29,31,.18);background:#fff;color:rgba(29,29,31,.8);font-weight:600}
.sb-tag.t-warn{background:var(--sb-brick0);border-color:var(--sb-brick2);color:var(--sb-ink)}
.sb-tag.t-none{background-color:var(--sb-brick0);background-image:var(--sb-hatch);border-color:var(--sb-brick2);color:var(--sb-ink)}
.sb-tag.t-designed{background:transparent;border:1px dashed var(--sb-b1);color:var(--sb-b1)}
/* 0928 巡检: Construct 格名字被结构标签挤没(扫地车只剩「S.」)。名字留最小宽度(--nch = 名字字数, 封顶 7.5em, 短名不留白);
   标签包一层 .sb-tags: 缩的时候它先缩(flex-shrink 1000), 放不下的折到第二行被裁掉, 「+N」由 sentence.fitTags 量完填 */
.sb-name{min-width:min(var(--nch,8ch),7.5em)}
.sb-tags{flex:0 1000 auto;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:5px;height:18px;overflow:hidden}
.sb-more{flex:none;font-size:10.5px;line-height:16px;padding:0 5px;border-radius:8px;white-space:nowrap;cursor:help;
  border:1px solid rgba(29,29,31,.18);background:#fff;color:rgba(29,29,31,.8);font-weight:700}
/* Cube 格: 一颗 cube 一个红方块(立体一点: 右下压暗的投影); 传感器空心; 没程序的马达带斜纹 */
.sb-sqs{flex:none;display:inline-flex;align-items:center;gap:3px}
.sb-sqs em{font-style:normal;font-size:11px;font-weight:700;color:var(--sb-red)}
.sb-sq{display:inline-block;width:11px;height:11px;border-radius:2px;background:var(--sb-red);box-shadow:1.5px 1.5px 0 #9c2a21}
.sb-sq.in{background:#fff;border:2px solid var(--sb-red)}
.sb-sq.idle{background:repeating-linear-gradient(45deg,var(--sb-red) 0 2px,#f5b9b3 2px 4px)}
.sb-sq.br{outline:1.5px dotted var(--sb-ink);outline-offset:1px}
/* 真搭装不上(只能在仿真里): 墨色虚线框 + 压淡, 与「要支架」的点线区分开 */
.sb-sq.no{outline:1.5px dashed var(--sb-ink);outline-offset:1px;opacity:.55}

/* ▶ Run: 全界面唯一的实心蓝主按钮(从仿真条挪上来, id / 绑定不变) */
.sb-run{flex:none;position:relative;display:flex;align-items:center;gap:6px;border-radius:9px;padding:2px}
#sentence #btnRun{height:32px;min-width:86px;padding:0 14px;border-radius:8px;background:var(--sb-b1);border:1px solid var(--sb-b1);
  color:#fff;font-weight:800;box-shadow:2px 2px 0 #1c4b98;white-space:nowrap}
#sentence #btnRun:hover:not(:disabled){background:#2a63c0;border-color:#2a63c0}
#sentence #btnRun:focus-visible{outline:2px solid var(--sb-ink);outline-offset:2px}
.sb-runmeta{display:flex;flex-direction:column;align-items:flex-start;gap:1px;max-width:170px;line-height:1.2}
.sb-runmeta:empty{display:none}
.sb-seen{display:inline-block;background:var(--sb-grn);color:#fff;border-radius:4px;padding:0 6px;font-size:10.5px;font-weight:800;line-height:16px}
.sb-runnote{font-size:11px;color:rgba(29,29,31,.78);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:170px}
/* 0927 评审 U1: 跑完没动的原因(warn)/ 动了但值得说一句(info)比「No motor」长 —— 允许两行, 全文在 title 和对话卡里 */
.sb-runnote[data-kind="warn"],.sb-runnote[data-kind="info"]{white-space:normal;max-width:230px;line-height:1.2;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.sb-runnote[data-kind="info"]{color:#1d4ed8}
/* 0927 评审 U0: 没马达时的「Try it ▶」—— 一次点击: 放马达 + 套说法 + 跑(隐藏规则由上面的 #sentence [hidden] 管) */
.sb-try{margin-left:6px;padding:1px 9px;font-size:11px;font-weight:800;line-height:18px;border-radius:9px;cursor:pointer;
  color:#fff;background:#2f6fd6;border:1px solid #1d4ed8;white-space:nowrap}
.sb-try:hover,.sb-try:focus-visible{background:#1d4ed8}
.sb-try:disabled{opacity:.55;cursor:default}

/* ---------- 下一步(黄 3px, 唯一) / 你在这儿(墨 3px + 小三角) ---------- */
.sb-cell.is-here,.sb-run.is-here{border-color:var(--sb-ink);box-shadow:0 0 0 2px var(--sb-ink)}
.sb-run.is-here{box-shadow:0 0 0 3px var(--sb-ink)}
.sb-cell.is-next,.sb-run.is-next{outline:3px solid var(--sb-yel);outline-offset:3px}
.sb-cell.is-here::after,.sb-run.is-here::after,.mm-cell.is-here::after{content:"";position:absolute;left:50%;top:100%;
  transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--sb-ink);margin-top:3px;pointer-events:none}

/* 格子刚被填上: 短促亮一下(≤300ms) */
@keyframes sbFill{0%{filter:brightness(1.45) saturate(1.2)}100%{filter:none}}
.sb-fill,.mm-fill{animation:sbFill .3s ease-out}
@keyframes sbFlash{0%,100%{box-shadow:2px 2px 0 #1c4b98}40%{box-shadow:0 0 0 5px rgba(47,111,214,.45)}}
#sentence #btnRun.sb-flash{animation:sbFlash .7s ease-out}

/* ---------- 九格小地图(句子带最右端; 越往下越厚; 原型行左边一枚 3C 小牌) ---------- */
.sb-map{flex:none;display:flex;align-items:center;gap:3px;padding-left:6px;border-left:1px solid rgba(29,29,31,.12)}
.mm-grid{display:grid;grid-template-columns:15px repeat(3,22px);grid-template-rows:9px 12px 15px;gap:2px}
.mm-rw{display:flex;align-items:center;justify-content:center;font-size:7.5px;font-weight:900;color:#fff;border-radius:2px;cursor:default}
.mm-rw.r1{background:var(--sb-b1)}
.mm-cell{position:relative;min-width:0;padding:0;margin:0;border:0;border-radius:2px;display:flex;align-items:center;justify-content:center;
  cursor:pointer;background:var(--sb-grayf);color:#fff;box-shadow:1px 1px 0 rgba(29,29,31,.35)}
.mm-cell:hover:not(:disabled){filter:brightness(1.08)}
.mm-g{width:9px;height:9px;flex:none}
.mm-cell.r2 .mm-g{width:11px;height:11px}
.mm-cell[data-state="filled"]{background:var(--rb)}
.mm-cell[data-state="partial"]{background:linear-gradient(135deg,var(--rb) 0 62%,var(--sb-brick1) 62%)}
.mm-cell[data-state="designed"]{background:transparent;border:1.5px dashed var(--rb);color:var(--rb);box-shadow:none}
.mm-cell[data-state="none"]{background-color:var(--sb-brick2);background-image:var(--sb-hatch);color:rgba(29,29,31,.55);cursor:not-allowed}
/* 产品行: 三个词齐 + 看过一次之前浅灰(照样能点); 之后先变浅蓝(可以去了) */
.mm-cell.is-locked[data-state="empty"]{background:#e6e8ec;color:rgba(255,255,255,.95)}
.mm-cell.is-ready[data-state="empty"]{background:#b7c8e6;background:color-mix(in srgb,var(--rb) 38%,#fff)}
.mm-cell.is-next{outline:2.5px solid var(--sb-yel);outline-offset:1px;z-index:1}
.mm-cell.is-here{outline:2.5px solid var(--sb-ink);outline-offset:1px;z-index:1}
.mm-cell.is-here::after{margin-top:2px;border-width:4px}
.mm-tog{flex:none;width:16px;height:30px;padding:0;border-radius:4px;border:1px solid rgba(29,29,31,.18);background:transparent;
  color:rgba(29,29,31,.6);font-size:10px;line-height:1}
.sb-map.folded .mm-grid{display:none}
.sb-map.folded .mm-tog{width:22px}

/* ---------- 手机抽屉(≤560 才会被打开) ---------- */
.sb-mapdrawer{position:absolute;left:0;right:0;top:100%;z-index:2;background:var(--sb-paper);border-bottom:2px solid var(--sb-ink);
  box-shadow:0 10px 24px rgba(15,23,42,.18);padding:10px 16px 14px;display:flex;flex-direction:column;gap:6px}
.md-head{display:flex;align-items:center;gap:8px;font-size:14px}
.md-head span{flex:1;min-width:0;font-size:12px;color:rgba(29,29,31,.65)}
.md-x{flex:none;min-width:44px;min-height:40px;border-radius:8px;background:transparent;border:1px solid rgba(29,29,31,.25);color:var(--sb-ink)}
.md-row{display:grid;grid-template-columns:46px repeat(3,minmax(0,1fr));gap:6px;align-items:stretch}
.md-rw{display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:900;color:rgba(29,29,31,.7)}
.md-row.r1 .md-rw{background:var(--sb-b1);color:#fff;border-radius:5px}
.md-cell{min-height:48px;min-width:0;padding:4px;border:0;border-radius:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:1px;background:var(--sb-grayf);color:#fff;font-size:14px;line-height:1.15;box-shadow:2px 2px 0 rgba(29,29,31,.4)}
.md-row.r1 .md-cell{min-height:54px}
.md-row.r2 .md-cell{min-height:60px}
.md-cell b{font-size:14px;font-weight:800}
.md-cell small{font-size:14px;opacity:.92}
.md-cell .mm-g{width:14px;height:14px}
.md-cell[data-state="filled"]{background:var(--rb)}
.md-cell[data-state="partial"]{background:linear-gradient(135deg,var(--rb) 0 70%,var(--sb-brick1) 70%)}
.md-cell[data-state="designed"]{background:transparent;border:1.5px dashed var(--rb);color:var(--rb);box-shadow:none}
.md-cell[data-state="none"]{background-color:var(--sb-brick2);background-image:var(--sb-hatch);color:var(--sb-ink)}
.md-cell[data-state="empty"]{color:rgba(29,29,31,.72)}
.md-cell.is-locked[data-state="empty"]{background:#e6e8ec}
.md-cell.is-ready[data-state="empty"]{background:#b7c8e6;background:color-mix(in srgb,var(--rb) 38%,#fff);color:var(--sb-ink)}
.md-cell.dr-here{outline:3px solid var(--sb-ink);outline-offset:1px}
.md-cell.dr-next{outline:3px solid var(--sb-yel);outline-offset:1px}
/* 句子带左端的小墙图标(手机) */
.mi-grid{display:grid;grid-template-columns:repeat(3,9px);grid-template-rows:6px 8px 10px;gap:2px}
.mi{display:block;border-radius:1.5px;background:var(--sb-grayf)}
.mi[data-state="filled"]{background:var(--rb)}
.mi[data-state="partial"]{background:linear-gradient(135deg,var(--rb) 0 62%,var(--sb-brick1) 62%)}
.mi[data-state="designed"]{background:transparent;box-shadow:inset 0 0 0 1px var(--rb)}
.mi[data-state="none"]{background:var(--sb-brick2)}
.mi.mi-next{box-shadow:0 0 0 1.5px var(--sb-yel)}

/* ---------- 样张说实话: 3D 视图左下角常驻小章(在仿真条上面) ---------- */
.simstamp{position:absolute;left:12px;bottom:56px;z-index:3;display:flex;align-items:center;gap:8px;max-width:calc(100% - 24px);
  padding:3px 9px;border-radius:6px;background:rgba(255,253,248,.93);color:var(--sb-ink);border:1.5px solid var(--sb-ink);
  box-shadow:2px 2px 0 rgba(29,29,31,.75);font-size:11px;line-height:16px;white-space:nowrap;overflow:hidden;cursor:help;
  transform:rotate(-1.2deg);transform-origin:left bottom}
.simstamp b{font-weight:800;letter-spacing:.01em}
.simstamp span{color:rgba(29,29,31,.75);overflow:hidden;text-overflow:ellipsis}

/* ---------- 产品行面板(D9): 盖在 3D 视图上, 同一个框架换内容 ---------- */
.prodpanel{position:absolute;left:8px;right:8px;top:8px;bottom:54px;z-index:34;overflow:auto;background:var(--sb-paper);color:var(--sb-ink);
  border:2px solid var(--sb-ink);border-radius:12px;box-shadow:4px 4px 0 rgba(29,29,31,.8);font-size:13px;line-height:1.45}
.pp-card{display:flex;flex-direction:column;min-height:100%}
.pp-h{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:8px;padding:8px 10px 8px 12px;background:var(--sb-paper);
  border-bottom:1px solid rgba(29,29,31,.14)}
.pp-h b{flex:1;min-width:0;font-size:14px;font-weight:800}
.pp-row{background:var(--rb,var(--sb-b2));color:#fff;font-weight:900;font-size:12px;padding:1px 8px;border-radius:5px;box-shadow:2px 2px 0 #183d78}
.pp-x{flex:none;min-width:34px;height:30px;padding:0;border-radius:8px;background:transparent;border:1px solid rgba(29,29,31,.25);color:var(--sb-ink)}
.pp-x:hover:not(:disabled){background:rgba(29,29,31,.06)}
.pp-lock{margin:8px 12px 0;padding:7px 10px;border-radius:7px;background:#eceef2;border-left:3px solid rgba(29,29,31,.55);font-size:12.5px}
.pp-body{display:grid;grid-template-columns:minmax(150px,210px) minmax(0,1fr);gap:12px;padding:10px 12px 14px}
.pp-proto{align-self:start;display:flex;flex-direction:column;gap:6px;padding:8px;border-radius:9px;background:#fff;
  border:1.5px solid rgba(29,29,31,.3);box-shadow:2px 2px 0 rgba(29,29,31,.4)}
.pp-cap{font-size:12px;font-weight:800;display:flex;flex-direction:column}
.pp-cap small{font-weight:500;color:rgba(29,29,31,.6);font-size:11px}
.pp-prow{display:flex;flex-direction:column;gap:3px;padding-top:6px;border-top:1px dashed rgba(29,29,31,.15)}
.pp-prow .sb-verb{align-self:flex-start;border-radius:5px;padding:2px 7px}
.pp-prow[data-state="empty"] .sb-verb{background:var(--sb-grayf)}
.pp-prow[data-state="partial"] .sb-verb{background:linear-gradient(135deg,var(--sb-b1) 0 70%,var(--sb-brick1) 70%)}
.pp-pbody{display:flex;flex-direction:column;gap:3px;min-width:0}
.pp-pl{font-size:12.5px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pp-ptags{display:flex;flex-wrap:wrap;gap:3px}
.pp-layers{display:flex;flex-direction:column;gap:10px;min-width:0}
.pp-layer{padding:8px 10px 10px;border-radius:9px;border:1.5px solid rgba(29,29,31,.2);background:#fff}
.pp-layer.is-here{border:2.5px solid var(--sb-ink)}
.pp-layer h4{display:flex;align-items:center;gap:7px;font-size:14px;font-weight:800;margin:0 0 5px}
.pp-layer h4 small{font-weight:500;font-size:11.5px;color:rgba(29,29,31,.6)}
.pp-lg{display:inline-flex;align-items:center;justify-content:center;width:24px;height:22px;border-radius:5px;background:var(--rb,var(--sb-b2));color:#fff}
.pp-lg .sb-g{width:14px;height:14px}
.pp-layer p{margin:3px 0}
.pp-mut{color:rgba(29,29,31,.62);font-size:12px}
.pp-need b,.pp-bom b{font-size:14px}
.pp-acts{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:6px 0}
.pp-btn1{background:var(--sb-b1);border:1px solid var(--sb-b1);color:#fff;font-weight:800;border-radius:8px;padding:5px 13px;box-shadow:2px 2px 0 #1c4b98}
.pp-btn1:hover:not(:disabled){background:#2a63c0}
.pp-btn2{display:inline-block;background:var(--sb-paper);border:1.5px solid var(--sb-ink);color:var(--sb-ink);font-weight:700;border-radius:8px;
  padding:4px 12px;box-shadow:2px 2px 0 var(--sb-ink);text-decoration:none;font-size:13px;cursor:pointer}
.pp-btn2:hover:not(:disabled){background:#fff}
.pp-csv{color:var(--sb-b1);font-weight:700}
.pp-brick{margin:6px 0;padding:5px 10px;border-radius:6px;font-size:12px;font-weight:600;color:var(--sb-ink);cursor:not-allowed;
  background-color:var(--sb-brick1);background-image:var(--sb-hatch);border:1px solid var(--sb-brick2)}
.pp-brick.hatch{background-color:var(--sb-brick0)}
.pp-brick.info{background:#f1f2f4;background-image:none;border-color:rgba(29,29,31,.12);cursor:default}

/* ---------- 手机 / 窄屏 ---------- */
@media (max-width:1100px){
  .mm-grid{grid-template-columns:13px repeat(3,19px)}
  .sb-cell .sb-tag{display:none}
  .sb-cell .sb-tag.t-warn{display:inline-block}
  .sb-cell .sb-more{display:none}
}
@media (max-width:900px){
  /* 堆叠版面时 body 是滚动容器: 句子带吸顶 */
  /* Blockly 工具箱自带 z-index 70: 带子要在它之上(否则往下滚时工具箱盖住句子带, fe2 在 390 宽截到过);
     顶栏的下拉菜单又要盖过带子, 所以顶栏跟着抬到 90。toast(99)和 Blockly 的下拉(99999)仍在最上。 */
  #sentence{position:sticky;top:0;z-index:80}
  .nav{z-index:90}
  .pp-body{grid-template-columns:1fr}
  .prodpanel{bottom:8px}
}
@media (max-width:560px){
  .sbar{padding:0 8px}
  .sb-row{gap:6px;height:auto;min-height:48px;padding:4px 0}
  .sb-mapicon{display:inline-flex;align-items:center;justify-content:center;flex:none;width:44px;height:40px;padding:0;border-radius:7px;
    background:var(--sb-paper);border:1.5px solid var(--sb-ink);box-shadow:2px 2px 0 rgba(29,29,31,.6)}
  .sb-map,.sb-3c{display:none}
  .sb-cells{overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;padding:5px 3px 7px;gap:7px;
    scrollbar-width:none}
  .sb-cells::-webkit-scrollbar{display:none}
  .sb-cell{flex:0 0 auto;width:min(62vw,230px);scroll-snap-align:start;height:36px}
  .sb-name{min-width:min(var(--nch,8ch),5em)}
  .sb-cell.is-here::after{display:none}
  .sb-run{flex-direction:column;align-items:stretch;gap:2px}
  #sentence #btnRun{min-width:70px;padding:0 10px}
  .sb-runmeta{max-width:78px}
  .sb-runnote{font-size:10.5px;max-width:78px;white-space:normal;line-height:1.15}
  .sb-run.is-here::after{display:none}
  /* ★ 390 宽 0 横滚: 基线就溢出(body.scrollWidth 462, 顶栏状态字 + 仿真条), 顺手收掉 */
  .nav{gap:6px;padding:0 8px}
  .navlinks{margin-left:0}
  .navstat{gap:6px;min-width:0}
  .navstat #stModel,.navstat #stQuality,.navstat #stTier{display:none}
  .simbar{flex-wrap:wrap;gap:6px;row-gap:4px;padding:6px 8px}
  .simstamp{bottom:92px;font-size:10.5px}
  .simstamp span{display:none}
}

/* ---------- 桌面: 三栏的高度要扣掉句子带(★ 只能写在这个 media 里, 见文件头) ---------- */
@media (min-width:901px){
  .main{height:calc(100vh - var(--nav-h) - var(--band-h,44px) - var(--status-h))}
}

@media (prefers-reduced-motion: reduce){
  .sb-fill,.mm-fill,#sentence #btnRun.sb-flash{animation:none!important}
}

/* 0927 真人模拟录屏(T3): 换模型时 3D 还是旧模型好几秒 —— 盖一层「Loading 名字…」, 压暗旧模型, 载完即撤(app.js watchLoadVeil) */
.loadveil{position:absolute;inset:0;z-index:6;display:flex;align-items:center;justify-content:center;pointer-events:none;
  background:rgba(15,23,42,.55)}
.loadveil span{padding:8px 16px;border-radius:10px;background:rgba(29,29,31,.85);color:#fff;font-size:14px;font-weight:800}
.loadveil[hidden]{display:none!important}

/* ═══════════════ 0929 真人模拟录屏(机械臂 + 灯 / 屏 / 蜂鸣器)的几处回执 ═══════════════ */
/* ① 输出面板: 桌面照旧整块(3c.css .outbox); 窄屏收成一行小片, 点一下展开(app.js renderOutputs 切 .open)。
      放到左上(圆钮 ⓘ 下面): 原来在左下, 手机上盖住半个 3D、压着 Reset / 速度滑块, 右边的「Brick ↔ Pro」又压着它的字。 */
.outbox .ob-chip{display:none}
.outbox .ob-body{display:block}
.outbox .ob-chip .sw{display:inline-block;width:10px;height:10px;border-radius:3px;margin:0 2px;vertical-align:-1px;border:1px solid rgba(0,0,0,.2)}
@media (max-width:760px){
  .panel.cad .outbox{top:48px;bottom:auto;left:12px;right:auto;max-width:calc(100% - 24px);padding:0;border-radius:15px;overflow:hidden}
  .outbox .ob-chip{display:flex;align-items:center;gap:6px;width:100%;min-height:30px;padding:0 11px;margin:0;border:0;background:transparent;
    color:inherit;font:inherit;font-size:12px;line-height:1.2;cursor:pointer;text-align:left}
  .outbox .ob-chip b{flex:none;font-weight:700}
  .outbox .ob-chip .ob-sum{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted,#6b7280)}
  .outbox .ob-chip .ob-arr{flex:none;color:var(--muted,#6b7280);font-size:11px}
  .outbox:not(.open) .ob-body{display:none}
  .panel.cad .outbox.open{border-radius:10px}
  .outbox.open .ob-body{padding:2px 11px 8px;max-height:38vh;overflow:auto}
}

/* ② 3D 里输出 cube 旁边的小标签(viewer3d placeOutBadges 每帧定位): 屏 = 气泡里的字 / 蜂鸣器 = ♪ / 灯 = 小圆点。
      安静: 白底深字、细边、不用警告色; 只在跑的时候有(停下 / 复位就收)。 */
.mk-outbadges{position:absolute;inset:0;pointer-events:none;z-index:3;overflow:hidden}
.mk-ob{position:absolute;transform:translate(-50%,calc(-100% - 6px));display:inline-flex;align-items:center;gap:5px;max-width:200px;
  padding:3px 9px;border-radius:10px;background:rgba(255,255,255,.94);color:#1f2937;border:1px solid rgba(15,23,42,.14);
  box-shadow:0 2px 8px rgba(15,23,42,.14);font:600 12px/1.35 system-ui,-apple-system,"Segoe UI",sans-serif;white-space:nowrap}
.mk-ob span{min-width:0;overflow:hidden;text-overflow:ellipsis}
.mk-ob.screen{border-bottom-left-radius:3px;font-family:ui-monospace,Consolas,monospace;font-weight:500}
.mk-ob.sound{color:#475569;font-size:13px}
.mk-ob.led i{display:inline-block;width:10px;height:10px;border-radius:50%;flex:none;box-shadow:0 0 0 2px #fff,0 0 0 3px rgba(15,23,42,.15)}

/* ③ 拖动标签(shelf.js 画 .mk-ghost; app.js 按 viewer 的预览挂 data-fit): 边框颜色跟着字走 ——
      只有「直接装得上」是绿; 要支架 / 真搭装不上 = 琥珀; 还没判出来 = 中性灰(不再一律绿)。 */
.mk-ghost.ok[data-fit="direct"]{border-color:#22c55e}
.mk-ghost.ok[data-fit="relocated"],.mk-ghost.ok[data-fit="bad"]{border-color:#f59e0b;box-shadow:0 0 0 1px rgba(245,158,11,.35),0 6px 22px rgba(0,0,0,.55)}
.mk-ghost.ok:not([data-fit]){border-color:rgba(148,163,184,.6);box-shadow:0 6px 22px rgba(0,0,0,.55)}

/* ④ 对话卡里的装配旁注: 默认折起来(<details class="asm">), 装不上 = 安静的灰 / 琥珀, 红字只留给真失败 */
.coach .chd i.nf{background:rgba(148,163,184,.16);color:#64748b}
.coach ul.mts li.nf .t{color:#8a6a2f}
.coach details.asm{margin:5px 0 0;font-size:11px;color:var(--muted,#6b7280)}
.coach details.asm>summary{cursor:pointer;color:var(--muted,#6b7280)}
.coach details.asm>summary:hover{color:var(--text,#1f2937)}
.coach details.asm p{margin:4px 0 0;color:var(--muted,#6b7280);font-size:11px;line-height:1.45}
.coach details.asm ul.mts{margin-top:5px}
