/* ════════════════════════════════════════════════════════════════════
   Workbench mode (2026-07-02) — spec §4/§5/§6/§7
   ────────────────────────────────────────────────────────────────────
   State carrier = body[data-workbench="true"]. This partial owns the
   three parallel motions (library slide-out, viewport shrink, panel
   slide-in), the true-masonry card grid, persistent Inspector rail, and
   explicit single-card Focus.
   Durations reuse the existing motion tokens (--dur-panel / --ease-out,
   00-tokens-base.css) — no new duration constants (CLAUDE.md §10.2).
   ════════════════════════════════════════════════════════════════════ */

:root {
  --workbench-w: 50vw;   /* left/right 5:5: canvas 50% / measurement panel 50% */
}
@media (max-width: 1200px) { :root { --workbench-w: 50vw; } }
@media (max-width: 860px)  { :root { --workbench-w: 100vw; } }  /* canvas fully behind */

/* Panel fullscreen (2026-08-06, user) — half ⇄ full is ONE variable.
   面板全屏只改 --workbench-w（50vw → 100vw）：面板本体、左缘把手、Add 钮、action dock
   全部从这一个真相源现读，不另立第二个宽度常量（§10.2）。状态位 =
   body[data-workbench-full="true"]，由 ui/workbench-mode.js 持有（工作台的**子态**：
   退出工作台即落回半屏，记忆保留在 localStorage 'pn.workbench.full'）。 */
body[data-workbench-full="true"] { --workbench-w: 100vw; }

/* Panel container: always present, off-screen until workbench is on.
   液态玻璃（DESIGN.md §6.4，同 .panel-floating 配方，反馈③）：float-bg 玻璃体 +
   backdrop blur/saturate + 高光边(--float-edge) + 三层投影(--float-shadow) + 玻璃噪点
   (24-glass-noise.css 名单已加 #workbench-panel) + 玻璃边(--glass-border)。 */
#workbench-panel {
  position: fixed;
  top: var(--topbar-h);
  right: 0;
  bottom: 0;
  width: var(--workbench-w);
  z-index: 12;                 /* above library(10)/dock(11), below floating panels(1000) */
  display: flex;
  flex-direction: column;
  background-color: var(--float-bg);
  background-image: var(--glass-noise);   /* 2% 单色噪点（用 -color/-image 分写，避免 background 简写清掉噪点） */
  backdrop-filter: blur(var(--float-blur)) saturate(var(--float-sat));
  -webkit-backdrop-filter: blur(var(--float-blur)) saturate(var(--float-sat));
  border-left: 1px solid var(--glass-border);
  box-shadow: var(--float-shadow), var(--float-edge);
  transform: translateX(100%);
  /* width 也过渡 —— 半屏 ⇄ 全屏是同一套滑移语言（进出工作台走 transform，改宽走 width）。 */
  transition: transform var(--dur-panel) var(--ease-out), width var(--dur-panel) var(--ease-out);
  overflow: hidden;
}
body[data-workbench="true"] #workbench-panel { transform: none; }

/* Workbench is a stable two-surface workspace: live readouts never disappear
   when an instrument is selected; the complete Inspector occupies its own rail. */
.wb-workspace {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
}
.wb-dashboard {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  min-height: 0;
  display: flex;
  overflow: hidden;
}
.wb-inspector-rail {
  flex: 0 0 clamp(320px, 40%, 400px);
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  background: var(--surface-1);
  border-left: 1px solid var(--line-1);
}
.wb-inspector-rail[hidden] { display: none; }
.wb-inspector-rail-head {
  flex: none;
  min-height: 42px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 10px 0 12px;
  border-bottom: 1px solid var(--line-1);
  color: var(--ink-2);
  font: 600 11px var(--font-mono);
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.wb-inspector-close {
  width: 32px;
  height: 32px;
  margin-left: auto;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 4px;
  background: transparent;
  color: var(--ink-2);
  font: 16px/1 var(--font-ui);
  cursor: pointer;
}
.wb-inspector-close:hover { background: var(--hover-bg); border-color: var(--hover-border); color: var(--ink-1); }
.wb-inspector-close:focus-visible { outline: none; border-color: var(--sig-select); box-shadow: 0 0 0 2px var(--sig-select); }
.wb-inspector-rail-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; }

