/* 小过 xiaoguo.vip — 站点样式（白色 · 苹果风 · 克制精致） */
:root{
  --bg:#ffffff;
  --bg-soft:#fbfbfd;        /* 苹果浅灰分区 */
  --panel:#ffffff;
  --panel-2:#f5f5f7;
  --line:#e3e3e6;
  --line-strong:#d2d2d7;
  --text:#1d1d1f;           /* 近黑 */
  --text-dim:#6e6e73;      /* 次级灰 */
  --text-mute:#86868b;      /* 说明灰 */
  --accent:#0a9b6e;         /* 品牌代谢绿（克制版） */
  --accent-press:#087a57;
  --blue:#0071e3;           /* 苹果蓝，用于强调按钮 */
  --warn:#b25000;           /* 免责橙 */
  --radius:18px;
  --maxw:1000px;
  --shadow:0 4px 20px rgba(0,0,0,.06);
  font-size:15px;            /* 整体偏小，对标苹果 */
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;background:var(--bg);color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro","PingFang SC","Helvetica Neue",Helvetica,Arial,"Microsoft YaHei",sans-serif;
  line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
a{color:var(--accent);text-decoration:none}
a:hover{color:var(--accent-press)}
img{max-width:100%}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 22px}

/* 导航 */
header.nav{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.8);backdrop-filter:saturate(180%) blur(20px);border-bottom:1px solid var(--line)}
.nav .wrap{display:flex;align-items:center;justify-content:space-between;height:52px}
.brand{display:flex;align-items:baseline;gap:9px;font-weight:600;font-size:16.5px;letter-spacing:.2px;color:var(--text);white-space:nowrap}
.brand .dot{display:none}
/* 「郭小过 • 健康代谢可视化」：• 分隔符用品牌绿点缀，文字略收小以适配更长的主名 */
/* 分隔符：黑色（原品牌绿），并用负 margin 抵消 .brand 的 flex gap:9px ——
   否则 9px(gap) + 3px(margin) 两侧各撑到 12px，看起来间距过大。*/
.brand .sep{color:var(--text);font-weight:600;margin:0 -2px;transform:translateY(-1px);font-size:15px}
.brand small{font-weight:400;color:var(--text-mute);font-size:10.5px;letter-spacing:1.1px;line-height:1}
nav.links{display:flex;gap:24px;font-size:14px}
nav.links a{color:var(--text-dim)}
nav.links a:hover,nav.links a.active{color:var(--text)}
.nav-toggle{display:none;background:none;border:0;color:var(--text);font-size:20px;cursor:pointer}

/* Hero */
.hero{padding:76px 0 64px;text-align:center}
.hero .badge{display:inline-block;font-size:12px;letter-spacing:1px;color:var(--text-mute);border:1px solid var(--line);padding:5px 13px;border-radius:999px;margin-bottom:20px}
.hero-inner{max-width:820px;margin:0 auto}
/* 段落与标题的各自样式（不含定位/宽度）*/
.hero h1{font-size:40px;font-weight:600;letter-spacing:-.02em;margin-top:0;margin-bottom:22px;line-height:1.12}
.hero p.lead{font-size:15px;color:var(--text-dim);margin-top:0;margin-bottom:30px;font-weight:400;line-height:1.85}
/* h1 与 lead 共用一条左沿：给两者同一个「居中列」宽度，各自在列内左对齐。
   之前 h1 是整块居中（文字被居中在块中央），lead 是左对齐，
   两者左沿天然差 33.6px —— 这正是「没对齐」的原因。
   列宽取两者较宽者（lead 420px），列整体 margin:auto 居中，
   于是 h1 左沿 = lead 左沿 = 列左沿，且整块仍居中。
   ⚠️ 本规则必须放在上面两条之后：h1 的 margin shorthand 会把 auto 重置为 0。
   2026-09-18：列宽 420 → 520px。原因：lead 共 6 行硬换行，不折行需要 510px，
   420px 会把其中 2 行挤成 8 行。加宽后 6 行各占一行。*/
