/**
 * 谱书 PDF 内嵌谱文页：谱文区尺寸由 --book-doc-text-width/height-mm 注入（与谱书 preset 一致）。
 * 容器 .tongzi-text-area 同尺寸；.book-doc-page-layer 铺满该矩形。
 * 跨尺寸时 .book-doc-scaler 整层 scale 填满目标版心。
 */
:root {
  --book-doc-text-width-mm: 139;
  --book-doc-text-height-mm: 222;
  --book-doc-column-line-mm: 0.28mm;
}

/*
 * 内嵌思源宋体（SourceHanSerif）：编辑器、谱书预览、印刷预览、PDF 离线渲染
 * 加载同一份 woff2 文件，字体度量全端一致（所见即所得的根基）。
 * 路径相对本 CSS：线上 /assets/css/../fonts/、离线临时目录 assets/css/../fonts/ 均成立。
 */
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_ExtraLight.woff2") format("woff2");
  font-weight: 200;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_Light.woff2") format("woff2");
  font-weight: 300;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_Regular.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_Medium.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_SemiBold.woff2") format("woff2");
  font-weight: 600;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_Bold.woff2") format("woff2");
  font-weight: 700;
  font-style: normal;
}
@font-face {
  font-family: "SourceHanSerif";
  src: url("../fonts/SourceHanSerif_Black.woff2") format("woff2");
  font-weight: 900;
  font-style: normal;
}

/*
 * 「宋体」字体栈写的是 Songti SC → STSong → SimSun。
 * Mac 有 Songti SC；Windows 通常只有 SimSun。若系统另有华文宋体(STSong)，
 * Chromium 会优先命中 STSong，度量与客户端常见的 SimSun 不一致，
 * 居中对齐列就会在 PDF 里上下留白、在浏览器里却像顶天立地。
 * 这里把前两个名字都别名到 SimSun，让 Windows 客户端与服务器 Playwright 统一命中中易宋体。
 * （Mac 若无 SimSun，local() 失败，仍回退到系统 Songti SC，不影响 Mac 本机预览。）
 */
@font-face {
  font-family: "Songti SC";
  src: local("SimSun"), local("NSimSun"), local("宋体");
  font-weight: 400;
  font-style: normal;
}
@font-face {
  font-family: "STSong";
  src: local("SimSun"), local("NSimSun"), local("宋体");
  font-weight: 400;
  font-style: normal;
}

.tongzi-half--document .tongzi-text-area,
.tongzi-half--document .tongzi-content,
.tongzi-half--lineage .tongzi-text-area,
.tongzi-half--lineage .tongzi-content {
  padding: 0;
  display: block;
  overflow: hidden;
}

.book-doc-page-layer {
  position: relative;
  width: 100%;
  height: 100%;
  flex: 1 1 auto;
  overflow: hidden;
  box-sizing: border-box;
  background: transparent;
}

.book-doc-scaler {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  /*
   * 跨尺寸缩放的内层布局盒是未变换的源版心尺寸（如大通谱 182×291mm），
   * 会超出目标页宽，触发 Chromium 打印"整页缩小适应"，导致谱文页整体缩印不铺满。
   * containment 把内层溢出彻底隔离，打印按真实版心几何输出。
   */
  contain: layout paint size;
}

.book-doc-scaler-inner {
  position: absolute;
  left: 0;
  top: 0;
  transform-origin: 0 0;
}

.book-doc-page-layer--source {
  width: 100%;
  height: 100%;
}

.book-doc-page-layer .book-doc-element {
  position: absolute;
  box-sizing: border-box;
  /* 禁止谱文绝对定位块把竖排文字画到版心黑框外 */
  overflow: hidden;
  min-width: 0;
  min-height: 0;
  border: 1px solid transparent;
  transform-origin: center center;
}

.book-doc-page-layer .text-box-content {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  padding: 10px 8px 8px 8px;
  outline: none;
  writing-mode: vertical-rl;
  direction: ltr;
  text-orientation: mixed;
  unicode-bidi: plaintext;
  overflow: hidden;
  color: #1f2937;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  font-size: var(--doc-default-font-size, 24px);
  line-height: 1.5;
  letter-spacing: 0.1em;
}

