
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { width: 100%; height: 100%; overflow: hidden; }
body {
		  font-family: 'Inter', 'Noto Serif SC', sans-serif;
		  text-rendering: optimizeLegibility;
		  -webkit-font-smoothing: antialiased;
		  -moz-osx-font-smoothing: grayscale;
		  user-select: none;
		  background: var(--bg);
		  color: var(--text);
		}
/* 旧的两套「浅色补丁类」已移除 —— 主题色板统一由 theme.css 提供。
   此处曾定义 --text/--card-bg/--header-bg 等方言变量并与 theme.css 冲突，
   是全站主题不同步的根源之一。 */

/* 头部 */
.header { position:fixed; top:0; left:0; right:0; z-index:100; height:48px; display:flex; align-items:center; justify-content:space-between; padding:0 16px; background:var(--header-bg); backdrop-filter:blur(20px); border-bottom:1px solid var(--header-border); }
.header-l { display:flex; align-items:center; gap:10px; }
.header-l .logo { width:24px; height:24px; border-radius: 4px; background:linear-gradient(135deg,var(--accent),var(--gold)); display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700; color:var(--btn-solid-text); box-shadow:0 0 12px var(--accent-dim); }
.header-l h1 { font-size:14px; font-weight:600; color:var(--text); }
.header-l .count { font-size:11px; color:var(--ink-2); margin-left:6px; }

/* ── 搜索框（人名/世代/页码）── */
.search-box { position:relative; margin-left:10px; }
.search-box input {
  width:190px; height:28px; padding:0 10px 0 28px; border-radius: 6px;
  border:1px solid var(--card-border); background:var(--header-bg); color:var(--text);
  font-size:12px; font-family:inherit; outline:none;
}
.search-box input:focus { border-color:var(--accent-dim); box-shadow:0 0 0 2px var(--accent-dim); }
.search-box::before { content:'🔍'; position:absolute; left:8px; top:5px; font-size:12px; opacity:.55; pointer-events:none; }
.search-pop {
  position:absolute; left:0; top:34px; width:320px; max-height:340px; overflow:auto; z-index:200;
  background:var(--header-bg); backdrop-filter:blur(20px); border:1px solid var(--card-border);
  border-radius: 7px; box-shadow: var(--shadow-drop); display:none; padding:4px;
}
.search-pop.show { display:block; }
.search-item { padding:7px 9px; border-radius: 7px; cursor:pointer; font-size:12px; display:flex; gap:8px; align-items:baseline; }
.search-item:hover, .search-item.sel { background:var(--accent-dim); }
.search-item .si-name { font-weight:600; color:var(--text); }
.search-item .si-meta { color:var(--ink-2); font-size:11px; }
.search-empty { padding:10px; font-size:12px; color:var(--ink-2); }

/* ── 统计芯片（人数等信息放大、分色）── */
.stats { display:flex; gap:6px; align-items:center; margin-left:8px; flex-wrap:wrap; }
.chip { font-size:12.5px; color:var(--ink-2); background:var(--card-bg,rgba(255,255,255,.05));
  border:1px solid var(--card-border); border-radius: 999px; padding:3px 10px; white-space:nowrap; }