/* Library slides out (kept in DOM so it slides back on exit). */
#library { transition: transform var(--dur-panel) var(--ease-out); }
body[data-workbench="true"] #library { transform: translateX(-100%); pointer-events: none; }
body[data-workbench="true"] #res-l,
body[data-workbench="true"] .dock-edge-toggle { display: none; }
body[data-workbench="true"] .action-dock {
  left: calc((100% - var(--workbench-w)) / 2);
}

/* Canvas stays FULL-BLEED behind the panel (2026-07-06, user: “不够液态玻璃”).
   The old approach shrank #viewport's right edge, so behind the glass panel sat
   only the flat page bg → the backdrop-filter had nothing to blur and the panel
   read as a solid slab, not glass. Now the 3D scene renders behind the panel
   (like the topbar / dock over the full-bleed canvas, DESIGN.md §6.4) → the
   blur/saturate acts on the live scene = real liquid glass. To keep the bench
   fully visible in the unoccluded left band, scene.js reframes the perspective
   camera with a RIGHT view-offset equal to the panel width (same UX-5
   dock-avoidance machinery, just mirrored to the right edge). */

/* ── "+ Add readout" button — floats at the panel's OUTER top-left corner ────
   (user 2026-07-06: 面板只留瀑布流；折叠头删掉；Add 钮移出面板、贴外缘左上。)
   right edge flush with the panel's left edge → the pill sits just OUTSIDE the
   panel over the canvas. High transparency at rest → solid glass on hover (same
   language as the topbar collapse handle). Shown only in workbench mode with
   ≥1 hidden readout (CSS gate below + the `hidden` attr set in render()). */
/* ── 面板外缘家具的**共用**表面语言（Add 钮 + 全屏把手，2026-08-06 UI 复核）──────
   两颗钮同挂面板左缘、同一条轨，此前一个是灰座(--ctl-rest)一个是透明边，静止形态各说
   各话。统一到画布浮层的**房规**：同 .help-fab 的玻璃座 +「淡 → hover 亮」
   （ui/shortcuts-panel.css）。为什么是玻璃而不是 DESIGN §3.3 的 --ctl-rest 灰座：这两颗浮在
   **实时 3D 台面**上，背景明暗不可预期，灰座在亮面包板上糊成一块脏影、纯 1px 边又整条
   消失；玻璃底 + 边 + 高光边三重线索两种背景都立得住，且满足 §8.0 ①静止可辨(U10)
   ③对比分级(U11)。静止档 .42 与 .help-fab 对齐 —— 用户要的「半隐藏」由**空间**（半嵌
   面板边）+ 这一档透明度共同表达，不靠把控件做到看不见。 */
.wb-add-btn,
.wb-full-btn {
  position: fixed;
  z-index: 13;                          /* just above the panel (12) */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: var(--float-bg);
  backdrop-filter: blur(var(--float-blur)) saturate(var(--float-sat));
  -webkit-backdrop-filter: blur(var(--float-blur)) saturate(var(--float-sat));
  border: 1px solid var(--line-1);
  box-shadow: var(--float-edge);
  color: var(--ink-2);
  opacity: .42;
  cursor: pointer;
  transition:
    opacity 140ms ease,
    color 140ms ease,
    border-color 140ms ease,
    box-shadow 140ms ease,
    transform 120ms var(--ease-out),
    right var(--dur-panel) var(--ease-out);
}
/* 命中区扩到 ≥32×32（§8.0 ④ 触控 ≥32×32）而**视觉不变**：伪元素撑开，绝对定位不入流、
   不推布局、不动相邻（细条钮本体只有 20–22px 宽，够不着这条线）。 */