/* 繁体导出：略收紧竖排间距（0.1em→0.08em），降低 overflow:hidden 裁切风险。
   只对有 0.1em 基础字距的文本框生效：表格单元格基础字距为 0，写进来等于反把字距撑到 0.08em，
   每列少排一个字、末字被裁（与「收紧」的本意相反，2026-08-14 繁体谱文丢字反馈）。 */
html[lang="zh-Hant"] .book-doc-page-layer .text-box-content {
  letter-spacing: 0.08em;
}

html[lang="zh-Hant"] .book-doc-page-layer .text-box-content,
html[lang="zh-Hant"] .book-doc-page-layer .table-cell-editor {
  opacity: 1 !important;
  color: #1f2937 !important;
}

.book-doc-page-layer .image-box {
  background: transparent;
  border: 0;
}

.book-doc-page-layer .image-box-content {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  padding: 0;
  overflow: hidden;
}

.book-doc-page-layer .image-box-content img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

.book-doc-page-layer .table-box-content {
  width: 100%;
  height: 100%;
  padding: 6px;
  box-sizing: border-box;
  background: rgba(255, 255, 255, 0.95);
  overflow: hidden;
}

.book-doc-page-layer .table-box-content table {
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  background: #fff;
}

.book-doc-page-layer .batch-text-table-box {
  border: 0;
  background: transparent;
  /* 印刷/预览必须裁切在版心内；列宽由 fixed 均分，避免竖排撑破后只露出部分列 */
  overflow: hidden;
  max-width: 100%;
  max-height: 100%;
  box-sizing: border-box;
}

.book-doc-page-layer .batch-text-table-box .table-box-content {
  width: 100%;
  height: 100%;
  max-width: 100%;
  max-height: 100%;
  padding: 0;
  box-sizing: border-box;
}

.book-doc-page-layer .batch-text-table-box .table-box-content table {
  width: 100% !important;
  max-width: 100%;
  height: 100%;
  table-layout: fixed !important;
  box-sizing: border-box;
}

/* max-width:0 + table-layout:fixed：阻止竖排/nowrap 按内容撑开列宽导致预览裁掉左侧列 */
.book-doc-page-layer .batch-text-table-box .table-box-content td {
  min-width: 0;
  max-width: 0;
  overflow: hidden;
  box-sizing: border-box;
}

.book-doc-page-layer .table-box:not(.batch-text-table-box) .table-cell-editor {
  writing-mode: horizontal-tb;
  direction: ltr;
}

.book-doc-page-layer .batch-table-flattened {
  width: 100%;
  height: 100%;
  padding: 0;
  box-sizing: border-box;
}

.book-doc-page-layer .book-doc-default-title {
  border: 0;
  background: transparent;
}

.book-doc-page-layer .book-doc-default-title .text-box-content,
.book-doc-page-layer .book-doc-default-title #main-title {
  width: 100%;
  height: 100%;
  writing-mode: vertical-rl;
  text-orientation: mixed;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  font-weight: 700;
  font-size: var(--doc-default-font-size, 24px);
  line-height: 1.9;
  letter-spacing: 0.1em;
  text-align: center;
  color: #111827;
  padding: 4px 2px;
  box-sizing: border-box;
}

.book-doc-page-layer .book-doc-element:not(.image-box):not(.batch-text-table-box):not(.book-doc-default-title):not(.book-doc-has-fill) {
  background: rgba(255, 255, 255, 0.96);
}

.book-doc-page-layer .book-doc-default-content {
  border: 0;
  overflow: hidden;
}

.book-doc-page-layer .book-doc-default-content:not(.book-doc-has-fill) {
  background: rgba(255, 255, 255, 0.96);
}

.book-doc-page-layer .book-doc-fill-inner {
  width: 100%;
  height: 100%;
  min-width: 100%;
  min-height: 100%;
  box-sizing: border-box;
}

