/* ============================================================
 * gbook.css —— p88 古籍阅读器 / 版式编辑器
 *
 * ⚠️ 铁律（用户口径）：阅读器窗口是**标准 Win31 窗口**。
 *   窗口标题栏 / 菜单栏 / 工具栏按钮 / 状态栏 / 对话框 一律用站内既有皮肤，
 *   只有 `.gb-page`（纸面）内部才允许古籍风格。
 *   ⇒ 本文件**只做作用域内新增**，绝不改任何全局选择器（body / button / .btn31 …）。
 *
 * 层级（对应用户 §38，顺序即 z-index）：
 *   ① 页面背景 ② 纸张纹理 ③ 页面阴影 ④ 版框 ⑤ 栏线 ⑥ 书口 ⑦ 鱼尾 ⑧ 页码 ⑨ 正文 ⑩ 夹注 ⑪ 批注 ⑫ 交互层
 * ============================================================ */

/* ---------- 量字宽用的探测宿主 ----------
   ⚠️ 绝不能 display:none（量不到）；也不能 position:fixed（body 有 zoom 时会被二次缩放）。
   用 position:absolute + 移出视口 ⇒ 与纸面同一坐标系，量出来的就是 CSS px。 */
/* ⚠️ 测量探针的宿主**绝对不能**写死 width/height！
   竖排（writing-mode:vertical-rl）下 block 轴的「块尺寸」是水平方向、
   「行内尺寸」是垂直方向；给宿主一个 1px 的确定尺寸会让子元素的
   行内尺寸（高度）退化成一行高 —— 30 个字量出来只有 22px（≈1 个字），
   推进量算成 0.73px/字（真值 22px/字），整本书的分页全错、字全叠在一起。
   正确做法：宿主尺寸 auto + 离屏 + visibility:hidden（**不能** display:none，
   那样量不到）。_dev/p88probe1.js 是这条的取证脚本。 */
.gb-probe { position: absolute; left: -99999px; top: 0; width: auto; height: auto; overflow: visible; visibility: hidden; pointer-events: none; }
/* ⚠️⚠️ `white-space: nowrap` 不是可有可无的（p96 实证，_dev/p96probe.js）：
   探针盒宽 `fs*2`，行高 = 1em ⇒ 名义上「正好两行」。但只要**换行**发生，
   `offsetHeight` 就既不是「30 字一行」也不是「两行各 15 字」——
   fs=50 时它恒为 900（= 视口高，与盒宽 50/100/150/4000 **全都无关**），
   于是 `adv = 900/30 = 30`（真值 50）⇒ 每个字只推进 30px、字形却高 50-55px
   ⇒ **字字重叠 25px、字形被 `.gb-ch` 裁掉**（就是用户投诉的「重叠、缺失」）。
   加 nowrap 后 30 字恒为一行：fs=50 → 1500/30 = 50 ✓，fs=22 → 660/30 = 22 ✓。 */
.gb-probe-col { writing-mode: vertical-rl; text-orientation: mixed; display: block; white-space: nowrap; }

/* ============================================================
 * 1. 阅读器窗口骨架（Win31 标准件）
 * ============================================================ */