.wb-add-btn::after,
.wb-full-btn::after { content: ""; position: absolute; inset: -6px; }
.wb-add-btn:hover,
.wb-full-btn:hover {
  opacity: 1;
  color: var(--ink-1);
  border-color: var(--glass-border);
  box-shadow: var(--float-shadow), var(--float-edge);
}
/* 五态覆盖（§8.0 ②）：pressed 单独一档，不与 hover 同形 —— 按下压一档 + 收一点。 */
.wb-add-btn:active,
.wb-full-btn:active { opacity: 1; box-shadow: var(--float-edge); }
/* 焦点环改用语义选中色 —— 原先的 --overlay-2 是 10% 黑，在玻璃上几乎看不见，
   等于键盘用户没有焦点提示（§1 focus-states / 同卡头 .wb-tl 的处理）。 */
.wb-add-btn:focus-visible,
.wb-full-btn:focus-visible {
  outline: none;
  opacity: 1;
  border-color: var(--sig-select);
  box-shadow: 0 0 0 2px var(--sig-select);
}

.wb-add-btn {
  top: calc(var(--topbar-h) + 12px);
  right: var(--workbench-w);            /* right edge = panel's left edge; opens leftward */
  /* Small "+" tab (user 2026-07-06)：单个加号，贴面板外缘的小方条。 */
  width: 20px;
  height: 24px;
  border-radius: 6px 0 0 6px;           /* rounded on the outer (left) side */
  font-family: var(--font-ui);
  font-size: 16px;
  font-weight: 500;
  line-height: 1;
  white-space: nowrap;
}
.wb-add-btn:active { transform: scale(.94); }
.wb-add-btn[hidden] { display: none; }
body:not([data-workbench="true"]) .wb-add-btn { display: none; }   /* never outside workbench */
/* 全屏时 right:var(--workbench-w)=100vw 会把钮整颗推出屏外 → 右缘再退一个身位（钮宽
   20px），贴在面板**内**侧左缘，仍是「面板左上角」。抽屉的展开方向由 JS 按可用空间选边
   （workbench-panel.js openDrawer），不在这里写死。 */
body[data-workbench-full="true"] .wb-add-btn {
  right: calc(var(--workbench-w) - 20px);
  border-radius: 0 6px 6px 0;
}

/* ── Fullscreen handle — 面板左竖边正中的半隐藏把手（2026-08-06, user）─────────
   半屏态：钮宽 22px、右缘落在面板左缘内 11px → 一半嵌进面板、一半探出画布 =「半隐藏」
   （表面语言与静止/hover/pressed/focus 四态见上面的共用块）。
   全屏态：--workbench-w=100vw，右缘再退整个身位（-22px）→ 整颗贴屏幕最左、落在面板内，
   位置仍是「左竖边中间」，图标翻成「收回半屏」。两态都只改 right，宽度变量一变即随面板
   一起过渡，不做位移/锚点切换。 */
.wb-full-btn {
  top: 50%;
  right: calc(var(--workbench-w) - 11px);
  transform: translateY(-50%);
  width: 22px;
  height: 56px;
  border-radius: 8px 0 0 8px;           /* rounded on the outer (canvas) side */
}
/* pressed 保留居中位移（translateY 是定位不是动效，丢了钮会往下跳半个身位）。 */
.wb-full-btn:active { transform: translateY(-50%) scale(.94); }
.wb-full-btn svg { width: 12px; height: 12px; }
body[data-workbench-full="true"] .wb-full-btn {
  right: calc(var(--workbench-w) - 22px);
  border-radius: 0 8px 8px 0;           /* 贴屏幕左缘 → 圆角翻到内侧 */
}
/* 只显一个图标（同卡片全屏钮的写法：类选择器对类选择器，别让 `.wb-full-btn svg` 抢赢）。 */
.wb-full-ic-collapse { display: none; }
body[data-workbench-full="true"] .wb-full-ic-expand { display: none; }
body[data-workbench-full="true"] .wb-full-ic-collapse { display: block; }
body:not([data-workbench="true"]) .wb-full-btn { display: none; }   /* never outside workbench */
/* ≤860px 面板本来就是 100vw → 全屏无事可做，把手不摆死控件。 */
@media (max-width: 860px) { .wb-full-btn { display: none; } }