.book-doc-page-layer .book-doc-has-fill {
  background: var(--book-doc-fill, transparent) !important;
}

.book-doc-page-layer .book-doc-has-fill > .text-box-content,
.book-doc-page-layer .book-doc-has-fill > #main-content {
  background-color: var(--book-doc-fill, transparent) !important;
}

.book-doc-page-layer .book-doc-default-content .text-box-content,
.book-doc-page-layer .book-doc-default-content #main-content {
  width: max-content;
  min-width: 100%;
  max-width: none;
  height: 100%;
  margin-left: auto;
  writing-mode: vertical-rl;
  text-orientation: mixed;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  font-size: var(--doc-default-font-size, 24px);
  line-height: 1.6;
  letter-spacing: 0.1em;
  text-align: justify;
  color: #1f2937;
  padding: 10px 8px;
  box-sizing: border-box;
  overflow: hidden;
}

.book-doc-page-layer .book-doc-default-content .batch-text-table-box,
.book-doc-page-layer .book-doc-default-content .batch-table-flattened {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.book-doc-page-layer .table-box-content td {
  border: none;
  border-right: var(--book-doc-column-line-mm) solid #111827;
  border-bottom: var(--book-doc-column-line-mm) solid #111827;
  padding: 0;
  vertical-align: top;
  position: relative;
  overflow: hidden;
}

.book-doc-page-layer .batch-text-table-box .table-box-content tr:last-child td {
  border-bottom: none;
}

.book-doc-page-layer .batch-text-table-box .table-box-content td:last-child {
  border-right: none;
}

.book-doc-page-layer .table-box:not(.batch-text-table-box) .table-box-content td {
  border: 1px solid #111827;
}

.book-doc-page-layer .table-box-content .table-cell-editor {
  position: absolute;
  inset: 0;
  padding: 2px 4px;
  box-sizing: border-box;
  overflow: hidden;
  word-break: break-all;
  text-align: center;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  font-size: 18px;
  color: #111827;
  text-orientation: mixed;
  unicode-bidi: plaintext;
}

/* 必须写在通用 .table-cell-editor 之后：否则 word-break:break-all 同优先级后写生效，PDF 竖排会把末字折到下一列顶 */
.book-doc-page-layer .batch-text-table-box .table-cell-editor {
  white-space: nowrap;
  word-break: keep-all;
  overflow: hidden;
  min-width: 0;
  max-width: 100%;
  box-sizing: border-box;
}

.book-doc-page-layer .shape-box {
  background: rgba(255, 255, 255, 0.88);
  border: 1px solid #111827;
}

.book-doc-page-layer .shape-circle {
  border-radius: 9999px;
}

.book-doc-page-layer .shape-round {
  border-radius: 12px;
}

.book-doc-page-layer .shape-box .text-box-content {
  writing-mode: horizontal-tb;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  line-height: 1.3;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  font-size: 18px;
  color: #111827;
  padding: 10px;
}

.book-doc-page-layer .shape-outline {
  border: none;
  background: transparent;
}

.book-doc-page-layer .shape-outline .shape-outline-svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 0;
  display: block;
}

.book-doc-page-layer .shape-box {
  position: relative;
}

.book-doc-page-layer .shape-box .text-box-content {
  position: relative;
  z-index: 1;
}

.book-doc-page-layer .shape-outline .shape-outline-svg path {
  fill: none;
  stroke: #111827;
  stroke-width: 1.6;
  stroke-linejoin: round;
  stroke-linecap: round;
  vector-effect: non-scaling-stroke;
}

.tongzi-content .book-toc-item--indent-3 {
  padding-right: 9mm;
}

/* 目录：竖排右起「目录」+ 条目列（题名 / 连续虚线 / 中文页码底对齐） */
.book-toc-page-layer {
  padding: 0;
  box-sizing: border-box;
  height: 100%;
  overflow: hidden;
}