.hero h1,.hero p.lead{width:520px;max-width:100%;margin-left:auto;margin-right:auto;text-align:left}
/* 桌面端：lead 的 6 行不再自动折行（窄屏仍允许，否则会横向溢出） */
@media (min-width:900px){.hero p.lead{white-space:nowrap}}
.hero-actions{display:flex;gap:10px;align-items:center;justify-content:center}

/* 按钮（苹果胶囊） */
.btn{display:inline-flex;align-items:center;gap:7px;padding:11px 22px;border-radius:980px;font-size:15px;font-weight:500;cursor:pointer;border:1px solid transparent;transition:.18s}
.btn.primary{background:var(--accent);color:#fff}
.btn.primary:hover{background:var(--accent-press);color:#fff}
.btn.ghost{background:transparent;border-color:var(--line-strong);color:var(--text)}
.btn.ghost:hover{border-color:var(--text);color:var(--text)}
.btn.mini{background:var(--accent);color:#fff;border:1px solid var(--accent);padding:5px 13px;font-size:12px;border-radius:999px;font-weight:500;letter-spacing:.2px}
.btn.mini:hover{background:var(--accent-press);color:#fff}

/* 区块 */
.section{padding:64px 0}
.section.soft{background:var(--bg-soft)}
.section h2{font-size:30px;font-weight:600;letter-spacing:-.01em;margin:0 0 6px}
.section .sub{color:var(--text-dim);margin:0 0 34px;font-size:16px}

/* 栅格 */
.grid{display:grid;gap:22px}
.grid.cols-2{grid-template-columns:repeat(2,1fr)}
.grid.cols-3{grid-template-columns:repeat(3,1fr)}

/* 大图卡片 */
.feature{background:var(--panel);border:1px solid var(--line);border-radius:0;overflow:hidden;display:flex;flex-direction:column;transition:.2s}
.feature:hover{box-shadow:var(--shadow);transform:translateY(-2px)}
.feature .thumb{height:220px;background:var(--panel-2) center/cover no-repeat;position:relative}
.feature .thumb::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent,rgba(255,255,255,.15))}
/* 简化图（16:9 深色底）：完整显示，不裁切 */
.feature .thumb.fit{height:auto;aspect-ratio:16/9;background-size:contain;background-repeat:no-repeat;background-position:center}
.feature .thumb.fit::after{background:none}
.feature .label{position:absolute;left:18px;bottom:14px;z-index:2;font-weight:600;font-size:18px;color:#fff;text-shadow:0 1px 8px rgba(0,0,0,.4)}
.feature .label span{display:block;font-weight:400;font-size:12.5px;color:rgba(255,255,255,.85)}
.feature .body{padding:18px 20px 22px;flex:1;display:flex;flex-direction:column;gap:14px}
.feature .body p{margin:0;color:var(--text-dim);font-size:14.5px}

/* 平台入口 */
.platforms{display:flex;flex-wrap:wrap;gap:12px;justify-content:center}
.platform{display:flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:11px 16px;color:var(--text);min-width:140px;transition:.18s}
.platform:hover{box-shadow:var(--shadow)}
.platform b{font-size:15px;font-weight:500}
.platform i{font-style:normal;color:var(--accent);font-size:12.5px}

/* 查看器 */
.viewer-head{margin-bottom:16px}
.viewer-head h1{font-size:34px;font-weight:600;letter-spacing:-.01em;margin:0}
.viewer-head p{margin:8px 0 0;color:var(--text-dim);max-width:100%;font-size:15px}
/* 舞台高度按图自身比例决定，不再用固定 74vh —— 固定高度会在小屏裁掉地图、大屏留白。
   map 为 8000x5000（1.6:1），stage 宽度受 --maxw 限制（1000-44=956px），
   故高度只需 956/1.6 = 597.5px 就能完整显示；aspect-ratio 让它随宽度自动换算。*/
.stage{position:relative;background:var(--panel-2);border:1px solid var(--line);border-radius:0;overflow:hidden;aspect-ratio:8000/5000;height:auto;min-height:0;cursor:default}
/* 非全屏时不允许任何鼠标/触摸操作（仅按钮），全屏内才开放抓取光标 */
.stage.is-fs{cursor:grab}
/* 暗色底图版（透明模型图专用）：背景固定在 stage 上，随图片缩放时保持不动、不糊 */
.stage.with-bg{
  background:#241b12 url("../assets/bg.webp") center / cover no-repeat;
  border-color:#3a2f22;
}
.stage.grabbing{cursor:grabbing}
.stage .canvas{position:absolute;top:0;left:0;transform-origin:0 0;will-change:transform}
.stage .canvas img{display:block;width:100%;height:auto;user-select:none;-webkit-user-drag:none}

/* ── 全屏查看（小过代谢地图）────────────── */
/* 全屏：解除宽高比约束，改为铺满视口 */
.stage:fullscreen,.stage.fs-fallback{aspect-ratio:auto;border-radius:0;border:0;width:100vw;height:100vh;max-height:none;background:#101012}
.stage.fs-fallback{position:fixed;inset:0;z-index:999}

/* 全屏浮动控制条（仅在全屏内显示，由 viewer.js 注入到 stage 内） */
.xg-fs-tools{
  position:absolute;top:14px;right:14px;z-index:20;
  display:none;align-items:center;gap:8px;
  background:rgba(20,16,12,.62);backdrop-filter:blur(8px);
  border:1px solid rgba(255,255,255,.16);border-radius:980px;padding:6px 8px;
}
.xg-fs-tools button{
  background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.18);
  color:#fff;padding:6px 12px;border-radius:999px;cursor:pointer;
  font-size:13px;line-height:1;font-family:inherit;white-space:nowrap;
}
.xg-fs-tools button:hover{background:rgba(255,255,255,.22)}

/* ── 能量模型：固定窗口 · 无圆角 · 序列帧动画 ── */
/* 2026-09-18：模型动画换成 3840x2400（1.6:1）分层素材，舞台比例同步改 1.6 */
.stage.solid{border-radius:0;cursor:default;aspect-ratio:3840/2400;height:auto;min-height:0;max-height:none;overflow:hidden}
/* 图层栈（自下而上）：anim-wrap 2 < hot-layer 3 < tag-layer 4 < tag-note 5 < title-layer 7 < unit-pop 8
   title-layer 是模型名称图，须压在模型与标签之上，故用 z-index 而非 DOM 顺序保证；
   但 unit-pop（弹窗）必须再压过它，否则标题文字会盖在弹窗内容上。 */
/* 标签层跟随新画幅 1.6 非等比铺满（旧素材按 1.5753 绘制，实测两版按百分比对应） */
.stage.solid .title-layer{position:absolute;inset:0;z-index:7;pointer-events:none;background:url(../assets/title.webp) center center / 100% 100% no-repeat}
.stage.solid .anim-wrap{position:absolute;inset:0;z-index:2}
.stage.solid .anim-wrap img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;user-select:none;-webkit-user-drag:none}
.stage.solid .anim-wrap img.anim{z-index:2}
/* ── 分层动画层（由 js/frames.js 动态插入）：底色 1 < 流动 2 < 火焰 3 ──
   所有层都用「全画板尺寸 + object-fit:contain」，与舞台同一坐标系，天然对齐，无需对位。
   火焰是位图，可用 fire-spot 的百分比框定位到画布局部以省体积。 */
.stage.solid .anim-wrap img.layer-base{z-index:1}
.stage.solid .anim-wrap img.layer-flow{z-index:2}
/* 分层模式：裁剪后的层用百分比定位铺在自己的内容框里（不 inset:0） */
.stage.solid .anim-wrap img.layer-rect{inset:auto;object-fit:fill;pointer-events:none}
.stage.solid .anim-wrap .fire-spot{position:absolute;z-index:3;pointer-events:none;background-repeat:no-repeat;background-size:100% 100%}

/* ── 模型单元标签（可点击 · 弹出解释框）──────── */
/* ── 标签位置编辑器（仅在编辑模式出现）────────────── */
.stage.show-grid{background-image:
  linear-gradient(rgba(255,255,255,.07) 1px,transparent 1px),
  linear-gradient(90deg,rgba(255,255,255,.07) 1px,transparent 1px),
  linear-gradient(rgba(255,255,255,.16) 1px,transparent 1px),
  linear-gradient(90deg,rgba(255,255,255,.16) 1px,transparent 1px);
  background-size:40px 40px,40px 40px,200px 200px,200px 200px;
  background-position:center center;
}
.stage.editing .unit-tag{cursor:move;box-shadow:0 0 0 2px rgba(255,255,255,.75),0 4px 14px rgba(0,0,0,.4)}
.stage.editing .unit-tag:hover{background:#000;color:#fff;border-color:#000;transform:translate(6px,-100%)}
.stage.editing .unit-tag.above:hover{transform:translate(-50%,-100%)}
/* 拖动中：关掉一切过渡，位置跟手 */
.stage.editing .unit-tag.dragging{transition:none !important;will-change:left,top}
.stage.editing .unit-tag.dragging{opacity:.92;box-shadow:0 0 0 3px #fff,0 8px 22px rgba(0,0,0,.5)}
.editor-bar{
  position:fixed;left:0;right:0;bottom:0;z-index:9999;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  background:rgba(20,16,12,.95);color:#f2ede6;
  border-top:1px solid rgba(255,255,255,.18);
  padding:10px 16px;font-size:12.5px;
  box-shadow:0 -6px 24px rgba(0,0,0,.4);
}
.editor-bar[hidden]{display:none}
.editHide{}
.editor-bar .eb-title{font-weight:600;color:#fff;margin-right:6px;letter-spacing:.3px}
.editor-bar button{
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);
  color:#fff;padding:5px 12px;border-radius:999px;cursor:pointer;font-size:12px;
  transition:.15s;font-family:inherit;
}
.editor-bar button:hover{background:rgba(255,255,255,.24)}
.editor-bar button.on{background:var(--accent);border-color:var(--accent)}
.editor-bar .eb-tip{color:rgba(255,255,255,.5);font-size:11.5px;margin-left:4px}
.editor-bar .eb-out{
  flex-basis:100%;margin-top:6px;padding:8px 10px;white-space:pre-wrap;
  background:rgba(0,0,0,.4);border:1px solid rgba(255,255,255,.14);
  border-radius:6px;color:#bfe9d5;font-family:ui-monospace,Consolas,monospace;
  font-size:11.5px;line-height:1.7;max-height:130px;overflow:auto;
  user-select:text;
}
/* 编辑模式下给底部工具条让位 */
body.xg-editing{padding-bottom:104px}
/* 导出坐标弹窗 */
.eb-modal{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;padding:24px}
.eb-modal-box{width:min(560px,100%);background:#1a1613;border:1px solid rgba(255,255,255,.2);padding:16px 18px 14px;color:#f2ede6}
.eb-modal-hd{font-size:13px;font-weight:600;margin-bottom:10px;letter-spacing:.3px}
.eb-modal-ta{width:100%;height:230px;background:rgba(0,0,0,.45);border:1px solid rgba(255,255,255,.18);color:#bfe9d5;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.75;padding:10px;resize:vertical;outline:none}
.eb-modal-ft{display:flex;gap:8px;justify-content:flex-end;margin-top:12px}
.eb-modal-ft button{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);color:#fff;padding:6px 16px;border-radius:999px;cursor:pointer;font-size:12.5px;font-family:inherit}
.eb-modal-ft button:hover{background:rgba(255,255,255,.26)}

.tag-note{position:absolute;left:14px;top:12px;z-index:5;font-size:11.5px;color:rgba(255,255,255,.72);background:rgba(20,14,8,.5);padding:4px 10px;border-radius:999px;pointer-events:none;backdrop-filter:blur(4px)}
.tag-layer{position:absolute;inset:0;z-index:4;pointer-events:none}
/* 设备本体热区：点设备即弹介绍（不可见，只做命中） */
.hot-layer{position:absolute;inset:0;z-index:3}
.unit-hot{position:absolute;display:block;background:transparent;border:0;padding:0;margin:0;cursor:pointer;border-radius:0;transition:background .18s}
.unit-hot:hover{background:rgba(58,168,128,.10)}
.unit-hot:focus-visible{outline:1px solid rgba(58,168,128,.7);outline-offset:-1px}
/* 编辑模式下热区不挡拖动、不显示悬停底色 */
.stage.editing .hot-layer{pointer-events:none}
.stage.editing .unit-hot:hover{background:transparent}
.unit-tag{
  position:absolute;
  display:inline-flex;align-items:center;
  background:#111;color:#fff;border:1px solid #111;border-radius:0;
  padding:2px 7px;
  font-size:11px;font-weight:500;letter-spacing:.3px;line-height:1.4;
  white-space:nowrap;cursor:pointer;pointer-events:auto;
  box-shadow:0 2px 6px rgba(0,0,0,.42);
  transition:background .14s,color .14s,border-color .14s;
}
/* 默认锚点：设备右上角（translate 把标签摆在锚点右上，不遮设备本体）*/
.unit-tag{transform:translate(6px,-100%);margin-top:-6px}
/* 三个火炉：正上方居中 */
.unit-tag.above{transform:translate(-50%,-100%);margin-top:-8px}
.unit-tag:hover{background:#000;border-color:#000}
.unit-tag.above:hover{transform:translate(-50%,-100%)}
.unit-tag.on{background:#fff;color:#111;border-color:#111}
/* z-index:8 —— 必须高于 .title-layer(7)。title-layer 是 inset:0 铺满整个舞台的
   模型名称图，虽然大部分透明，但文字笔画是不透明的；若弹窗压在它下面，标题文字会
   盖在弹窗内容上（实测「肌糖原」和三个灶的弹窗都与标题文字区重叠 165x20px），
   看起来像渲染错误。弹窗是临时 UI，必须永远在最上层。 */
.unit-pop{
  position:absolute;z-index:8;width:284px;max-width:calc(100% - 24px);
  background:rgba(24,18,12,.96);color:#f2ede6;
  border:1px solid rgba(255,255,255,.16);
  border-radius:0;padding:14px 16px 15px;
  box-shadow:0 10px 34px rgba(0,0,0,.5);
  font-size:13px;line-height:1.75;pointer-events:auto;
}
.unit-pop h4{margin:0 0 3px;font-size:14.5px;font-weight:600;color:#fff;letter-spacing:.2px}
.unit-pop .en{display:block;font-size:10.5px;color:rgba(255,255,255,.45);letter-spacing:.6px;margin-bottom:9px;text-transform:uppercase}
.unit-pop p{margin:0 0 8px}
.unit-pop p:last-child{margin-bottom:0}
.unit-pop b{color:#5fe0a8;font-weight:600}
.unit-pop .kv{display:flex;gap:8px;margin:7px 0 0;padding-top:8px;border-top:1px solid rgba(255,255,255,.12)}
.unit-pop .kv div{flex:1}
.unit-pop .kv small{display:block;color:rgba(255,255,255,.45);font-size:10px;margin-bottom:2px}
.unit-pop .kv b{display:block;font-size:13px;color:#fff;font-weight:600}
.unit-pop .close{
  position:absolute;top:8px;right:8px;width:20px;height:20px;border:0;
  background:rgba(255,255,255,.1);color:#fff;border-radius:50%;
  font-size:13px;line-height:1;cursor:pointer;display:grid;place-items:center;padding:0;
}
.unit-pop .close:hover{background:rgba(255,255,255,.22)}
@media (max-width:860px){
  .unit-tag{font-size:10.5px;padding:2px 6px}
  .unit-pop{width:240px;font-size:12px}
}
.viewer-bar{display:flex;gap:10px;align-items:center;margin:14px 0 30px;flex-wrap:wrap}
.viewer-bar .seg{display:inline-flex;gap:1px;background:var(--panel-2);border:1px solid var(--line);border-radius:980px;padding:3px}
.viewer-bar button{background:transparent;border:0;color:var(--text-dim);padding:4px 10px;border-radius:980px;cursor:pointer;font-size:12.5px;line-height:1.5}
.viewer-bar button:hover{color:var(--text)}
.viewer-bar button.on{background:var(--accent);color:#fff}

/* 分层讲解 */
.explain{display:grid;gap:12px;max-width:820px}
.node{border:1px solid var(--line);border-radius:14px;background:var(--panel);overflow:hidden}
.node summary{cursor:pointer;padding:15px 18px;display:flex;align-items:center;gap:12px;font-size:16px;font-weight:500;list-style:none}
.node summary::-webkit-details-marker{display:none}
.node summary .num{width:26px;height:26px;flex:none;border-radius:8px;display:grid;place-items:center;background:var(--accent);color:#fff;font-size:13px;font-weight:600}
.node summary .chev{margin-left:auto;color:var(--text-mute);transition:.2s}
.node[open] summary .chev{transform:rotate(90deg)}
.node .txt{padding:0 18px 18px 56px;color:var(--text-dim);font-size:15px}
.node .txt ul{margin:8px 0;padding-left:20px}
.tag{display:inline-block;font-size:12px;color:var(--accent);border:1px solid var(--line);padding:2px 9px;border-radius:999px;margin-left:8px}

/* 视频卡片 */
.videocard{background:var(--panel);border:1px solid var(--line);border-radius:0;overflow:hidden;transition:.2s}
.videocard:hover{box-shadow:var(--shadow)}
.videocard .ph{height:190px;background:linear-gradient(135deg,#f5f5f7,#ececef);display:grid;place-items:center;color:var(--text-mute);font-size:14px}
.videocard .body{padding:14px 16px}
.videocard .body b{font-size:16px;font-weight:500}
.videocard .body span{display:block;color:var(--text-mute);font-size:13.5px;margin-top:4px}
.videocard .src{display:inline-block;margin-top:10px;font-size:12.5px;color:var(--accent)}

/* 关于/留言 */
.disclaimer{border:1px solid rgba(178,80,0,.25);background:rgba(178,80,0,.06);border-radius:14px;padding:18px 20px;color:#7a3a00;font-size:14.5px}
.disclaimer b{color:var(--warn)}
.form{display:grid;gap:14px;max-width:560px}
.form input,.form textarea{width:100%;background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;color:var(--text);padding:12px 14px;font-size:15px;font-family:inherit;transition:.15s}
.form input:focus,.form textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(10,155,110,.12)}
.form textarea{min-height:120px;resize:vertical}
.form .ok{display:none;color:var(--accent);font-size:14px}
.contact{display:flex;flex-wrap:wrap;gap:12px;margin-top:6px}
.contact .item{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 16px}
.contact .item small{display:block;color:var(--text-mute);font-size:12px}
.contact .item b{font-size:15px;font-weight:500}

/* 页脚 */
footer.ft{margin-top:64px;border-top:1px solid var(--line);background:var(--bg-soft);padding:30px 0;color:var(--text-mute);font-size:12.5px}
.ft .wrap{display:flex;flex-direction:column;gap:8px;align-items:center;text-align:center}
.ft a{color:var(--text-dim)}

/* 移动端提醒 */
.mobile-tip{display:none;background:rgba(0,113,227,.08);border:1px solid rgba(0,113,227,.2);color:#0058b0;padding:12px 16px;border-radius:12px;margin-bottom:18px;font-size:14px}
@media (max-width:860px){
  .grid.cols-2,.grid.cols-3{grid-template-columns:1fr}
  nav.links{display:none;position:absolute;top:52px;left:0;right:0;background:rgba(255,255,255,.96);flex-direction:column;padding:14px 22px;border-bottom:1px solid var(--line)}
  nav.links.open{display:flex}
  .nav-toggle{display:block}
  .hero h1{font-size:30px}
  .mobile-tip{display:block}
  /* 移动端同样按地图比例（58vh 固定高会在窄屏裁掉上下）*/
  .stage{aspect-ratio:8000/5000;height:auto;min-height:0}
}