/* 面板全屏 = 画布整块被盖住 → 画布侧的浮层留着只会隔着玻璃糊成一团（dock 还会被
   left:calc((100% − 100vw)/2)=0 推到屏幕左缘）。全屏期间整层收起，收回半屏即恢复。 */
body[data-workbench-full="true"] .action-dock { display: none; }

/* 减动效：半屏 ⇄ 全屏与两颗边缘钮直接落位，不做补间；pressed 只留视觉不做缩放
   （translateY 是**定位**必须留着，去掉钮会掉下去半个身位）。 */
@media (prefers-reduced-motion: reduce) {
  #workbench-panel,
  .wb-add-btn,
  .wb-full-btn { transition: none; }
  .wb-add-btn:active { transform: none; }
  .wb-full-btn:active { transform: translateY(-50%); }
}

/* ── Masonry (true waterfall: independent flex columns, staggered full height) ──
   反馈（第三轮）①：左右列互不依赖、按内容**错位**；卡片默认显示**完整高度**。用 JS 分列的
   flex 多列（workbench-panel.js columnCount/ensureColumns，index%N 稳定分配）——CSS grid 把
   同行左右卡耦合成等高（高卡溢出遮挡，上一轮的坑）。Focus 卡由 JS 临时挂到
   `.wb-dashboard` 直属层，退出后再按 index%N 放回列中，避免滚动容器改变绝对定位参照。 */
.wb-masonry {
  flex: 1 1 auto; overflow-y: auto; overflow-x: hidden;
  padding: 12px;
  display: flex;
  align-items: flex-start;    /* 列顶对齐，各列独立向下生长 */
  gap: 12px;
}
.wb-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 12px; }
.wb-card {
  min-width: 0;
  margin: 0;
  background: var(--surface-1);
  border: 1px solid var(--line-1);
  border-radius: 8px;
  /* 默认高度=内容（完整显示，反馈①）；可手动拖高（resize:vertical → 手柄右下角、只改高度），
     内容超出出滚动条（overflow:auto）。min-height 让拖到最矮时也至少留「分界线以上（卡头）+
     底部圆角」一截（≈ 卡头 30px + 圆角余量 14px）。max-height:max-content = 拖到内容全显后
     不再继续拉高（反馈：没内容可显时限制扩展）。 */
  overflow: auto;
  resize: vertical;
  min-height: 44px;
  max-height: max-content;
}
.wb-card.is-selected { outline: 2px solid var(--sig-select); outline-offset: -1px; }
/* 反馈②：卡片分界线以上（名字 + 按钮）始终可见——卡头 sticky 钉在卡片滚动视口顶部，
   拖矮/滚动都不会滚掉；实色背景遮住下方滚过来的读数。 */
.wb-card-head {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; gap: 8px;
  padding: 7px 10px;
  background: var(--surface-1);
  border-bottom: 1px solid var(--line-1);   /* 分界线 */
}
/* 隐藏 / Focus 按钮在卡头左侧，器件名右侧。 */
.wb-card-actions { display: flex; gap: 7px; flex: none; align-items: center; }
.wb-card-name {
  margin-left: auto; text-align: right;
  font-size: 12px; font-weight: 600; color: var(--ink-1); min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.wb-card-sub { font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); flex: none; }
/* 左上角两颗钮统一黑白、方形圆角；Focus 沿用四角扩展图标（SVG）。
   黑白 = 主题自适应 --surface-3 底 + --ink-1 前景（浅色近黑 / 深色近白），字形常显。 */