.book-toc-writing {
  /* 竖排一字宽约 4.0mm；列宽略留余量。栏距 0.5mm 才是列与列之间的空隙。
   * 若列宽仍用 10mm，栏距再小也几乎看不出「列距」变化（视觉间距≈列宽）。 */
  --book-toc-col-mm: 7.5mm;
  --book-toc-gap-mm: 0.5mm;
  /* 「目录」与条目区之间额外左移量（条目区整体相对「目录」往左） */
  --book-toc-entries-shift-mm: 1.6mm;
  /* 原 3.5mm → 加大一号≈4.0mm（谱文标题与页码共用） */
  --book-toc-entry-size-mm: 5.0mm;
  --book-toc-entry-lh: 1.5;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: row-reverse;
  flex-wrap: nowrap;
  justify-content: flex-start;
  align-content: flex-start;
  align-items: stretch;
  column-gap: var(--book-toc-gap-mm);
  row-gap: 0;
  padding: 4mm;
  box-sizing: border-box;
  font-family: "Songti SC", "STSong", "SimSun", serif;
  overflow: hidden;
}

/*
 * 最右「目录」：仅首页。
 * 垂直：顶部落在首条题名第 7 字高度（跳过前 6 个条目字高）。
 * 水平：位于右缘与首条（数字1）之间的标题列内居中（数字1–2 中间）。
 */
.book-toc-label {
  flex: 0 0 var(--book-toc-col-mm);
  width: var(--book-toc-col-mm);
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  writing-mode: vertical-rl;
  text-orientation: upright;
  font-size: 6.5mm;
  line-height: 1.15;
  letter-spacing: 0;
  font-weight: 600;
  color: #111;
  /* 6 × 条目字高 → 「目」对齐第 7 字位置 */
  padding-top: calc(6 * var(--book-toc-entry-size-mm) * var(--book-toc-entry-lh));
  /* row-reverse 下 margin-left = 「目录」左侧空隙 → 条目区整体往左 */
  margin-left: var(--book-toc-entries-shift-mm);
  box-sizing: border-box;
}

.book-toc-item {
  break-inside: avoid;
  page-break-inside: avoid;
  flex: 0 0 var(--book-toc-col-mm);
  width: var(--book-toc-col-mm);
  height: 100%;
  padding: 0;
  margin: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  font-size: var(--book-toc-entry-size-mm);
  line-height: var(--book-toc-entry-lh);
  letter-spacing: 0.12em;
  color: #111;
}

.book-toc-item .book-toc-title {
  flex: 0 0 auto;
  display: block;
  writing-mode: vertical-rl;
  text-orientation: upright;
  max-height: 55%;
  overflow: hidden;
}

/* 章节：仅题名，无虚线/页码；字体字号由编排注入的 .book-toc-item--chapter 覆盖 */
.book-toc-item--chapter .book-toc-title {
  max-height: 100%;
}

/*
 * 连续细虚线：每个小段为「细长竖矩形」（高 > 宽），参考样张放大图。
 * 宽约 0.28mm，段高约 1.0mm，间隙约 1.0mm。
 */
.book-toc-item .book-toc-leader {
  flex: 1 1 auto;
  min-height: 8mm;
  width: 0.28mm;
  margin: 1.5mm 0;
  align-self: center;
  border: 0;
  background-image: repeating-linear-gradient(
    to bottom,
    #555 0,
    #555 1mm,
    transparent 1mm,
    transparent 2mm
  );
  background-repeat: repeat-y;
  background-size: 100% 2mm;
}

.book-toc-item .book-toc-page {
  flex: 0 0 auto;
  display: block;
  writing-mode: vertical-rl;
  text-orientation: upright;
  font-size: var(--book-toc-entry-size-mm);
  letter-spacing: 0.12em;
  /* 各列页码末字底对齐 */
  margin-top: auto;
}

/* 阿拉伯数字页码：多位数横排（如 39），避免竖排拆成「3 在上、9 在下」 */
body[data-toc-page-style="arabic"] .book-toc-item .book-toc-page {
  writing-mode: horizontal-tb;
  text-orientation: mixed;
  letter-spacing: 0;
  text-align: center;
  white-space: nowrap;
}
