/* ==========================================================================
   报价王 · app.css
   主题：浅色。文档区严格复刻参考报价单（长沙柏嘉装饰工程有限公司装修报价单）
   参考配色：表头 #17365D / 分段 #DCE6F1 / 公司名 #1F3864 / 备注灰 #595959
   ========================================================================== */

:root{
  --brand:#17365D;
  --brand-2:#1F3864;
  --section:#DCE6F1;
  --accent:#2f7fd1;
  --accent-soft:#e8f1fb;
  --ink:#1a1a1a;
  --ink-2:#3c4653;
  --muted:#7a8698;
  --note:#595959;
  --bg:#eef1f6;
  --panel:#ffffff;
  --line:#dfe5ee;
  --line-2:#c9d3e0;
  --danger:#c0392b;
  --ok:#1e8e5a;

  --ui-font:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Segoe UI",system-ui,sans-serif;
  --doc-font:"Microsoft YaHei","PingFang SC",sans-serif;

  --r:8px;
  --sh:0 1px 2px rgba(23,54,93,.06),0 6px 18px rgba(23,54,93,.07);

  /* ============ 显示档位（大字模式）· 基准刻度 ============
     桌面端只读这里的基准值（= 改动前的现状值，逐像素一致）；
     手机端（≤860px）由 :root.ui-large.ui-lv-* 覆盖。
     档位尺寸只在这两处定义，JS 不硬编码任何字号。 */
  --fs-note:11px;      /* 辅助说明 .hint/.warn/.save-state/.btn.small … */
  --fs-mini:10.5px;    /* 更小的元信息 .d-meta/.t-desc/.vt-hint */
  --fs-line:12px;      /* 字段标签与正文 .fld/.kv/.t-name/.vt-title … */
  --fs-item:12.5px;    /* 页签与名称 .tab/.d-name/.card h3/弹窗正文 */
  --fs-modal-h:14px;   /* 弹窗标题 */
  --fs-tool:9px;       /* 纸内行工具按钮文字 */
  --fs-mb:11px;        /* 底栏按钮文字 */
  --fs-mb-i:15px;      /* 底栏图标 + 缩放胶囊按钮 */
  --fs-mb-k:13.5px;    /* 底栏合计金额 */
  --fs-mb-s:10px;      /* 底栏「合计」副标 */
  --fs-ms:12.5px;      /* 「更多」面板命令格子 */
  --fs-zoom:11.5px;    /* 缩放胶囊百分比 */
  --fs-ctl:16px;       /* 手机端真输入控件（16px 是 iOS 不放大整页的下限） */
  --fs-title:16px;     /* 顶栏标题输入框 */
  --tap:36px;          /* 顶栏图标按钮边长 */
  --btn-h:34px;        /* 手机端块按钮高度 */
  --chk:19px;          /* 复选框边长 */
  --tool:14px;         /* 纸内行工具按钮边长 */
  --ctl-py:6px;--ctl-px:8px;         /* 输入控件内边距 */
  --fld-py:3px;        /* 设置项上下内边距 */
  --tab-py:13px;       /* 页签上下内边距 */
  --mb-py:7px;         /* 底栏按钮上下内边距 */
  --mbar-gap:6px;      /* 底栏按钮间距 */
  --zoom-w:42px;--zoom-h:38px;       /* 缩放胶囊按钮 */
  --ms-cols:3;         /* 「更多」面板列数 */
  --cell-fs:10px;--cell-pad-y:1px;   /* 纸内单元格字号 / 上下内边距 */
  --topbar-h:52px;     /* 手机端顶栏高度 */
  --mbar-h:60px;       /* 底栏高度（手机上由 JS 实测写回真实值） */
}

*{box-sizing:border-box}
/* 必须放在最前：否则 .modal{display:grid} 之类的作者样式会盖掉 [hidden] */
[hidden]{display:none !important}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font:13px/1.55 var(--ui-font);
  -webkit-font-smoothing:antialiased;
  overflow:hidden;
}
button,input,select,textarea{font:inherit;color:inherit}
h3,h4{margin:0}

/* ------------------------------ 顶部栏 ------------------------------ */
.topbar{
  height:54px;display:flex;align-items:center;gap:14px;
  padding:0 14px;background:#fff;border-bottom:1px solid var(--line);
  position:relative;z-index:30;
}
.brand{display:flex;align-items:center;gap:9px;flex:0 0 auto}
.logo{
  height:30px;width:auto;display:block;
  /* 柏嘉标记（黑线+木纹），由 _dev/make-icons.py 从 logo 原图裁紧生成。
     顶栏本身是纯白、标记的底色也已压成纯白，所以直接贴上去天然无缝；
     原来那个蓝底「报」字方块已撤掉。 */
}
/* 兜底：万一浏览器拿到的是旧版 HTML（还是 <span class="logo">报</span>），
   而 CSS 已经是新版，上面那条会把「报」字裸成一个 30px 的黑字。
   发布后网关对根路径的缓存会比静态资源晚失效，会短暂出现这种「新旧拼接」，
   所以给 span 形态保留原来的蓝底方块样式，让这个窗口期也不难看。 */