.wb-tl {
  width: 17px; height: 17px; flex: none; padding: 0;
  border-radius: 4px; cursor: pointer;
  border: 1px solid var(--line-1);
  background: var(--surface-3); color: var(--ink-1);
  display: inline-flex; align-items: center; justify-content: center;
  transition: background-color 120ms ease, border-color 120ms ease;
}
.wb-tl:hover { background: var(--hover-bg); border-color: var(--hover-border); }
.wb-tl:focus-visible { outline: none; border-color: var(--sig-select); box-shadow: 0 0 0 2px var(--sig-select); }
.wb-tl-close::before { content: "\00d7"; font-size: 13px; line-height: 1; }   /* × */
/* 卡片 Focus 钮（「这张读数卡占满看板」= enterCardFocus）。2026-08-21 前类名带 fs /
   文案叫 "Fullscreen"，与顶栏新增的浏览器全屏钮(#fs-toggle-btn)同名且同屏出现 ——
   已改名 focus 到底，两者不再撞词。 */
.wb-tl-focus svg { width: 11px; height: 11px; }               /* 方形图标（尺寸；显隐见下） */
/* 只显一个图标：未 Focus 显展开、Focus 显收拢。 */
.wb-focus-ic-enter { display: block; }
.wb-focus-ic-exit { display: none; }
.wb-card.is-focused .wb-focus-ic-enter { display: none; }
.wb-card.is-focused .wb-focus-ic-exit { display: block; }
.wb-card-body { padding: 10px 12px 12px; }

/* Camera readout display controls: Workbench-only, per camera instance. */
.wb-card-body .cam-view-controls {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
  margin: 0 0 8px;
}
/* 反馈：未展开（masonry）相机卡窄，Palette / Zoom 竖排两行——每行 label 左、控件右，
   不再挤在一行留大空档或换行错位。Focus（.is-focused，宽）仍走上面的单行 space-between。 */
.wb-card:not(.is-focused) .wb-card-body .cam-view-controls { flex-direction: column; align-items: stretch; gap: 6px; }
.wb-card:not(.is-focused) .wb-card-body .cam-view-field { justify-content: space-between; width: 100%; }
.wb-card-body .cam-view-field {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  font-size: 10px;
  color: var(--ink-3);
}
.wb-card-body .cam-view-field span {
  flex: none;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.wb-card-body .cam-palette-select {
  min-width: 0;
  max-width: 112px;
  height: 24px;
  padding: 0 22px 0 7px;
  border: 1px solid var(--line-1);
  border-radius: 4px;
  background: var(--surface-1);
  color: var(--ink-1);
  font: 11px var(--font-ui);
}
.wb-card-body .cam-zoom-controls {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  flex: none;
}
.wb-card-body .cam-view-btn {
  width: 24px;
  height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 4px;
  background: transparent;
  color: var(--ink-2);
  font: 500 11px var(--font-mono);
  line-height: 1;
  cursor: pointer;
}
.wb-card-body .cam-zoom-select {
  width: 52px;
  height: 24px;
  padding: 0 18px 0 7px;
  border: 1px solid var(--line-1);
  border-radius: 4px;
  background: var(--surface-1);
  color: var(--ink-1);
  font: 11px var(--font-mono);
  line-height: 1;
}
.wb-card-body .cam-view-btn:hover:not(:disabled) {
  background: var(--hover-bg);
  border-color: var(--hover-border);
  color: var(--ink-1);
}
.wb-card-body .cam-view-btn:disabled {
  opacity: 0.35;
  cursor: default;
}

/* ── Explicit Focus fills only the Dashboard; Inspector remains visible ── */
.wb-card.is-focused {
  position: absolute; inset: 0;
  z-index: 5; margin: 0; border-radius: 0; display: flex; flex-direction: column; overflow: hidden;
  resize: none; max-height: none;
}
body.wb-has-focus .wb-dashboard .wb-card:not(.is-focused) { visibility: hidden; }
.wb-card.is-focused .wb-card-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; }

/* Fold away the PM readout's Path row in workbench (反馈⑤). */
.wb-card-body .m-row-path { display: none; }

/* Empty state (no detectors on the bench). */
.wb-empty {
  flex: 1 1 auto; display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 32px; color: var(--ink-3); font-size: 12px; line-height: 1.6;
}