.chip b { color:var(--text); font-weight:700; font-size:13px; }
.chip.c-review { cursor:pointer; border-color:rgba(217,138,31,.5); color:var(--accent); }
.chip.c-review:hover { background:var(--accent-dim); }
.stats-toggle { cursor: pointer; display: flex; align-items: center; gap: 6px; user-select: none; }
.stats-toggle:hover { color: var(--accent); }
.stats-toggle .chevron { transition: transform .3s; }
.stats-toggle.open .chevron { transform: rotate(180deg); }
.stats-detail { display: none; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border-1); gap: 6px; flex-wrap: wrap; }
.stats-detail.open { display: flex; }
.stat-chip { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 999px; font-size: 12px; background: var(--card); color: var(--ink-2); border: 1px solid var(--border-1); }
.stat-chip.warn { color: var(--state-warn, #e0b263); border-color: color-mix(in srgb, var(--state-warn, #e0b263) 30%, transparent); }

/* ── 术语速查 ── */
.gloss-btn { margin-left:8px; height:22px; padding:0 10px; border-radius: 999px; cursor:pointer; white-space:nowrap; flex:0 0 auto;
  border:1px solid var(--card-border); background:transparent; color:var(--ink-2);
  font-size:11px; font-family:inherit; }
.gloss-btn:hover { color:var(--accent); border-color:var(--accent-dim); background:var(--accent-dim); }
.gloss-pop { position:fixed; left:50%; transform:translateX(-50%); bottom:64px; z-index:210;
  width:min(760px,92vw); max-height:66vh; overflow:auto; display:none;
  background:var(--header-bg); backdrop-filter:blur(20px); border:1px solid var(--card-border);
	  border-radius: 9px; box-shadow: var(--shadow-drop); }
.gloss-pop.show { display:block; }
.gloss-head { display:flex; align-items:center; gap:10px; padding:11px 14px;
  border-bottom:1px solid var(--card-border); font-weight:700; color:var(--accent);
  font-family:var(--ff-title,"Noto Serif SC",serif); letter-spacing:1px; position:sticky; top:0;
  background:var(--header-bg); }
.gloss-head .gloss-tip { font-weight:400; font-size:11px; color:var(--ink-3); margin-left:auto; }
.gloss-head button { background:none; border:none; color:var(--ink-3); font-size:15px; cursor:pointer; }
.gloss-body { padding:10px 14px 14px; display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); gap:8px 18px; }
.g-item { font-size:12px; line-height:1.65; color:var(--ink-2); }
.g-item b { color:var(--text); font-family:var(--ff-title,"Noto Serif SC",serif); margin-right:6px; }

/* ── 全览小地图 minimap ──：左上角（页头下方），画全量人物点 + 视口框，点/拖可跳转；
   「◎ 定位到我」按钮融合在地图标题栏里 */
.minimap{position:fixed;left:14px;top:64px;z-index:110;width:250px;
  background:var(--header-bg);backdrop-filter:blur(16px);border:1px solid var(--card-border);
  border-radius: 7px;box-shadow: var(--shadow-md);overflow:hidden;user-select:none}
.mm-head{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 9px;
  font-size:11px;color:var(--ink-2);border-bottom:1px solid var(--card-border)}
.mm-head .mm-locate{background:var(--accent-dim);border:1px solid var(--accent);border-radius: 999px;
	  color:var(--accent);font-size:11px;font-family:inherit;padding:3px 12px;cursor:pointer;white-space:nowrap;font-weight:600;transition:all .2s}
	.mm-head .mm-locate:hover{color:var(--btn-solid-text);border-color:var(--accent-2);background:var(--accent);box-shadow:0 0 12px var(--accent-glow)}
.mm-head button{background:none;border:none;color:var(--ink-3);cursor:pointer;font-size:11px;padding:0 2px}
.mm-head button:hover{color:var(--accent)}
.mm-canvas-wrap{position:relative;height:104px;cursor:crosshair}
.minimap.collapsed .mm-canvas-wrap{display:none}
.minimap.collapsed .mm-head{border-bottom:none}
.minimap canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.mm-view{position:absolute;border:1.5px solid var(--accent);background:rgba(255,180,60,.14);
  border-radius: 2px;pointer-events:none;box-shadow:0 0 0 9999px rgba(0,0,0,.18)}
/* 窄屏（≤900px）不再整块隐藏小地图：这里原先是 `.minimap{display:none}`，
   而「◎ 定位到我」只活在小地图标题栏里（3467 行已删掉右上角/工具栏的同名按钮），
   等于手机端根本没有定位入口，用户只能反复报告「定位到我点不动」。
   现在由文末 <style id="tree-mobile-locate"> 把面板收成一颗胶囊（只留 #mmLocate）。
   规则必须写在 polish.css 之后且同带 body.page-tree-view 前缀，否则被其
   `body.page-tree-view .minimap/.mm-head/.mm-locate` 覆盖（同一特异性比后者，见 10-03 教训）。 */

/* ── 可点线的悬停提示 ── */
.line-hint {
  position:fixed; z-index:130; pointer-events:none; display:none;
  padding:5px 10px; border-radius: 999px; font-size:12px;
  background:var(--header-bg); border:1px solid var(--accent-dim); color:var(--text);
  box-shadow: var(--shadow-sm); white-space:nowrap;
}
.tree-link.hot { stroke-width:4 !important; opacity:1 !important; }
.header-r { display:flex; align-items:center; gap:4px; }
.header-r .sep { width:1px; height:20px; background:var(--card-border); margin:0 4px; }
.header-r .btn { height:30px; padding:0 10px; border-radius: 4px; border:1px solid transparent; background:transparent; color:var(--ink-2); font-size:11px; cursor:pointer; display:flex; align-items:center; gap:4px; transition:all .2s; font-family:inherit; white-space:nowrap; }
.header-r .btn:hover { background:var(--card-hover); border-color:var(--card-border); color:var(--text); }
.header-r .btn.primary { background:var(--accent-dim); border-color:var(--accent-dim); color:var(--accent); font-weight:600; }
.header-r .btn.primary:hover { background:var(--accent); color:var(--bg); }
.header-r .zoom-label { font-size:11px; color:var(--ink-2); min-width:34px; text-align:center; font-variant-numeric:tabular-nums; }

/* 右侧工具栏 */
.toolbar { position:fixed; right:16px; top:50%; transform:translateY(-50%); z-index:99; display:flex; flex-direction:column; gap:4px; }
/* [P220] 首次引导浮层 */
.tv-guide { position:fixed; right:16px; bottom:16px; left:auto; top:auto; z-index:250; display:block; }
.tv-guide[hidden] { display:none; }
.tv-guide .tg-card { width:min(330px,92vw); box-sizing:border-box; padding:16px 18px 14px; border-radius:12px; background:var(--polish-panel,var(--header-bg)); border:1px solid var(--card-border); box-shadow:0 12px 34px rgba(0,0,0,.45); }
@media (max-width:760px){ .tv-guide { right:10px; bottom:74px; } .tv-guide .tg-card { width:min(320px,calc(100vw - 20px)); } }
.tv-guide .tg-title { display:block; font-size:15px; color:var(--accent); margin-bottom:12px; letter-spacing:1px; }
.tv-guide .tg-step { display:flex; align-items:flex-start; gap:10px; margin-bottom:10px; font-size:13px; color:var(--ink-2,var(--text)); line-height:1.6; }
.tv-guide .tg-step i { flex:none; width:20px; height:20px; border-radius:50%; background:var(--accent); color:var(--btn-solid-text); font-style:normal; font-size:11px; font-weight:700; display:flex; align-items:center; justify-content:center; margin-top:2px; }
.tv-guide kbd { display:inline-block; padding:0 5px; border:1px solid var(--card-border); border-bottom-width:2px; border-radius:4px; font-family:inherit; font-size:11px; }
.tv-guide .tg-ok { width:100%; margin-top:6px; padding:10px; border:none; border-radius:8px; background:var(--accent); color:var(--btn-solid-text); font:inherit; font-size:13px; font-weight:600; cursor:pointer; }
.tv-guide .tg-ok:hover { filter:brightness(1.08); }
/* 工具条按钮尺寸/圆角/配色统一由文末 tree-design-system 管理，此处只留结构与状态类 */
.toolbar .btn { cursor:pointer; display:flex; align-items:center; justify-content:center; transition:all .2s; font-family:inherit; }
.toolbar .btn:hover { background:var(--card-hover); color:var(--text); }
.toolbar .btn.v-badge { position:relative; }
.toolbar .v-count { position:absolute; top:-5px; right:-5px; min-width:17px; height:17px; padding:0 4px; border-radius:9px; background:var(--state-err,#ff2d55); color:#fff; font-size:11px; font-weight:800; line-height:17px; text-align:center; box-shadow:0 0 8px color-mix(in srgb, var(--state-err,#ff2d55) 60%, transparent); }
/* ── OCR 断头核验面板：跨页找不到父亲的人，列出来源页/应接页供翻谱核对 ── */
.verify-panel{ position:fixed; right:64px; top:64px; z-index:120; width:410px; max-width:92vw; max-height:76vh; display:flex; flex-direction:column; background:var(--header-bg); border:1px solid var(--card-border); border-radius:9px; box-shadow:0 18px 46px rgba(0,0,0,.5); font-size:12px; color:var(--text); }
.verify-panel.hidden{ display:none; }
.verify-head{ display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--card-border); font-weight:600; }
.verify-head .vc-num{ color:#ff2d55; }
.verify-head button{ margin-left:auto; background:none; border:none; color:var(--ink-2); cursor:pointer; font-size:15px; padding:0 3px; }
.verify-head button:hover{ color:var(--text); }
.verify-body{ overflow:auto; padding:4px 0; }
.verify-row{ display:flex; align-items:flex-start; gap:8px; padding:8px 14px; border-bottom:1px dashed var(--card-border); flex-wrap:wrap; }
.verify-row .nm{ font-weight:600; min-width:56px; }
.verify-chips{ display:flex; flex-wrap:wrap; gap:6px; margin-left:auto; }
.chip{ font-size:11px; padding:1px 7px; border-radius:10px; white-space:nowrap; }
.chip.src{ background:rgba(255,159,45,.16); color:var(--state-warn,#ff9f2d); }
.chip.see{ background:color-mix(in srgb, var(--state-err,#ff2d55) 16%, transparent); color:var(--state-err,#ff2d55); font-weight:700; }
.chip.same{ background:rgba(25,180,120,.16); color:#16b577; }
.verify-foot{ padding:8px 14px; border-top:1px solid var(--card-border); font-size:11px; color:var(--ink-2); display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
.verify-foot button{ background:var(--accent-dim); color:var(--accent); border:none; border-radius:4px; padding:4px 9px; cursor:pointer; font-size:11px; }
/* 待考支系（09-11）：重建未定父亲的人，可点名选父接上 */
.pd-btn{ margin-left:8px; background:var(--accent-dim); color:var(--accent); border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);
  border-radius:6px; padding:4px 10px; cursor:pointer; font-size:12px; }
.pd-btn:hover{ background:var(--accent); color:#fff; }
.pd-search{ margin-left:auto; background:transparent; border:1px solid var(--card-border); color:var(--text);
  border-radius:5px; padding:2px 8px; font-size:11.5px; width:130px; }
/* [P227 2026-11-04] 卡片化重排：每条人物独立卡片，内部固定四区块
   身份 / 位置 / 依据 / 操作；长说明默认一行摘要、点「展开详情」看全文。
   旧 .pd-row 仍作卡片根类保留（计数与既有脚本/测试不受影响）。 */
.pd-row.pd-card{ display:block; margin:8px 6px; padding:0; border:1px solid color-mix(in srgb,var(--card-border) 80%,transparent); border-radius:9px; background:var(--card-bg); box-shadow:0 1px 3px rgba(0,0,0,.16); overflow:hidden; transition:border-color .15s, box-shadow .15s; }
.pd-row.pd-card:hover{ border-color:color-mix(in srgb,var(--accent) 45%,var(--card-border)); box-shadow:0 3px 10px rgba(0,0,0,.24); }
.pd-row.pd-card.flash{ animation:pdFlash .8s ease-in-out 2; }
.pd-row.pd-card.selected{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent) inset; }
@keyframes pdFlash{ 0%,100%{ background:var(--card-bg); } 50%{ background:color-mix(in srgb,var(--accent) 16%,var(--card-bg)); } }
.pdc-sec{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:6px 10px; border-bottom:1px dashed color-mix(in srgb,var(--card-border) 65%,transparent); }
.pdc-sec:last-child{ border-bottom:none; }
.pdc-k{ flex:none; display:inline-flex; align-items:center; gap:3px; font-size:10px; letter-spacing:.5px; color:var(--ink-3); }
.pdc-k b{ font-weight:600; }
.pdc-ic{ font-size:11px; line-height:1; }
.pd-row .pd-top{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; }
.pd-row .pd-nm{ font-size:16px; font-weight:800; line-height:1.3; cursor:pointer; color:var(--text); white-space:nowrap; max-width:100%; overflow:hidden; text-overflow:ellipsis; }
.pd-row .pd-nm:hover{ color:var(--accent); text-decoration:underline; }
.pdc-sex{ font-size:11px; color:var(--ink-2); }
.pd-row .pd-reason{ flex:1 1 100%; margin-top:0; font-size:11px; line-height:1.5; color:var(--ink-2); word-break:break-word;
  display:-webkit-box; -webkit-line-clamp:1; -webkit-box-orient:vertical; overflow:hidden; }
.pd-row .pd-reason.open{ display:block; -webkit-line-clamp:unset; }
.pd-row .pd-reason b{ margin-right:5px; font-weight:600; color:var(--ink-3); }
.pdc-fold{ flex:none; padding:0 4px; border:none; background:transparent; color:var(--accent); font:inherit; font-size:10.5px; cursor:pointer; }
.pd-row .pd-pick{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; margin-top:0; flex:1 1 100%; }
.pd-row .pd-lbl{ flex:none; font-size:10.5px; letter-spacing:.5px; color:var(--ink-3); }
.pd-row .pd-sel{ flex:1 1 200px; min-width:160px; max-width:100%; padding:4px 6px; border:1px solid var(--card-border); border-radius:6px; background:var(--card-bg); color:var(--text); font:inherit; font-size:11.5px; }
.pd-row .pd-sel:disabled{ opacity:.85; }
.pd-row .pd-ev{ padding:1px 7px; border-radius:9px; font-size:10.5px; white-space:nowrap; }
.pd-ev.high{ background:rgba(25,180,120,.16); color:#16b577; }
.pd-ev.medium{ background:rgba(255,159,45,.18); color:var(--state-warn,#d98a1f); }
.pd-ev.low,.pd-ev.none{ background:color-mix(in srgb,var(--ink-2) 16%,transparent); color:var(--ink-2); }
.pd-row .pd-act{ flex:none; white-space:nowrap; padding:4px 10px; border-radius:6px; border:1px solid var(--card-border); background:transparent; color:var(--ink-2); font:inherit; font-size:11px; cursor:pointer; }
.pd-row .pd-act.ok{ border-color:transparent; background:var(--accent); color:var(--btn-solid-text,#fff); font-weight:700; }
.pd-row .pd-act.quiet{ background:transparent; color:var(--ink-3); border:1px solid var(--card-border); }
.pd-row .pd-act:hover{ filter:brightness(1.12); }
.pd-row .pd-act:disabled{ opacity:.5; cursor:not-allowed; filter:none; }
.pd-endorse{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:5px 10px; font-size:10.5px; color:var(--ink-2); background:color-mix(in srgb,var(--accent) 5%,transparent); }
.pd-endorse .st{ font-weight:700; color:var(--state-warn,#d98a1f); }
.pd-endorse .st.ok{ color:#16b577; }
.pd-endorse .st.bad{ color:var(--state-err,#ff2d55); }
.pd-endorse button{ margin-left:auto; padding:2px 8px; border:1px solid var(--card-border); border-radius:5px; background:transparent; color:var(--accent); font:inherit; font-size:10.5px; cursor:pointer; }
.pd-empty{ padding:10px 14px; font-size:11.5px; color:var(--ink-2); }
/* 顶部筛选与按页分组（P226） */
.pd-filters{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; padding:8px 14px 4px; }
.pd-filters .pd-search{ flex:1 1 100%; margin-left:0; width:auto; }
.pd-mini{ flex:0 0 auto; width:auto; max-width:46%; padding:2px 4px; border:1px solid var(--card-border); border-radius:5px; background:var(--card-bg); color:var(--text); font:inherit; font-size:11px; }
.pd-check{ display:flex; align-items:center; gap:4px; font-size:11px; color:var(--ink-2); }
.pd-check input{ margin:0; }
.pd-filters .pd-tool{ padding:3px 9px; border:none; border-radius:5px; background:var(--accent-dim); color:var(--accent); font:inherit; font-size:11px; cursor:pointer; }
.pd-filters .pd-tool.on{ background:var(--accent); color:var(--btn-solid-text); }
.pd-filters .pd-held{ padding:3px 9px; border:none; border-radius:5px; background:transparent; color:var(--ink-3); font:inherit; font-size:11px; cursor:pointer; }
.pd-count{ padding:6px 14px 2px; font-size:10.5px; color:var(--ink-3); }
.pd-group{ border-top:1px solid var(--card-border); background:color-mix(in srgb,var(--accent) 5%,transparent); }
.pd-group-head{ display:flex; align-items:center; gap:8px; padding:6px 14px; font-size:11px; color:var(--ink-2); }
.pd-group-head b{ font-size:11.5px; color:var(--text); }
.pd-group-head button{ margin-left:auto; padding:2px 8px; border:none; border-radius:5px; background:var(--accent-dim); color:var(--accent); font:inherit; font-size:10.5px; cursor:pointer; }
.pd-done{ margin:6px 10px; border:1px solid var(--card-border); border-radius:6px; }
.pd-done summary{ padding:6px 10px; font-size:11px; color:var(--ink-2); cursor:pointer; }
.pd-done-row{ display:flex; flex-wrap:wrap; gap:8px; padding:4px 10px; border-top:1px dashed var(--card-border); font-size:11px; color:var(--ink-2); }
.pd-done-row .nm{ font-weight:600; color:var(--text); }
@media(max-width:700px){
  .pd-row .pd-sel{ flex:1 1 100%; }
  .pd-row .pd-act{ flex:1 1 auto; min-height:34px; }
  .pd-row .pd-reason{ font-size:11.5px; }
  .pd-filters .pd-tool,.pd-filters .pd-held{ flex:1 1 auto; min-height:32px; }
  .pdc-sec{ padding:7px 9px; }
  .pd-row.pd-card{ margin:8px 4px; }
}
/* [P227] 断头核验卡片（与待接回同款四区块） */
.verify-row.vc-card{ display:block; margin:8px 6px; padding:0; border:1px solid color-mix(in srgb,var(--card-border) 80%,transparent); border-radius:9px; background:var(--card-bg); box-shadow:0 1px 3px rgba(0,0,0,.16); cursor:pointer; }
.verify-row.vc-card:hover{ border-color:color-mix(in srgb,var(--accent) 45%,var(--card-border)); }
.verify-row.vc-card .nm{ font-size:15px; font-weight:800; color:var(--text); }
/* [P227] 我的提案卡片 */
.pr-row.pr-card{ margin:8px 6px; padding:0; border:1px solid color-mix(in srgb,var(--card-border) 80%,transparent); border-radius:9px; background:var(--card-bg); box-shadow:0 1px 3px rgba(0,0,0,.16); cursor:pointer; overflow:hidden; }
.pr-row.pr-card:hover{ border-color:color-mix(in srgb,var(--accent) 45%,var(--card-border)); }
.pr-row.pr-card .pr-detail{ border-top:1px dashed var(--card-border); }
#pdBackCard{ display:none; position:sticky; bottom:0; z-index:2; margin:6px 10px; padding:6px 10px; border:1px solid var(--card-border); border-radius:7px; background:var(--header-bg); color:var(--accent); font:inherit; font-size:11.5px; cursor:pointer; box-shadow:0 -4px 10px rgba(0,0,0,.18); }
#pdBackCard.on{ display:block; }

/* ── [P228 2026-11-04] 谱务 · 待接回 三段式改版 ──
   列表行只留四个短芯片，点开才是「摘要 / 候选 / 固定底栏」详情；
   候选由原生下拉改为单选卡（按置信度排序 + 证据徽章），底栏常驻不随内容滚动。 */
.pd-compact{ display:flex; align-items:center; gap:8px; margin:6px 8px; padding:8px 10px; border-radius:9px; cursor:pointer;
  border:1px solid color-mix(in srgb,var(--card-border) 80%,transparent); background:var(--card-bg); }
.pd-compact:hover{ border-color:color-mix(in srgb,var(--accent) 45%,var(--card-border)); }
.pd-compact .pc-main{ display:flex; align-items:center; gap:6px; min-width:0; flex:1 1 auto; }
.pd-compact .pc-nm{ font-size:14.5px; font-weight:800; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pd-chip{ flex:none; padding:1px 7px; border-radius:9px; font-size:10.5px; line-height:1.6; color:var(--ink-2); background:color-mix(in srgb,var(--ink-2) 14%,transparent); }
.pd-chip.st{ color:var(--state-warn,#d98a1f); background:rgba(255,159,45,.14); }
.pd-chip.st.ok{ color:#16b577; background:rgba(25,180,120,.14); }
.pd-chip.st.mute{ color:var(--ink-3); background:color-mix(in srgb,var(--ink-2) 10%,transparent); }
.pd-chev{ flex:none; color:var(--ink-3); font-size:14px; }

.pd-detail{ padding:0 0 8px; }
.pd-dhead{ display:flex; align-items:center; gap:8px; padding:8px 12px 2px; }
.pd-back{ border:none; background:transparent; color:var(--accent); font:inherit; font-size:11.5px; cursor:pointer; padding:2px 4px; }
.pd-dhint{ margin-left:auto; font-size:10.5px; color:var(--ink-3); }
.pd-who{ padding:8px 14px 10px; border-bottom:1px solid color-mix(in srgb,var(--card-border) 75%,transparent); }
.pd-who-top{ display:flex; align-items:baseline; gap:8px; }
.pd-who-top .nm{ font-size:22px; font-weight:800; letter-spacing:1px; color:var(--text); font-family:var(--ff-title,"Noto Serif SC",serif); }
.pd-who-top .sx{ font-size:11.5px; color:var(--ink-2); }
.pd-who-chips{ display:flex; flex-wrap:wrap; gap:6px; margin-top:6px; }
.pd-who-acts{ display:flex; flex-wrap:wrap; gap:6px; margin-top:9px; }
.pd-who-acts button{ flex:none; padding:4px 10px; border-radius:6px; border:1px solid var(--card-border); background:transparent; color:var(--ink-2); font:inherit; font-size:11px; cursor:pointer; }
.pd-who-acts button.primary{ border-color:color-mix(in srgb,var(--accent) 55%,transparent); color:var(--accent); }
.pd-who-acts button:hover{ filter:brightness(1.15); }
.pd-sec-h{ display:flex; align-items:center; gap:5px; padding:9px 14px 5px; font-size:11px; letter-spacing:1px; color:var(--ink-3); }
.pd-sec-h b{ font-size:12px; color:var(--text); letter-spacing:.6px; font-weight:700; }
.pd-sec-h .tag{ font-size:10.5px; color:var(--ink-3); letter-spacing:0; }
.pd-sec-h button{ margin-left:auto; border:none; background:transparent; color:var(--accent); font:inherit; font-size:10.5px; cursor:pointer; }
.pd-i{ display:inline-flex; align-items:center; justify-content:center; width:13px; height:13px; margin-left:2px; border-radius:50%;
  border:1px solid color-mix(in srgb,var(--ink-3) 60%,transparent); color:var(--ink-3); font-size:9px; line-height:1; cursor:help; }
.pd-evline{ margin:0 14px; padding:8px 10px; border-radius:8px; background:color-mix(in srgb,var(--ink-2) 7%,transparent);
  font-size:11px; line-height:1.6; color:var(--ink-2); }
.pd-evbox{ display:none; margin:6px 14px 0; padding:9px 10px; border-left:2px solid color-mix(in srgb,var(--accent) 45%,transparent);
  font-size:11px; line-height:1.75; color:var(--ink-2); }
.pd-evbox.on{ display:block; }
.pd-evbox p{ margin:0 0 5px; }
.pd-evbox p:last-child{ margin-bottom:0; }
.pd-evbox b{ color:var(--ink-3); font-weight:600; margin-right:4px; }

.pd-cands{ padding:0 12px; }
.pd-cand{ display:flex; align-items:center; gap:9px; width:100%; margin:0 0 5px; padding:8px 11px; text-align:left;
  border:1px solid var(--card-border); border-radius:9px; background:var(--card-bg); color:var(--text); font:inherit; cursor:pointer; }
.pd-cand:hover{ border-color:color-mix(in srgb,var(--accent) 45%,var(--card-border)); }
.pd-cand.on{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent) inset, 0 4px 14px rgba(0,0,0,.2); }
.pd-cand:disabled{ opacity:.72; cursor:not-allowed; }
.pd-radio{ flex:none; width:15px; height:15px; border-radius:50%; border:1.5px solid color-mix(in srgb,var(--ink-2) 55%,transparent); position:relative; }
.pd-cand.on .pd-radio{ border-color:var(--accent); background:color-mix(in srgb,var(--accent) 22%,transparent); }
.pd-cand.on .pd-radio::after{ content:""; position:absolute; inset:3px; border-radius:50%; background:var(--accent); }
.pd-cand .c-main{ min-width:0; flex:1 1 auto; display:flex; flex-direction:column; gap:3px; }
.pd-cand .c-name{ font-size:14px; font-weight:800; color:var(--text); }
.pd-cand .c-meta{ font-size:10.5px; color:var(--ink-2); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pd-more{ display:block; width:100%; margin:2px 0 4px; padding:7px 10px; border:1px dashed var(--card-border); border-radius:8px;
  background:transparent; color:var(--accent); font:inherit; font-size:11px; cursor:pointer; }
.pd-more:hover{ background:color-mix(in srgb,var(--accent) 8%,transparent); }
.pd-empty-cand{ margin:0 14px; padding:12px; border:1px dashed var(--card-border); border-radius:8px; font-size:11.5px; color:var(--ink-2); line-height:1.7; }

/* ── [P229 2026-11-04] 整行可点 / 候选全量可选 / 待处理合并 ──
   1) 行与候选卡内的文字、芯片、箭头一律不吃点击：冒泡到按钮/行，由事件委托 closest 判定，
      避免"只有右侧小三角能点"。行内子按钮（原页等）用 closest 优先匹配，互不干扰。 */
.pd-compact .pc-main, .pd-compact .pc-nm, .pd-compact .pd-chip, .pd-compact .pd-chev{ pointer-events:none; }
.pd-cand > *{ pointer-events:none; }
/* 2) 原因标签：缺父证据（琥珀）/ 无父断头（红） */
.pd-chip.reason{ color:var(--state-warn,#d98a1f); background:rgba(255,159,45,.14); }
.pd-chip.reason.bad{ color:var(--state-err,#ff2d55); background:rgba(255,45,85,.12); }
.pd-chip.hold{ color:var(--ink-3); background:color-mix(in srgb,var(--ink-2) 12%,transparent); }
/* 3) 不可提交候选：置灰但仍可点（点了给原因），不做静默禁用 */
.pd-cand.dead{ opacity:.62; border-style:dashed; cursor:not-allowed; }
.pd-cand.dead:hover{ border-color:color-mix(in srgb,var(--state-err,#ff2d55) 55%,var(--card-border)); }
.pd-cand.dead .c-why{ color:var(--state-err,#ff2d55); font-weight:700; }
.pd-cand .c-why{ font-style:normal; margin-left:4px; font-size:10.5px; }
/* 4) 「还有 N 个候选」展开后为全量可滚动列表（含低/中置信，不截断） */
.pd-cands.all{ max-height:min(46vh,420px); overflow:auto; padding-right:6px; overscroll-behavior:contain; }
/* 5) 抽屉顶部一句话说明 */
.svc-note{ padding:6px 14px 0; font-size:11.5px; line-height:1.55; color:var(--ink-2); }
.svc-note b{ color:var(--text); font-weight:700; }
.pd-bar-warn{ color:var(--state-warn,#d98a1f); font-weight:700; }

.pd-bar{ flex:0 0 auto; display:none; padding:9px 12px 10px; border-top:1px solid var(--card-border);
  background:var(--header-bg); box-shadow:0 -6px 18px rgba(0,0,0,.22); }
.pd-bar.on{ display:block; }
.pd-bar-lbl{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; font-size:10.5px; color:var(--ink-3); }
.pd-bar-lbl b{ font-size:13px; color:var(--text); font-weight:800; }
.pd-bar-btns{ display:flex; gap:6px; margin-top:7px; }
.pd-bar-btns button{ padding:9px 10px; border-radius:8px; border:1px solid var(--card-border); background:transparent;
  color:var(--ink-2); font:inherit; font-size:12px; cursor:pointer; white-space:nowrap; }
.pd-bar-btns button.ok{ flex:1 1 auto; border-color:transparent; background:var(--accent); color:var(--btn-solid-text,#fff); font-weight:800; }
.pd-bar-btns button:disabled{ opacity:.5; cursor:not-allowed; }
.pd-bar-note{ margin-top:6px; font-size:10px; line-height:1.5; color:var(--ink-3); }
.pd-bar-note a{ color:var(--accent); cursor:pointer; }

#svcGrab{ display:none; }
@media(max-width:700px){
  #svcGrab{ display:block; height:16px; margin:4px auto 0; width:56px; border-radius:8px;
    background:linear-gradient(180deg,transparent 6px,color-mix(in srgb,var(--ink-2) 38%,transparent) 6px 8px);
    cursor:grab; touch-action:none; }
  .pd-who-top .nm{ font-size:19px; }
  .pd-dhead{ padding:5px 12px 0; }
  .pd-who{ padding:5px 12px 8px; }
  .pd-who-chips{ margin-top:4px; }
  .pd-who-acts{ margin-top:6px; }
  .pd-who-acts button{ padding:3px 8px; }
  .pd-sec-h{ padding:7px 12px 4px; }
  /* 手机屏高有限：缺父原因整行让位给候选（依据仍可点开看全文） */
  .pd-evline{ display:none; }
  .pd-cand{ min-height:48px; margin-bottom:4px; padding:7px 10px; gap:8px; }
  .pd-cand .c-name{ font-size:13.5px; }
  .pd-cand .c-meta{ font-size:10px; }
  .pd-bar{ padding:7px 10px 8px; }
  .pd-bar-btns{ margin-top:5px; }
  .pd-bar-btns button{ min-height:42px; font-size:12.5px; }
  .pd-bar-btns button.ok{ flex:1 1 50%; }
  .pd-bar-note{ margin-top:4px; font-size:9.5px; }
}
.svc-pane[data-pane="pending"] .svc-foot{ display:none; }
/* [P228] 进入详情后收起口径长文与筛选条，把高度让给候选（首屏尽量 5–6 条同屏） */
.svc-drawer.pd-detail .svc-caliber,
.svc-drawer.pd-detail .pd-filters{ display:none; }
.svc-drawer.pd-detail .svc-body{ padding-top:0; }

.verify-foot .hint{ margin-left:auto; }
@media(max-width:700px){ .verify-panel{ right:10px; left:10px; top:56px; width:auto; } }

/* ── 谱务抽屉（2026-11-03 布局方案 A）──
   右侧工具栏只保留一个带数量的「谱务 N」入口，展开 340px 抽屉；
   画布不被永久挤压，可随时收起，窄屏改为底部抽屉。 */
body.page-tree-view .toolbar .btn.svc-btn{ width:auto; min-width:58px; padding:0 10px; gap:5px; font-size:12px; font-weight:600; letter-spacing:.5px; }
body.page-tree-view .toolbar .btn.svc-btn .svc-num{ min-width:18px; height:18px; padding:0 4px; border-radius:9px; background:var(--state-err,#ff2d55); color:#fff; font-size:11px; font-weight:800; line-height:18px; text-align:center; }
body.page-tree-view .toolbar .btn.svc-btn .svc-num.zero{ background:var(--card-border); color:var(--ink-2); }
/* P1-11（2026-11-07）：原位 right:64px + width:448px 会压住右侧 88px 工具条，只露半截按钮。
   现改为贴右 16px、宽度自适应视口；同时打开抽屉时隐藏工具条（body.svc-open）。 */
.svc-drawer{ position:fixed; right:16px; top:66px; bottom:24px; z-index:130; width:min(448px, calc(100vw - 32px)); display:flex; flex-direction:column; background:var(--header-bg); backdrop-filter:blur(20px); border:1px solid var(--card-border); border-radius:10px; box-shadow:0 18px 46px rgba(0,0,0,.5); font-size:12px; color:var(--text); overflow:hidden; }
body.svc-open .toolbar{ opacity:0; pointer-events:none; transition:opacity .2s; }
.svc-drawer.hidden{ display:none; }
.svc-head{ display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--card-border); font-weight:700; font-family:var(--ff-title,"Noto Serif SC",serif); letter-spacing:1px; }
.svc-total-note{ margin-left:2px; font-weight:400; font-size:11px; letter-spacing:0; color:var(--ink-2); }
.svc-caliber{ padding:7px 14px; border-bottom:1px dashed var(--card-border); font-size:11px; line-height:1.65; color:var(--ink-3); background:var(--surface-2,rgba(255,255,255,.02)); }
.svc-caliber>summary{ cursor:pointer; list-style:none; font-size:11px; font-weight:600; color:var(--ink-2); }
.svc-caliber>summary::-webkit-details-marker{ display:none; }
.svc-caliber>summary::before{ content:'▸ '; color:var(--ink-3); }
.svc-caliber[open]>summary::before{ content:'▾ '; }
.svc-caliber[open]{ padding-bottom:6px; }
.svc-caliber>div{ margin-top:4px; }
.export-msg{ font-size:11.5px; line-height:1.4; color:var(--ink-3); max-width:150px; }
.export-msg.err{ color:var(--state-err,#ff8fa3); }
.export-msg.ok{ color:var(--ok,#5fd08a); }
.svc-head .vc-num{ color:var(--state-err,#ff2d55); }
.svc-head button{ margin-left:auto; background:none; border:none; color:var(--ink-2); cursor:pointer; font-size:15px; padding:0 3px; }
.svc-head button:hover{ color:var(--text); }
.svc-tabs{ display:flex; border-bottom:1px solid var(--card-border); }
.svc-tab{ flex:1; padding:8px 4px; background:none; border:none; border-bottom:2px solid transparent; color:var(--ink-2); font:inherit; font-size:12px; cursor:pointer; }
.svc-tab span{ font-size:10.5px; color:var(--ink-3); margin-left:3px; }
.svc-tab.active{ color:var(--accent); border-bottom-color:var(--accent); font-weight:600; }
.svc-pane{ display:flex; flex-direction:column; min-height:0; flex:1; }
.svc-pane.hidden{ display:none; }
.svc-body{ overflow:auto; padding:4px 0; min-height:120px; flex:1 1 auto; }
.svc-pane-tools{ display:flex; gap:8px; align-items:center; padding:8px 14px 4px; }
.svc-pane-tools .pd-search{ margin-left:0; flex:1; width:auto; }
.svc-pane-tools button{ background:var(--accent-dim); color:var(--accent); border:none; border-radius:5px; padding:4px 10px; cursor:pointer; font-size:11px; }
.svc-foot{ padding:8px 14px; border-top:1px solid var(--card-border); font-size:11px; color:var(--ink-2); line-height:1.55; }
.svc-empty{ padding:22px 16px; text-align:center; color:var(--ink-2); font-size:12px; line-height:1.7; }
.svc-mask{ position:fixed; inset:0; background:transparent; z-index:125; pointer-events:none; }
.svc-mask.hidden{ display:none; }
/* 我的提案 */
.pr-row{ padding:9px 14px; border-bottom:1px dashed var(--card-border); cursor:pointer; }
.pr-row:hover{ background:var(--card-hover); }
.pr-top{ display:flex; align-items:center; gap:7px; }
.pr-id{ font-weight:700; color:var(--accent); }
.pr-st{ font-size:10.5px; padding:1px 7px; border-radius:9px; background:var(--card-border); color:var(--ink-2); }
.pr-st.open{ background:rgba(255,159,45,.16); color:var(--state-warn,#d98a1f); }
.pr-st.effective{ background:rgba(25,180,120,.16); color:#16b577; }
.pr-st.rejected,.pr-st.conflict{ background:color-mix(in srgb,var(--state-err,#ff2d55) 15%,transparent); color:var(--state-err,#ff2d55); }
.pr-meta{ font-size:11px; color:var(--ink-2); margin-top:3px; }
.pr-detail{ padding:10px 14px; border-bottom:1px solid var(--card-border); background:var(--card); }
.pr-diff{ display:grid; grid-template-columns:78px 1fr; gap:4px 8px; font-size:11.5px; margin:6px 0; }
.pr-diff .k{ color:var(--ink-3); }
.pr-diff .old{ color:var(--state-err,#ff2d55); text-decoration:line-through; word-break:break-all; }
.pr-diff .new{ color:#16b577; word-break:break-all; }
.pr-act{ display:flex; gap:6px; flex-wrap:wrap; margin-top:8px; }
.pr-act button{ border:none; border-radius:5px; padding:5px 10px; font-size:11.5px; cursor:pointer; background:var(--accent-dim); color:var(--accent); }
.pr-act button.danger{ background:color-mix(in srgb,var(--state-err,#ff2d55) 14%,transparent); color:var(--state-err,#ff2d55); }
.pr-act button.ok{ background:rgba(25,180,120,.16); color:#16b577; }
/* P1：站内通知（冲突/生效） */
.svc-notif{ margin:8px 12px; padding:8px 10px; border-radius:7px; background:color-mix(in srgb,var(--state-err,#ff2d55) 10%,transparent); border:1px solid color-mix(in srgb,var(--state-err,#ff2d55) 28%,transparent); font-size:11.5px; line-height:1.55; }
.svc-notif .nt{ font-weight:700; color:var(--state-err,#ff2d55); }
.svc-notif .nb{ color:var(--ink-2); display:block; margin:2px 0 5px; word-break:break-all; }
.svc-notif button{ border:none; border-radius:5px; padding:3px 8px; margin-right:5px; font-size:11px; cursor:pointer; background:var(--accent-dim); color:var(--accent); }
.svc-notif button.ghost{ background:transparent; color:var(--ink-3); }
.ep-row.pp-wide{ grid-column:1/-1; }
@media(max-width:700px){
  .svc-drawer{ left:8px; right:8px; top:auto; bottom:0; width:auto; max-width:none; height:90vh; max-height:90vh; border-radius:12px 12px 0 0; }
  body.page-tree-view .toolbar .btn.svc-btn{ width:auto; height:44px; font-size:11px; min-width:50px; padding:0 7px; }
  .svc-mask{ background:rgba(0,0,0,.42); }
}

	/* 图例 */
.legend { position:fixed; bottom:16px; left:50%; transform:translateX(-50%); z-index:99; display:flex; gap:10px; align-items:center; padding:6px 14px; background:var(--header-bg); backdrop-filter:blur(20px); border-radius: 999px; border:1px solid var(--card-border); }
.legend-item { display:flex; align-items:center; gap:5px; font-size:var(--fs-xs,12px); color:var(--ink-2); }
/* 图例用形状而非纯色点，与节点的形状编码一一对应 */
/* 图例形状：按节点真实比例（116×60 ≈ 1.93）缩放，避免小尺寸下看不出差别。
   只有两种「形状」：方角 = 男，椭圆 = 女；
   身份用边框颜色/线型区分，不引入第三种形状 —— 之前四例都是方角、
   只靠 0.5px 边框粗细区分，肉眼根本分辨不出。 */
.legend-shape {
  display:inline-block; width:24px; height:14px; flex:none;
  background:var(--card-bg); box-sizing:border-box;
  border:1px solid var(--ink-2);
}
.legend-shape.lg-m    { border-radius: 3px; }    /* 男：方角 */
.legend-shape.lg-f    { border-radius: 999px; }  /* 女：椭圆 */
.legend-shape.lg-hi   { border-color:var(--accent); border-width:2px; }  /* 始祖 / 我 */
.legend-item { white-space:nowrap; }
.legend-shape.lg-dash { border-style:dashed; }                            /* 有配偶 */

/* 画布 */
.tree-stage { position:fixed; top:48px; left:0; right:0; bottom:0; overflow:hidden; cursor:grab; }
.tree-stage:active { cursor:grabbing; }
.tree-world {
  transform-origin:0 0; position:absolute;
  /* 提示浏览器把这一层交给合成器：拖动/缩放只做 transform，不重排不重绘 */
  will-change: transform;
}
/* 回弹与程序化定位时的过渡要短一些，0.5s 拖沓 */
.tree-world.animating { transition:transform .38s cubic-bezier(.22,.61,.36,1); }
/* 跳转专用：更慢的平移（约一半速度），让用户看清画面往哪个方向走 */
.tree-world.animating-slow { transition:transform .85s cubic-bezier(.33,.58,.28,1); }
.tree-world svg.lines { position:absolute; top:0; left:0; width:100%; height:100%; pointer-events:none; overflow:visible; }

/* 世代标签 — 固定在右侧 */
.gen-labels { position:fixed; right:12px; top:52px; bottom:0; z-index:80; pointer-events:none; display:flex; flex-direction:column; }
.gen-label { position:absolute; right:0; font-size:11px; font-weight:700; color:var(--ink); letter-spacing:0.5px; pointer-events:none; white-space:nowrap; transition:opacity .2s; }
.gen-label.edge { color:var(--accent); background:var(--card, var(--card-bg)); border:1px solid color-mix(in srgb,var(--accent) 45%,transparent); border-radius: 999px; padding:1px 8px; }

/* 展开按钮 */
.expand-btn { position:absolute; left:50%; transform:translateX(-50%); z-index:5; cursor:pointer; padding:6px 18px; border-radius: 999px; border:1px solid var(--card-border); background:var(--header-bg); backdrop-filter:blur(12px); color:var(--ink-2); font-size:11px; font-family:inherit; transition:all .25s; white-space:nowrap; }
.expand-btn:hover { border-color:var(--accent-dim); color:var(--accent); }

/* 2026-11-07：大谱分片提示条。默认只铺开部分支系时，其余支系没有坐标、点不出来，
   这里常驻一条提示，提供「再展开 6 支 / 任选支系跳转 / 全部展开」，保证人人可达。 */
.branch-cap-bar { position:absolute; top:10px; left:50%; transform:translateX(-50%); z-index:9; display:flex; flex-wrap:wrap; align-items:center; gap:6px; padding:6px 10px; border-radius:12px; border:1px solid var(--card-border); background:var(--header-bg); backdrop-filter:blur(12px); font-size:11px; color:var(--ink-2); max-width:min(96vw,760px); box-shadow:0 6px 20px rgba(0,0,0,.10); }
.branch-cap-bar b { color:var(--ink); font-weight:700; }
.bcb-btn { cursor:pointer; padding:3px 10px; border-radius:999px; border:1px solid var(--card-border); background:transparent; color:var(--ink-2); font-size:11px; font-family:inherit; white-space:nowrap; }
.bcb-btn:hover { border-color:var(--accent-dim); color:var(--accent); }
.bcb-sel { max-width:210px; padding:3px 6px; border-radius:8px; border:1px solid var(--card-border); background:var(--card,var(--header-bg)); color:var(--ink-2); font-size:11px; font-family:inherit; }

/* ── 节点卡片 — 思维导图风格 ─────────────────────────────
   字号下限 12px（原 7–9px 不可读）；性别用「颜色 + 形状 + 符号」
   三重冗余编码，色觉障碍用户同样可辨。
   ────────────────────────────────────────────────────── */
/* ── 尺寸契约 ────────────────────────────────────────────────
   这四个变量是 CSS 与 JS 布局的「双向契约」：
   JS 用 getComputedStyle 读它们来算坐标，不再另写死数字。
   以前节点靠内容撑开、格子却是写死的 76×42，
   于是姓名越写越宽就压住邻居、连线从卡片内部穿出。
   现在卡片恒等于格子，内容再多也撑不破。
   注：改这里，布局自动跟随，无需再去动 JS。          */
:root{
  --node-w:   116px;  /* 节点宽：4 字姓名 + 性别符号 + 内边距 */
  --node-h:    60px;  /* 节点高：姓名 20 + 副行 16 + 内边距 */
  --node-gap:  14px;  /* 兄弟节点净间距（够放下外挂徽标） */
  --gen-gap:   88px;  /* 世代间距 = 节点高 + 28 连线留白 */
}

.node {
  position: absolute; cursor: pointer;
  width: var(--node-w); height: var(--node-h);
  transition: transform .25s cubic-bezier(.22,.61,.36,1);
  display: flex; align-items: center; justify-content: center;
}
.node:hover { transform: translateY(-2px) !important; z-index: 10; }
.node:focus { outline: none; }
.node:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; border-radius: var(--r-sm, 8px); z-index: 11; }

/* 卡片恒定填满格子：尺寸可预测，是治理重叠的根
   [P220 去双源] 底色/边框/顶线/投影已统一由 polish.css `body.page-tree-view .node-card`
   提供（单一样式源）；此处只保留版式属性（尺寸/内边距/圆角/文字）。 */
.node-card {
	  width: 100%; height: 100%; box-sizing: border-box;
	  padding: 6px 9px;
	  display: flex; flex-direction: column; align-items: center; justify-content: center;
	  /* 圆角：男 4px（方角），女 999px 在下面 .female 覆盖 */
	  border-radius: 4px; text-align: center;
	  /* 世代面色作为底色兜底（polish.css 正常会覆盖为面板混色） */
	  background: var(--gc, var(--card-bg));
	  font-size: var(--fs-sm, 13px); font-weight: 500;
	  transition: all .25s cubic-bezier(.22,.61,.36,1); position: relative;
	}
	.node.root .node-card {
	  border-top: 3px solid var(--gold);
	  box-shadow:
	    inset 0 0 0 1px color-mix(in srgb, var(--gc, var(--card-bg)) 80%, var(--ink)),
	    0 0 16px var(--gold-dim),
	    0 2px 6px rgba(0,0,0,.12);
	}
	/* ── 待审核（找不到父亲、非始祖起始层）→ 高饱和红框，需人工校验 ── */
.node.broken .node-card {
  border: 2.5px solid var(--state-err,#ff2d55) !important;
  border-top: 3.5px solid var(--state-err,#ff2d55) !important;
  background: color-mix(in srgb, var(--state-err,#ff2d55) 9%, var(--card-bg));
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb, var(--state-err,#ff2d55) 45%, transparent),
    0 0 0 3px color-mix(in srgb, var(--state-err,#ff2d55) 30%, transparent),
    0 0 18px color-mix(in srgb, var(--state-err,#ff2d55) 55%, transparent);
}
.node.broken .node-card .name { color: var(--state-err,#ff2d55); }
	/* 待审核徽标（含原谱页码）：顶部居中，高饱和红胶囊，比普通身份徽标更醒目 */
	.node-card .badge-broken {
	  right: auto; left: 50%; top: -9px; transform: translateX(-50%);
	  width: auto; height: auto; min-width: 0;
	  padding: 1px 8px; border-radius: 11px;
	  font-size: 11px; font-weight: 800; letter-spacing: .02em; white-space: nowrap;
	  background: var(--state-err,#ff2d55);
	  box-shadow: 0 1px 5px color-mix(in srgb, var(--state-err,#ff2d55) 55%, transparent);
	  border: 1px solid color-mix(in srgb, var(--state-err,#ff2d55) 45%, #fff);
	}
	.node.me .node-card {
	  border-top: 3px solid var(--accent);
	  box-shadow:
	    inset 0 0 0 1px color-mix(in srgb, var(--gc, var(--card-bg)) 80%, var(--ink)),
	    0 0 20px var(--accent-glow),
	    0 2px 6px rgba(0,0,0,.12);
	}
.node-card .name {
	  font-size: 15px; font-weight: 700; line-height: 1.3;
	  max-width: 100%; min-width: 0;
	  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
	  letter-spacing: .02em;
	}
/* 副行：世代标签 + 配偶同排。
   原实现把世代标签绝对定位外挂到右上角（top/right: -6px），
   既压住自己姓名，又侵入右邻节点 —— 现改为常规流内的行内元素。 */
.node-card .sub {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  max-width: 100%; min-width: 0;
  overflow: hidden;   /* 只裁容器，标签本身用短标签（P8 / 册1 P8），不再整句被切 */
}
.node-card .meta,
.node-card .spouse {
  font-size: 12px; color: var(--ink-2); line-height: 1.4;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 世代标签：弱描边 + 金色文字，避免实底块过于抢眼 */
.node-card .gen-tag {
  flex: none;
  font-size: 11px; line-height: 1.5; padding: 0 5px;
  border-radius: 3px; letter-spacing: .02em;
  background: color-mix(in srgb, var(--accent) 10%, transparent);
  color: var(--accent); font-weight: 700;
  border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
}
/* 页码标签：中性灰弱化，区别于金色世代/身份标签，供核对原谱时对照页码 */
.node-card .pg-tag {
  background: color-mix(in srgb, var(--ink-2) 14%, transparent);
  color: var(--ink-2);
  border: 1px solid color-mix(in srgb, var(--ink-2) 26%, transparent);
  font-weight: 600;
}
.node-card .node-badge {
	  position: absolute; right: -6px; top: -6px; z-index: 5;
	  width: 20px; height: 20px; border-radius: 50%;
	  background: var(--accent);
	  color: var(--btn-solid-text); font-size: var(--fs-xs, 12px); font-weight: 700;
	  display: flex; align-items: center; justify-content: center;
	  box-shadow: 0 1px 4px rgba(0,0,0,.25);
	}
	.node-card .badge-noheir { background: var(--state-err); }
	.node-card .badge-married { background: var(--sex-f, #ec4899); }
	.node-card .badge-husband { background: #14b8a6; }
	/* P1：树上提案状态角标（议=进行中，冲=冲突） */
	.node-card .badge-proposal { left: -6px; right: auto; top: -6px; width: auto; min-width: 18px; padding: 0 4px; border-radius: 9px; font-size: 10px; background: var(--state-warn, #d99a2b); color: #fff; }
	.node-card .badge-proposal.conflict { background: var(--state-err, #ef4444); }
	.node-card .badge-adopted { width: 28px; border-radius: 7px; font-size: 11px; background: #8b5cf6; }
	/* 待核：挂左上角，避开右上角身份徽标（乏 / 适 / 出嗣），两者可同时出现。
	   琥珀色 + 问号，表示「这条还没跟原书对上」，不是错误、只是待确认。 */
	.node-card .badge-pending {
	  right: auto; left: -6px; top: -6px;
	  width: 17px; height: 17px; font-size: 11px;
	  background: var(--state-warn);
		  box-shadow: 0 1px 4px color-mix(in srgb, var(--state-warn) 35%, transparent);
	}
	.node-card .spouse-secondary { font-style: italic; }
	.node-card .spouse-secondary i { display: inline-block; font-style: normal; font-size: 11px; background: rgba(255,255,255,.08); color: var(--ink-2); padding: 0 4px; border-radius: 3px; margin-left: 2px; border: 1px solid rgba(255,255,255,.06); }
/* 性别：圆角胶囊 = 女，方角 = 男（形状冗余，不依赖颜色） */
.node.female .node-card { border-radius: 999px; padding-left: 12px; padding-right: 12px; }
.node.female .node-card .name { color: color-mix(in srgb, var(--sex-f) 85%, var(--ink)); }
.node.male   .node-card { border-radius: 4px; }
/* 性别符号：♂/♀ 作为形状和颜色之外的第三重冗余编码，色觉障碍用户同样可辨 */
.node-card .gender-icon { font-size: 13px; margin-left: 3px; opacity: 0.85; }
.node.female .node-card .gender-icon { color: var(--sex-f, #ec4899); }
.node.male   .node-card .gender-icon { color: var(--sex-m, #54a0ff); }
/* 疑似幻觉：模型在该页文字层找不到此名。灰字+斜体+「?」徽标，只打标不删除，待站主对照原谱判读。 */
.node.hallu .node-card { filter: saturate(.45) brightness(.96); }
.node.hallu .node-card .name { color: var(--ink-2); font-style: italic; }
.node-card .badge-hallu {
  right: auto; left: -6px; top: 14px;
  width: 17px; height: 17px; font-size: 11px;
  background: #9aa7b5;
  box-shadow: 0 1px 4px rgba(154,167,181,.3);
}
/* [P226] 角标统一为「胶囊行」：旧实现是 20×20 固定圆点（待核 17×17），
   两字标签必然溢出被裁；现在改成自适应宽度、同排不换行、最多 3 个，
   其余收进 +N（title 里列全）。右缘只外挂 6px，仍在 --node-gap(14px) 内。 */
.node-card .node-badges{
  position:absolute; right:-6px; top:-9px; z-index:5;
  display:flex; align-items:center; gap:3px; max-width:calc(100% + 12px);
}
.node-card .node-badges .node-badge{
  position:static; left:auto; right:auto; top:auto; transform:none;
  width:auto; min-width:0; height:auto; min-height:17px;
  padding:0 5px; border-radius:9px;
  font-size:10.5px; font-weight:700; line-height:17px; white-space:nowrap;
  box-shadow:0 1px 4px rgba(0,0,0,.25);
}
.node-card .node-badges .badge-broken{ padding:0 7px; border-radius:11px; background:var(--state-err,#ff2d55); }
.node-card .node-badges .badge-pending{ background:var(--state-warn); }
.node-card .node-badges .badge-hallu{ background:#9aa7b5; }
.node-card .node-badges .badge-same{ background:color-mix(in srgb,var(--ink-2) 70%,#333); color:#fff; }
.node-card .node-badges .badge-ok{ background:#16b577; color:#fff; }
.node-card .node-badges .badge-more{ background:var(--card-border); color:var(--ink); }
.tt-hallu{background:color-mix(in srgb,#9aa7b5 12%,transparent);border:1px solid color-mix(in srgb,#9aa7b5 40%,transparent);border-radius:6px;padding:8px 10px;margin-bottom:8px}
.tt-hallu b{color:#b9c4d0;font-size:12px;letter-spacing:.03em}
.lod-far .node-card .gender-icon { display: none; }
	.lod-min .node-card .gender-icon { display: none; }

/* ── 缩放分级降级（LOD）：缩小时藏细节，避免糊成一团 ── */
.lod-far .node-card .sub { display: none; }
.lod-min .node-card .gen-tag,
	.lod-min .node-card .sub { display: none; }
	.lod-min .node-card { padding: 3px 6px; }
	.lod-min .node-card .name { font-size: 13px; }
	/* lod 时去掉顶部高光线，避免线条太粗占空间 */
	.lod-far .node-card,
	.lod-min .node-card { border-top-width: 1.5px; }

/* ── 世系连线 ────────────────────────────────────────────────
   连线是「理解亲属关系所必需的图形」，按 WCAG 1.4.11 需 ≥3:1。
   原 stroke:var(--line-c) 实测只有 1.16~1.31:1，几乎看不见
   （用户能看到，只是因为线穿过节点时在节点面上才有对比）。
   现用「页面底色 45% + 文字色 55%」自动混合，四套主题下 3.34~5.35:1。 */
.lines .tree-link {
  fill: none;
  stroke: var(--border-2);                                        /* 回退 */
  stroke: color-mix(in srgb, var(--bg) 45%, var(--ink));
  stroke-linecap: round; stroke-linejoin: round;
  stroke-width: 2.4; vector-effect: non-scaling-stroke;           /* 加粗 + 缩放不变细，缩小也看得见 */
}
/* 推断父系连线：这条父子关系是程序按世代/坐标/子女数「猜」出来的，不是谱上读到的。
   用琥珀色虚线 + 半透明，和确认父系（实线）一眼区分开。 */
.lines .tree-link-inferred {
  stroke: var(--accent);
  stroke: color-mix(in srgb, var(--bg) 40%, var(--state-warn, #d98a1f));
  stroke-dasharray: 5 4;
  stroke-width: 2.4; vector-effect: non-scaling-stroke;
  opacity: .8;
}
/* 实时重叠检测：把当前布局里真正压在一起的卡片描红边，供肉眼核对 */
.node.ovl .node-card { outline: 2px solid var(--state-err); outline-offset: 1px; box-shadow: 0 0 0 2px color-mix(in srgb, var(--state-err) 35%, transparent); }
/* 点击高亮：点亮某人 + 其直系祖先链 + 其子女，其余淡出 */
#treeContent.hl-on .node:not(.hl) { opacity: .12; }
#treeContent.hl-on .tree-link:not(.hl) { opacity: .05; }
#treeContent.hl-on .gen-band, #treeContent.hl-on .gen-label { opacity: .12; }
.node.hl .node-card { outline: 2px solid var(--accent); outline-offset: 1px; box-shadow: 0 0 12px var(--accent-glow); }
.tree-link.hl { stroke-width: 3.6 !important; opacity: 1 !important; }

/* ── 长线点击跳转（点到线的另一端）──
   长度≥JUMP_LEN 的父子线在其上方叠一条透明加粗的「命中层」：只响应鼠标、不显示，
   鼠标悬上去变手型，提示这条线可点。 */
.lines .tree-link-hit {
  fill: none;
  stroke: transparent;
  stroke-width: 14;
  pointer-events: stroke;
  cursor: pointer;
}
/* 跳转瞬间点亮这条线本身：只加粗提亮，颜色由 JS 换成彩虹渐变（见 ensureRainbow/highlightEdge），
   不再写死黄色——黄色会与部分家庭线色重复，不醒目（用户反馈）。 */
.tree-link.jump-hl { stroke-width: 4.5 !important; opacity: 1 !important; }
/* 命中层悬停时给底下真线一点提示（可选的轻提示，避免误以为线坏了） */
.lines .tree-link-hit:hover + .tree-link { stroke-width: 3.4; }

/* ── 跳转方向提示：电流沿导线跑 ──
   亮头(circle)+已走过的彩虹线段(path 渐进绘制)从出发端流向目标端，方向一目了然。
   颜色由 JS 换成彩虹渐变。 */
.lines .tree-link-charge {
  fill: none;
  stroke-width: 4;
  stroke-linecap: round;
  vector-effect: non-scaling-stroke;
  pointer-events: none;
}
.lines .tree-link-head { fill:#fff; pointer-events:none; }
.lines .tree-link-halo { fill:none; stroke:#fff; stroke-width:2; opacity:.35; pointer-events:none; }

/* ── 跳转落点卡片：外边框彩虹辉光循环，几秒后由 JS 摘掉恢复原样 ──
   用 box-shadow+border-color 循环变色实现（border-image 不支持圆角，故不用）。 */
@keyframes rainbowCardGlow {
  0%   { border-color:#ff5f6d; box-shadow:0 0 14px 2px rgba(255,95,109,.85); }
  17%  { border-color:#ff9f43; box-shadow:0 0 14px 2px rgba(255,159,67,.85); }
  33%  { border-color:#ffe14d; box-shadow:0 0 14px 2px rgba(255,225,77,.85); }
  50%  { border-color:#5bd66a; box-shadow:0 0 14px 2px rgba(91,214,106,.85); }
  67%  { border-color:#4db8ff; box-shadow:0 0 14px 2px rgba(77,184,255,.85); }
  83%  { border-color:#8f7bff; box-shadow:0 0 14px 2px rgba(143,123,255,.85); }
  100% { border-color:#e26bff; box-shadow:0 0 14px 2px rgba(226,107,255,.85); }
}
.node .node-card.jump-rainbow {
  animation: rainbowCardGlow 1.6s linear infinite;
  border-width: 2px;
}
/* 扩散圆环（locateMe/跳转两端都用）：从 0.4 倍放大到 1.6 倍并淡出 */
@keyframes ringExpand {
  from { transform:scale(.4); opacity:.9; }
  to   { transform:scale(1.6); opacity:0; }
}

/* ── 回到视图：防止拖丢后无处可去 ── */
.recenter {
  position: fixed; left: 50%; bottom: 84px; transform: translateX(-50%);
  z-index: 95; display: none;
  padding: 10px 20px; border-radius: 999px;
  background: var(--accent); color: var(--btn-solid-text);
  border: none; font-family: inherit; font-size: 13px; font-weight: 600;
  cursor: pointer; box-shadow: var(--shadow-md);
  min-height: 44px;
}
.recenter.show { display: block; }
.recenter:hover { filter: brightness(1.08); }
.gen-band { position:absolute; left:-2000px; right:-2000px; pointer-events:none; border-radius: 4px; }
@keyframes fadeSlide { from{opacity:0;transform:translateY(6px) scale(.97)} to{opacity:1;transform:translateY(0) scale(1)} }
.node.fade-in { animation:fadeSlide .25s cubic-bezier(.22,.61,.36,1) both; }

/* 提示 */
.tooltip { position:fixed; z-index:999; padding:14px 16px; background:var(--header-bg); backdrop-filter:blur(20px); border:1px solid var(--card-border); border-radius: 8px; font-size:14px; color:var(--text); pointer-events:none; opacity:0; transition:opacity .15s; max-width:380px; min-width:240px; line-height:1.7; box-shadow:0 12px 34px rgba(0,0,0,.40); }
.tt-name{font-family:var(--ff-title,"Noto Serif SC",serif);font-size:18px;font-weight:700;color:var(--ink);letter-spacing:1.5px}
.tt-rel{margin-top:4px;font-size:14px;font-weight:700;color:var(--accent)}
.tt-meta{margin-top:3px;font-size:12px;color:var(--ink-3)}
.tt-row{display:flex;gap:10px;margin-top:6px;font-size:13px;line-height:1.65}
.tt-k{flex:none;width:38px;color:var(--ink-3);font-size:12px;padding-top:1px}
.tt-v{color:var(--ink);min-width:0;word-break:break-all}
.tt-note{margin-top:8px;padding-top:7px;border-top:1px solid var(--card-border);font-size:12px;color:var(--ink-3);line-height:1.55}
.tooltip.show { opacity:1; }

/* 关系面板 */
.relation-panel { position:fixed; bottom:60px; left:50%; transform:translateX(-50%); z-index:90; max-width:420px; width:90%; padding:10px 14px; background:var(--header-bg); backdrop-filter:blur(20px); border:1px solid var(--accent-dim); border-radius: 7px; font-size:12px; color:var(--text); pointer-events:none; opacity:0; transition:opacity .3s,transform .3s; box-shadow:var(--shadow-drop); line-height:1.6; }
.relation-panel.show { opacity:1; pointer-events:auto; }
.relation-panel .rp-title { font-weight:600; font-size:13px; color:var(--accent); margin-bottom:4px; }
.relation-panel .rp-body { color:var(--ink-2); font-size:11px; }
.relation-panel .rp-close { float:right; background:none; border:none; color:var(--ink-2); cursor:pointer; font-size:14px; padding:0 4px; pointer-events:auto; }
/* 人物注记 / 生平：完整展示，长文本可展开（不再只给悬停一句） */
.relation-panel { max-height:64vh; overflow:auto; }
.relation-panel .rp-bio, .relation-panel .rp-note { margin-top:6px; line-height:1.6; white-space:normal; word-break:break-word; }
.relation-panel .rp-long { max-height:66px; overflow:hidden; }
.relation-panel .rp-long.open { max-height:none; }
.relation-panel .rp-more { margin-top:2px; background:none; border:none; padding:0; color:var(--accent); font-size:11px; cursor:pointer; pointer-events:auto; }
.relation-panel .rp-edit { margin-top:8px; pointer-events:auto; }
.relation-panel .rp-close:hover { color:var(--text); }

/* 加载 */
.loading { position:fixed; inset:0; z-index:200; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px; transition:opacity .4s; background:var(--bg); }
.loading.hide { opacity:0; pointer-events:none; }
.loading .spinner { width:28px; height:28px; border:2px solid var(--border-1); border-top-color:var(--accent); border-radius:50%; animation:spin .7s linear infinite; }
@keyframes spin { to{transform:rotate(360deg)} }
.loading p { font-size:12px; color:var(--ink-2); }

@media (max-width:600px) {
  /* 站主令 09-06 晚：顶部横幅窄屏完整显示（边框不越界、允许换行），徽标列下移避让，世代标签避开缩放按钮
     10-03：横幅位置改由 polish.css 统一管（贴底），此处原 top:54px 会压住世系图上方节点，故移除。
     仅保留窄屏字号与内边距微调。 */
  .family-note { white-space:normal !important; line-height:1.55; }
  #demoBadges { top:132px !important; }
  .gen-labels { right:46px; }
  .header { padding:0 10px; }
  .header-l .count { display:none; }
  /* .header-l .sub 的窄屏显示统一由文末 tree-design-system 管理（此处不再重复定义） */
  .stats, .search-box { display:none; }
  .toolbar { right:8px; }
  /* 工具条按钮尺寸统一由文末 tree-design-system 管理（此处不再重复定义） */
  /* F1: 修图例挤压——「始祖 / 我」不再折行、术语按钮不被压扁，整体限宽两行整齐排布 */
  .legend { bottom:10px; left:8px; right:8px; transform:none; max-width:none; width:auto; padding:6px 10px; gap:5px 10px; flex-wrap:wrap; justify-content:center; border-radius:12px; }
  .legend-item { white-space:nowrap; flex:0 0 auto; font-size:11px; gap:4px; }
  .legend-item[style] { padding-left:8px !important; margin-left:0 !important; }
  .gloss-btn { flex:0 0 auto; white-space:nowrap; font-size:11px; padding:3px 8px; }
  .header-r .btn { padding:0 6px; font-size:10px; }
  .header-r .sep { display:none; }
}

/* ── 申请修订面板：底部横排抽屉（原为右侧竖条，字段太窄不好编辑）── */
.edit-panel{position:fixed;left:12px;right:12px;bottom:12px;top:auto;width:auto;max-width:1180px;margin:0 auto;z-index:300;background:var(--header-bg);backdrop-filter:blur(20px);border:1px solid var(--card-border);border-radius: 9px;box-shadow:0 18px 46px rgba(0,0,0,.5);display:none;font-size:13px}
.edit-panel.show{display:block}
.ep-head{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid var(--card-border);font-weight:700;color:var(--accent);font-family:var(--ff-title,"Noto Serif SC",serif);letter-spacing:1px}
.ep-head button{background:none;border:none;color:var(--ink-3);font-size:15px;cursor:pointer}
.ep-body{padding:10px 16px;max-height:34vh;overflow:auto;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px 18px;align-content:start}
.ep-row{margin-bottom:0;min-width:0}
.ep-row>label{display:block;color:var(--ink-3);font-size:11px;margin-bottom:3px}
.ep-row input[type=text],.ep-row input[type=number],.ep-row select,.ep-row textarea{width:100%;box-sizing:border-box;padding:5px 9px;border-radius: 6px;border:1px solid var(--card-border);background:var(--card);color:var(--ink);font-size:13px;font-family:inherit}
.ep-row textarea{min-height:42px;resize:vertical}
/* 长字段跨两列，编辑起来更舒展 */
.ep-row:is(#epNote,#epReason,#epOrderPreview,#epConfirmRow),
.ep-row:has(textarea),.ep-row:has(.ep-preview){grid-column:1/-1}
.ep-inline{display:flex;gap:14px;align-items:center;flex-wrap:wrap;color:var(--ink-2);font-size:12px}
.ep-inline label{display:flex;align-items:center;gap:4px;cursor:pointer}
.ep-order-item{display:flex;justify-content:space-between;align-items:center;padding:5px 8px;margin-bottom:4px;background:var(--card);border-radius: 6px;font-size:12px;color:var(--ink)}
.ep-order-item.me{color:var(--accent);font-weight:700}
.ep-order-item button{border:none;background:transparent;color:var(--ink-3);cursor:pointer;padding:0 5px;font-size:13px}
.ep-order-item button:hover:not(:disabled){color:var(--accent)}
.ep-order-item button:disabled{opacity:.3;cursor:default}
.ep-foot{padding:9px 16px;border-top:1px solid var(--card-border);display:flex;flex-direction:column;gap:6px}
.ep-foot button{padding:8px;border-radius: 6px;border:1px solid var(--accent);background:var(--accent-dim);color:var(--accent);font-weight:600;cursor:pointer;font-family:inherit;font-size:13px}
.ep-foot button:hover{background:var(--accent);color:var(--bg)}
/* 快速添加行：单行横排不换行，小号按钮；删除钮靠右 */
.ep-add-row{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;border-top:1px dashed var(--card-border)}
.ep-add-row .ep-add-label{color:var(--ink-3);font-size:11px;white-space:nowrap}
.ep-add-row button{padding:5px 10px;border-radius: 4px;border:1px solid var(--card-border);background:transparent;color:var(--ink-2);font-weight:500;font-size:12px;white-space:nowrap}
.ep-add-row button:hover{color:var(--accent);border-color:var(--accent)}
.ep-add-row .ep-del{margin-left:auto;border-color:color-mix(in srgb, var(--state-err) 45%, transparent);color:var(--state-err)}
.ep-tip{font-size:11px;color:var(--ink-3);line-height:1.5}
.ep-toast{position:fixed;left:50%;bottom:84px;transform:translateX(-50%);z-index:400;padding:11px 22px;border-radius: 999px;background:var(--accent);color:var(--btn-solid-text);font-size:13px;font-weight:600;box-shadow: var(--shadow-drop);opacity:0;transition:opacity .3s;pointer-events:none}
.ep-toast.show{opacity:1}

/* ── 修改模式（表单编辑，不拖拽） ── */
.header-r .btn.editing{background:var(--accent);color:var(--btn-solid-text);border-color:var(--accent);font-weight:700}
body.edit-mode .node{cursor:pointer}
body.edit-mode .node:hover{outline:2px dashed var(--accent);outline-offset:3px}
.ep-row select{width:100%;padding:6px 9px;border-radius: 6px;border:1px solid var(--card-border);background:var(--card);color:var(--ink);font-size:13px;font-family:inherit}
.ep-hint{font-size:11px;color:var(--ink-3);background:var(--card);padding:7px 10px;border-radius: 6px;margin-bottom:12px;line-height:1.65}
.ep-hint b{color:var(--ink-2);font-weight:600}
.ep-order-edit{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.ep-order-edit input[type=number]{width:74px;padding:6px 9px;border-radius: 6px;border:1px solid var(--card-border);background:var(--card);color:var(--ink);font-size:13px;font-family:inherit}
.ep-quick{display:flex;gap:4px}
.ep-quick button{padding:5px 10px;border-radius: 4px;border:1px solid var(--card-border);background:transparent;color:var(--ink-2);font-size:12px;cursor:pointer;font-family:inherit}
.ep-quick button:hover{color:var(--accent);border-color:var(--accent)}
.ep-preview{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:6px 8px;background:var(--card);border-radius: 6px}
.ep-chip{padding:3px 8px;border-radius: 4px;background:var(--chip-bg);font-size:12px;color:var(--ink-2);white-space:nowrap}
.ep-chip.on{background:var(--accent-dim);color:var(--accent);font-weight:700}
.ep-arrow{color:var(--ink-3);font-size:11px}
.ep-muted{color:var(--ink-3);font-size:11px}
.ep-auth{font-size:11px;padding:7px 10px;border-radius: 6px;margin-bottom:11px;line-height:1.6}
.ep-auth.no{background:color-mix(in srgb, var(--state-err) 10%, transparent);color:var(--state-err)}
.ep-auth.ok{background:color-mix(in srgb, var(--state-ok) 10%, transparent);color:var(--state-ok)}
.ep-auth button{margin-left:6px;padding:2px 8px;border-radius: 5px;border:1px solid currentColor;background:transparent;color:inherit;font-size:11px;cursor:pointer;font-family:inherit}
/* 编辑面板：两列紧凑字段 + 直接保存主按钮 + 快速添加行 */
.ep-2col{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.ep-2col label{display:block}
.ep-row textarea{width:100%;min-height:44px;resize:vertical}
.ep-foot .ep-primary{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:var(--btn-solid-text);border:none;font-weight:600}
.ep-add-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;border-top:1px dashed var(--card-border)}
.ep-add-label{font-size:11px;color:var(--ink-3)}
/* 待核解释块（tooltip 顶部）+ 确认按钮 */
.tt-pending{background:color-mix(in srgb, var(--state-warn) 10%, transparent);border:1px solid color-mix(in srgb, var(--state-warn) 35%, transparent);border-radius: 6px;padding:8px 10px;margin-bottom:8px}
.tt-pending b{color:var(--state-warn);font-size:12px;letter-spacing:.03em}
.tt-pending-body{font-size:12px;color:var(--ink);line-height:1.6;margin:4px 0}
.tt-pending-act{font-size:11px;color:var(--ink-2);line-height:1.5;border-top:1px dashed rgba(217,119,6,.3);padding-top:6px;margin-top:6px}
.ep-confirm-row{align-items:center;gap:10px;flex-wrap:wrap;background:color-mix(in srgb, var(--state-warn) 7%, transparent);border:1px dashed color-mix(in srgb, var(--state-warn) 35%, transparent);border-radius: 7px;padding:8px 10px}
.ep-confirm-ok{background:linear-gradient(135deg,var(--state-warn),color-mix(in srgb, var(--state-warn) 70%, #000));color:var(--btn-solid-text);border:none;border-radius: 6px;padding:6px 12px;font-size:12px;cursor:pointer;font-family:inherit;font-weight:600}
.ep-confirm-ok:hover{opacity:.9}
.ep-confirm-undo{background:transparent;color:var(--ink-2);border:1px solid var(--border-2);border-radius: 6px;padding:6px 12px;font-size:12px;cursor:pointer;font-family:inherit}
.ep-confirm-undo:hover{border-color:var(--accent);color:var(--accent)}
/* 内嵌模式（iframe）：隐去页头与顶部提示条，画布占满。
   别动 .toolbar —— 它是 right:16px;top:50%;translateY(-50%) 的固定定位，改 top 会把它顶飞。 */
.embed .header{display:none}
.embed .family-note{display:none}

/* ===== mobile nav ===== */
@media(max-width:500px) {
  .head .mbtn { display:flex;align-items:center;gap:4px;padding:8px 12px;border-radius: 6px;border:1px solid var(--line);background:var(--card);cursor:pointer;transition:all .3s;font-size:14px;color:var(--ink);z-index:1001; }
  .head .mbtn:hover { border-color:var(--accent);color:var(--accent);background:var(--accent-glow); }
  .head nav { display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:var(--bg);z-index:1000;flex-direction:column;align-items:center;justify-content:center;gap:24px;animation:fadeIn .3s ease; }
  .head nav.open { display:flex; }
  .head nav a { font-size:20px;padding:12px 24px;transition:all .3s; }
  .head nav a:hover { transform:scale(1.1);color:var(--accent); }
  .head .search-wrap { display:none; }
  .head .theme-toggler { display:none; }
  .head .login { display:none; }
}
@keyframes fadeIn { from{opacity:0;transform:scale(.95)} to{opacity:1;transform:scale(1)} }
/* N4（2026-10-10）：系统级「减少动态效果」——动画/过渡/流光全部压到瞬态 */
@media (prefers-reduced-motion: reduce) {
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
}
/* P225（2026-11-03）原页查看器：近全屏、工具条不压图、可翻页/缩放/拖动 */
.pgv{position:fixed;inset:0;z-index:320;display:flex;flex-direction:column;background:rgba(4,8,16,.94);backdrop-filter:blur(6px);color:#e9edf5}
.pgv.hidden{display:none}
.pgv .hidden{display:none !important}
.pgv-bar{flex:0 0 auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 14px;background:rgba(15,22,36,.92);border-bottom:1px solid rgba(255,255,255,.12)}
.pgv-btn{appearance:none;border:1px solid rgba(255,255,255,.18);background:rgba(255,255,255,.06);color:#e9edf5;border-radius:6px;padding:6px 10px;font-size:13px;line-height:1.2;cursor:pointer}
.pgv-btn:hover{background:rgba(255,255,255,.14)}
.pgv-btn:disabled{opacity:.35;cursor:not-allowed}
.pgv-title{font-weight:700;font-size:14px;letter-spacing:.5px;max-width:32vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pgv-meta{font-size:12px;color:#9fb0c9;max-width:30vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pgv-jump{display:flex;align-items:center;gap:4px;font-size:12px;color:#cfdae9}
.pgv-jump input{width:58px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.2);color:#fff;border-radius:5px;padding:4px 6px;text-align:center}
.pgv-zoom{display:flex;align-items:center;gap:4px;margin-left:auto}
.pgv-pct{min-width:46px;text-align:center;font-size:12px;color:#cfdae9}
.pgv-raw{color:#8fc7ff;font-size:12px;text-decoration:none;white-space:nowrap}
.pgv-raw:hover{text-decoration:underline}
.pgv-close{margin-left:2px}
.pgv-stage{flex:1 1 auto;position:relative;overflow:hidden;padding:14px;display:flex;align-items:center;justify-content:center;touch-action:none;cursor:grab}
.pgv-stage:active{cursor:grabbing}
.pgv-canvas{transform-origin:center center;will-change:transform}
.pgv-canvas img{display:block;max-width:none;max-height:none;user-select:none;-webkit-user-drag:none;background:#fff;box-shadow:0 10px 40px rgba(0,0,0,.55)}
.pgv-msg{position:absolute;inset:14px;display:none;align-items:center;justify-content:center;text-align:center;font-size:14px;line-height:1.9;color:#cfdae9;background:rgba(8,12,20,.62);border:1px dashed rgba(255,255,255,.18);border-radius:8px;padding:20px}
.pgv-msg.show{display:flex}
@media (max-width:720px){
  .pgv-bar{gap:6px;padding:8px 10px}
  .pgv-title{max-width:100%;font-size:13px}
  .pgv-meta{display:none}
  .pgv-zoom{margin-left:0;width:100%;justify-content:flex-start;flex-wrap:wrap}
  .pgv-stage{padding:8px}
  .pgv-raw{font-size:11px}
}