span.logo{
  width:30px;height:30px;border-radius:8px;display:grid;place-items:center;
  background:linear-gradient(140deg,var(--brand),#2b5fa8);color:#fff;
  font-weight:700;font-size:15px;letter-spacing:.5px;
}
.brand-txt{display:flex;flex-direction:column;line-height:1.15}
.brand-txt strong{font-size:14px;color:var(--brand-2);letter-spacing:.5px}
.brand-txt small{font-size:10px;color:var(--muted);letter-spacing:.6px}

.doc-name{display:flex;align-items:center;gap:8px;flex:1 1 auto;min-width:120px}
.doc-name input{
  border:1px solid transparent;background:#f4f7fb;border-radius:6px;
  padding:6px 10px;width:100%;max-width:340px;font-weight:600;color:var(--ink-2);
}
.doc-name input:hover{border-color:var(--line-2)}
.doc-name input:focus{outline:none;border-color:var(--accent);background:#fff}
.save-state{font-size:var(--fs-note);color:var(--muted);white-space:nowrap}
.save-state.dirty{color:#c47f16}
.save-state.saved{color:var(--ok)}

.tools{display:flex;align-items:center;gap:6px;flex:0 0 auto;flex-wrap:nowrap}
.sep{width:1px;height:20px;background:var(--line);margin:0 2px}

/* ------------------------------ 按钮 ------------------------------ */
.btn{
  height:30px;padding:0 11px;border:1px solid var(--line-2);background:#fff;
  border-radius:7px;cursor:pointer;white-space:nowrap;color:var(--ink-2);
  transition:.13s;display:inline-flex;align-items:center;gap:5px;
}
.btn:hover{background:#f5f8fc;border-color:var(--accent);color:var(--brand)}
.btn:active{transform:translateY(1px)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:#20497c;color:#fff}
.btn.icon{width:30px;padding:0;justify-content:center;font-size:15px}
.btn.icon svg{
  width:16px;height:16px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;
}
/* 纸张方向按钮：纵向 / 横向两个图标互斥显示 */
#btnOrient svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
#btnOrient .ic-landscape{display:none}
body.landscape #btnOrient .ic-portrait{display:none}
body.landscape #btnOrient .ic-landscape{display:block}
.btn.small{height:27px;font-size:var(--fs-line);padding:0 9px}
.btn.block{width:100%;justify-content:center}
.btn.danger{color:var(--danger);border-color:#eccac5}
.btn.danger:hover{background:#fdf3f2;border-color:var(--danger);color:var(--danger)}
.btn:disabled{opacity:.4;cursor:not-allowed}
.btn.on{background:var(--accent-soft);border-color:var(--accent);color:var(--brand);font-weight:600}
.mini{
  width:22px;height:22px;border-radius:6px;border:1px solid var(--line-2);
  background:#fff;cursor:pointer;line-height:1;color:var(--ink-2);
}
.mini:hover{background:var(--accent-soft);border-color:var(--accent)}
.btn-col{display:flex;flex-direction:column;gap:6px}

/* ------------------------------ 布局 ------------------------------ */
.app{
  display:grid;grid-template-columns:236px 1fr 268px;height:calc(100vh - 54px);
  transition:grid-template-columns .24s cubic-bezier(.4,0,.2,1);
}
.sidebar,.inspector{background:#fff;overflow-y:auto;display:flex;flex-direction:column}
.sidebar{border-right:1px solid var(--line);transition:opacity .18s ease}
.inspector{border-left:1px solid var(--line);padding:12px;gap:12px}

/* 侧边栏收起 / 展开 */
body.side-collapsed .app{grid-template-columns:0 1fr 268px}
body.side-collapsed .sidebar{
  opacity:0;visibility:hidden;pointer-events:none;overflow:hidden;
  border-right-width:0;
  transition:opacity .18s ease, visibility 0s linear .24s;
}
@media(max-width:1180px){
  .app{grid-template-columns:200px 1fr 0}
  .inspector{display:none}
  body.side-collapsed .app{grid-template-columns:0 1fr 0}
  /* 命令按钮排不下时改成横向滚动条，绝不把按钮裁掉（右侧栏已隐藏，空间让给顶栏） */
  .tools{overflow-x:auto;overflow-y:hidden;flex:1 1 auto;min-width:0;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;padding-bottom:1px}
  .tools::-webkit-scrollbar{display:none}
  .doc-name{min-width:90px}
}

/* ------------------------------ 左侧面板 ------------------------------ */
.tabs{display:flex;border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;z-index:5}
.tab{
  flex:1;padding:11px 0;border:0;background:transparent;cursor:pointer;
  color:var(--muted);border-bottom:2px solid transparent;font-size:var(--fs-item);
}
.tab.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600;background:#f7fafd}
.tab-collapse{
  flex:0 0 28px;display:grid;place-items:center;padding:0;border:0;cursor:pointer;
  background:transparent;color:var(--muted);border-left:1px solid var(--line);
}
.tab-collapse:hover{color:var(--brand);background:var(--accent-soft)}
.tab-collapse svg{
  width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;
}
.panel{display:none;padding:12px;flex-direction:column;gap:8px}
.panel.active{display:flex}
.panel-head{display:flex;align-items:center;justify-content:space-between}
.panel-head h3{font-size:var(--fs-item);color:var(--brand-2);letter-spacing:.5px}
.panel-foot{margin-top:auto;padding-top:8px;border-top:1px dashed var(--line)}
.hint{font-size:var(--fs-note);color:var(--muted);margin:0;line-height:1.5}
.hint-inline{font-size:var(--fs-note);color:var(--muted);margin-left:8px}
.warn{font-size:var(--fs-note);color:#c47f16}

/* 列表 */
.doc-list,.tpl-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
.doc-list li,.tpl-list li{
  border:1px solid var(--line);border-radius:7px;padding:8px 9px;background:#fbfcfe;
  cursor:pointer;transition:.12s;position:relative;
}
.doc-list li:hover,.tpl-list li:hover{border-color:var(--accent);background:#f4f9ff}
.doc-list li.cur{border-color:var(--brand);background:var(--accent-soft);box-shadow:inset 2px 0 0 var(--brand)}
.doc-list li .d-name{font-weight:600;font-size:var(--fs-item);color:var(--ink-2);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.doc-list li .d-meta{font-size:var(--fs-mini);color:var(--muted);display:flex;gap:6px;margin-top:2px}
.doc-list li .d-act{position:absolute;right:6px;top:6px;display:none;gap:4px}
.doc-list li:hover .d-act{display:flex}
.d-act button{
  width:20px;height:20px;border-radius:5px;border:1px solid var(--line-2);
  background:#fff;cursor:pointer;font-size:var(--fs-note);line-height:1;color:var(--muted);
}
.d-act button:hover{border-color:var(--accent);color:var(--brand)}

.tpl-list li{cursor:default}
.tpl-list li .t-row{display:flex;align-items:flex-start;gap:7px}
.tpl-list li .t-name{font-weight:600;font-size:var(--fs-line);color:var(--ink-2);flex:1}
.tpl-list li .t-desc{font-size:var(--fs-mini);color:var(--muted);margin-top:3px;line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.tpl-list li .t-act{display:flex;gap:5px;margin-top:7px;flex-wrap:wrap}
.tpl-list li .t-act .btn{height:23px;font-size:var(--fs-note);padding:0 8px}

/* 设置项 */
.fld{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--fs-line);color:var(--ink-2);padding:var(--fld-py) 0}
.fld>span{flex:1}
.fld select,.fld input[type=number],.fld input[type=text]{
  border:1px solid var(--line-2);border-radius:6px;padding:4px 6px;background:#fff;max-width:120px;
}
.fld input[type=checkbox]{width:16px;height:16px;accent-color:var(--brand);cursor:pointer}
h4.sub{font-size:var(--fs-note);color:var(--muted);letter-spacing:.8px;margin:10px 0 2px;
  text-transform:uppercase;border-top:1px dashed var(--line);padding-top:9px}

/* 大字模式的设置项只在手机端出现 —— 桌面端外观零变化（「默认外观不变」的硬约定）。
   手机上这个分组的完整入口在设置面板顶部；「更多」面板顶部另有一步可达的快捷入口。 */
@media (min-width:861px){ .fld-display{display:none} }

/* ------------------------------ 画布与纸张 ------------------------------ */
/* 纸张尺寸由 CSS 变量驱动，body.landscape 时换成 A4 横向 */
:root{--paper-w:210mm;--paper-h:297mm}
body.landscape{--paper-w:297mm;--paper-h:210mm}
/* 画布：必须用块级布局 + margin:auto 居中。
   若用 flex + justify-content:center，当纸张比容器宽时左侧会溢出到负坐标，
   滚动条无法到达 → 表现为「左边看不见」。块级下 margin:auto 在溢出时自动靠左，
   左右都能滚到。 */
.canvas{overflow:auto;padding:22px 18px 60px;display:block}
.paper{
  width:var(--paper-w);min-height:var(--paper-h);background:#fff;box-shadow:var(--sh);
  padding:13mm 12mm 14mm;font-family:var(--doc-font);color:#000;
  border-radius:2px;
  margin:0 auto;                     /* 纸张比容器宽时自动靠左，保证左侧可见可滚 */
  transition:width .18s ease;
}

/* 表头三行 —— 对齐参考报价单 R1/R2/R3 */
.doc-head{margin-bottom:7px}
.row-company{
  text-align:center;font-size:18px;font-weight:700;color:var(--brand-2);
  letter-spacing:1px;line-height:1.3;
}
.row-title{text-align:center;font-size:14px;font-weight:700;margin-top:3px;letter-spacing:6px}
.row-meta{
  display:flex;gap:26px;justify-content:flex-start;
  font-size:10px;margin-top:9px;color:#000;
}
.meta-part{white-space:nowrap}

/* 可编辑单元格 */
.cell-edit{
  display:inline-block;min-width:34px;padding:0 2px;border-radius:3px;
  outline:none;cursor:text;transition:background .12s;
}
.cell-edit:hover{background:#f1f6fd;box-shadow:inset 0 -1px 0 var(--accent)}
.cell-edit:focus{background:#eaf3ff;box-shadow:0 0 0 2px rgba(47,127,209,.35)}
.cell-edit:empty:before{content:attr(data-ph);color:#b9c2cf}

/* 明细表 —— 深蓝表头，与参考一致 */
table.sheet{width:100%;border-collapse:collapse;table-layout:fixed;font-size:10px}
table.sheet th,table.sheet td{
  border:.75px solid #9fb0c6;padding:3px 5px;vertical-align:middle;word-break:break-word;
}
table.sheet thead th{
  background:var(--brand);color:#fff;font-weight:700;text-align:center;font-size:10.5px;
  padding:5px 3px;line-height:1.35;
}
table.sheet tbody td{background:#fff}
td.c-no{text-align:center;width:100%}
td.c-text{text-align:left}
td.c-num{text-align:right;font-variant-numeric:tabular-nums}
td.c-mid{text-align:center}
td.c-amount{text-align:right;font-variant-numeric:tabular-nums;font-weight:600}

/* 行样式 */
tr.item-row.dragging{opacity:.42}
tr.item-row.drop-above>td{box-shadow:inset 0 3px 0 var(--accent)}
tr.item-row.drop-below>td{box-shadow:inset 0 -3px 0 var(--accent)}
tr.item-row.minus td.c-text{color:#8a3a2e}
tr.item-row.minus td.c-num{color:#8a3a2e}

/* 单元格内输入控件（无边框，融入纸张） */
.cell-in{
  width:100%;border:0;background:transparent;resize:none;overflow:hidden;
  font:var(--cell-fs)/1.5 var(--doc-font);color:inherit;padding:var(--cell-pad-y) 2px;border-radius:3px;
  outline:none;display:block;
}
.cell-in:focus{background:#eaf3ff;box-shadow:inset 0 0 0 1.5px var(--accent)}
.cell-in::placeholder{color:#c3cbd8}
th .cell-in:focus{background:rgba(255,255,255,.2);box-shadow:inset 0 0 0 1.5px #fff;color:#fff}
td.c-no .cell-in,td.c-mid .cell-in{text-align:center}
td.c-num .cell-in,td.c-amount .cell-in{text-align:right;font-variant-numeric:tabular-nums}
textarea.cell-in{white-space:pre-wrap;word-break:break-word}

/* 行工具：浮在序号格上的迷你工具条（悬停出现，不溢出纸面） */
.rowtools{
  position:absolute;left:0;top:50%;transform:translateY(-50%);
  display:none;gap:1px;padding:1px;background:#fff;border-radius:5px;
  box-shadow:0 1px 5px rgba(23,54,93,.22);z-index:6;
}
tr.item-row:hover td.c-no .rowtools{display:flex}
tr.item-row:hover td.c-no .cell-in{opacity:.18}
.rowtools button{
  width:var(--tool);height:var(--tool);border-radius:3px;border:1px solid var(--line-2);background:#fff;
  font-size:var(--fs-tool);line-height:1;cursor:pointer;padding:0;color:var(--muted);
  display:flex;align-items:center;justify-content:center;
}
.rowtools button:hover{border-color:var(--accent);color:var(--brand);background:var(--accent-soft)}
.rowtools .grab{cursor:grab;color:var(--brand)}

/* 内嵌麦克风按钮 */
.cell-mic{
  position:absolute;right:3px;top:3px;width:15px;height:15px;border-radius:4px;
  border:1px solid #c8d4e4;background:#fff;font-size:9px;line-height:1;cursor:pointer;
  display:none;padding:0;z-index:5;
}
td{position:relative}
td.cell-active .cell-mic{display:block}
.cell-mic:hover{border-color:var(--accent);background:var(--accent-soft)}
.cell-mic.live{background:#e8453c;border-color:#e8453c;color:#fff;animation:pulse 1.1s infinite}
/* 行内小麦克风（备注条款等工具条里用） */
.mic-inline{
  width:17px;height:17px;border-radius:4px;border:1px solid var(--line-2);background:#fff;
  font-size:9px;line-height:1;cursor:pointer;padding:0;color:var(--muted);
  flex:0 0 auto;margin-left:5px;vertical-align:middle;
}
.mic-inline:hover{border-color:var(--accent);background:var(--accent-soft)}
.mic-inline.live{background:#e8453c;border-color:#e8453c;color:#fff;animation:pulse 1.1s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}

/* 汇总行（合计） */
table.summary{margin-top:0}
table.summary td{background:var(--section);font-weight:700;font-size:12px;color:#000}
table.summary td.lbl{text-align:right;padding-right:8px}
table.summary td.val{text-align:right;font-variant-numeric:tabular-nums}
table.summary tr.soft td{font-weight:600;font-size:11px;background:#eef4fb}
table.summary tr.grand td{background:#cfe0f5;font-size:12.5px}
table.summary td.note-inline{background:#fff;text-align:left;font-weight:400;font-size:10px;color:var(--note)}

/* 自由文本行（业主自购 / 装修手续 / 空调移机 …） */
.free-lines{margin-top:0}
.free-line{
  border:.75px solid #9fb0c6;border-top:0;padding:4px 6px;font-size:10px;color:#000;
  display:flex;align-items:flex-start;gap:6px;
}
.free-line .cell-in{flex:1}
.free-line:first-child{border-top:.75px solid #9fb0c6}
.free-line .fl-del{
  width:16px;height:16px;border:1px solid var(--line-2);background:#fff;border-radius:4px;
  font-size:10px;line-height:1;cursor:pointer;color:var(--muted);padding:0;opacity:0;flex:0 0 auto;
}
.free-line:hover .fl-del{opacity:1}
.free-line .fl-del:hover{border-color:var(--danger);color:var(--danger)}

/* 只读格（序号 / 金额 / 附表序号） */
.cell-in.ro{cursor:default;background:transparent}
.cell-in.ro:focus{background:transparent;box-shadow:none}
.cell-in.amount-view{font-weight:600}

/* 附表计算行 */
.sub-total{
  display:flex;justify-content:space-between;gap:8px;
  background:var(--section);border:.75px solid #9fb0c6;border-top:0;
  padding:4px 7px;font-size:11px;font-weight:700;
}
.sub-total b{font-variant-numeric:tabular-nums}

/* 附表行内删除按钮 */
.row-del{
  position:absolute;right:1px;top:50%;transform:translateY(-50%);
  width:14px;height:14px;border-radius:3px;border:1px solid var(--line-2);background:#fff;
  font-size:9px;line-height:1;cursor:pointer;color:var(--muted);padding:0;display:none;z-index:4;
}
.sub-card tbody tr:hover .row-del{display:block}
.row-del:hover{border-color:var(--danger);color:var(--danger);background:#fdf3f2}

/* 徽标 */
.badge{
  font-size:9.5px;padding:1px 5px;border-radius:4px;background:var(--accent-soft);
  color:var(--brand);border:1px solid #bcd6f2;white-space:nowrap;
}
.badge.alt{background:#f4f7fb;color:var(--muted);border-color:var(--line-2)}

/* 表头里的麦克风不占宽度，浮在右上角 */
table.sheet th{position:relative}
table.sheet th .mic-inline{position:absolute;right:1px;top:1px;margin:0;opacity:.75}
table.sheet th .mic-inline:hover{opacity:1}

/* 附表内的可编辑表头 / 标题 */
.cell-in.sub-h{font-size:10px;font-weight:700;text-align:center;color:#fff}
th .cell-in.sub-h{color:#fff}
.cell-in.sub-tt{font-weight:700;text-align:center}
.sub-title .mic{display:none}

/* 附表 */
.subwrap{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-top:9px}
.subwrap.one{grid-template-columns:1fr}
.sub-card{border:0;display:flex;flex-direction:column}
.sub-card.half{grid-column:span 1}
.sub-title{
  background:var(--section);border:.75px solid #9fb0c6;padding:5px 7px;
  font-size:11px;font-weight:700;text-align:center;position:relative;display:flex;
  align-items:center;justify-content:center;gap:6px;min-height:26px;
}
.sub-title .cell-edit{flex:1;text-align:center;font-weight:700}
.sub-title .st-act{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:none;gap:3px}
.sub-card:hover .st-act{display:flex}
.st-act button{
  width:18px;height:18px;border-radius:4px;border:1px solid var(--line-2);background:#fff;
  font-size:10px;line-height:1;cursor:pointer;color:var(--muted);padding:0;
}
.st-act button:hover{border-color:var(--accent);color:var(--brand)}
.sub-card table.sheet thead th{font-size:10px;padding:4px 3px}
/* 附表表头的语音按钮改绝对定位、不占列宽（序号/水计这类窄列会被行内按钮挤爆），悬停才现身 */
.sub-card table.sheet thead th{position:relative}
.sub-card table.sheet thead th .mic-inline{
  position:absolute;right:0;top:0;width:13px;height:13px;
  font-size:8px;margin:0;padding:0;opacity:0;transition:opacity .12s ease;
}
.sub-card table.sheet thead th:hover .mic-inline{opacity:1}

/* 备注条款 */
.noteswrap{margin-top:9px;border:.75px solid #9fb0c6;padding:6px 8px}
.noteswrap .n-head{font-size:10px;color:var(--note);margin-bottom:4px}
.note-clause{
  position:relative;padding:4px 22px 4px 0;font-size:9.5px;line-height:1.62;color:var(--note);
  border-bottom:1px dashed #e2e6ec;
}
.note-clause:last-child{border-bottom:0}
.note-clause .nc-title{font-weight:700;color:#40474f}
.note-clause .nc-body{white-space:pre-wrap;display:block}
.note-clause .nc-act{position:absolute;right:0;top:5px;display:none;gap:3px}
.note-clause:hover .nc-act{display:flex}
.nc-act button{
  width:17px;height:17px;border-radius:4px;border:1px solid var(--line-2);background:#fff;
  font-size:10px;line-height:1;cursor:pointer;color:var(--muted);padding:0;
}
.nc-act button:hover{border-color:var(--accent);color:var(--brand)}

/* 签字区 */
.signblock{
  margin-top:11px;font-size:10px;color:var(--note);display:flex;gap:26px;flex-wrap:wrap;
}
.signblock .sg{display:flex;align-items:center;gap:4px}
.signblock .sg .cell-edit{min-width:120px}

/* ------------------------------ 右侧卡片 ------------------------------ */
.card{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:11px}
.card h3{font-size:var(--fs-item);color:var(--brand-2);margin-bottom:8px;letter-spacing:.5px}
.kv{display:flex;justify-content:space-between;align-items:baseline;padding:4px 0;font-size:var(--fs-line);color:var(--ink-2)}
.kv b{font-variant-numeric:tabular-nums;color:var(--ink)}
.kv.big strong{font-size:19px;color:var(--brand);font-variant-numeric:tabular-nums}
.kv.total{border-top:1px solid var(--line);margin-top:5px;padding-top:7px}
.kv.total strong{font-size:17px;color:#b8342a;font-variant-numeric:tabular-nums}
.sum-rows{display:flex;flex-direction:column;gap:2px;margin-top:5px}
.sum-rows.disabled{opacity:.4;pointer-events:none}

.voice-state{display:flex;align-items:center;gap:7px;font-size:var(--fs-line);color:var(--ink-2)}
.voice-state .dot{width:8px;height:8px;border-radius:50%;background:#c3cbd8;flex:0 0 auto}
.voice-state.live .dot{background:#e8453c;animation:pulse 1.1s infinite}
.voice-state.on .dot{background:var(--ok)}

/* ------------------------------ 语音悬浮条 ------------------------------ */
.voice-toast{
  position:fixed;left:50%;bottom:24px;transform:translateX(-50%);
  display:flex;align-items:center;gap:11px;padding:11px 14px;
  background:#1d2b3c;color:#fff;border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,.28);
  z-index:60;max-width:min(620px,92vw);
}
.vt-ring{
  width:26px;height:26px;border-radius:50%;border:3px solid rgba(255,255,255,.25);
  border-top-color:#e8453c;animation:spin .9s linear infinite;flex:0 0 auto;
}
@keyframes spin{to{transform:rotate(360deg)}}
.vt-body{min-width:0}
.vt-title{font-size:var(--fs-line);font-weight:600}
.vt-text{font-size:calc(var(--fs-line) + 1px);color:#cfe4ff;margin-top:2px;min-height:18px;word-break:break-word}
.vt-hint{font-size:var(--fs-mini);color:#8fa3b8;margin-top:3px}
.vt-stop{
  border:1px solid rgba(255,255,255,.35);background:transparent;color:#fff;
  border-radius:7px;padding:4px 10px;cursor:pointer;font-size:var(--fs-line);flex:0 0 auto;
}
.vt-stop:hover{background:rgba(255,255,255,.14)}

/* ------------------------------ 弹窗 ------------------------------ */
.modal{position:fixed;inset:0;background:rgba(20,32,48,.42);display:grid;place-items:center;z-index:80}
.modal-box{
  background:#fff;border-radius:12px;padding:18px;min-width:380px;max-width:min(680px,92vw);
  max-height:82vh;overflow:auto;box-shadow:0 20px 50px rgba(0,0,0,.25);
}
.modal-box h3{font-size:var(--fs-modal-h);color:var(--brand-2);margin-bottom:10px}
.modal-box p{margin:0 0 8px;font-size:var(--fs-item);color:var(--ink-2);line-height:1.6}
.modal-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}
.modal-box input,.modal-box textarea,.modal-box select{
  width:100%;border:1px solid var(--line-2);border-radius:7px;padding:7px 9px;font-size:var(--fs-item);
}
.modal-box textarea{min-height:120px;font-family:var(--doc-font);line-height:1.6;resize:vertical}
.modal-box label{display:block;font-size:calc(var(--fs-note) + .5px);color:var(--muted);margin:9px 0 4px}
.modal-box .lk{word-break:break-all;background:#f5f8fc;border:1px solid var(--line);border-radius:7px;
  padding:8px;font-size:11px;color:var(--brand);font-family:ui-monospace,Consolas,monospace;max-height:110px;overflow:auto}

/* 更新公告弹窗（v1.01 起，手机端每次打开提示一次）。
   字号一律走 --fs-* 变量 → 开大字模式时公告自己也跟着放大，
   否则会出现「界面已经很大、公告还是小字」的割裂感。 */
.modal-box .upd-ver{margin:0 0 13px;font-size:calc(var(--fs-note) + .5px);color:var(--muted)}
.modal-box .upd-ver b{display:inline-block;margin-left:7px;padding:2px 10px;border-radius:999px;
  background:var(--brand);color:#fff;font-size:var(--fs-modal-h);letter-spacing:.5px;font-weight:600}
.modal-box .upd-sub{margin:0 0 8px;font-size:calc(var(--fs-note) + .5px);color:var(--muted)}
.modal-box .upd-list{margin:0 0 13px;padding-left:20px;font-size:var(--fs-item);color:var(--ink-2);line-height:1.75}
.modal-box .upd-list li{margin:0 0 6px}
.modal-box .upd-tip{margin:0;padding:9px 11px;background:#f5f8fc;border:1px solid var(--line);border-radius:7px;
  font-size:calc(var(--fs-note) + .5px);color:var(--muted);line-height:1.7}

/* 设置面板底部的版本号 */
.ver-line{margin:16px 0 4px;text-align:center;color:var(--muted)}

/* ==========================================================================
   打印预览（屏幕上模拟 @media print 的效果，与打印共用同一套规则）
   ========================================================================== */
body.print-preview{background:#fff;overflow:auto}
body.print-preview .topbar,body.print-preview .sidebar,body.print-preview .inspector,
body.print-preview .table-actions,body.print-preview .rowtools,body.print-preview .cell-mic,
body.print-preview .mic-inline,body.print-preview .st-act,body.print-preview .nc-act,
body.print-preview .fl-del,body.print-preview .row-del,
body.print-preview .voice-toast,body.print-preview .modal,
body.print-preview .mbar,body.print-preview .mzoom,body.print-preview .msheet,
body.print-preview .mbackdrop{display:none !important}
body.print-preview .app{display:block;height:auto}
body.print-preview .canvas{padding:0;display:block;overflow:visible}
body.print-preview .paper{
  width:var(--paper-w);min-height:0;box-shadow:none;border-radius:0;
  margin:0 auto;padding:13mm 12mm 14mm;
  zoom:1 !important;                 /* 预览/打印不缩放，保证纸张真实尺寸 */
}
body.print-preview .cell-edit:hover,body.print-preview .cell-edit:focus{background:transparent;box-shadow:none}
body.print-preview .cell-in:focus{background:transparent;box-shadow:none}
body.print-preview .cell-edit:empty:before{content:""}
body.print-preview .subwrap{grid-template-columns:1fr 1fr}
/* 预览时的退出条 */
.preview-bar{
  position:fixed;left:0;right:0;top:0;height:42px;z-index:70;display:none;
  align-items:center;justify-content:center;gap:14px;
  background:#1d2b3c;color:#fff;font-size:12.5px;box-shadow:0 2px 10px rgba(0,0,0,.2);
}
body.print-preview .preview-bar{display:flex}
.preview-bar b{color:#ffe9a8}
.preview-bar button{
  border:1px solid rgba(255,255,255,.4);background:transparent;color:#fff;
  border-radius:7px;padding:4px 12px;cursor:pointer;font-size:12px;
}
.preview-bar button:hover{background:rgba(255,255,255,.15)}
body.print-preview .canvas{padding-top:52px}

/* 无障碍 */
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}

/* ==========================================================================
   打印 —— 严格 A4，隐藏所有 UI
   ========================================================================== */
@page{size:A4;margin:10mm 10mm 12mm}
@media print{
  html,body{overflow:visible;background:#fff;height:auto}
  .topbar,.sidebar,.inspector,.table-actions,.rowtools,.cell-mic,.mic-inline,.voice-toast,.modal,
  .st-act,.nc-act,.fl-del,.row-del,.preview-bar,
  .mbar,.mzoom,.msheet,.mbackdrop{display:none !important}
  .app{display:block;height:auto}
  .canvas{padding:0;display:block;overflow:visible}
  .paper{width:auto;min-height:0;box-shadow:none;padding:0;border-radius:0;zoom:1 !important}
  table.sheet thead{display:table-header-group}
  tr.item-row,.sub-card,.note-clause,.free-line{break-inside:avoid;page-break-inside:avoid}
  .subwrap,.noteswrap,.signblock{break-inside:avoid}
  .cell-edit:hover,.cell-edit:focus{background:transparent;box-shadow:none}
  .cell-in:focus{background:transparent;box-shadow:none}
  .cell-edit:empty:before{content:""}
  .subwrap{grid-template-columns:1fr 1fr}
  body{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  /* 大字模式是纯屏幕偏好：打印时把纸内尺寸强制还原成基准。
     纸外 UI（侧栏/底栏/更多面板/弹窗）在上面那条 display:none 里已经排除了，不参与打印。 */
  :root{--cell-fs:10px !important;--cell-pad-y:1px !important}
}

/* ==========================================================================
   移动端适配（≤ 860px）
   —— 思路：顶栏只留「菜单 + 标题」，全部命令收进底部工具面板；
      左侧栏改成抽屉（可滑出）；纸张按比例缩放到「适宽」，可放大编辑。
   ========================================================================== */
.mbar,.mzoom,.msheet,.mbackdrop{display:none}

@media (max-width:860px){
  html{overscroll-behavior:none;-webkit-text-size-adjust:100%}

  /* ====================================================================
     大字模式 · 三档刻度
     —— 唯一的档位尺寸定义处。JS 只切 <html> 上的 class，不硬编码任何字号。
        「正常」档 = 不挂 .ui-large，直接用 :root 里的基准值。
     倍率不是统一的：小字（11~14px）×1.15/1.32/1.5 猛放；
     已达标的大字输入框（16px）×1.06/1.16/1.25 只微调，免得挤掉横向空间；
     纸内单元格受纸张列宽硬约束，只敢 ×1.1/1.2/1.3。
     ==================================================================== */
  :root.ui-large.ui-lv-s{
    --fs-note:12.5px; --fs-mini:12px;   --fs-line:14px;    --fs-item:14.5px;
    --fs-modal-h:16px; --fs-tool:10px;
    --fs-mb:12.5px; --fs-mb-i:17px; --fs-mb-k:15.5px; --fs-mb-s:11.5px;
    --fs-ms:14.5px; --fs-zoom:13px;
    --fs-ctl:17px; --fs-title:17.5px;
    --tap:40px; --btn-h:38px; --chk:22px; --tool:16px;
    --ctl-py:10px; --ctl-px:12px; --fld-py:5px; --tab-py:15px;
    --mb-py:8px; --mbar-gap:6px;
    --zoom-w:46px; --zoom-h:42px;
    --cell-fs:11px; --cell-pad-y:2px; --topbar-h:56px;
  }
  :root.ui-large.ui-lv-m{
    --fs-note:14px; --fs-mini:13.5px; --fs-line:16px;    --fs-item:16.5px;
    --fs-modal-h:18px; --fs-tool:11px;
    --fs-mb:14.5px; --fs-mb-i:19.5px; --fs-mb-k:18px; --fs-mb-s:13px;
    --fs-ms:16.5px; --fs-zoom:14.5px;
    --fs-ctl:18.5px; --fs-title:19px;
    --tap:44px; --btn-h:42px; --chk:26px; --tool:18px;
    --ctl-py:12px; --ctl-px:14px; --fld-py:6px; --tab-py:17px;
    --mb-py:9px; --mbar-gap:4px;
    --zoom-w:50px; --zoom-h:46px;
    --cell-fs:12px; --cell-pad-y:3px; --topbar-h:60px;
  }
  :root.ui-large.ui-lv-l{
    --fs-note:16px; --fs-mini:15px; --fs-line:18px;      --fs-item:19px;
    --fs-modal-h:20.5px; --fs-tool:12px;
    --fs-mb:16.5px; --fs-mb-i:22px; --fs-mb-k:20px; --fs-mb-s:14.5px;
    --fs-ms:19px; --fs-zoom:16px;
    --fs-ctl:20px; --fs-title:21px;
    --tap:48px; --btn-h:46px; --chk:30px; --tool:20px;
    --ctl-py:15px; --ctl-px:17px; --fld-py:7px; --tab-py:19px;
    --mb-py:10px; --mbar-gap:4px;
    --zoom-w:54px; --zoom-h:50px;
    --cell-fs:13px; --cell-pad-y:4px; --topbar-h:64px;
    --ms-cols:2;                       /* 大档：格子文字放不下，降到 2 列 */
  }

  /* 三档共有的结构调整（与数值无关的那部分），只在大档开启 */
  :root.ui-large.ui-lv-l .ms{white-space:normal;text-overflow:clip}  /* 宁可换行，绝不裁字 */
  :root.ui-large.ui-lv-l .mb.kpi .mb-s{display:none}                  /* 只留数字，宽度让给字号 */
  :root.ui-large.ui-lv-l .sidebar{width:min(92vw,380px)}
  /* 抽屉里的设置项：标签不收缩，长标签把控件挤到下一行（短标签照旧一行） */
  :root.ui-large.ui-lv-l .fld{flex-wrap:wrap;row-gap:2px}
  :root.ui-large.ui-lv-l .fld>span{flex:1 1 auto;min-width:60%}

  /* ------------------------------ 顶部栏 ------------------------------ */
  .topbar{height:var(--topbar-h);gap:8px;padding:0 10px}
  .brand-txt{display:none}                    /* 只留柏嘉标记，把宽度让给标题 */
  .doc-name{min-width:0;gap:6px;flex:1 1 auto}
  .doc-name input{max-width:none;font-size:var(--fs-title);padding:7px 9px}  /* ≥16px，防 iOS 聚焦放大整页 */
  .save-state{font-size:calc(var(--fs-note) - .5px)}   /* 正常档 = 11 - .5 = 10.5px，与改动前一致 */
  .tools{display:none}                        /* 命令移到移动端面板，避免顶栏被挤爆 */
  .btn.icon{width:var(--tap);height:var(--tap)}           /* 加大点按热区 */
  .side-toggle{flex:0 0 auto}

  /* ------------------------------ 布局 ------------------------------ */
  .app{
    grid-template-columns:1fr;
    height:calc(100vh - var(--topbar-h));
    height:calc(100dvh - var(--topbar-h));
  }
  body.side-collapsed .app{grid-template-columns:1fr}
  .canvas{padding:10px 8px calc(var(--mbar-h) + 78px + env(safe-area-inset-bottom))}

  /* ------------------------------ 左侧栏 → 抽屉 ------------------------------ */
  .sidebar{
    position:fixed;left:0;top:0;bottom:0;width:min(84vw,330px);z-index:66;
    border-right:1px solid var(--line);box-shadow:0 12px 44px rgba(15,30,50,.24);
    transform:translateX(-102%);
    transition:transform .26s cubic-bezier(.4,0,.2,1);
    opacity:1;visibility:visible;pointer-events:auto;overflow-y:auto;
  }
  body.mdrawer-open .sidebar{transform:none}
  /* 中和桌面端的「收起」机制：手机上侧栏只受抽屉控制 */
  body.side-collapsed .sidebar{
    opacity:1;visibility:visible;pointer-events:auto;overflow-y:auto;
    border-right-width:1px;
    transition:transform .26s cubic-bezier(.4,0,.2,1);
  }
  .tabs{padding-right:2px}
  .tab{padding:var(--tab-py) 0}
  .tab-collapse{flex:0 0 40px}
  /* 右侧「实时金额 / 导出」在手机上并入抽屉（由 JS 搬进来） */
  .sidebar>.inspector{
    display:flex;border-left:0;background:#fff;padding:12px 12px 20px;
    border-top:1px dashed var(--line);margin-top:10px;
  }

  /* ------------------------------ 纸张：适宽缩放 ------------------------------ */
  .paper{box-shadow:0 1px 3px rgba(23,54,93,.10),0 4px 14px rgba(23,54,93,.10)}

  /* ------------------------------ 底部操作栏 ------------------------------ */
  .mbar{
    position:fixed;left:0;right:0;bottom:0;z-index:64;display:flex;gap:var(--mbar-gap);
    padding:6px 8px calc(6px + env(safe-area-inset-bottom));
    background:rgba(255,255,255,.97);backdrop-filter:blur(10px);
    border-top:1px solid var(--line);box-shadow:0 -4px 20px rgba(15,30,50,.08);
  }
  .mb{
    flex:1 1 0;min-width:0;border:1px solid var(--line-2);background:#fff;border-radius:10px;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
    padding:var(--mb-py) 2px;font-size:var(--fs-mb);color:var(--ink-2);cursor:pointer;transition:.12s;
    -webkit-tap-highlight-color:transparent;
  }
  .mb .mb-i{font-size:var(--fs-mb-i);line-height:1.1}
  .mb:active{background:var(--accent-soft);border-color:var(--accent)}
  .mb.on{background:var(--accent-soft);border-color:var(--accent);color:var(--brand);font-weight:600}
  .mb.kpi{flex:1.35 1 0;border-color:#cfe0f5;background:var(--accent-soft)}
  .mb.kpi .mb-k{font-size:var(--fs-mb-k);font-weight:700;color:var(--brand);font-variant-numeric:tabular-nums;line-height:1.2}
  .mb.kpi .mb-s{font-size:var(--fs-mb-s);color:var(--muted)}

  /* ------------------------------ 缩放胶囊 ------------------------------ */
  .mzoom{
    position:fixed;right:8px;bottom:calc(var(--mbar-h) + 8px + env(safe-area-inset-bottom));z-index:63;
    display:flex;align-items:stretch;background:#fff;border:1px solid var(--line-2);
    border-radius:999px;box-shadow:var(--sh);overflow:hidden;
  }
  .mzoom button{
    border:0;background:transparent;min-width:var(--zoom-w);height:var(--zoom-h);padding:0;
    font-size:var(--fs-mb-i);color:var(--ink-2);cursor:pointer;-webkit-tap-highlight-color:transparent;
  }
  .mzoom button+button{border-left:1px solid var(--line)}
  .mzoom button:active{background:var(--accent-soft)}
  #mZoomVal{min-width:58px;padding:0 9px;font-size:var(--fs-zoom);font-weight:600;color:var(--brand);
    font-variant-numeric:tabular-nums}
  #mZoomVal.fit{color:var(--ok)}

  /* ------------------------------ 底部「更多」面板 ------------------------------ */
  .msheet{
    display:block;
    position:fixed;left:0;right:0;bottom:0;z-index:68;background:#fff;
    border-radius:14px 14px 0 0;
    padding:12px 12px calc(14px + env(safe-area-inset-bottom));
    box-shadow:0 -12px 44px rgba(15,30,50,.22);
    transform:translateY(105%);transition:transform .24s cubic-bezier(.4,0,.2,1);
    max-height:74vh;overflow-y:auto;
  }
  body.msheet-open .msheet{transform:none}
  .msheet-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
  .msheet-h strong{font-size:calc(var(--fs-line) + 1px);color:var(--brand-2);letter-spacing:.5px}

  /* ------------------- 大字模式入口：「显示」分段控件（跨整行） -------------------
     放在「更多」面板标题下方、命令网格上方。需要大字的人正是操作最吃力的人，
     所以入口不能埋进「更多 → 设置 → 显示」三级里；而且这个面板自己就是样本，
     点「大」立刻看见它变大，所见即所得。 */
  .mdsp{display:flex;align-items:center;gap:10px;margin:0 0 10px}
  .mdsp-l{font-size:var(--fs-ms);color:var(--muted);flex:0 0 auto}
  .mdsp-seg{display:flex;flex:1 1 auto;border:1px solid var(--line-2);border-radius:9px;overflow:hidden}
  .mdsp-seg button{
    flex:1 1 0;min-width:0;border:0;background:#fff;padding:calc(var(--ctl-py) + 3px) 2px;
    font-size:var(--fs-ms);color:var(--ink-2);cursor:pointer;
    -webkit-tap-highlight-color:transparent;
  }
  .mdsp-seg button+button{border-left:1px solid var(--line)}
  .mdsp-seg button.on{background:var(--brand);color:#fff;font-weight:600}
  .mdsp-seg button:active{background:var(--accent-soft)}
  .mdsp-seg button.on:active{background:var(--brand)}
  .msheet-x{
    /* 正常档 = --tap 36 - 6 = 30px / 12.5 + .5 = 13px，与改动前逐像素一致 */
    width:calc(var(--tap) - 6px);height:calc(var(--tap) - 6px);border-radius:8px;
    border:1px solid var(--line-2);background:#fff;
    color:var(--muted);font-size:calc(var(--fs-ms) + .5px);line-height:1;cursor:pointer;
  }
  .msheet-grid{display:grid;grid-template-columns:repeat(var(--ms-cols),1fr);gap:8px}
  .ms{
    /* 垂直内边距随档位放大（正常档 = 6 + 6 = 12px，与改动前一致） */
    border:1px solid var(--line-2);background:#fff;border-radius:10px;
    padding:calc(var(--ctl-py) + 6px) 4px;
    font-size:var(--fs-ms);color:var(--ink-2);cursor:pointer;line-height:1.25;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    -webkit-tap-highlight-color:transparent;
  }
  .ms:active{background:var(--accent-soft);border-color:var(--accent);color:var(--brand)}
  .ms.primary{background:var(--brand);border-color:var(--brand);color:#fff}

  /* ------------------------------ 遮罩 ------------------------------ */
  .mbackdrop{
    display:block;position:fixed;inset:0;z-index:65;background:rgba(15,30,50,.4);
    opacity:0;pointer-events:none;transition:opacity .2s ease;
  }
  body.mdrawer-open .mbackdrop,body.msheet-open .mbackdrop{opacity:1;pointer-events:auto}

  /* ------------------------------ 其它控件 ------------------------------ */
  .modal-box{min-width:0;width:calc(100vw - 28px);
    padding:calc(var(--ctl-py) + 9px);max-height:88vh}   /* 正常档 = 6 + 9 = 15px */
  .voice-toast{bottom:calc(var(--mbar-h) + 20px + env(safe-area-inset-bottom));max-width:calc(100vw - 24px)}
  .preview-bar{height:auto;padding:8px 10px;flex-wrap:wrap;gap:8px;text-align:center}
  .preview-bar span{font-size:calc(var(--fs-note) + .5px)}   /* 正常档 = 11 + .5 = 11.5px */
  /* 手机上这些真 <input>/<select> 必须是 16px：iOS Safari 聚焦字号 <16px 的输入控件时
     会把整个页面放大并保持放大态（表格单元格是 contenteditable div，不受此限）。
     桌面端字号不变，只改手机这一档。 */
  .fld select,.fld input[type=number],.fld input[type=text]{max-width:none;min-width:120px;
    padding:var(--ctl-py) var(--ctl-px);font-size:var(--fs-ctl)}
  .fld input[type=checkbox]{width:var(--chk);height:var(--chk)}
  .modal-box input,.modal-box textarea,.modal-box select{font-size:var(--fs-ctl)}
  .doc-list li,.tpl-list li{padding:10px}
  .tpl-list li .t-act .btn{height:calc(var(--btn-h) - 4px);font-size:var(--fs-line);padding:0 10px}
  .btn{height:var(--btn-h)}
  .tabs{position:sticky;top:0}
}

/* 窄屏（手机竖屏）进一步收紧 —— 只收水平方向。
   注意：这里**绝不能**直接写死 font-size，否则会盖掉 :root.ui-large.ui-lv-* 的档位值，
   让「更多」面板在大字模式下反而变小。用 calc(--档位值 ∓ 偏移) 表达，
   偏移量取到「正常档 = 12px / 11px」为止，保证正常档与改动前逐像素一致。 */
@media (max-width:480px){
  .msheet-grid{gap:7px}
  .ms{font-size:calc(var(--fs-ms) - .5px);padding:calc(var(--ctl-py) + 5px) 2px}
}