/* ── Hidden-readout drawer (fixed popover under the floating Add button) ── */
.wb-drawer {
  position: fixed; z-index: 14;                 /* JS sets top/right, anchored to .wb-add-btn */
  min-width: 200px; max-width: 320px;
  background: var(--surface-1); border: 1px solid var(--line-1); border-radius: 8px;
  box-shadow: var(--float-shadow); padding: 6px; display: flex; flex-direction: column; gap: 2px;
  animation: menu-pop var(--dur-enter) var(--ease-out);
}
.wb-drawer-item {
  display: flex; align-items: center; gap: 8px; justify-content: space-between;
  font: inherit; font-size: 12px; color: var(--ink-1); text-align: left;
  background: transparent; border: 1px solid transparent; border-radius: 4px;
  padding: 6px 8px; cursor: pointer;
}
.wb-drawer-item:hover { background: var(--hover-bg); border-color: var(--hover-border); }

/* Focus enter transition. */
.wb-card.is-focused { animation: wb-focus-in var(--dur-panel) var(--ease-out); }
@keyframes wb-focus-in { from { opacity: 0.4; } to { opacity: 1; } }

/* ── Workbench Inspector: identity/status → complete controls → details ── */
.wb-inspector-shell {
  min-height: 100%;
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 10px;
}
.wb-inspector-overview,
.wb-inspector-controls,
.wb-inspector-details {
  background: var(--surface-2);
  border: 1px solid var(--line-1);
  border-radius: 6px;
}
.wb-inspector-overview { padding: 10px; }
.wb-inspector-controls { padding: 0; background: transparent; border: 0; border-radius: 0; }
.wb-inspector-details > summary {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.wb-inspector-details > summary {
  min-height: 32px;
  display: flex;
  align-items: center;
  padding: 0 10px;
  cursor: pointer;
  list-style: none;
}
.wb-inspector-details > summary::-webkit-details-marker { display: none; }
.wb-inspector-details > summary::after {
  content: '›';
  margin-left: auto;
  font-size: 16px;
  font-weight: 400;
  letter-spacing: 0;
  transform: rotate(90deg);
  transition: transform var(--dur-panel) var(--ease-out);
}
.wb-inspector-details[open] > summary::after { transform: rotate(-90deg); }
.wb-inspector-details > [data-wb-inspector-host="details"] {
  padding: 0 10px 10px;
  border-top: 1px solid var(--line-1);
}

/* The identity renderer remains the single Inspector renderer. */
.wb-inspector-overview #ins-identity-card { margin: 0; padding: 0; background: transparent; border: 0; }
.wb-inspector-overview #ins-load-summary { margin: 6px 0 0; }
.wb-inspector-overview #ins-warnings-section { margin: 8px 0 0; }
.wb-inspector-status-ok {
  display: none;
  align-items: center;
  gap: 6px;
  margin-top: 8px;
  color: var(--ink-2);
  font-size: 12px;
}
.wb-inspector-status-ok > span {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--sig-ok);
}
.wb-inspector-overview:has(#ins-load-summary:empty):has(#ins-warnings-section[hidden]) .wb-inspector-status-ok { display: flex; }

.wb-inspector-controls #ins-controls-section { margin: 0; background: var(--surface-2); border-radius: 6px; }
.wb-inspector-controls #ins-pose-mount,
.wb-inspector-controls #ins-aoi-mount,
.wb-inspector-controls #ins-mount-section,
.wb-inspector-controls #ins-showdata-btn,
.wb-inspector-controls #ins-beam-y { max-width: none; }
.wb-inspector-controls .ins-section-eyebrow,
.wb-inspector-controls .ins-section-title {
  font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-3);  /* §4.7 R1/R3 */
}

.wb-inspector-details #ins-optical-height-section,
.wb-inspector-details #ins-specs-section,
.wb-inspector-details #ins-model-section { margin: 8px 0 0; }