.gb-client { padding: 0 !important; overflow: hidden; }
.gb-root { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; background: var(--face, #c0c0c0); }

/* 工具栏 = 一行 Win31 按钮，换行排列；换行后不撑破窗口 */
.gb-bar {
  flex: 0 0 auto; display: flex; flex-wrap: wrap; align-items: center; gap: 2px;
  padding: 3px 3px 2px; background: var(--face, #c0c0c0); border-bottom: 1px solid #000;
}
.gb-b {
  min-height: 0 !important; min-width: 0; max-height: none;
  padding: 1px 6px !important; font-family: inherit !important;
  font-size: 12px; line-height: 15px;
}
/* 自绘按钮必须自己带上凸起阴影（全局 button 的 box-shadow 带 !important，压掉它也得带 !important） */
.gb-b, .gb-tab, .gb-bp, .nd31-box.gb-setbox .gb-q {
  box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #85898C, 0 0 0 1px #000 !important;
}
.gb-b:active, .gb-tab.on { box-shadow: inset 1px 1px 0 #85898C, inset -1px -1px 0 #fff, 0 0 0 1px #000 !important; }
.gb-tab.on { background: #dcdcdc; }

/* 视口：Win31 的「工作区」灰底；纸面浮在上面 */
.gb-view {
  flex: 1 1 auto; min-height: 0; overflow: auto;
  background: var(--gb-backdrop, #808080);
  padding: 0;
}
/* p117 ①：放大到内容溢出时，视口变成「抓手」——按住左键即可拖动页面
   （手势实现在 js/gbook.js 的 panView()；`gb-pannable` 由 syncPanCursor() 按是否溢出加）。
   ⚠️ 拖动中 `user-select:none` —— 纸面文字是 visibility:hidden 的，
      不挡住的话会拖出一片看不见的选区，视觉上像「字在闪」。 */
/* p120③：拖拽区已收窄到**纸面**（见 js/gbook.js 的 panView），抓手光标也跟着收窄 ——
   灰底一律普通箭头。否则整屏都是 `grab`，看上去就像「整個窗口都能拖」。 */
.gb-view.gb-pannable { cursor: default; }
.gb-view.gb-pannable .gb-page,
.gb-view.gb-pannable .gb-slot,
.gb-view.gb-pannable .gb-spread { cursor: grab; }
.gb-view.gb-panning, .gb-view.gb-panning .gb-page,
.gb-view.gb-panning .gb-slot, .gb-view.gb-panning .gb-spread { cursor: grabbing; }
.gb-view.gb-panning, .gb-view.gb-panning * { user-select: none !important; }
.gb-entry {
  display: flex; align-items: flex-start; justify-content: center; gap: 26px;
  padding: 14px; min-height: 100%; box-sizing: border-box;
  zoom: var(--gb-zoom, 1);
}
/* 古籍双页：**右叶在前**（从右向左读）⇒ 主序页放在右边，所以用 row-reverse */
.gb-entry.dual { flex-direction: row-reverse; gap: var(--gb-pagegap, 26px); }
.gb-spread { display: flex; flex: none; }
.gb-slot { display: flex; flex: none; }
.gb-slot.gb-blank { display: none; }

/* ============================================================
 * 2. 纸面 + 装饰层（③–⑧）
 * ============================================================ */
.gb-page {
  position: relative; flex: none; overflow: hidden;
  font-family: var(--gb-font, serif);
  font-size: 12px; line-height: 1;
  image-rendering: auto;
}
/* ③ 页面阴影：独立元素，关掉它不影响任何其它层 */
.gb-pageshade { position: absolute; left: 0; top: 0; right: 0; bottom: 0; z-index: 1; pointer-events: none;
  box-shadow: 2px 2px 0 rgba(0, 0, 0, .35); }
/* ④ 版框 */
.gb-frame { position: absolute; z-index: 3; pointer-events: none; }
.gb-edge { position: absolute; z-index: 1; box-sizing: border-box; }
.gb-frame-outer { position: absolute; z-index: 0; }
/* ⑤ 栏线：宽度 0 + 只留 border-left ⇒ 改粗细不动文字位置 */
.gb-rule { position: absolute; z-index: 2; width: 0; box-sizing: border-box; }
/* ⑥ 书口（中缝） */
.gb-mouth { position: absolute; z-index: 3; box-sizing: border-box; }
/* p114 书口黑带（大黑口 / 细黑口）—— 折缝正中那条「连上（下）鱼尾与版框内边」的黑线。
   用户口径：「雖然與截斷線極近，但是應當可以顯示，且在左右頁都能看到」⇒ 它画在**書口带之内**
   （`left = (mouthW - bandW)/2`），所以折缝切齐规则（只裁版框横线）碰不到它。
   ⚠️ 宽度 / 位置 / 高度一律由 js 写成 inline（书口宽、鱼尾高、鱼尾距上下框全可调）；这里只管盒子。
   ⚠️ z-index 0 < `.gb-mouthtext` 的 1 ⇒ 书口文字压在黑带之上；整条带子在 `.gb-mouth`(3) 之内
      ⇒ 恒在鱼尾(4) 之下，黑带停在鱼尾边缘而不会盖住鱼尾。 */
.gb-mouthband { position: absolute; z-index: 0; }
.gb-mouthtext { z-index: 1; }
.gb-mouthtext {
  position: absolute; left: 0; right: 0; top: 0; bottom: 0;
  display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 6px 0; box-sizing: border-box;
}
.gb-mt { display: block; writing-mode: vertical-rl; text-orientation: upright; white-space: nowrap; line-height: 1; }
.gb-mt-title { font-size: 12px; }
.gb-mt-vol { font-size: 12px; }
.gb-mt-chap { font-size: 11px; }
.gb-mt-ver { font-size: 10px; }
.gb-mt-page { font-size: 12px; }
/* ⑦ 鱼尾 */
.gb-tail { position: absolute; z-index: 4; line-height: 0; }
.gb-tail svg { display: block; }

/* ============================================================
 * 3. 正文 / 夹注（⑨⑩）
 * ------------------------------------------------------------
 * ⚠️ 每一项都由排版引擎给绝对坐标（top / height），不靠浏览器内联流 ——
 *    见 js/gbook.js renderPage() 的注释。
 * ⚠️ `writing-mode: vertical-rl` **只对块级/绝对定位元素生效**，
 *    所以每个字都是 position:absolute + display:block。
 *    `line-height` = 栏宽 ⇒ 半行距把字**横向居中**在栏里（含全角标点）。
 * ============================================================ */
.gb-col { position: absolute; z-index: 6; overflow: hidden; }
.gb-ch, .gb-lat {
  position: absolute; left: 0; width: 100%; box-sizing: border-box;
  display: block; writing-mode: vertical-rl; text-orientation: mixed;
  text-align: center; overflow: hidden;
}
/* 拉丁串：整串一起旋转 90°（vertical-rl 的默认行为） */
.gb-lat { text-orientation: mixed; }
.gb-lat1 { text-orientation: upright; }
.gb-t-vol, .gb-t-chap { font-weight: normal; }

/* 双行夹注：占一个正文字位宽，内部 N 个竖排子列（从右到左） */
.gb-note {
  position: absolute; left: 0; box-sizing: border-box;
  display: flex; flex-direction: row-reverse; align-items: stretch;
  overflow: hidden;
}
.gb-note-line {
  display: block; flex: 1 1 0; min-width: 0;
  writing-mode: vertical-rl; text-orientation: mixed;
  text-align: center; overflow: hidden;
  line-height: var(--gb-nw, 12px);
  /* ⚠️⚠️ p112：**必须 nowrap**。
     子列的内容高 = per × 每字推进，与格子高**恰好相等**（分页就是这么算的）；
     一旦发生换行，竖排里第二行盒会被摆到**左边一个子列**的位置
     ⇒ 末字挤进隔壁子列（实测：子列盒 31px、scrollWidth 65px，第 10 字
     的 x 比第 1..9 字小 34px），用户在「即时预览」里看到的就是这个「汉字溢出」。
     一个字格的内容本就不该再折行（要放下是分页的责任）⇒ nowrap。 */
  white-space: nowrap;
}
.gb-note-clip { overflow: hidden; }

/* 句读 / 附著标点（p92）：不占字格，画在**上一个字的右侧**。
   位置（left / top / 字号）全部由 js 侧算好写成 inline style，这里只管盒子。 */
.gb-pu {
  position: absolute; display: block;
  writing-mode: horizontal-tb; text-align: center;
  font-family: inherit; pointer-events: none; user-select: none;
}

/* ⚠️ p93：⑫「鼠标交互层」(.gb-hit) 与 `.gb-editing` 那一组样式随**版式编辑模式**一起删除
   （用户口径「删除古籍阅读器的版式按钮」）。这里留个空位说明，免得后来者去 js 里找不到对应代码。 */

/* ============================================================
 * 4. 版式设定对话框（复用 .nd31-overlay / .nd31-box，只是加大）
 * ------------------------------------------------------------
 * ⚠️ `.nd31-box` 自带 `max-width:460px !important` ⇒ 想加宽必须
 *    **升特异性 + 同样带 !important**（p78 踩过「跨文件 !important 无条件取胜」）。
 * ⚠️ 表单体用 `.nd31-fbd`（被 v7.css 那条三段 !important 规则排除在外）。
 * ============================================================ */
.nd31-overlay .nd31-box.gb-setbox { max-width: 780px !important; width: 92vw; }
/* ⚠️ v6.css:366 `.nd31-bd{display:flex; align-items:flex-start}` ——
   **默认的 flex-start 会把整张表单压成「内容宽度」**：780px 的对话框里，
   页签栏只占 592px、表单区只占 **233px**，于是「鱼尾宽 px（0=书口宽）」这种长标签
   被挤到省略号（用户批注的那张图就是这个原因）。
   ⇒ 必须显式写 `align-items: stretch`，让页签 / 表单区 / 预览区铺满对话框宽度。 */
.nd31-overlay .nd31-fbd.gb-sbd {
  display: flex; flex-direction: column; align-items: stretch; gap: 5px;
  min-height: 0; max-height: 76vh; overflow: hidden;
}
.gb-settabs { flex: 0 0 auto; display: flex; flex-wrap: wrap; gap: 2px; }
.gb-tab { min-height: 0 !important; padding: 1px 7px !important; font-family: inherit !important; font-size: 12px; line-height: 15px; }

/* ---------- p93：全文搜索对话框（用户报「UI 崩坏 / 下一个无效 / 右侧下拉栏崩坏」） ----------
   ⚠️ 「UI 崩坏」的根因是**没给对话框体布局类**：它冒用了 `.nd31-fbd` 的**默认 flex 行**，
      于是三个子块（输入行 / 提示 / 结果列表）被并排塞进 `.nd31-box` 的 460px 上限里。
      实测：提示被压成 **27px 宽**（一个字一列竖着排）、结果列表被挤出框外，
      只剩一条 **300×4 的白条** —— 就是用户截图右侧那条「坏掉的下拉栏」。
   ⚠️ 加宽同样要**升特异性 + 带 !important**（跨文件 `!important` 无条件取胜）。 */
.nd31-overlay .nd31-box.gb-srbox { max-width: 680px !important; width: 92vw; }
.nd31-overlay .nd31-fbd.gb-srbd {
  display: flex; flex-direction: column; align-items: stretch; gap: 5px;
  min-height: 0; max-height: 70vh; overflow: hidden;
}
.nd31-overlay .gb-srbd .gb-srrow { flex: 0 0 auto; }
.nd31-overlay .gb-srbd .gb-srinput { min-width: 0; flex: 1 1 auto; }
.nd31-overlay .gb-srbd .gb-sr-info { flex: 0 0 auto; min-height: 15px; }
.nd31-overlay .gb-srbd .gb-srlist { flex: 1 1 auto; min-height: 132px; max-height: 46vh; min-width: 0; }

/* ---------- p93：导出对话框（用户口径「刪去左邊的說明、上下左右對齊右邊的按鈕」） ----------
   左边那段说明已删；9 个按钮改成 **3 列等宽网格** ⇒ 同宽同高、行列严格对齐。 */
.nd31-overlay .nd31-fbd.gb-exbd {
  display: flex; flex-direction: column; align-items: stretch; gap: 6px;
  min-height: 0; max-height: 76vh; overflow: auto;
}
.gb-exgrid { display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: 1fr;
  gap: 4px; align-items: stretch; align-content: start; }
.gb-exgrid .gb-b2 { width: 100%; min-height: 0 !important; min-width: 0; font-family: inherit !important; }

/* p93：字体行右侧的**字样**（「國學典籍」四个字用所选字体画）。
   font-family 由 js 侧写成 inline；这里只管盒子。
   目的：让「正文字体 / 夹注字体可以不一样」变成**看得见**的东西
   （即时预览整体只有 0.5 倍，13px 的夹注缩到 6.5px，光看预览分辨不出来）。
   ⚠️ 必须与选择框**同行**：`.gb-fctl` 默认 flex-wrap:wrap，而设置面板宽屏是
      两列栅格 —— 细胞里折出第二行时字样的白底会盖住下一行字段的标签
      （p93 shot-02 实拍）。所以给含字样的单元格加 gb-hassamp：不折行 +
      选择框可收缩、字样占剩余宽度。 */
.gb-fctl.gb-hassamp { flex-wrap: nowrap; }
.gb-fctl.gb-hassamp > .gb-sel { min-width: 0; flex: 1 1 auto; }
.gb-fsamp { flex: 0 0 auto; font-size: 13px; line-height: 17px; white-space: nowrap; color: #333; overflow: hidden; }
/* 表单区：**响应式两列**。
   780px 的对话框如果一行只放一个字段，右半张全是空白、还得多滚好几屏。
   `auto-fit + minmax(330px,1fr)`：宽了就自动排两列，窄了（<660px）自动退回一列 ——
   一行一个字段的「行距过小」问题也一并解决（两列时行距 = 6px，且每列都够宽）。 */
.gb-setpane {
  flex: 0 1 auto; min-height: 96px; max-height: 34vh; overflow: auto;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
  gap: 7px 18px; align-content: start; padding: 8px 8px;
  background: #fff; color: #000;
  box-shadow: inset 1px 1px 0 #85898C, inset -1px -1px 0 #fff, 0 0 0 1px #000;
}
/* 说明文字 / 需要整行宽的控件（如「快速栏数」那排 11 个小按钮）横跨两列 */
.gb-setpane .cp-note, .gb-setpane .gb-span { grid-column: 1 / -1; }
.gb-setprev { flex: 1 1 auto; min-height: 0; overflow: auto; display: flex; flex-direction: column; gap: 3px; align-items: center; }
.gb-pvnote { font-size: 11px; align-self: stretch; }
.gb-mini { display: flex; gap: 8px; justify-content: center; align-items: flex-start; padding-bottom: 4px; }
/* p96：即时预览从「把所有 px 乘 0.5 后重新排版」改成
   「用**同一份 cfg** 渲染 1:1 的纸面 + 整块 `transform: scale(0.5)`」
   —— 只有这样预览才**构造保证**是阅读器那一页的等比缩模（用户口径：
   「要求閱讀器的實際效果完全向預覽看齊」）。
   ⚠️ `transform` 不改变布局盒 ⇒ 外壳 `.gb-mini-sc` 必须给**缩放后**的显式
      宽高，否则预览区会留一大片空白、滚动区域也跟着错位。 */
.gb-mini-sc { position: relative; overflow: hidden; flex: none; }
.gb-mini-sc > .gb-page { position: absolute; left: 0; top: 0; }

/* ---------- 表单行（p92 重做：加行距 + 绝不截断） ----------
   ⚠️ 老版本是 `white-space:nowrap; overflow:hidden; text-overflow:ellipsis` + 42% 定宽，
      在窄面板里「鱼尾宽 px（0=书口宽）」这种长标签会被切成「鱼尾宽 px（0=书…」。
      用户口径是「不要让文字被截断」⇒ 标签改成**可换行**（换行最多让这一行变高，
      不会丢字），并给足行高，别让字被上下文裁掉。 */
.gb-frow { display: flex; align-items: center; gap: 6px; min-height: 22px; line-height: 17px; }
.gb-flab {
  /* 固定 190px：最长两条标签「双页两叶版心相对（贴中缝）」「版框外套一圈（四库全书式双边）」
     都在 180px 以内 ⇒ 一律单行，**整张表行高统一 22px**（用百分比的话这两条会折行，
     那一行会高出一头）。窄面板（<346px 列宽）时 55% 上限接管，改回折行不丢字。 */
  flex: 0 0 190px; min-width: 0; max-width: 55%; padding-right: 2px;
  font-size: 12px; line-height: 17px;
  white-space: normal; overflow-wrap: break-word; word-break: break-word;
}
.gb-fctl { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 3px; flex-wrap: wrap; }
/* 置灰的整行（页面页：比例非「自由」时的全部数值项）。用整行 opacity 而不是改控件底色
   —— 站内 `input31 / select` 的皮肤分布在好几张表里，逐属性去压很容易压不干净。 */
.gb-frow.gb-off { opacity: .5; }
.gb-frow.gb-off .gb-flab { color: #7a7a7a; }
.gb-num { width: 68px; }
.gb-sel { min-width: 96px; }
/* ⚠️ 这里**故意不写** width/height：站内 v7.css:1213 有一条
   `input[type="color"]{width:64px;height:32px;…}`（Win31 标准取色字段皮肤）。
   它比特异性 (0,1,1) 压过 `.gb-color` (0,1,0) —— 早先写的 `width:34px;height:17px`
   其实是**死规则**（实测 64×32），而 64×32 正是本站各处取色块的样子 ⇒ 保持站内皮肤，
   别把古籍面板的取色块做成异类（也正因为它是 32 高，含取色块的行高是 32 而不是 22）。 */
.gb-color { flex: none; }
.gb-chk { flex: none; }
.gb-q { min-height: 0 !important; padding: 0 4px !important; font-family: inherit !important; font-size: 11px; line-height: 14px; }
.gb-q.on { background: #dcdcdc; }
.gb-edgebox { display: flex; flex-direction: column; gap: 2px; padding: 3px 4px; margin-bottom: 3px;
  box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #85898C, 0 0 0 1px #808080; }
.gb-edgebox-t { font-size: 11px; }
.gb-bp { font-weight: normal; }

/* 目录 / 搜索 / 书签：列表 */
.gb-toc, .gb-srlist { display: flex; flex-direction: column; gap: 1px; max-height: 260px; min-width: 300px; overflow: auto;
  background: #fff; box-shadow: inset 1px 1px 0 #85898C, inset -1px -1px 0 #fff, 0 0 0 1px #000; padding: 2px; }
.gb-tocrow, .gb-srrow2 { font-size: 12px; line-height: 16px; padding: 1px 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gb-tocrow:hover, .gb-srrow2:hover { background: var(--sel-bg, #0000a8); color: #fff; }
.gb-srrow { display: flex; align-items: center; gap: 4px; margin-bottom: 3px; }
.gb-srinput { flex: 1 1 auto; min-width: 220px; }
.gb-sr-info { font-size: 11px; }

/* 夜间模式下工作区也压暗（只有视口背景，不碰窗口本身） */
.gb-night .gb-view { background: #303034; }

/* ============================================================
 * 5. 文章应用（电子公告板）里的古籍痕迹
 * ------------------------------------------------------------
 * · 列表条目：浅蓝底 `#BDD7EE` —— 与右栏「标签」模块同一个浅蓝，用户口径「浅蓝色背景」。
 * · 选中态仍是全局的海军蓝（选中比底色优先），所以这里显式写一条 .selected。
 * · 「古籍」标签 chip：用**深一点的蓝**和普通标签区分开（它是格式标记，不是分类）。
 * ⚠️ 这两条都是**新增选择器**（多一个类），不改任何既有规则。
 * ============================================================ */
.blog-item.gb-item { background: #BDD7EE; }
.blog-item.gb-item:hover { background: #CFE3F5; }
.blog-item.gb-item.selected { background: var(--sel-bg, #0000a8); color: var(--sel-fg, #fff); }
.blog-item.gb-item.selected .b31-tagmini { background: #C7CCD0; color: #000; }
.b31-tagmini.gb-tagmini { background: #2B579A; color: #fff; box-shadow: inset 1px 1px 0 #6E8FC7, inset -1px -1px 0 #16325C, 0 0 0 1px #000; }

/* 右栏的「古籍文章不预览」提示卡（Win31 面 + 凹陷内容框，不用大圆角/阴影） */
.gb-notice { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; padding: 10px 12px; }
.gb-notice .gb-tagmini { align-self: flex-start; font-size: 11px; line-height: 15px; padding: 0 4px; }
.gb-notice-t { font-size: 15px; line-height: 20px; }
.gb-notice-m { font-size: 12px; line-height: 16px; }
.gb-notice-n { font-size: 12px; line-height: 18px; }
.gb-notice-act { display: flex; gap: 6px; margin-top: 2px; flex-wrap: wrap; }
.gb-openbtn { font-family: inherit !important; }


/* ============================================================
   p114：古籍设置对话框（.gb-setbox）的页脚按钮按**内容**定宽。
   为什么必须加：v7.css:1511 的 `.nd31-ft .btn31{width:72px}` 是 p62 定死的
   全局像素规格（中文「应用并关闭」5 个字放得下），但默认语言是 **en**，
   "Apply and close" 在 72px 里会被折成两行 —— 就在用户报②的这个对话框上。
   ⇒ 只给 `.gb-setbox` 开小口：宽度由内容决定、最小 72px、不折行。
   特异性 (0,3,0) > v7 的 (0,2,0)，且本文件在 v7.css **之后**加载 ⇒ 稳。
   其它 .nd31 对话框（消息框等）的 72px 规格一字未动。
   ============================================================ */
.gb-setbox .nd31-ft .btn31 {
  width: auto; min-width: 72px; padding: 0 10px; white-space: nowrap;
}