@media (max-width: 720px) {
  .wb-workspace { flex-direction: column; }
  .wb-dashboard { flex: 0 0 45%; }
  .wb-inspector-rail {
    flex: 1 1 55%;
    width: 100%;
    border-left: 0;
    border-top: 1px solid var(--line-1);
  }
}

/* PM readout: flatten the nested `.measurement` card frame inside wb-card-body
   (only the power meter reuses the framed component; frog/camera/spectrum render flat). */
.wb-card-body .measurement { margin: 0; padding: 0; background: none; border: none; border-radius: 0; }

/* Scene-level pump/probe delay readout. */
.ppd-card { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.ppd-kicker {
  font-size: 10px; line-height: 1.2; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-3);
}
.ppd-value {
  font-family: var(--font-mono); font-size: 22px; line-height: 1.05;
  font-variant-numeric: tabular-nums; color: var(--ink-1);
}
.ppd-status { font-size: 12px; color: var(--ink-2); }
.ppd-rows { display: flex; flex-direction: column; gap: 2px; padding-top: 2px; }
.ppd-row {
  display: flex; justify-content: space-between; gap: 10px;
  font-size: 11px; line-height: 1.35; color: var(--ink-3);
}
.ppd-row b {
  min-width: 0; text-align: right; font-family: var(--font-mono); font-weight: 500;
  color: var(--ink-1); overflow-wrap: anywhere;
}
.ppd-card.is-unresolved .ppd-value { color: var(--ink-3); font-size: 16px; }

/* TA typical-result preview (timing chain complete + |delay| within threshold;
   pump-probe-delay-card taPreviewState). Illustrative image, not simulated. */
.ppd-ta-preview { margin: 4px 0 0; display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ppd-ta-preview img {
  display: block; width: 100%; height: auto;
  border-radius: 6px; border: 1px solid var(--line-1);
}
.ppd-ta-preview figcaption { font-size: 11px; color: var(--ink-3); }
.ppd-ta-dev { font-size: 10px; color: var(--ink-3); opacity: .75; font-family: var(--font-mono); }

/* Floating Inspector stays hidden in Workbench; its canonical sections are
   relocated into the persistent Inspector rail by workbench-panel.js. */
body[data-workbench="true"] #panel-inspector { display: none !important; }

/* 反馈#2：工作台模式下这些画布浮层不该压在测量面板上（面板是液态玻璃、会透出）——
   浏览器式画布标签条、3D 比例尺、CAD 件号气泡在工作台态隐藏，退出即恢复。!important 是为
   了压过 scale-bar.js 每帧写的 inline `display`（否则内联样式赢）。修图层逻辑，非只调 z-index。*/
body[data-workbench="true"] #canvas-tabs,
body[data-workbench="true"] .scalebar,
body[data-workbench="true"] #help-fab,                                       /* 右上角 ? 速查钮：工作台下隐藏 */
body[data-workbench="true"] .overhead-stack { display: none !important; }   /* 器件上方悬浮气泡（读数 chip / ⚙ 药丸 / 件号气泡）整层隐藏，不压面板 */

/* EOS sampling trace card (eos-trace-card.js, workbench 'eos_trace').
   Chart-first layout (user 2026-08-19): big waveform on top, dispItem-style
   readout rows below. Trace magenta = THz render family (color.js >30 um tier);
   marker orange. Vertical gridlines at the delay ticks (zero line emphasised). */
.eos-card { --wb-eos-trace: #e640be; --wb-eos-marker: #d85a30; }
.eos-wave { margin: 2px 0 0; min-width: 0; }
.eos-wave svg { display: block; width: 100%; height: auto; }
.eos-axis { stroke: var(--line-1); stroke-width: 1; }
.eos-grid { stroke: var(--line-1); stroke-width: 1; opacity: .45; }
.eos-grid-zero { stroke: var(--ink-3); stroke-width: 1; opacity: .8; }
.eos-tick { font-size: 12px; fill: var(--ink-2); font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
.eos-svg-label { font-size: 11px; fill: var(--ink-3); font-family: var(--font-mono); }
