:root{
  /* 墨绿自然杂志色系 */
  --ink:#2c3e2d; --ink-2:#4a5d4b; --ink-3:#7a8a7b; --ink-4:#a5b0a6;
  /* 纸白背景 */
  --paper:#fafaf7; --paper-2:#f2f2ed; --paper-3:#e8e8e2;
  --line:#d4d4cc; --line-2:#bfbfb5;
  /* 主色：自然绿 */
  --accent:#5a7a5c; --accent-light:#e8f0e8; --accent-bg:rgba(90,122,92,.1);
  --warm:#f5f0e6;
  --raise:#ffffff;
  /* 收集玩法专用色：朱砂（与种树绿色系区分） */
  --cinnabar:#b03a2e; --cinnabar-soft:rgba(176,58,46,.08);
  /* 阴影 */
  --shadow:0 2px 12px rgba(44,62,45,.08), 0 8px 32px rgba(44,62,45,.06);
  --shadow-lg:0 4px 20px rgba(44,62,45,.1), 0 12px 48px rgba(44,62,45,.08);
  /* 字体 */
  --f-display:"Georgia","Noto Serif SC","Songti SC",serif;
  --f-body:-apple-system,BlinkMacSystemFont,"PingFang SC","Helvetica Neue",sans-serif;
  /* Tab高度 */
  --tab-h:72px;
  --page-gutter:16px;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;margin:0;padding:0}
html,body{height:100%;overflow:hidden}
*{touch-action:pan-y}
body{
  font-family:var(--f-body);color:var(--ink);
  background:#e8e8e2;
  display:flex;align-items:center;justify-content:center;
}
/* 手机宽度下 App 铺满整屏，body 只在 iOS 状态条那条带子里露出来；
   带子颜色比页面纸白深，iOS 在交界处羽化就成了一条灰→白的渐变，所以这里跟页面同色 */
@media (max-width:1280px){body{background:var(--paper)}}
/* ---------- App 容器 ---------- */
.app{
  position:relative;width:100%;max-width:1280px;min-height:0;height:100vh;height:100dvh;
  background:var(--paper);overflow:hidden;
  display:flex;flex-direction:column;
}
.screen{position:absolute;inset:0;display:flex;flex-direction:column;overflow:hidden}

/* ---------- 页头 ---------- */
.head{
  flex:0 0 auto;padding:max(14px, env(safe-area-inset-top)) 16px 12px;
  background:var(--paper);position:relative;z-index:10;
}
.hrow{display:flex;align-items:center;justify-content:space-between;gap:16px}
.app-icon{display:block;flex:0 0 auto;object-fit:contain;border-radius:22%}
.hrow h2{
  font-family:var(--f-display);font-size:28px;font-weight:400;
  letter-spacing:-.02em;color:var(--ink);line-height:1.1;
}
.form-page-title{font-size:20px!important;font-weight:700!important}

/* ---------- 树种筛选条 ---------- */
.focus{display:flex;align-items:center;gap:8px;margin-top:12px;padding:6px 7px 6px 12px;
  background:var(--paper-2);border-radius:12px;border:1px solid var(--line)}
.focus .lbl{font-size:10.5px;color:var(--ink-4);letter-spacing:.04em;flex:0 0 auto}
.focus .nm{flex:1;font-size:13px;color:var(--ink);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.focus button{width:24px;height:24px;border:0;border-radius:8px;cursor:pointer;flex:0 0 auto;
  background:var(--raise);color:var(--ink-3);display:grid;place-items:center;transition:.16s}
.focus button:active{transform:scale(.9)}
.focus button svg{width:12px;height:12px}

/* ---------- 视图设置入口（弱化为右上角单按钮） ---------- */
.viewbtn{
  width:36px;height:36px;border-radius:12px;border:1px solid var(--line);
  background:var(--raise);color:var(--ink-3);cursor:pointer;flex:0 0 auto;
  display:grid;place-items:center;transition:.2s;
}
.viewbtn.on{background:var(--accent-bg);color:var(--accent);border-color:rgba(90,122,92,.35)}
.viewbtn svg{width:17px;height:17px}

/* ---------- 视图设置浮层 ---------- */
.viewlayer{position:absolute;inset:0;z-index:35;pointer-events:none}
.viewmask{position:absolute;inset:0;pointer-events:auto;background:rgba(44,62,45,.06)}
.viewpop{
  position:absolute;left:var(--page-gutter);top:calc(max(14px, env(safe-area-inset-top)) + 78px);
  width:320px;max-width:calc(100% - 2 * var(--page-gutter));pointer-events:auto;
  background:rgba(255,255,255,.88);
  backdrop-filter:blur(30px) saturate(1.6);-webkit-backdrop-filter:blur(30px) saturate(1.6);
  border:1px solid rgba(255,255,255,.65);border-radius:20px;padding:6px 14px;
  box-shadow:0 12px 40px rgba(44,62,45,.16), 0 2px 8px rgba(44,62,45,.08);
  animation:popIn .22s cubic-bezier(.34,1.4,.5,1);
}
@keyframes popIn{from{opacity:0;transform:scale(.94) translateY(-8px)}to{opacity:1;transform:none}}
.vp-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 2px}
.vp-row + .vp-row{border-top:1px solid var(--line)}
.vp-lbl{font-size:11px;color:var(--ink-4);font-weight:500;letter-spacing:.08em;flex:0 0 auto}
.vp-seg{display:flex;background:var(--paper-2);border-radius:12px;padding:3px;gap:2px}
.vp-seg button{
  font:inherit;font-size:12px;font-weight:500;padding:6px 10px;border:0;border-radius:9px;
  background:transparent;color:var(--ink-3);cursor:pointer;transition:.18s;white-space:nowrap;
  display:inline-flex;align-items:center;justify-content:center;gap:4px;
}
.vp-seg button.on{background:var(--raise);color:var(--accent);font-weight:600;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.vp-seg button svg{width:14px;height:14px;flex:0 0 auto}

/* ---------- 滚动区 ---------- */
.body{
  flex:1;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;
  padding:0 16px calc(var(--tab-h) + 24px + env(safe-area-inset-bottom,0px));
  scrollbar-width:none;
}
.body::-webkit-scrollbar{display:none}

/* 我的页独占：刪了页头后依然要保顶部安全区（免凹刘海机顶到书衣卡） */
.me-body{padding-top:max(14px,env(safe-area-inset-top))}

/* ---------- 图鉴分页与下拉刷新 ---------- */
.head-actions{display:flex;gap:8px;flex:0 0 auto}
.head-actions .viewbtn{width:44px;height:44px}
.album-body{min-height:0;overscroll-behavior-y:none}
.pull-refresh{
  flex:0 0 auto;display:flex;align-items:center;justify-content:center;
  overflow:hidden;color:var(--ink-2);font-size:12px;background:var(--paper-2);
}
.album-footer{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 0 8px;color:var(--ink-2);font-size:12px;text-align:center}
.album-footer:empty{display:none}
.album-footer .btn{min-height:44px;min-width:128px}
.album-footer p{line-height:1.6;overflow-wrap:anywhere}
.head-actions button:focus-visible,.album-footer button:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* ---------- 图鉴顶部：地图入口与筛选按钮同排 ---------- */
.album-map-entry{
  flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;height:44px;padding:0 12px 0 10px;
  border:1px solid rgba(255,255,255,.08);border-radius:14px;cursor:pointer;font:inherit;
  background:linear-gradient(135deg,#2c3e2d 0%,#3d5a3e 58%,#4d6b4d 100%);color:#fff;
  box-shadow:0 6px 18px rgba(44,62,45,.18),inset 0 1px 0 rgba(255,255,255,.06);
  transition:transform .16s ease,box-shadow .16s ease;
}
.album-map-entry:active{transform:scale(.97)}
.album-map-entry:focus-visible{outline:2px solid rgba(44,62,45,.45);outline-offset:2px}
.ame-ic{display:grid;place-items:center;color:#fff;opacity:.9}
.ame-ic svg{width:16px;height:16px}
.ame-label{font-size:13px;font-weight:600;letter-spacing:.02em;color:#fff;white-space:nowrap}
@media(max-width:359px){
  .album-map-entry{padding:0 10px;gap:5px}
  .ame-label{font-size:12.5px;letter-spacing:0}
}

/* ---------- 图鉴搜索：纸白输入区与墨绿结果摘要 ---------- */
.album-search{margin-top:16px;max-width:720px}
.search-fields{display:grid;grid-template-columns:84px minmax(0,1fr) auto;gap:8px;align-items:center}
.search-fields input,.search-fields select{
  width:100%;min-width:0;min-height:44px;padding:10px 12px;
  font:inherit;font-size:16px;line-height:22px;color:var(--ink);
  background:var(--raise);border:1px solid var(--line);border-radius:12px;
}
.search-fields select{padding:10px 6px;cursor:pointer}
.search-fields input::placeholder{color:var(--ink-3)}
.search-fields input:focus,.search-fields select:focus{outline:2px solid var(--accent);outline-offset:2px}
.search-fields .btn{min-height:44px;padding:10px 14px;border-radius:12px;white-space:nowrap;box-shadow:none}
.search-hint{margin-top:8px;font-size:12px;line-height:1.6;color:var(--ink-2)}
.search-summary{
  display:flex;align-items:center;gap:12px;max-width:720px;margin-top:12px;
  padding:6px 8px 6px 12px;border-left:2px solid var(--accent);
  border-radius:0 12px 12px 0;background:var(--accent-light);
}
.search-description{flex:1;min-width:0}
.search-description span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;color:var(--ink)}
.search-description small{display:block;margin-top:4px;font-size:12px;line-height:1.5;color:var(--ink-2)}
.search-summary button{
  flex:0 0 auto;min-width:44px;min-height:44px;padding:8px;border:0;border-radius:10px;
  font:inherit;font-size:13px;color:var(--ink-2);background:transparent;cursor:pointer;
}
.search-summary button:hover{background:var(--raise)}
.search-summary button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.search-empty .btn{display:inline-flex;min-height:44px;margin:0 4px 8px}
@media(max-width:359px){
  .search-fields{grid-template-columns:76px minmax(0,1fr) auto;gap:6px}
  .search-fields input{padding-inline:8px}
  .search-fields .btn{padding-inline:12px}
}

/* ---------- 图鉴筛选面板与标签条 ---------- */
.album-filter{margin-top:16px;max-width:720px}
.filter-fields{display:flex;flex-direction:column;gap:12px}
.filter-row{display:flex;align-items:center;gap:12px}
.filter-label{font-size:12px;color:var(--ink-3);flex:0 0 36px;letter-spacing:.04em}
.filter-row select{
  flex:1;min-width:0;min-height:44px;padding:10px 12px;
  font:inherit;font-size:15px;line-height:22px;color:var(--ink);
  background:var(--raise);border:1px solid var(--line);border-radius:12px;cursor:pointer;
}
.filter-row select:focus{outline:2px solid var(--accent);outline-offset:2px}
.filter-grade-seg{display:flex;background:var(--paper-2);border-radius:12px;padding:3px;gap:2px;flex:1}
.filter-grade-seg button{
  font:inherit;font-size:13px;font-weight:500;padding:8px 0;border:0;border-radius:9px;
  background:transparent;color:var(--ink-3);cursor:pointer;transition:.18s;flex:1;white-space:nowrap;
}
.filter-grade-seg button.on{background:var(--raise);color:var(--accent);font-weight:600;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.filter-actions{
  display:flex;align-items:center;gap:8px;margin-top:14px;
}
.filter-count{flex:1;font-size:12px;color:var(--ink-2)}
.filter-actions .btn{min-height:40px;padding:8px 14px;font-size:13px}
.filter-tags{
  display:flex;flex-wrap:wrap;align-items:center;gap:8px;max-width:720px;margin-top:12px;
  padding:6px 8px 6px 12px;border-left:2px solid var(--accent);
  border-radius:0 12px 12px 0;background:var(--accent-light);
}
.filter-tag{
  display:inline-flex;align-items:center;gap:4px;
  padding:4px 8px 4px 10px;background:var(--raise);border-radius:8px;
  font-size:12px;color:var(--ink);border:1px solid var(--line);
}
.ft-lbl{white-space:nowrap;max-width:100px;overflow:hidden;text-overflow:ellipsis}
.filter-tag button{
  width:20px;height:20px;border:0;border-radius:6px;cursor:pointer;
  background:transparent;color:var(--ink-3);display:grid;place-items:center;padding:0;
  transition:.16s;
}
.filter-tag button:hover{background:var(--paper-2)}
.filter-tag button svg{width:10px;height:10px}
.filter-tags small{font-size:12px;color:var(--ink-2);margin-left:auto;white-space:nowrap}
@media(max-width:359px){
  .filter-row{gap:8px}
  .filter-label{flex:0 0 30px;font-size:11px}
  .filter-grade-seg button{font-size:12px;padding:6px 0}
}

/* ---------- 分组标题 ---------- */
.grp{display:flex;align-items:baseline;gap:12px;padding:20px 0 12px}
.grp .t{
  font-family:var(--f-display);font-size:18px;color:var(--ink);
  letter-spacing:-.01em;font-weight:400;font-style:italic;
}
.grp .c{
  font-size:11px;color:var(--ink-4);letter-spacing:.04em;
  text-transform:uppercase;font-weight:500;
}
.grp .rule{flex:1;height:1px;background:var(--line)}

/* ---------- 密视图网格 ---------- */
.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.cell{
  position:relative;cursor:pointer;background:var(--raise);
  border-radius:14px;overflow:hidden;
  box-shadow:0 1px 4px rgba(44,62,45,.06), 0 4px 16px rgba(44,62,45,.04);
  transition:transform .2s, box-shadow .2s;
}
.cell:active{transform:scale(.97);box-shadow:0 1px 4px rgba(44,62,45,.08)}
.cell .ph{
  width:100%;aspect-ratio:3/4;overflow:hidden;
  background:var(--paper-2);position:relative;
}
.cell .ph img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .4s}
.cell:hover .ph img{transform:scale(1.03)}
.cell .info{padding:8px 10px 10px}
.cell .nm{
  font-size:13px;font-weight:500;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.cell .sub{font-size:11px;color:var(--ink-4);margin-top:3px}
.record-location{margin-top:6px;font-size:12px;line-height:1.6;color:var(--ink-3);overflow-wrap:anywhere;display:flex;flex-wrap:wrap;align-items:baseline;gap:4px}
.cell .record-location{font-size:11px;margin-top:4px}
.record-location .location-place{color:var(--ink-2)}
.record-location .location-region{color:var(--ink-3)}
.badge{
  position:absolute;top:10px;right:10px;min-width:22px;height:22px;padding:0 6px;
  border-radius:11px;background:rgba(255,255,255,.88);color:var(--accent);
  font-size:11px;font-weight:600;display:grid;place-items:center;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
}

/* 留白格 */
.cell.blank{
  background:transparent;border:1.5px dashed var(--line);
  box-shadow:none;display:flex;align-items:center;justify-content:center;
  min-height:200px;
}
.cell.blank .ph,.cell.blank .info{display:none}
.cell.blank::after{
  content:'+';font-size:28px;color:var(--line-2);font-weight:300;
}

/* 名树格 */
.cell.named{
  background:var(--accent-light);border:1px solid rgba(90,122,92,.15);
  box-shadow:none;display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:200px;
}
.cell.named .ph,.cell.named .info{display:none}
.cell.named .nmtxt{
  writing-mode:vertical-rl;font-family:var(--f-display);
  font-size:16px;color:var(--accent);letter-spacing:.3em;
}
.cell.named .named-label{
  font-size:10px;color:var(--ink-4);margin-top:12px;letter-spacing:.06em;
}

/* ---------- 疏视图 ---------- */
.sparse{display:flex;flex-direction:column;gap:20px}
.card{
  background:var(--raise);border-radius:18px;overflow:hidden;
  box-shadow:var(--shadow);cursor:pointer;transition:transform .2s;
}
.card:active{transform:scale(.985)}
.card .cw{position:relative;background:var(--paper-2)}
.card .cw img{width:100%;aspect-ratio:3/2;object-fit:cover;display:block}
.card .multi{
  position:absolute;right:12px;bottom:12px;
  background:rgba(0,0,0,.45);color:#fff;
  font-size:11px;padding:4px 10px;border-radius:12px;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
}
.card .info{padding:12px 14px 14px}
.card .nmt{font-family:var(--f-display);font-size:20px;font-weight:400;letter-spacing:-.01em}
.card .age-tag{font-size:12px;color:var(--ink-3);margin-left:8px;font-family:var(--f-body);font-weight:400}
.card .l2{font-size:12px;color:var(--ink-3);margin-top:6px;letter-spacing:.02em}

.card .note{
  font-size:14px;color:var(--ink-2);line-height:1.6;margin-top:12px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}

/* ---------- 骨架屏 ---------- */
@keyframes sk-shimmer{
  0%{background-position:-200% 0}
  100%{background-position:200% 0}
}
.sk{
  border-radius:6px;
  background:linear-gradient(90deg,var(--paper-2) 20%,#fff 50%,var(--paper-2) 80%);
  background-size:200% 100%;
  animation:sk-shimmer 2.2s ease-in-out infinite;
}
.sk-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.sk-cell{
  border-radius:14px;overflow:hidden;background:var(--raise);
  box-shadow:0 1px 4px rgba(44,62,45,.06),0 4px 16px rgba(44,62,45,.04);
}
.sk-cell .sk-ph{width:100%;aspect-ratio:3/4}
.sk-cell .sk-lines{padding:10px}
.sk-cell .sk-line{height:12px;margin-bottom:6px}
.sk-cell .sk-line:last-child{margin-bottom:0;width:60%}
.sk-sparse{display:flex;flex-direction:column;gap:20px}
.sk-card{
  border-radius:18px;overflow:hidden;background:var(--raise);
  box-shadow:var(--shadow);
}
.sk-card .sk-ph{width:100%;aspect-ratio:3/2}
.sk-card .sk-lines{padding:14px}
.sk-card .sk-line{height:16px;margin-bottom:8px}
.sk-card .sk-line:nth-child(2){width:45%;height:12px}
.sk-card .sk-line:last-child{width:75%;height:12px}
.sk-load-more{width:100%;padding:0 16px}
.sk-load-bar{height:4px;border-radius:2px;margin-bottom:12px}

/* ---------- 图片加载淡入 ---------- */
.cell .ph,.card .cw{
  background:linear-gradient(90deg,var(--paper-2) 20%,#fff 50%,var(--paper-2) 80%);
  background-size:200% 100%;
  animation:sk-shimmer 2.2s ease-in-out infinite;
}
.cell .ph:has(img[data-state="ready"]:not([data-fading])),.cell .ph:has(img[data-state="error"]),
.card .cw:has(img[data-state="ready"]:not([data-fading])),.card .cw:has(img[data-state="error"]){
  animation:none;background:var(--paper-2);
}
.cell .ph img[data-state],.card .cw img[data-state]{
  opacity:0;transition:opacity .4s ease,transform .4s ease;transform:scale(1.02);
}
.cell .ph img[data-state="ready"],.card .cw img[data-state="ready"]{
  opacity:1;transform:scale(1);
}
.cell .ph img[data-state="error"],.card .cw img[data-state="error"]{
  opacity:1;transform:scale(1);
}

/* ---------- iOS 18 悬浮 Tab Bar ---------- */
.tabs-wrap{
  position:absolute;left:0;right:0;bottom:0;z-index:50;
  padding:0 12px calc(env(safe-area-inset-bottom,8px) + 8px);
  pointer-events:none;
}
.tabs{
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.86);
  backdrop-filter:blur(40px) saturate(1.8);
  -webkit-backdrop-filter:blur(40px) saturate(1.8);
  border:1px solid rgba(255,255,255,.5);
  border-radius:28px;
  padding:6px 8px;
  pointer-events:auto;
  box-shadow:
    0 2px 8px rgba(0,0,0,.04),
    0 8px 32px rgba(0,0,0,.08),
    inset 0 1px 0 rgba(255,255,255,.6);
  max-width:380px;
  margin:0 auto;
}
.tabs .t{
  flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;
  padding:8px 16px;border-radius:22px;cursor:pointer;
  transition:all .3s cubic-bezier(.4,0,.2,1);
  position:relative;
}
/* 未选中项压在照片上也要读得清：用墨绿二阶（白底 7:1），不靠透明度做层级 */
.tabs .t svg{width:24px;height:24px;color:var(--ink-2);transition:.25s}
.tabs .t span{
  font-size:12px;font-weight:500;color:var(--ink-2);
  letter-spacing:.02em;transition:.25s;
}
.tabs .t.on{background:var(--accent-bg)}
.tabs .t.on svg{color:var(--accent)}
.tabs .t.on span{color:var(--accent);font-weight:600}
.tabs .t:active{transform:scale(.92)}

/* ---------- Tab 中间新增按钮 ---------- */
.tabs .t.add{flex:0 0 68px;padding:0;margin:-24px 4px 0}
.tabs .t.add .addbtn{
  width:54px;height:54px;border-radius:50%;
  background:linear-gradient(145deg,#6d8f6f,#4a6a4c);color:#fff;
  display:grid;place-items:center;
  box-shadow:0 6px 18px rgba(74,106,76,.42), inset 0 1px 0 rgba(255,255,255,.28);
  transition:transform .18s;
}
.tabs .t.add:active{transform:none}
.tabs .t.add:active .addbtn{transform:scale(.9)}
.tabs .t.add svg{width:24px;height:24px;color:#fff}

/* ---------- 页面过渡 ---------- */
.page-enter{animation:pageIn .35s cubic-bezier(.4,0,.2,1)}
@keyframes pageIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}

/* ---------- 我的页 · 图鉴封面化（书样卡片含封面+目录） ---------- */
.book-card{
  position:relative;overflow:hidden;display:flex;flex-direction:column;
  width:100%;font:inherit;text-align:left;cursor:pointer;
  padding:22px 22px 18px;border-radius:20px;
  background:linear-gradient(135deg,#2c3e2d 0%,#3d5a3e 55%,#4d6b4d 100%);
  border:1px solid rgba(255,255,255,.08);
  box-shadow:0 10px 36px rgba(44,62,45,.22),inset 0 1px 0 rgba(255,255,255,.06);
  margin-top:4px;
  transition:transform .16s ease, box-shadow .16s ease;
}
.book-card:active{transform:scale(.985)}
.book-card:focus-visible{outline:2px solid rgba(255,255,255,.55);outline-offset:3px}
.book-card .bk-cover{
  display:flex;align-items:flex-start;justify-content:space-between;gap:16px;
}
.book-card .bk-t{
  font-family:var(--f-display);font-size:20px;color:#fff;
  letter-spacing:.01em;font-weight:400;line-height:1.2;
}
.book-card .bk-s{font-size:12px;color:rgba(255,255,255,.55);margin-top:6px}
.book-card .bk-r{
  display:flex;align-items:baseline;gap:3px;color:#fff;flex:0 0 auto;
  text-shadow:0 2px 8px rgba(0,0,0,.18);
}
.book-card .bk-r b{font-family:var(--f-display);font-size:42px;font-weight:400;line-height:.9}
.book-card .bk-r i{font-style:normal;font-size:13px;color:rgba(255,255,255,.6);margin-left:2px}

/* 封面 → 目录横向分隔 */
.book-card .bk-sep{
  height:1px;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.22) 18%,rgba(255,255,255,.22) 82%,transparent);
  margin:16px -22px 14px;
}

/* 目录区 */
.book-card .bk-cata{}
.book-card .bk-cata-head{
  display:flex;align-items:baseline;gap:10px;margin-bottom:10px;
}
.book-card .bk-cata-head .t{
  font-family:var(--f-display);font-size:14px;color:rgba(255,255,255,.85);
  font-weight:400;letter-spacing:.02em;
}
.book-card .bk-cata-head .c{
  font-size:10px;color:rgba(255,255,255,.45);letter-spacing:.06em;
  text-transform:uppercase;font-weight:500;
}
.book-card .bk-tags{display:flex;flex-wrap:wrap;gap:7px}
.book-card .bk-tag{
  font:inherit;cursor:pointer;
  border:1px solid rgba(255,255,255,.18);background:rgba(255,255,255,.06);
  color:#fff;border-radius:14px;padding:6px 13px;
  font-size:13px;font-weight:500;
  display:inline-flex;align-items:baseline;gap:6px;
  transition:background .16s,border-color .16s,transform .12s;
}
.book-card .bk-tag:hover{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.32)}
.book-card .bk-tag:active{transform:scale(.96)}
.book-card .bk-tag i{font-style:normal;font-size:11px;color:rgba(255,255,255,.7);font-weight:600}
.book-card .bk-tag.n3{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.4);font-weight:600}
.book-card .bk-tag.n3 i{color:#fff}

/* 空态（未有树种） */
.book-card .bk-cata-empty{
  display:flex;align-items:center;gap:8px;
  color:rgba(255,255,255,.55);font-size:13px;padding:2px 0;
}
.book-card .bk-cata-empty svg{flex:0 0 auto;opacity:.7}

.cloud{display:flex;flex-wrap:wrap;gap:8px;padding-top:4px}
.cloud .tag{
  font:inherit;cursor:pointer;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-2);
  border-radius:16px;padding:8px 16px;font-size:13px;font-weight:500;
  display:inline-flex;align-items:baseline;gap:6px;transition:.2s;
}
.cloud .tag:hover{border-color:var(--accent);color:var(--accent)}
.cloud .tag:active{transform:scale(.96)}
.cloud .tag i{font-style:normal;font-size:11px;color:var(--accent);font-weight:600}
.cloud .tag.n1{color:var(--ink-3);border-color:var(--line)}
.cloud .tag.n2{border-color:rgba(90,122,92,.3)}
.cloud .tag.n3{font-weight:600;color:var(--ink);border-color:var(--accent);background:var(--accent-light)}

.rows{border-top:1px solid var(--line)}
/* 标题组自带 .rule 横线，紧跟的 .rows 不再重复 border-top */
.grp + .rows{border-top:none}
.row{
  display:flex;padding:14px 2px;border-bottom:1px dotted rgba(44,62,45,.15);
  font-size:14px;align-items:baseline;
}
.row .k{width:80px;flex:0 0 auto;color:var(--ink-3);font-size:13px}
.row .v{flex:1;color:var(--ink);line-height:1.6}
.row .v em{font-style:normal;color:var(--ink-4);font-size:12px;margin-left:5px}

/* ---------- 详情页 ---------- */
.detail-scroll{padding:0}
.dgallery{min-width:0}
.dhead{position:relative}
.dslides,.dhead .empty{width:100%;aspect-ratio:3/4;max-height:60vh;max-height:60dvh;background:var(--paper-2)}
.dslides{
  display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;
  overscroll-behavior-x:contain;scrollbar-width:none;
}
.dslides::-webkit-scrollbar{display:none}
.dslides,.dslides *,.ths,.ths *{touch-action:pan-x pan-y pinch-zoom}
.dslide{
  flex:0 0 100%;min-width:0;width:100%;height:100%;object-fit:cover;object-position:center;display:block;
  scroll-snap-align:start;scroll-snap-stop:always;user-select:none;
}
.dhead .empty{display:grid;place-items:center;color:var(--ink-4);font-family:var(--f-display)}
.photo-nav{
  position:absolute;top:50%;transform:translateY(-50%);width:44px;height:44px;
  display:grid;place-items:center;border:0;border-radius:50%;cursor:pointer;
  background:rgba(0,0,0,.55);color:#fff;
}
.photo-prev{left:12px}
.photo-next{right:12px}
.photo-nav svg{width:20px;height:20px}
.photo-next svg{transform:rotate(180deg)}
.photo-nav[aria-disabled="true"]{opacity:.35;cursor:default}
.photo-nav:not([aria-disabled="true"]):hover{background:rgba(0,0,0,.75)}
.photo-count{
  position:absolute;right:16px;bottom:16px;padding:6px 12px;border-radius:12px;
  background:rgba(0,0,0,.65);color:#fff;font-size:12px;font-variant-numeric:tabular-nums;pointer-events:none;
}
.dslides:focus-visible,.photo-nav:focus-visible{outline:2px solid #fff;outline-offset:-4px}
.dbody{
  background:var(--paper);position:relative;padding:24px 24px 120px;
}
.dtitle-row{display:flex;align-items:flex-start;gap:10px}
.dtitle-row h2{flex:1 1 auto;min-width:0;font-family:var(--f-display);font-size:24px;margin:0 0 10px;font-weight:400;letter-spacing:-.01em}
/* 记录详情右上角：在地图上查看这棵树。只在有经纬度时出现 */
.detail-map-btn{
  flex:0 0 auto;width:38px;height:38px;margin-top:-2px;
  display:grid;place-items:center;cursor:pointer;
  border:1px solid var(--line);border-radius:12px;background:var(--raise);color:var(--accent);
  box-shadow:0 1px 6px rgba(44,62,45,.08);transition:transform .15s ease,background .15s ease,color .15s ease;
}
.detail-map-btn svg{width:18px;height:18px}
.detail-map-btn:active{transform:scale(.94);background:var(--accent);border-color:var(--accent);color:#fff}
.detail-map-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.dtags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:18px}
.dtag{
  font-size:13px;padding:4px 12px;border-radius:12px;
  background:var(--paper-2);color:var(--ink-2);letter-spacing:.02em;
}
.dtag-link{
  background:var(--accent-light);color:var(--accent);border:1px solid color-mix(in srgb,var(--accent) 25%,transparent);
  cursor:pointer;font-weight:500;transition:.18s;
}
.dtag-link:hover{background:color-mix(in srgb,var(--accent) 14%,var(--paper-2));border-color:color-mix(in srgb,var(--accent) 40%,transparent)}
.dtag-link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.note-blk{
  font-size:15px;line-height:1.8;color:var(--ink-2);
  padding:16px 18px;background:var(--warm);border-radius:12px;
  margin-top:16px;border-left:3px solid var(--accent);
}
.note-blk strong{display:block;font-size:13px;color:var(--ink-3);margin-bottom:6px;letter-spacing:.04em;text-transform:uppercase}
.note-blk.my-note{border-left-color:var(--ink-3);background:var(--paper-2)}
.card .note.my-note{font-style:italic;color:var(--ink-3)}
.ths{
  position:relative;display:flex;gap:8px;overflow-x:auto;padding:12px 16px 4px;
  scrollbar-width:none;overscroll-behavior-x:contain;
}
.ths::-webkit-scrollbar{display:none}
.photo-thumb{
  flex:0 0 64px;width:64px;height:64px;padding:2px;border-radius:10px;
  border:2px solid transparent;background:var(--paper-2);cursor:pointer;
}
.photo-thumb img{width:100%;height:100%;display:block;border-radius:6px;object-fit:cover}
.photo-thumb.on{border-color:var(--accent)}
.photo-thumb:hover{background:var(--accent-light)}
.photo-thumb:focus-visible{outline:2px solid var(--ink);outline-offset:1px}
.dslides{cursor:pointer}

/* 详情页：图片直接显示，骨架屏已提供加载反馈，不再叠加淡入 */

/* 详情页：数据加载骨架屏 */
.sk-detail{padding:0}
.sk-detail .sk-dgallery{padding:0}
.sk-detail .sk-dphoto{width:100%;aspect-ratio:3/4;max-height:60vh;max-height:60dvh;border-radius:0}
.sk-detail .sk-dbody{padding:24px 24px 80px}
.sk-detail .sk-dtitle{height:28px;width:45%;margin-bottom:14px}
.sk-detail .sk-dtags{display:flex;gap:8px;margin-bottom:20px}
.sk-detail .sk-dtag{height:26px;width:72px;border-radius:12px}
.sk-detail .sk-drow{display:flex;gap:12px;margin-bottom:12px;align-items:center}
.sk-detail .sk-dk{height:14px;width:52px;flex-shrink:0}
.sk-detail .sk-dv{height:14px;width:38%}
.sk-detail .sk-dnote{margin-top:20px;padding:16px 18px;border-radius:12px;background:var(--paper-2)}
.sk-detail .sk-dnote .sk-line{height:13px;margin-bottom:8px}
.sk-detail .sk-dnote .sk-line:last-child{width:65%;margin-bottom:0}

@media(min-width:768px){
  .sk-detail .sk-detail-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px;max-width:760px;margin:0 auto}
  .sk-detail .sk-dphoto{aspect-ratio:auto;height:50vh;height:50dvh;min-height:200px;max-height:520px;max-height:none;border-radius:14px}
  .sk-detail .sk-dbody{padding:24px var(--page-gutter)}
}

/* ---------- 大图预览 ---------- */
.lightbox{
  position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.95);
  display:flex;align-items:center;justify-content:center;
  opacity:0;transition:opacity .25s;
  overflow:hidden;touch-action:none;
}
.lightbox.on{opacity:1}
.lb-track{
  display:flex;align-items:center;width:100%;height:100%;
  will-change:transform;
}
.lb-track.lb-anim{transition:transform .28s cubic-bezier(.22,.61,.36,1)}
.lb-slide{
  flex:0 0 100%;min-width:0;height:100%;
  display:flex;align-items:center;justify-content:center;
}
.lb-img{
  max-width:98vw;max-height:94vh;max-height:94dvh;object-fit:contain;
  user-select:none;-webkit-user-drag:none;-webkit-touch-callout:none;
  touch-action:none;will-change:transform;
}
.lb-img.lb-anim{transition:transform .28s cubic-bezier(.22,.61,.36,1)}
.lb-close,.lb-nav{
  position:absolute;background:rgba(255,255,255,.12);border:0;border-radius:50%;
  color:#fff;cursor:pointer;display:grid;place-items:center;
  transition:background .2s;
}
.lb-close:hover,.lb-nav:hover{background:rgba(255,255,255,.25)}
.lb-close{top:max(16px,calc(env(safe-area-inset-top,0) + 12px));right:16px;width:44px;height:44px}
.lb-close svg{width:20px;height:20px}
.lb-nav{top:50%;transform:translateY(-50%);width:48px;height:48px}
.lb-prev{left:12px}
.lb-next{right:12px}
.lb-nav svg{width:22px;height:22px}
.lb-next svg{transform:rotate(180deg)}
.lb-nav[aria-disabled="true"]{opacity:.3;cursor:default}
.lb-nav:not([aria-disabled="true"]):hover{background:rgba(255,255,255,.3)}
.lb-count{
  position:absolute;bottom:max(24px,calc(env(safe-area-inset-bottom,0) + 16px));
  left:50%;transform:translateX(-50%);color:rgba(255,255,255,.8);
  font-size:14px;font-variant-numeric:tabular-nums;
}
.lb-close:focus-visible,.lb-nav:focus-visible{outline:2px solid #fff;outline-offset:2px}

/* ---------- 底部操作条 ---------- */
.actbar{
  position:absolute;left:0;right:0;bottom:0;
  padding:12px 24px calc(12px + env(safe-area-inset-bottom,12px));
  background:linear-gradient(to top, var(--paper) 60%, transparent);
  z-index:44;display:flex;gap:10px;
}
.btn{
  font:inherit;font-size:14px;font-weight:500;border-radius:14px;cursor:pointer;
  border:0;padding:14px 20px;transition:.2s;
  display:flex;align-items:center;justify-content:center;gap:7px;
}
.btn.primary{background:var(--accent);color:#fff;flex:1;box-shadow:0 4px 16px rgba(90,122,92,.25)}
.btn.primary:active{background:#4a6a4c}
.btn.ghost{background:var(--raise);color:var(--ink-2);border:1px solid var(--line)}
.btn.sm{font-size:12px;padding:6px 12px;border-radius:8px;flex:0 0 auto}
.btn svg{width:18px;height:18px}
button:disabled{opacity:.55;cursor:wait}
.btn-del{background:none;border:0;color:var(--ink-4);font-size:13px;padding:4px 0;cursor:pointer;opacity:.6;transition:opacity .2s}
.btn-del:active{opacity:1;color:#b44}
.btn:focus-visible,.fphotos button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}

/* ---------- 表单 ---------- */
.fphotos{display:flex;flex-wrap:wrap;gap:10px;padding:2px 0 16px}
.fphotos img,.fphotos .add{width:120px;height:120px;border-radius:12px;object-fit:cover;flex:0 0 auto}
.fphotos .add{
  border:1.5px dashed var(--line);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  cursor:pointer;color:var(--ink-4);background:var(--paper-2);font-size:12px;
}
.fphotos .add svg{width:24px;height:24px}
.fphotos .add:hover{background:var(--accent-light);border-color:var(--accent);color:var(--accent)}
.form-body{padding-top:16px}
.form-fields{border:0;padding:0;margin:0;min-width:0}
.form-layout,.form-media,.form-grid,.field{min-width:0}
.region-selects{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.region-selects select{min-width:0;max-width:100%}
.fphoto{position:relative;flex:0 0 120px;cursor:grab;transition:opacity .15s,transform .15s}
.fphoto img{display:block}
.fphoto.dragging{opacity:.35;transform:scale(.95)}
.fphoto.drag-over{box-shadow:0 0 0 2.5px var(--accent);border-radius:12px}
.fphoto-remove{
  position:absolute;right:0;bottom:0;width:44px;height:44px;border:1px solid var(--line);
  border-radius:12px 0 12px 0;background:var(--raise);color:var(--ink);cursor:pointer;
  display:grid;place-items:center;
}
.fphoto-remove svg{width:18px;height:18px}
.photo-status{font-size:14px;line-height:1.6;color:var(--ink-2);margin:0 0 20px;overflow-wrap:anywhere}
.photo-status.uploading{color:var(--accent-dark,var(--ink));font-weight:600;background:var(--accent-light);padding:8px 14px;border-radius:8px;border:1px solid var(--accent);animation:pulse 1.5s ease-in-out infinite}
.plaque-upload{margin-bottom:20px}
.plaque-label{display:block;font-size:12px;color:var(--ink-3);margin-bottom:6px;font-weight:500;letter-spacing:.04em}
.plaque-hint{font-weight:400;color:var(--ink-2);margin-left:4px}
.plaque-preview{position:relative;width:120px;height:120px}
.plaque-preview img{width:100%;height:100%;display:block;border-radius:12px;object-fit:cover}
.plaque-preview .fphoto-remove{right:0;bottom:0}
.plaque-add{
  width:120px;height:120px;border:1.5px dashed var(--line);border-radius:12px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  cursor:pointer;color:var(--ink-4);background:var(--paper-2);font-size:12px;
}
.plaque-add svg{width:24px;height:24px}
.plaque-add:hover{background:var(--accent-light);border-color:var(--accent);color:var(--accent)}
.plaque-add:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.plaque-detail{margin-top:20px;padding:18px 16px;background:var(--paper-2);border:1px solid var(--line);border-radius:10px}
.plaque-detail h3{font-size:15px;font-weight:600;color:var(--ink);margin:0 0 12px}
/* 铭牌缩略 + 编号徽章横排；与编辑页 .plaque-preview 的 120×120 口径一致 */
.plaque-detail-body{display:flex;align-items:center;gap:16px}
.plaque-detail-img{width:120px;height:120px;flex:0 0 auto;display:block;border-radius:12px;object-fit:cover;cursor:pointer}
.plaque-detail-img:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.plaque-detail-info{min-width:0}
.plaque-detail-number{display:inline-flex;align-items:baseline;gap:8px;padding:7px 14px;background:var(--raise);border:1px solid var(--line);border-radius:9px}
.plaque-detail-number-label{color:var(--ink-3);font-size:12px}
.plaque-detail-number-value{font-weight:600;color:var(--ink);font-size:16px;font-family:monospace;letter-spacing:.05em}
.plaque-detail-hint{margin-top:8px;font-size:12px;color:var(--ink-4)}
/* 古树编号查重提示 */
.tree-number-dup{display:flex;align-items:center;gap:8px;margin-top:8px;padding:10px 12px;background:#fff8e1;border:1px solid #ffe082;border-radius:10px;font-size:13px;color:#6d5a00}
.tree-number-dup-icon{flex:0 0 20px;width:20px;height:20px;color:#f9a825}
.tree-number-dup-icon svg{width:20px;height:20px}
.tree-number-dup-text{flex:1;min-width:0}
.tree-number-dup-btn{flex:0 0 auto;padding:4px 12px;border:1px solid #f9a825;border-radius:8px;background:#fff;color:#6d5a00;font-size:13px;font-weight:500;cursor:pointer}
.tree-number-dup-btn:active{background:#f9a825;color:#fff}
.tree-number-dup-dismiss{flex:0 0 auto;width:24px;height:24px;border:none;background:none;cursor:pointer;color:#6d5a00;padding:0;display:flex;align-items:center;justify-content:center}
.tree-number-dup-dismiss svg{width:14px;height:14px}
.tree-number-detail{display:flex;align-items:center;gap:8px;padding:0 16px 8px;font-size:14px}
.tree-number-detail-label{color:var(--ink-3);font-size:13px}
.tree-number-detail-value{font-weight:500;color:var(--ink);font-family:monospace;letter-spacing:.05em}
.storage-notice{flex:0 0 auto;padding:12px 24px;background:var(--accent-light);color:var(--ink);font-size:14px;line-height:1.6}
.field{margin-bottom:20px}
.field label{display:block;font-size:12px;color:var(--ink-3);margin-bottom:6px;font-weight:500;letter-spacing:.04em}
.field input,.field textarea,.field select{
  width:100%;font:inherit;font-size:15px;padding:12px 14px;
  border:1px solid var(--line);border-radius:12px;
  background:var(--raise);color:var(--ink);outline:none;
  /* 只过渡焦点态的边框与光晕；all 过渡会让清除图标的 background-position 从左侧滑入 */
  transition:border-color .2s, box-shadow .2s;
}
.field input:focus,.field textarea:focus,.field select:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg);
}
.field textarea{resize:none;height:100px;line-height:1.7}
/* 日期文字居中，两侧等宽留白避免日历图标挤偏；约束移动端原生控件宽度。 */
.field input[type="date"]{
  position:relative;display:block;min-width:0;max-width:100%;min-height:48px;
  -webkit-appearance:none;appearance:none;
  padding:10px 44px;font-size:16px;line-height:24px;text-align:center;
}
.field input[type="date"]::-webkit-datetime-edit{min-width:0;padding:0;text-align:center}
.field input[type="date"]::-webkit-datetime-edit-fields-wrapper{padding:0}
.field input[type="date"]::-webkit-date-and-time-value{min-height:24px;text-align:center}
.field input[type="date"]::-webkit-calendar-picker-indicator{
  position:absolute;right:0;top:50%;transform:translateY(-50%);
  box-sizing:border-box;width:44px;height:44px;margin:0;padding:12px;cursor:pointer;
}
/* 字段已填写标记：label 尾部小对勾（主题绿） */
.field.filled > label::after{
  content:'';display:inline-block;width:13px;height:13px;margin-left:6px;vertical-align:-1px;
  background-color:var(--accent);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") no-repeat center/contain;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") no-repeat center/contain;
}
/* 输入框聚焦且已有内容时，右侧显示叉形清空图标（点击拦截由 JS 委托实现） */
.field input.input-clearable.has-value:focus{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237a8a7b' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:16px 16px;
  padding-right:38px;
}
.field textarea.input-clearable.has-value:focus{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237a8a7b' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px top 12px;background-size:16px 16px;
  padding-right:38px;
}
.last-place-hint{
  display:inline-flex;align-items:center;gap:4px;margin-top:6px;
  font-size:13px;color:var(--accent);cursor:pointer;
  padding:4px 10px;border-radius:8px;background:var(--accent-bg);
  transition:.18s;border:1px solid transparent;
}
.last-place-hint:hover{border-color:var(--accent);background:var(--accent-light)}
.last-place-hint svg{width:14px;height:14px;flex:none}
.last-name-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.last-name-tag{
  display:inline-flex;align-items:center;gap:4px;
  font-size:13px;color:var(--accent);cursor:pointer;
  padding:4px 10px;border-radius:8px;background:var(--accent-bg);
  transition:.18s;border:1px solid transparent;
}
.last-name-tag:hover{border-color:var(--accent);background:var(--accent-light)}
.last-name-tag svg{width:14px;height:14px;flex:none}
.pills{display:flex;flex-wrap:wrap;gap:8px}
.pill{
  font:inherit;font-size:13px;padding:8px 16px;border-radius:16px;cursor:pointer;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-2);transition:.2s;font-weight:500;
}
.pill:hover{border-color:var(--accent)}
.pill.on{background:var(--accent);color:#fff;border-color:var(--accent)}

/* ---------- Toast ---------- */
.toast{
  position:fixed;left:50%;bottom:100px;transform:translate(-50%,12px);z-index:200;
  background:rgba(44,62,45,.9);color:#fff;font-size:13px;padding:12px 20px;
  border-radius:16px;opacity:0;pointer-events:none;transition:.3s;
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  white-space:nowrap;max-width:88%;font-weight:500;
}
.toast.on{opacity:1;transform:translate(-50%,0)}

/* ---------- 空态 ---------- */
.empty-state{padding:60px 20px;text-align:center}
.empty-state .ic{
  width:100px;height:100px;margin:0 auto 24px;border-radius:20px;
  border:2px dashed var(--line);display:grid;place-items:center;
  background:var(--paper-2);
}
.empty-state .ic svg{width:44px;height:44px;color:var(--ink-4)}
.empty-state h3{font-family:var(--f-display);font-size:20px;margin:0 0 10px;font-weight:400}
.empty-state p{font-size:14px;color:var(--ink-3);line-height:1.8;margin:0 0 24px}

/* ---------- 加载 ---------- */
.loading{padding:80px 20px;text-align:center;color:var(--ink-4);font-size:14px;letter-spacing:.04em}

/* ---------- 登录弹窗 ---------- */
.modal-overlay{
  position:fixed;inset:0;background:rgba(44,62,45,.5);
  display:flex;align-items:center;justify-content:center;
  z-index:1000;padding:20px;
  backdrop-filter:blur(4px);
}
.modal{
  background:var(--paper);border-radius:16px;padding:28px;
  width:100%;max-width:360px;max-height:calc(100vh - 40px);max-height:calc(100dvh - 40px);overflow-y:auto;
  box-shadow:var(--shadow-lg);
  animation:modalin .2s ease;
}
@keyframes modalin{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:none}}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.6}}
.login-icon{margin-bottom:16px}
.modal h2{
  font-family:var(--f-display);font-size:20px;font-weight:500;
  margin-bottom:20px;color:var(--ink);
}
.modal input[type="password"]{
  width:100%;padding:12px 14px;border:1px solid var(--line);
  border-radius:10px;font-size:15px;font-family:var(--f-body);
  background:var(--raise);color:var(--ink);
  transition:border-color .16s;
}
.modal input[type="password"]:focus{
  outline:none;border-color:var(--accent);
}
.modal-actions{
  display:flex;gap:10px;margin-top:18px;
}
.modal-actions button{
  flex:1;padding:11px;border-radius:10px;font-size:14px;
  font-weight:500;cursor:pointer;transition:.16s;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-2);
}
.modal-actions button[type="submit"]{
  background:var(--accent);color:#fff;border-color:var(--accent);
}
.modal-actions button[type="submit"]:hover{
  background:var(--ink-2);
}
.login-error{
  margin-top:12px;padding:10px;border-radius:8px;
  background:#fee;color:#c33;font-size:13px;
  display:none;
}
.login-error.show{display:block}

/* ---------- 删除确认 ---------- */
.delete-dialog{
  --delete-ink:#a4483a;--delete-bg:#f7ebe6;
  position:fixed;inset:0;margin:auto;padding:0;
  width:calc(100% - 32px);max-width:360px;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);
  border:1px solid var(--line);border-radius:20px;
  background:var(--paper);color:var(--ink);box-shadow:var(--shadow-lg);
  overflow-y:auto;overscroll-behavior:contain;
}
.delete-dialog::backdrop{background:rgba(44,62,45,.5);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
.delete-dialog[open]{animation:modalin .2s ease}
.delete-card{padding:28px}
.delete-icon{width:48px;height:48px;display:grid;place-items:center;margin-bottom:18px;border-radius:14px;background:var(--delete-bg);color:var(--delete-ink)}
.delete-icon svg{width:24px;height:24px}
.delete-dialog h2{font-family:var(--f-display);font-size:22px;font-weight:400;line-height:1.4;margin:0 0 12px}
.delete-dialog p{font-size:14px;line-height:1.7;color:var(--ink-2);overflow-wrap:anywhere}
.delete-dialog .delete-name{margin-bottom:8px;font-weight:600;color:var(--ink);max-height:5.1em;overflow-y:auto}
.delete-dialog .delete-error{margin-top:16px;padding:10px 12px;border-radius:10px;background:var(--delete-bg);color:var(--delete-ink)}
.delete-actions{display:flex;gap:12px;margin-top:24px}
.delete-actions button{flex:1;min-width:0;min-height:48px;padding:12px 8px;border:1px solid var(--line);border-radius:12px;background:var(--raise);color:var(--ink-2);font:inherit;font-size:14px;font-weight:500;cursor:pointer}
.delete-actions .delete-confirm{background:var(--delete-ink);border-color:var(--delete-ink);color:#fff}
.delete-actions button:enabled:hover{filter:brightness(.96)}
.delete-actions button:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.delete-actions button:disabled{opacity:.55;cursor:wait}
@media(prefers-reduced-motion:reduce){.delete-dialog[open]{animation:none}}

/* =========================================================
   每日模块
   ========================================================= */
/* 页头主标题（每日页） */
.head-title{min-width:0}
/* 日期徽标：公历 + 农历两行，右对齐 */
.daily-date{
  display:flex;flex-direction:column;align-items:flex-end;gap:2px;white-space:nowrap;
  line-height:1.3;text-align:right;
}
.daily-date .solar{
  font-size:12.5px;color:var(--ink);font-weight:500;letter-spacing:.01em;
}
.daily-date .lunar{
  font-size:11.5px;color:var(--ink-3);font-weight:400;
}

/* 卡片堆外层：负责比例，底部留空间给后面卡片露出 */
.daily-stack-wrap{
  position:relative;
  border-radius:16px;
  aspect-ratio:3/4;
  margin-bottom:32px;
}
.daily-stack-wrap.landscape{aspect-ratio:4/3}
/* 卡片堆内层：填满外层 */
.daily-stack{
  position:absolute;inset:0;
  user-select:none;-webkit-user-select:none;
  touch-action:pan-y;
}
/* 堆内每张卡片 */
.daily-stack .daily-poster{
  position:absolute;inset:0;
  border-radius:16px;overflow:hidden;cursor:grab;
  box-shadow:0 8px 32px rgba(0,0,0,.12),0 2px 8px rgba(0,0,0,.06);
  transition:transform .32s cubic-bezier(.2,.7,.3,1),opacity .26s,box-shadow .4s;
  will-change:transform;
}
.daily-stack .daily-poster.s-dragging{
  transition:none!important;cursor:grabbing;
}
/* 拖拽期间所有卡片都跟手，不加过渡；松手后恢复过渡做回弹/飞出 */
.daily-stack.s-dragging .daily-poster{transition:none}
/* 叠放层次：后面卡片缩小+下移；--dp 是拖动进度，后层随之向顶层靠拢 */
.daily-stack .daily-poster.s-back1{
  transform:translateY(calc(30px - 30px * var(--dp, 0))) scale(calc(.93 + .07 * var(--dp, 0)));z-index:1;
  box-shadow:0 4px 16px rgba(0,0,0,.08);
}
.daily-stack .daily-poster.s-back2{
  transform:translateY(calc(60px - 30px * var(--dp, 0))) scale(calc(.86 + .07 * var(--dp, 0)));z-index:0;
  box-shadow:0 2px 8px rgba(0,0,0,.05);
}
/* 顶层卡片交互 */
.daily-stack .daily-poster.s-top{z-index:10}
/* 海报卡片内部元素 */
.daily-poster-photo{
  position:relative;overflow:hidden;background:var(--paper-3);
}
.daily-poster-photo.portrait{aspect-ratio:3/4}
.daily-poster-photo.landscape{aspect-ratio:4/3}
.daily-poster-photo img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform 6s ease;
}
/* 渐变叠层 */
.daily-poster-overlay{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(
    to top,
    rgba(0,0,0,.72) 0%,
    rgba(0,0,0,.28) 35%,
    rgba(0,0,0,.02) 60%,
    rgba(0,0,0,.08) 100%
  );
}
/* 分级徽章 */
.daily-poster-badge{
  position:absolute;top:16px;right:16px;z-index:2;
  font-size:11px;font-weight:600;color:#fff;
  padding:4px 10px;border-radius:6px;
  letter-spacing:.5px;
  box-shadow:0 2px 8px rgba(0,0,0,.2);
}
/* 底部文字区 */
.daily-poster-content{
  position:absolute;left:0;right:0;bottom:0;z-index:2;
  padding:24px 20px 20px;color:#fff;
}
.daily-poster-name{
  font-size:24px;font-weight:700;line-height:1.25;
  font-family:"Noto Serif SC",Georgia,"Times New Roman",serif;
  letter-spacing:-.01em;
  text-shadow:0 1px 6px rgba(0,0,0,.3);
}
.daily-poster-sub{
  font-size:13px;color:rgba(255,255,255,.78);margin-top:6px;
  display:flex;align-items:center;gap:0;flex-wrap:wrap;
}
.daily-poster-sep{margin:0 6px;opacity:.5}
.daily-poster-loc{
  display:flex;align-items:center;gap:4px;
  font-size:12px;color:rgba(255,255,255,.6);margin-top:10px;
}
.daily-poster-loc svg{width:14px;height:14px;flex-shrink:0;opacity:.7}

/* 空海报占位 */
.daily-empty-poster{
  text-align:center;padding:60px 24px;color:var(--ink-3);
  border:1px dashed var(--line);border-radius:16px;
}
.daily-empty-poster .ic{margin-bottom:8px}
.daily-empty-poster .ic svg{width:36px;height:36px;color:var(--ink-4)}

/* 知识卡片区 */
.daily-section{margin-top:28px}
.daily-section-head{
  display:flex;justify-content:space-between;align-items:center;
  margin-bottom:14px;padding-bottom:10px;
  border-bottom:1px solid var(--line);
}
.daily-section-head span{
  font-size:15px;font-weight:600;color:var(--ink);
  font-family:"Noto Serif SC",Georgia,serif;
}

/* 知识卡片区底部刷新按钮 */
.daily-refresh-btn{
  display:block;margin:16px auto 0;
  padding:10px 32px;
  font-size:14px;font-weight:500;
  color:var(--accent);background:transparent;
  border:1.5px solid var(--accent);border-radius:24px;
  cursor:pointer;transition:background .2s,color .2s;
}
/* 触屏上 :hover/:active 都会在 tap 后粘滞（点一次实心不回落），
   故 :hover 仅在支持悬停的设备生效；:active 不进实心规则 */
@media (hover: hover){
  .daily-refresh-btn:hover{background:var(--accent);color:#fff;}
}
.daily-refresh-btn:focus-visible{
  background:var(--accent);color:#fff;
}

/* 学习挑战：App Store Today 式整块大卡 */
.daily-challenge-hero{
  position:relative;display:flex;
  margin:32px 0 8px;min-height:196px;border-radius:22px;overflow:hidden;
  color:#fff;cursor:pointer;
  background:linear-gradient(152deg,#233726 0%,#3d5a40 58%,#5c7b5d 100%);
  box-shadow:0 10px 30px rgba(44,62,45,.18),0 2px 8px rgba(44,62,45,.1);
  transition:transform .18s ease,box-shadow .18s ease;
  -webkit-user-select:none;user-select:none;
}
.daily-challenge-hero::before{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(120% 95% at 92% -10%,rgba(255,255,255,.18),transparent 56%),
    linear-gradient(to top,rgba(15,26,18,.52),rgba(15,26,18,.08) 52%,transparent 72%);
}
.dch-art{position:absolute;right:-28px;top:-26px;width:238px;height:238px;color:#fff;pointer-events:none}
.dch-inner{
  position:relative;z-index:1;display:flex;flex-direction:column;justify-content:space-between;
  width:100%;min-height:196px;padding:17px 20px 18px;
}
/* 小标题删掉后按等量收高（212→196），但完成态多一行成绩，靠这 16px 保证徽章与标题不贴脸 */
.dch-top{display:flex;align-items:flex-start;justify-content:flex-end;gap:12px;margin-bottom:16px}
.dch-badge{
  width:40px;height:40px;border-radius:13px;flex:0 0 auto;
  display:grid;place-items:center;color:#fff;
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);
}
.dch-badge svg{width:21px;height:21px}
.dch-badge-done{background:rgba(217,230,207,.2);border-color:rgba(217,230,207,.28)}
.dch-main{max-width:calc(100% - 8px)}
.dch-title{
  font-family:var(--f-display);font-size:26px;font-weight:600;
  line-height:1.2;letter-spacing:-.01em;text-shadow:0 1px 8px rgba(0,0,0,.16);
}
.dch-sub{margin-top:7px;font-size:13px;line-height:1.5;color:rgba(255,255,255,.74)}
.dch-foot{display:flex;justify-content:flex-end;margin-top:18px}
.dch-cta{
  display:inline-flex;align-items:center;gap:7px;
  padding:9px 16px 9px 18px;border-radius:999px;
  background:#fff;color:#2c3e2d;font-size:13.5px;font-weight:600;white-space:nowrap;
  box-shadow:0 4px 14px rgba(0,0,0,.16);
}
.dch-cta svg{width:14px;height:14px}
.daily-challenge-hero.is-done{background:linear-gradient(152deg,#2c3f2f 0%,#49614a 58%,#6b7f6b 100%)}
.daily-challenge-hero.is-done .dch-cta{background:rgba(255,255,255,.15);color:#fff;border:1px solid rgba(255,255,255,.24);box-shadow:none}
.daily-challenge-hero.is-empty,.daily-challenge-hero.is-loading{cursor:default}
.daily-challenge-hero.is-loading .dch-title{color:rgba(255,255,255,.8)}
.daily-challenge-hero[role="button"]:active{transform:scale(.985);box-shadow:0 4px 14px rgba(44,62,45,.16)}
@media(hover:hover){
  .daily-challenge-hero[role="button"]:hover{transform:translateY(-1px);box-shadow:0 14px 34px rgba(44,62,45,.22),0 2px 8px rgba(44,62,45,.1)}
}
.daily-challenge-hero:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
@media(max-width:359px){
  .daily-challenge-hero,.dch-inner{min-height:180px}
  .dch-inner{padding:15px 16px 16px}
  .dch-title{font-size:23px}
  .dch-art{right:-38px;top:-22px;width:210px;height:210px}
  .dch-badge{width:36px;height:36px;border-radius:12px}
}

/* 答题覆盖层 */
.quiz-overlay{
  position:fixed;inset:0;z-index:9000;
  background:var(--paper);
  display:flex;flex-direction:column;
  max-width:600px;margin:0 auto;
}
.qz-header{
  display:flex;align-items:center;gap:12px;
  padding:12px 16px;border-bottom:1px solid var(--line);
  flex-shrink:0;
}
.qz-close{
  width:32px;height:32px;border:none;background:none;
  cursor:pointer;color:var(--ink-2);padding:4px;
  display:flex;align-items:center;justify-content:center;
}
.qz-close svg{width:20px;height:20px}
.qz-progress{font-size:14px;font-weight:600;color:var(--ink);white-space:nowrap}
.qz-dots{display:flex;gap:6px;margin-left:auto}
.qz-dot{
  width:8px;height:8px;border-radius:50%;
  background:var(--line);transition:background .2s;
}
.qz-dot.done{background:var(--accent)}
.qz-dot.current{background:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.qz-body{flex:1;overflow-y:auto;padding:20px 16px}
.qz-type-tag{
  display:inline-block;font-size:11px;font-weight:500;
  color:var(--accent);background:var(--accent-light);
  padding:3px 10px;border-radius:4px;margin-bottom:12px;
}
.qz-question{font-size:17px;font-weight:600;color:var(--ink);line-height:1.5;margin-bottom:20px}
.qz-options{display:flex;flex-direction:column;gap:10px}
.qz-option{
  display:flex;align-items:center;gap:12px;
  padding:14px 16px;border:1.5px solid var(--line);
  border-radius:10px;cursor:pointer;
  transition:border-color .15s,background .15s;
  font-size:15px;color:var(--ink);
}
.qz-option:hover{border-color:var(--accent);background:var(--accent-light)}
.qz-option.selected{border-color:var(--accent);background:var(--accent-light);font-weight:500}
.qz-option.correct{border-color:#4caf50;background:#e8f5e9;color:#2e7d32}
.qz-option.wrong{border-color:#f44336;background:#ffebee;color:#c62828}
.qz-opt-letter{font-weight:600;color:var(--ink-2);min-width:20px}
.qz-opt-text{flex:1}
.qz-feedback{margin-top:16px;padding:14px;border-radius:10px}
.qz-fb-correct{font-size:15px;font-weight:600;color:#2e7d32}
.qz-fb-wrong{font-size:15px;font-weight:600;color:#c62828}
.qz-explain{font-size:13px;color:var(--ink-2);margin-top:6px;line-height:1.6}
.qz-footer{padding:12px 16px;border-top:1px solid var(--line);flex-shrink:0}
.qz-btn{
  display:block;width:100%;padding:14px;
  font-size:15px;font-weight:600;
  border:1.5px solid var(--accent);border-radius:12px;
  background:transparent;color:var(--accent);
  cursor:pointer;transition:background .15s,color .15s;
  font-family:var(--f);
}
.qz-btn:disabled{opacity:.4;cursor:default}
.qz-btn-primary{background:var(--accent);color:#fff}
.qz-btn:hover:not(:disabled){background:var(--accent);color:#fff}

/* 结果页 */
.qz-result{
  flex:1;display:flex;flex-direction:column;
  align-items:center;justify-content:center;
  padding:32px 24px;text-align:center;
}
.qz-result-icon{width:72px;height:72px;margin-bottom:16px;border-radius:50%;background:var(--accent-light);color:var(--accent);display:flex;align-items:center;justify-content:center}
.qz-result-icon svg{width:34px;height:34px}
.qz-result-title{font-size:20px;font-weight:700;color:var(--ink);margin-bottom:8px}
.qz-result-score{font-size:48px;font-weight:800;color:var(--accent);line-height:1}
.qz-result-label{font-size:14px;color:var(--ink-2);margin-top:4px}
.qz-result-bonus{font-size:13px;color:#b8860b;margin-top:8px;font-weight:500}
.qz-result-energy{
  margin-top:16px;padding:14px 32px;border-radius:16px;
  background:var(--accent-light);
  display:flex;align-items:baseline;justify-content:center;gap:6px;
}
.qz-result-energy .qz-energy-num{font-size:34px;font-weight:800;color:var(--accent);line-height:1}
.qz-result-energy .qz-energy-unit{font-size:15px;font-weight:700;color:var(--accent)}
.qz-result-energy .qz-energy-hint{font-size:12px;color:var(--ink-2);margin-left:8px}
.qz-result .qz-btn{max-width:240px;margin-top:24px}

/* 答题回看列表 */
.qr-body{padding:16px}
.qr-item{
  padding:16px;margin-bottom:12px;
  border:1px solid var(--line);border-radius:12px;
  background:var(--paper);
}
.qr-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.qr-idx{
  width:24px;height:24px;border-radius:50%;
  background:var(--accent);color:#fff;
  font-size:12px;font-weight:700;
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
}
.qr-type{font-size:11px;color:var(--ink-2);flex:1}
.qr-tag{
  font-size:13px;font-weight:700;
  width:24px;height:24px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
}
.qr-tag.qr-correct{background:#e8f5e9;color:#2e7d32}
.qr-tag.qr-wrong{background:#ffebee;color:#c62828}
.qr-question{font-size:15px;font-weight:600;color:var(--ink);line-height:1.5;margin-bottom:12px}
.qr-options{display:flex;flex-direction:column;gap:8px}
.qr-opt{
  display:flex;align-items:center;gap:10px;
  padding:10px 12px;border:1.5px solid var(--line);
  border-radius:8px;font-size:14px;color:var(--ink);
}
.qr-opt.qr-opt-right{border-color:#4caf50;background:#e8f5e9;color:#2e7d32}
.qr-opt.qr-opt-wrong{border-color:#f44336;background:#ffebee;color:#c62828}
.qr-opt-letter{font-weight:600;color:var(--ink-2);min-width:18px}
.qr-opt-right .qr-opt-letter{color:#2e7d32}
.qr-opt-wrong .qr-opt-letter{color:#c62828}
.qr-opt-text{flex:1}
.qr-answer{margin-top:10px;font-size:13px;color:var(--ink-2);line-height:1.6}
.qr-wrong-text{color:#c62828;font-weight:600}
.qr-correct-text{color:#2e7d32;font-weight:600}
.qr-explain{margin-top:8px;padding:10px 12px;background:#f9f9f6;border-radius:8px;font-size:13px;color:var(--ink-2);line-height:1.6}

.daily-kcard{
  background:var(--paper);border:1px solid var(--line);
  border-left:3px solid var(--kcard-accent,var(--accent));
  border-radius:4px 12px 12px 4px;
  padding:14px 16px;margin-bottom:12px;
  cursor:pointer;transition:background .15s,border-color .15s;
}
.daily-kcard:hover{background:var(--paper-2)}
.daily-kcard:active{background:var(--paper-3)}
.daily-kcard-head{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
.daily-kcard-title{font-size:15px;font-weight:600;color:var(--ink);line-height:1.4}
.daily-src-tag{
  font-size:10px;color:var(--tag-c,var(--accent));background:var(--tag-bg,var(--accent-light));
  padding:2px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0;font-weight:500;
}
.daily-kcard-body{
  font-size:14px;color:var(--ink-2);line-height:1.7;margin-top:6px;
  display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;
}

/* 知识卡片弹窗 */
.kcard-modal{
  position:fixed;inset:0;z-index:900;
  display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.35);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
  opacity:0;transition:opacity .25s ease;
  padding:24px;
}
.kcard-modal.on{opacity:1}
.kcard-modal-card{
  position:relative;width:100%;max-width:380px;
  background:var(--paper);border-radius:16px;
  box-shadow:0 12px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);
  overflow:hidden;
  transform:translateY(20px) scale(.96);transition:transform .3s cubic-bezier(.22,.61,.36,1);
}
.kcard-modal.on .kcard-modal-card{transform:translateY(0) scale(1)}
.kcard-modal-accent{
  height:4px;background:var(--kc-accent,var(--accent));
}
.kcard-modal-close{
  position:absolute;top:12px;right:12px;
  width:32px;height:32px;border-radius:50%;border:none;
  background:rgba(0,0,0,.05);color:var(--ink-3);
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background .15s,color .15s;
}
.kcard-modal-close:hover{background:rgba(0,0,0,.1);color:var(--ink)}
.kcard-modal-close svg{width:16px;height:16px}
.kcard-modal-body{padding:24px 24px 28px}
.kcard-modal-tag{
  display:inline-block;font-size:11px;font-weight:500;
  color:var(--tag-c,var(--accent));background:var(--tag-bg,var(--accent-light));
  padding:3px 10px;border-radius:6px;margin-bottom:12px;
}
.kcard-modal-title{
  font-family:Georgia,'Noto Serif SC',serif;
  font-size:20px;font-weight:700;color:var(--ink);
  line-height:1.4;margin:0 0 14px;
}
.kcard-modal-text{
  font-size:15px;color:var(--ink-2);line-height:1.8;margin:0;
  white-space:pre-wrap;word-break:break-word;
}

/* ---------- 合并向导 ---------- */
.merge-body{padding:16px var(--page-gutter) calc(var(--tab-h) + 24px + env(safe-area-inset-bottom,0px));display:flex;flex-direction:column}
.merge-subtitle{font-size:13px;color:var(--ink-3);margin-top:4px}
.merge-cards{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.merge-card{flex:1;background:var(--paper-2);border-radius:12px;padding:14px;border:1.5px solid var(--line)}
.merge-card.source{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--paper-2))}
.merge-card.target{border-color:var(--ink-4);border-style:dashed}
.merge-card-label{font-size:11px;text-transform:uppercase;letter-spacing:0.5px;color:var(--ink-3);margin-bottom:6px;font-weight:600}
.merge-card-name{font-size:16px;font-weight:600;color:var(--ink-1);margin-bottom:4px}
.merge-card-meta{font-size:12px;color:var(--ink-3)}
.merge-card-empty{font-size:14px;color:var(--ink-4);font-style:italic;padding:8px 0}
.merge-arrow{color:var(--ink-4);flex:0 0 24px;display:flex;align-items:center;justify-content:center}
.merge-arrow svg{width:20px;height:20px}
.merge-photo-merge{background:color-mix(in srgb,var(--accent) 8%,var(--paper-2));border-radius:8px;padding:10px 14px;font-size:13px;color:var(--ink-2);margin-bottom:16px}
.merge-select-section{flex:1;min-height:0;display:flex;flex-direction:column}
.merge-select-section label{font-size:14px;font-weight:500;color:var(--ink-2);display:block;margin-bottom:8px;flex:0 0 auto}
.merge-search{margin-bottom:12px}
.merge-search input{width:100%;padding:10px 14px;border:1px solid var(--line);border-radius:10px;font:inherit;font-size:14px;background:var(--paper)}
.merge-list{display:flex;flex-direction:column;gap:6px;flex:1;min-height:0;overflow-y:auto}
.merge-list-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper);cursor:pointer;text-align:left;width:100%;transition:.15s}
.merge-list-item:hover{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 4%,var(--paper))}
.merge-list-item.selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,var(--paper));box-shadow:0 0 0 1.5px var(--accent)}
.merge-list-item img{width:44px;height:44px;border-radius:8px;object-fit:cover;flex:0 0 44px}
.merge-list-noimg{width:44px;height:44px;border-radius:8px;background:var(--paper-2);display:flex;align-items:center;justify-content:center;color:var(--ink-4);flex:0 0 44px}
.merge-list-noimg svg{width:20px;height:20px}
.merge-list-info{flex:1;min-width:0}
.merge-list-name{font-size:14px;font-weight:500;color:var(--ink-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.merge-list-meta{font-size:12px;color:var(--ink-3);margin-top:2px}
.merge-list-check{color:var(--accent);flex:0 0 20px}
.merge-list-check svg{width:18px;height:18px}
.merge-list-empty{text-align:center;padding:24px;color:var(--ink-3);font-size:14px}
.merge-summary{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:20px;padding:12px 16px;background:var(--paper-2);border-radius:10px}
.merge-summary-item{font-size:13px;color:var(--ink-2)}
.merge-summary-item strong{color:var(--accent);margin-right:4px}
.merge-group{margin-bottom:20px}
.merge-group-title{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;color:var(--ink-3);margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.merge-row{display:grid;grid-template-columns:80px 1fr;gap:8px 12px;align-items:start;padding:8px 0;border-bottom:1px solid color-mix(in srgb,var(--line) 50%,transparent)}
.merge-row.same{opacity:0.6}
.merge-row.conflict{background:color-mix(in srgb,#ff9800 6%,transparent);margin:0 -8px;padding:8px 8px;border-radius:6px}
.merge-row-label{font-size:13px;color:var(--ink-2);font-weight:500}
.merge-row-values{display:flex;flex-direction:column;gap:6px}
.merge-val-btn{flex:unset;width:100%;display:flex;align-items:flex-start;gap:6px;padding:8px 10px;border:1.5px solid var(--line);border-radius:8px;background:var(--paper);cursor:pointer;font:inherit;font-size:13px;color:var(--ink-2);transition:.15s;text-align:left}
.merge-val-btn:hover{border-color:var(--accent)}
.merge-val-btn.chosen{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 8%,var(--paper));color:var(--ink-1);font-weight:500}
.merge-val-btn.empty{opacity:0.5}
.merge-val-side{flex:1;white-space:normal;word-break:break-word;line-height:1.5}
.merge-val-tag{font-size:10px;font-weight:700;color:var(--ink-3);background:var(--paper-2);border-radius:4px;padding:2px 5px}
.merge-row-hint{grid-column:2;font-size:11px;color:var(--ink-3);font-style:italic}

/* ---------- 合并确认弹层 ---------- */
.merge-confirm-overlay{
  position:fixed;inset:0;background:rgba(44,62,45,.45);
  display:flex;align-items:center;justify-content:center;
  z-index:1000;padding:24px;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  animation:mcFadeIn .2s ease;
}
@keyframes mcFadeIn{from{opacity:0}to{opacity:1}}
.merge-confirm{
  background:var(--paper);border-radius:20px;padding:0;
  width:100%;max-width:340px;
  box-shadow:var(--shadow-lg);
  animation:mcSlideIn .25s ease;
  overflow:hidden;
}
@keyframes mcSlideIn{from{opacity:0;transform:translateY(16px) scale(.96)}to{opacity:1;transform:none}}
.mc-icon{
  display:flex;align-items:center;justify-content:center;
  width:52px;height:52px;border-radius:50%;margin:24px auto 0;
  background:color-mix(in srgb,#e67e22 12%,var(--paper-2));
  color:#c96a1a;
}
.mc-icon svg{width:26px;height:26px}
.mc-title{
  font-family:var(--f-display);font-size:18px;font-weight:600;
  color:var(--ink);text-align:center;margin:12px 24px 0;
}
.mc-desc{
  font-size:13px;color:var(--ink-3);text-align:center;
  line-height:1.6;margin:8px 24px 0;
}
.mc-records{
  display:flex;align-items:center;gap:8px;
  margin:16px 20px 0;padding:12px 14px;
  background:var(--paper-2);border-radius:12px;
}
.mc-rec{flex:1;min-width:0}
.mc-rec-label{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--ink-4);font-weight:600;margin-bottom:2px}
.mc-rec-name{font-size:14px;font-weight:500;color:var(--ink-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mc-rec-arrow{flex:0 0 20px;color:var(--ink-4);display:flex;align-items:center}
.mc-rec-arrow svg{width:16px;height:16px}
.mc-warn{
  display:flex;align-items:flex-start;gap:8px;
  margin:14px 20px 0;padding:10px 12px;
  background:color-mix(in srgb,#c44 6%,var(--paper-2));
  border-radius:10px;font-size:12px;color:#a33;line-height:1.5;
}
.mc-warn svg{width:16px;height:16px;flex:0 0 16px;margin-top:1px}
.mc-actions{
  display:flex;gap:10px;padding:20px 20px 24px;margin-top:4px;
}
.mc-actions button{
  flex:1;padding:12px;border-radius:12px;font-size:14px;
  font-weight:500;cursor:pointer;transition:.16s;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-2);
  font-family:var(--f-body);
}
.mc-actions button:active{transform:scale(.97)}
.mc-actions .mc-btn-ok{
  background:var(--accent);color:#fff;border-color:var(--accent);
}
.mc-actions .mc-btn-ok:disabled{opacity:.5;cursor:not-allowed}

/* ---------- 详情页操作栏重设计 ---------- */
.detail-actions{gap:8px}
.detail-actions .btn{white-space:nowrap}
.detail-actions .detail-card-btn{flex:1;min-width:0;min-height:44px}
/* 手机宽度：三个动作挤一行，收窄内边距，文字仍各自完整 */
@media(max-width:767px){
  .detail-actions{padding-left:16px;padding-right:16px;gap:6px}
}
@media(max-width:340px){
  .detail-actions{padding-left:12px;padding-right:12px;gap:4px}
  .detail-actions .detail-card-btn{font-size:13px;padding-left:10px;padding-right:10px}
}
.detail-more-wrap{position:relative;flex:0 0 auto}
.detail-more-btn{padding:14px 12px}
.detail-more-btn svg{width:20px;height:20px}
.detail-more-menu{position:absolute;bottom:calc(100% + 8px);right:0;min-width:140px;background:var(--paper);border:1px solid var(--line);border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.12);padding:4px;display:none;z-index:50}
.detail-more-menu.open{display:block}
.detail-more-item{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:0;background:none;cursor:pointer;font:inherit;font-size:14px;color:var(--ink-1);border-radius:8px;text-align:left;transition:.12s}
.detail-more-item:hover{background:var(--paper-2)}
.detail-more-item svg{width:18px;height:18px;flex:0 0 18px}
.detail-more-delete{color:#c44}
.detail-more-delete:hover{background:color-mix(in srgb,#c44 8%,var(--paper-2))}

/* 合并页面图标尺寸约束 */
.head h2 svg{width:20px;height:20px;vertical-align:middle;margin-right:4px}
.merge-arrow svg{width:24px;height:24px}

/* 每日页面平板适配 */
@media(min-width:768px){
  .daily-poster{max-width:520px;margin:0 auto}
  .daily-next-tree{max-width:520px;margin:10px auto 0}
  .daily-section{max-width:520px;margin:24px auto 0}
  .daily-challenge-hero{max-width:520px;margin:24px auto 8px}
  .daily-poster-name{font-size:22px}
}

/* ---------- 分屏 / 小平板：不再套用固定高度的手机展示框 ---------- */
@media(min-width:520px){
  .grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .sparse{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .cell.blank{display:none}
}

/* ---------- 平板通用：按可用视口布局，旋转不重建页面 ---------- */
@media(min-width:768px){
  :root{--page-gutter:clamp(24px,3vw,40px)}
  body{background:var(--paper-2)}
  .head{padding:max(20px,env(safe-area-inset-top)) var(--page-gutter) 16px}
  .hrow h2{font-size:30px}
  .body{padding:0 var(--page-gutter) calc(var(--tab-h) + 40px + env(safe-area-inset-bottom,0px))}
  .grid{gap:20px}
  .cell .ph{aspect-ratio:4/5}
  .cell .info{padding:12px 14px 14px}
  .cell .nm{font-size:14px}
  .cell .sub{font-size:12px}
  .sparse{gap:20px}
  .card .cw img{aspect-ratio:16/10}
  .card .info{padding:16px 18px 18px}
  .tabs{max-width:480px;padding:8px 10px}
  .tabs .t{padding:10px 14px}

  /* 操作条参与纵向布局，正文无需猜测按钮高度或预留遮挡区。 */
  .actbar{
    position:relative;flex:0 0 auto;justify-content:flex-end;
    padding:12px var(--page-gutter) calc(12px + env(safe-area-inset-bottom,0px));
    background:var(--paper);border-top:1px solid var(--line);
  }
  .actbar .btn{min-height:48px}
  .actbar .btn.primary{flex:0 1 320px}
  .detail-actions .btn:first-child{margin-right:auto}
  .detail-actions.off-checkin-actions .btn:first-child{margin-right:0}
  .detail-scroll{padding:0}
  .detail-layout{max-width:760px;margin:0 auto}
  .dbody{min-width:0;padding:24px var(--page-gutter);overflow-wrap:anywhere}
  .dbody h2{font-size:28px}
  .dslide{object-fit:contain}
  .dslides,.dhead .empty{max-height:55vh;max-height:55dvh}

  .form-body{padding-top:16px;padding-bottom:24px}
  .form-grid .tree-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:24px;align-items:start}
  .form-grid .tree-fields > .field:first-child{grid-row:span 2}
  .field input,.field select,.field textarea{font-size:16px}
  .focus button{min-width:44px;min-height:44px}
  .form-grid .tree-fields .tree-choice,.cloud .tag{min-height:44px}
  .me-body{padding-top:max(14px,env(safe-area-inset-top));width:100%;max-width:960px;margin:0 auto}
  .book-card{padding:28px 32px 22px;border-radius:24px}
  .book-card .bk-t{font-size:24px}
  .book-card .bk-r b{font-size:52px}
  .book-card .bk-sep{margin:20px -32px 18px}
  .book-card .bk-tag{font-size:14px;padding:7px 16px}
  .modal{max-width:400px;padding:32px}
  .empty-state{padding:60px 24px}

  /* 四个排列选项完整容纳，短视口内可滚动。 */
  .viewpop{left:var(--page-gutter);top:calc(max(20px,env(safe-area-inset-top)) + 56px);width:340px;max-width:calc(100% - 32px);max-height:calc(100dvh - 112px);overflow-y:auto}
  .vp-seg button{min-height:44px}

  /* ===== 以下为平板通用适配（竖屏 + 横屏均生效） ===== */

  /* 图鉴：4列网格充分利用平板宽度 */
  .grid{grid-template-columns:repeat(4,minmax(0,1fr))}
  .cell .info{padding:10px 12px 12px}
  .cell .nm{font-size:13px}
  .cell .sub{font-size:11px}

  /* 图鉴搜索/筛选/标签条：去掉最大宽度限制，充分利用平板横向空间 */
  .album-search,.album-filter,.filter-tags{max-width:none}

  /* 详情页：平板竖屏也启用左右双栏 */
  .detail-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:24px}
  .dgallery{position:sticky;top:0}
  .dhead{border-radius:14px;overflow:hidden}
  .dslides,.dhead .empty{aspect-ratio:auto;height:50vh;height:50dvh;min-height:200px;max-height:520px}
  .dslides{max-height:none}
  .ths{padding:12px 0 4px}

  /* 每日页：卡片呈竖版比例(3:4)以适配竖版照片，完整显示在一屏内 */
  .daily-stack-wrap{aspect-ratio:3/4;max-width:420px;margin-left:auto;margin-right:auto}
  /* 卡片宽度收窄，使卡片呈竖版比例以适配竖版照片 */
  .daily-poster{max-width:420px}
  /* 照片容器：平板上取消固定比例，改为填满海报 */
  .daily-poster-photo,.daily-poster-photo.portrait,.daily-poster-photo.landscape{position:absolute;inset:0;aspect-ratio:auto}
  .daily-next-tree{max-width:640px}
  .daily-section,.daily-challenge-hero{max-width:640px}
  /* 平板上的挑战大卡加高、字号跟上，避免变成一条横幅 */
  .daily-challenge-hero{min-height:244px}
  .dch-inner{min-height:244px;padding:22px 26px 24px}
  .dch-title{font-size:30px}
  .dch-art{right:-34px;top:-34px;width:288px;height:288px}
  .dch-badge{width:44px;height:44px;border-radius:14px}
  .dch-cta{padding:10px 19px 10px 21px;font-size:14px}

  /* 弹窗/对话框：平板上放大 */
  .kcard-modal-card{max-width:480px}
  .delete-dialog{max-width:440px}
  .modal{max-width:440px}
  .merge-confirm{max-width:420px}

  /* 视图设置浮层：容纳更多选项 */
  .viewpop{width:400px}

  /* 合并页：卡片横排更舒适 */
  .merge-cards{gap:16px}
  .merge-card{padding:18px}
  .merge-card-name{font-size:17px}

  /* 我的页：事实行更宽松 */
  .row{padding:16px 2px;font-size:15px}
  .row .k{width:100px;font-size:14px}

  /* 表单：字段间距微调 */
  .field{margin-bottom:24px}
}

/* ---------- 横屏平板：包括 1024×768，不仅限于宽度大于 1024 ---------- */
@media(min-width:900px) and (orientation:landscape){
  .grid{grid-template-columns:repeat(4,minmax(0,1fr))}
  .detail-layout{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);align-items:start;gap:28px;max-width:none;padding:24px var(--page-gutter)}
  .dgallery{position:sticky;top:0}
  .dhead{border-radius:16px;overflow:hidden}
  .dslides,.dhead .empty{aspect-ratio:auto;height:calc(100vh - 220px);height:calc(100dvh - 220px);min-height:200px;max-height:640px}
  .ths{padding:12px 0 4px}
  .dbody{padding:8px 0 24px}

  /* 每日页横屏：海报更宽 */
  .daily-poster{max-width:720px}
  .daily-next-tree{max-width:720px}
  .daily-section,.daily-challenge-hero{max-width:720px}
}

@media(min-width:1000px) and (orientation:landscape){
  .form-layout{display:grid;grid-template-columns:200px minmax(0,1fr);gap:32px;align-items:start}
  .form-media .fphotos img,.form-media .fphotos .add{width:120px;height:120px}
  .form-media .photo-status{font-size:12px}
}

@media(min-width:1180px) and (orientation:landscape){
  .sparse{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* ========== 分步向导表单 ========== */
.wizard-progress{padding:10px 24px 12px;flex-shrink:0;display:flex;gap:8px}
.wizard-seg{flex:1;display:flex;align-items:center;gap:8px;padding:7px 12px;border-radius:22px;border:1px solid var(--line);background:var(--paper-2);font-size:13px;color:var(--ink-3);transition:all .3s;min-width:0}
.wizard-seg-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wizard-seg.active{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
.wizard-seg.done{background:var(--accent-light);border-color:var(--accent);color:var(--accent)}
.wizard-seg-num{width:20px;height:20px;border-radius:50%;background:var(--line);color:var(--ink-2);font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;flex:0 0 auto}
.wizard-seg-num svg{width:11px;height:11px}
.wizard-seg.active .wizard-seg-num{background:rgba(255,255,255,.25);color:#fff}
.wizard-seg.done .wizard-seg-num{background:var(--accent);color:#fff}
.wizard-panel{display:none;animation:wizardFadeIn .3s ease}
.wizard-panel.active{display:block}
@keyframes wizardFadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.wizard-step-title{font-family:var(--f-display);font-size:18px;font-weight:700;margin-bottom:6px;color:var(--ink)}
.wizard-step-subtitle{font-size:13px;color:var(--ink-2);margin-bottom:20px;line-height:1.5}
.wizard-section-divider{font-size:15px;font-weight:700;color:var(--ink);padding:12px 14px;margin:20px 0 16px;border-left:3px solid var(--accent);background:var(--accent-light);border-radius:0 8px 8px 0;display:flex;align-items:center;gap:8px}
.wizard-section-divider svg{width:16px;height:16px;flex:0 0 auto}
.wizard-save-now{background:var(--orange,#c47d2c)!important;color:#fff!important;flex:0 0 auto!important;font-size:13px!important;padding:12px 14px!important;white-space:nowrap}
.wizard-save-now:hover{background:#b06e24!important}
.wizard-summary-card{background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:14px 16px;margin-bottom:12px}
.wizard-summary-card h3{font-size:14px;font-weight:600;color:var(--ink);margin-bottom:10px;display:flex;align-items:center;gap:6px}
.wizard-summary-card h3 svg{width:15px;height:15px;flex:0 0 auto}
.wizard-summary-row{display:flex;justify-content:space-between;padding:5px 0;font-size:13px;border-bottom:1px solid var(--line)}
.wizard-summary-row:last-child{border:none}
.wizard-summary-row .wlabel{color:var(--ink-3)}
.wizard-summary-row .wvalue{color:var(--ink);font-weight:500;text-align:right;max-width:60%;overflow-wrap:anywhere}
.wizard-summary-row .wvalue.empty{color:var(--ink-4);font-style:italic}
.wizard-summary-photos{display:flex;gap:6px;margin-top:6px}
.wizard-summary-photos .wthumb{width:44px;height:44px;border-radius:6px;background:var(--accent-light);display:flex;align-items:center;justify-content:center;font-size:16px;overflow:hidden}
.wizard-summary-photos .wthumb img{width:100%;height:100%;object-fit:cover}
.wizard-edit-hint{text-align:center;font-size:12px;color:var(--ink-3);margin-top:10px}
.wizard-confirm-section{margin-top:24px;padding-top:20px;border-top:1px solid var(--line)}

/* =========================================================
   官方图鉴（名树特辑）：我的页特辑卡 + 特辑页 + 名树页 + 打卡弹层
   ========================================================= */
/* ---------- 我的页：特辑卡列表 ---------- */
.official-albums{display:flex;flex-direction:column;gap:12px;margin-top:4px}
.oa-card{
  display:flex;align-items:center;gap:14px;font:inherit;text-align:left;cursor:pointer;
  padding:12px;border:1px solid var(--line);border-radius:16px;background:var(--raise);
  transition:transform .16s ease, box-shadow .16s ease;
}
.oa-card:active{transform:scale(.98)}
.oa-cover{flex:0 0 auto;width:88px;height:66px;border-radius:10px;overflow:hidden;background:var(--paper-2)}
.oa-cover img{width:100%;height:100%;object-fit:cover;display:block}
.oa-info{flex:1;min-width:0}
.oa-title{font-family:var(--f-display);font-size:15.5px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.oa-sub{font-size:11px;color:var(--ink-4);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.oa-progress{display:flex;align-items:center;gap:8px;margin-top:8px}
.oa-bar{flex:1;max-width:130px;height:5px;border-radius:3px;background:var(--paper-3);overflow:hidden}
.oa-bar i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#7a9a6d,#5a7a5c);transition:width .4s ease}
.oa-progress em{font-style:normal;font-size:11px;color:var(--ink-3);flex:0 0 auto}
.oa-arrow{flex:0 0 auto;color:var(--ink-4);display:grid;place-items:center}
.oa-arrow svg{width:16px;height:16px;transform:rotate(180deg)}

/* ---------- 特辑页 / 名树页：全宽滚动容器与顶栏 ---------- */
.official-scroll{padding:0 0 calc(120px + env(safe-area-inset-bottom,0px))}
.off-navbar{
  position:sticky;top:0;z-index:30;
  display:flex;align-items:center;gap:10px;
  padding:max(10px, env(safe-area-inset-top)) 12px 10px;
  background:rgba(250,250,247,.92);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border-bottom:1px solid var(--paper-3);
}
.off-back{
  width:36px;height:36px;border:0;border-radius:12px;background:var(--raise);
  color:var(--ink-2);cursor:pointer;display:grid;place-items:center;flex:0 0 auto;
  box-shadow:0 1px 6px rgba(44,62,45,.08);transition:transform .15s ease;
}
.off-back:active{transform:scale(.92)}
.off-back svg{width:18px;height:18px}
.off-nav-title{font-family:var(--f-display);font-size:16px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pad-x{padding-left:16px;padding-right:16px}

/* ---------- 特辑页：活动头部卡与名树网格 ---------- */
.off-activity{
  position:relative;margin:12px 16px 0;border-radius:20px;overflow:hidden;
  background:linear-gradient(180deg,var(--warm),var(--raise) 46%);
  border:1px solid var(--line);box-shadow:0 2px 14px rgba(44,62,45,.07);
}
.off-act-cover{position:relative}
.off-act-cover .off-cover{display:block;width:100%;aspect-ratio:16/9;object-fit:cover;background:var(--paper-2)}
.off-act-badge{
  position:absolute;left:12px;top:12px;z-index:2;
  display:inline-flex;align-items:center;gap:4px;
  font-size:11px;font-weight:600;letter-spacing:.04em;color:#fff;
  padding:4px 10px;border-radius:999px;
  background:linear-gradient(135deg,#c04a3a,var(--cinnabar));
  box-shadow:0 2px 8px rgba(176,58,46,.32);
}
.off-act-body{padding:16px 16px 18px}
.off-title{font-family:var(--f-display);font-size:24px;font-weight:400;color:var(--ink);letter-spacing:-.01em;line-height:1.25}
.off-sub{font-size:12.5px;color:var(--ink-3);margin-top:6px;letter-spacing:.02em}
.off-act-steps{
  display:flex;align-items:stretch;gap:6px;margin-top:16px;
  padding:12px 8px;border-radius:14px;
  background:var(--cinnabar-soft);border:1px solid rgba(176,58,46,.16);
}
.off-step{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;text-align:center;gap:5px}
.off-step-ic{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--cinnabar);box-shadow:0 1px 4px rgba(176,58,46,.2)}
.off-step-ic svg{width:16px;height:16px}
.off-step-t{font-size:12px;font-weight:600;color:var(--ink-2)}
.off-step-s{font-size:10.5px;line-height:1.5;color:var(--ink-3)}
.off-step-arrow{align-self:center;flex:0 0 auto;color:rgba(176,58,46,.45);font-size:18px;line-height:1;margin-top:-18px}
.off-progress{display:flex;align-items:center;gap:12px;margin-top:16px}
.off-bar{flex:1;height:6px;border-radius:3px;background:var(--paper-3);overflow:hidden}
.off-bar i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#7a9a6d,#5a7a5c);transition:width .4s ease}
.off-progress-num{flex:0 0 auto;font-size:12px;color:var(--ink-2)}
.off-progress-num b{color:var(--accent);font-weight:600}
.off-act-desc{
  font-size:12.5px;line-height:1.8;color:var(--ink-3);margin-top:14px;
  padding-top:12px;border-top:1px dashed var(--paper-3);
}
.off-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px}
.off-card{
  position:relative;overflow:hidden;cursor:pointer;font:inherit;text-align:left;padding:0;
  border:1px solid var(--line);border-radius:16px;background:var(--raise);
  transition:transform .16s ease, box-shadow .16s ease, border-color .2s ease;
}
.off-card:active{transform:scale(.97)}
.off-card.checked{border-color:rgba(90,122,92,.45)}
.off-card-photo{width:100%;aspect-ratio:1/1;background:var(--paper-2)}
.off-card-photo img{width:100%;height:100%;object-fit:cover;display:block}
.off-card-photo .pz-cover{height:100%;aspect-ratio:auto}
.off-card-body{padding:10px 12px 12px}
.off-card-name{font-family:var(--f-display);font-size:16px;color:var(--ink)}
.off-card-py{font-size:11px;color:var(--ink-4);margin-top:2px;letter-spacing:.04em}
.off-card-loc{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--ink-3);margin-top:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.off-card-loc svg{width:11px;height:11px;flex:0 0 auto}
.off-check{
  position:absolute;top:10px;right:10px;width:24px;height:24px;border-radius:50%;
  background:var(--accent);color:#fff;display:grid;place-items:center;
  box-shadow:0 2px 8px rgba(44,62,45,.3);
}
.off-check svg{width:13px;height:13px}
.off-check.big{top:12px;right:12px;width:30px;height:30px}
.off-check.big svg{width:16px;height:16px}
.off-footnote{font-size:11px;color:var(--ink-4);margin-top:24px;line-height:1.7}

/* ---------- 保护等级徽章（沿用现有等级色） ---------- */
.grade-badge{
  position:absolute;top:10px;left:10px;z-index:2;
  font-size:10.5px;font-weight:600;letter-spacing:.06em;
  padding:3px 8px;border-radius:8px;color:#fff;background:#8a8a7a;
}
.grade-badge.g1{background:#b04030}
.grade-badge.g2{background:#c07830}
.grade-badge.g3{background:#5a7a5c}
.grade-badge.on-photo{top:12px;left:12px;box-shadow:0 2px 8px rgba(44,62,45,.25)}

/* ---------- 名树详情：可翻面的 3D 收藏卡 ---------- */
.off-deck{padding:10px 16px 0}
.off-deck-count{
  margin-left:auto;flex:0 0 auto;font-size:11px;letter-spacing:.08em;color:var(--ink-3);
  font-variant-numeric:tabular-nums;padding:4px 9px;border-radius:999px;background:var(--paper-2);
}
.off-deck-stage{
  position:relative;width:min(calc(100vw - 32px),310px);aspect-ratio:5/7;margin:2px auto 0;
  perspective:1200px;perspective-origin:50% 44%;
  cursor:pointer;outline:none;touch-action:pan-y;
  user-select:none;-webkit-user-select:none;
}
.off-deck-stage:focus-visible{outline:2px solid var(--accent);outline-offset:6px;border-radius:24px}
.off-deck-stage.enter-next{animation:offDeckEnterNext .42s cubic-bezier(.22,.72,.3,1)}
.off-deck-stage.enter-prev{animation:offDeckEnterPrev .42s cubic-bezier(.22,.72,.3,1)}
@keyframes offDeckEnterNext{from{opacity:.15;transform:translateX(36px) scale(.94)}to{opacity:1;transform:none}}
@keyframes offDeckEnterPrev{from{opacity:.15;transform:translateX(-36px) scale(.94)}to{opacity:1;transform:none}}
.off-deck-aura{
  position:absolute;left:50%;top:50%;width:104%;aspect-ratio:1;transform:translate(-50%,-50%);
  border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,rgba(216,179,106,.24),rgba(216,179,106,0) 64%);
  filter:blur(3px);
}
.off-deck-tilt{
  position:absolute;inset:0;transform-style:preserve-3d;
  transform:rotateX(0deg) rotateY(0deg);will-change:transform;
}
.off-deck-flip{position:absolute;inset:0;transform-style:preserve-3d;transition:transform .66s cubic-bezier(.2,.72,.24,1)}
.off-deck-flip.flipped{transform:rotateY(180deg)}
.off-pcard{
  position:absolute;inset:0;padding:7px;border-radius:20px;overflow:hidden;
  backface-visibility:hidden;-webkit-backface-visibility:hidden;
  background:linear-gradient(152deg,#5b7a5d,#2c3e2d 54%,#4a684c);
  box-shadow:0 18px 34px rgba(44,62,45,.3),0 3px 10px rgba(44,62,45,.2),inset 0 1px 0 rgba(255,255,255,.3);
}
.off-pcard::after{content:'';position:absolute;inset:2px;border-radius:18px;border:1px solid rgba(255,247,228,.25);pointer-events:none}
.off-pcard-back{transform:rotateY(180deg)}
/* iOS WebKit 会让卡面里的浮层（编号胶囊、等级徽章、拼图计数）穿透 backface-visibility 漏到另一面，
   侧过去之后把整面 visibility 掉，兜住这个合成层 bug。
   延迟必须落在翻面动画的 90° 那一刻：660ms + cubic-bezier(.2,.72,.24,1) 实测 102ms 就侧立了，
   取 110ms 刚过侧立点——再晚就会在背面上多压一段镜像浮层，撤掉时闪一下 */
.off-deck-flip:not(.flipped) .off-pcard-back,
.off-deck-flip.flipped .off-pcard-front{visibility:hidden;transition:visibility 0s linear .11s}
.off-pcard-inner{
  position:relative;height:100%;border-radius:14px;overflow:hidden;
  display:flex;flex-direction:column;background:var(--paper);
}
.off-pcard-front .off-pcard-inner{background:#fbf7ec}
.off-pcard-photo{position:relative;flex:0 0 auto;width:100%;aspect-ratio:1/1;background:var(--paper-2)}
.off-pcard-photo .pz-cover{position:absolute;inset:0;width:100%;height:100%;aspect-ratio:auto}
.off-pcard-photo .pz-cover>img{width:100%;height:100%;object-fit:cover}
.off-pcard-photo .pz-count{right:10px;bottom:10px;z-index:4}
.off-pcard-no{
  position:absolute;left:10px;top:10px;z-index:4;
  font-size:10.5px;font-weight:600;letter-spacing:.12em;color:#f9f4e6;
  padding:5px 8px;border-radius:999px;background:rgba(44,62,45,.72);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.off-pcard .grade-badge.on-photo{left:auto;right:10px;top:10px}
.off-pcard-seal{
  position:absolute;left:10px;bottom:10px;z-index:4;width:50px;height:50px;border-radius:50%;
  display:grid;place-items:center;font-family:var(--f-display);font-size:12px;letter-spacing:.08em;
  color:#fff;background:var(--cinnabar);border:2px double rgba(255,255,255,.55);
  box-shadow:0 3px 10px rgba(176,58,46,.4);transform:rotate(-8deg);
}
.off-pcard-holo{
  position:absolute;inset:0;z-index:3;pointer-events:none;mix-blend-mode:screen;opacity:.72;
  background:
    radial-gradient(circle at var(--mx,50%) var(--my,42%),rgba(255,253,240,.58),rgba(255,255,255,0) 46%),
    linear-gradient(115deg,rgba(255,255,255,0) 28%,rgba(255,241,205,.28) 44%,rgba(255,255,255,.34) 50%,rgba(200,224,200,.25) 57%,rgba(255,255,255,0) 74%);
}
.off-pcard-foot{
  flex:1;min-height:0;padding:10px 13px 11px;display:flex;flex-direction:column;
  background:linear-gradient(180deg,#fffdf7,#f6f0e1);
}
.off-pcard-name{
  font-family:var(--f-display);font-size:27px;font-weight:400;line-height:1.08;
  color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.off-pcard-py{font-size:10.5px;color:var(--ink-4);letter-spacing:.05em;margin-top:3px}
.off-pcard-foot-row{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin-top:auto;padding-top:7px;border-top:1px solid rgba(90,122,92,.14);
}
.off-pcard-loc{display:flex;align-items:center;gap:4px;min-width:0;font-size:11px;color:var(--ink-3)}
.off-pcard-loc svg{width:11px;height:11px;flex:0 0 auto}
.off-pcard-loc span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 卡背：纸档案 */
.off-pcard-back .off-pcard-inner{
  padding:15px 15px 13px;
  background:
    radial-gradient(130% 90% at 12% 0%,rgba(255,255,255,.82),rgba(255,255,255,0) 58%),
    repeating-linear-gradient(0deg,rgba(122,82,48,.035) 0 1px,rgba(0,0,0,0) 1px 5px),
    linear-gradient(165deg,#f8f1e0,#efe3ca);
}
.off-pcard-back .off-pcard-inner::before{
  content:'';position:absolute;inset:7px;border:1px solid rgba(122,82,48,.26);border-radius:10px;pointer-events:none;
}
.off-pcard-back-body{position:relative;z-index:1;height:100%;min-height:0;display:flex;flex-direction:column}
.off-pcard-back-kicker{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:9.5px;letter-spacing:.18em;color:var(--cinnabar)}
.off-pcard-back-kicker em{font-style:normal;font-size:9.5px;letter-spacing:.08em;color:var(--ink-4)}
.off-pcard-back-name{
  font-family:var(--f-display);font-size:25px;font-weight:400;line-height:1.12;color:var(--ink);
  margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.off-pcard-back-rule{position:relative;height:1px;margin:8px 0 9px;background:linear-gradient(90deg,rgba(122,82,48,.35),rgba(122,82,48,0))}
.off-pcard-back-rule::after{content:'';position:absolute;left:0;top:-2px;width:5px;height:5px;transform:rotate(45deg);background:rgba(176,58,46,.65)}
.off-pcard-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 7px}
.off-pcard-stat{min-width:0;padding:4px 7px;border-radius:8px;background:rgba(255,255,255,.55);border:1px solid rgba(122,82,48,.14)}
.off-pcard-stat dt{font-size:9px;letter-spacing:.1em;color:var(--ink-4)}
.off-pcard-stat dd{
  margin-top:1px;font-size:11.5px;line-height:1.35;font-weight:600;color:var(--ink-2);overflow-wrap:anywhere;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.off-pcard-latin{display:flex;gap:6px;margin-top:6px;font-size:10px;line-height:1.4;color:var(--ink-3)}
.off-pcard-latin span{flex:0 0 auto;color:var(--ink-4)}
.off-pcard-latin em{
  font-style:italic;overflow-wrap:anywhere;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.off-pcard-tax{font-size:10px;color:var(--ink-4);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.off-pcard-bloc{display:flex;align-items:flex-start;gap:4px;margin-top:5px;font-size:10.5px;line-height:1.4;color:var(--ink-3)}
.off-pcard-bloc svg{width:10px;height:10px;margin-top:1px;flex:0 0 auto}
.off-pcard-intro-wrap{
  flex:1;min-height:0;display:flex;flex-direction:column;
  margin-top:7px;padding-top:6px;border-top:1px dashed rgba(122,82,48,.24);
}
.off-pcard-intro-k{flex:0 0 auto;margin-bottom:3px;font-size:9.5px;letter-spacing:.14em;color:var(--ink-4)}
.off-pcard-intro{
  flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;
  padding-right:2px;font-size:11px;line-height:1.65;color:var(--ink-2);
  scrollbar-width:none;touch-action:pan-y;
}
.off-pcard-intro::-webkit-scrollbar{display:none}
.off-pcard-empty{
  flex:1;display:grid;place-items:center;margin-top:8px;border-top:1px dashed rgba(122,82,48,.24);
  font-size:11px;color:var(--ink-4);
}
.off-pcard-ck{
  flex:0 0 auto;display:flex;align-items:center;gap:6px;min-width:0;
  margin-top:7px;padding-top:7px;border-top:1px solid rgba(122,82,48,.18);
  font-size:10.5px;color:var(--ink-3);
}
.off-pcard-ck-k{flex:0 0 auto;color:var(--ink-4);letter-spacing:.08em}
.off-pcard-ck b{flex:0 0 auto;font-size:12px;color:var(--accent);font-weight:600}
.off-pcard-ck b.off{color:var(--ink-4);font-weight:500}
.off-pcard-ck-date{
  margin-left:auto;min-width:0;font-size:9.5px;color:var(--ink-4);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
}

/* 卡片下方：翻面 / 换一棵 */
.off-deck-tools{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:12px}
.off-deck-arrow{
  width:42px;height:42px;flex:0 0 auto;border-radius:50%;cursor:pointer;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-2);
  display:grid;place-items:center;box-shadow:0 2px 8px rgba(44,62,45,.08);
  transition:transform .15s ease,background .15s ease;
}
.off-deck-arrow:active{transform:scale(.92);background:var(--paper-2)}
.off-deck-arrow svg{width:17px;height:17px}
.off-deck-flipbtn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:42px;padding:0 18px;
  border-radius:999px;cursor:pointer;font:inherit;font-size:12.5px;font-weight:600;
  color:var(--cinnabar);background:var(--cinnabar-soft);border:1px solid rgba(176,58,46,.28);
  transition:transform .15s ease,background .15s ease;
}
.off-deck-flipbtn:active{transform:scale(.96);background:rgba(176,58,46,.14)}
.off-deck-flipbtn svg{width:15px;height:15px}
.off-deck-arrow:focus-visible,.off-deck-flipbtn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.off-deck-hint{text-align:center;font-size:10.5px;color:var(--ink-4);margin-top:8px;letter-spacing:.02em}
.off-deck-records{padding-top:2px}

/* ---------- 我的图鉴：3D 卡片浮层 ---------- */
.pcard-layer{
  /* 卡片宽度：收藏卡跟着可用高度一起放大（高屏不再固定 286px），明信片按横版铺满 */
  --pcard-collect-w:min(calc(100vw - 40px), calc((100vh - 244px) / 1.4), 360px);
  --pcard-collect-w:min(calc(100vw - 40px), calc((100dvh - 244px) / 1.4), 360px);
  --pcard-post-w:min(calc(100vw - 32px),416px);
  position:fixed;inset:0;z-index:1150;display:flex;align-items:center;justify-content:center;
  padding:max(12px,env(safe-area-inset-top,0px)) 16px max(12px,env(safe-area-inset-bottom,0px));
  background:rgba(20,27,21,.82);animation:offFadeIn .2s ease;
}
.pcard-panel{
  position:relative;width:100%;max-width:420px;max-height:100%;
  padding:0 0 2px;display:flex;flex-direction:column;align-items:center;
  overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none;
}
.pcard-panel::-webkit-scrollbar{display:none}
.pcard-close{
  position:absolute;top:0;right:0;z-index:6;width:36px;height:36px;border-radius:50%;
  display:grid;place-items:center;cursor:pointer;color:#f6f1e2;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.22);
  transition:background .15s ease;
}
.pcard-close:active{background:rgba(255,255,255,.26)}
.pcard-close svg{width:15px;height:15px}
.pcard-close:focus-visible{outline:2px solid #fff;outline-offset:2px}
.pcard-stage-slot{
  flex:0 0 auto;display:flex;align-items:center;justify-content:center;
  width:var(--pcard-post-w);
  height:calc(var(--pcard-collect-w) * 1.4);
}
.pcard-stage{width:var(--pcard-collect-w);margin:0}
.pcard-stage.is-postcard{width:var(--pcard-post-w);aspect-ratio:3/2}
/* 卡片放大后卡面文字跟着长，否则名称与地点之间会空出一大条；
   下限取原字号，小屏（244 宽）保持旧观感不动 */
.pcard-layer .off-pcard-inner{container-type:inline-size}
.pcard-layer .off-pcard-foot{padding:clamp(10px,4.2cqw,15px) clamp(13px,4.6cqw,18px) clamp(11px,4.8cqw,17px)}
.pcard-layer .off-pcard-name{font-size:clamp(27px,9.45cqw,34px)}
.pcard-layer .off-pcard-py{font-size:clamp(10.5px,3.7cqw,13px)}
.pcard-layer .off-pcard-loc{font-size:clamp(11px,3.85cqw,13.5px)}
.pcard-layer .off-pcard-loc svg{width:clamp(11px,3.85cqw,13.5px);height:clamp(11px,3.85cqw,13.5px)}
.pcard-stage.is-zoomed{touch-action:none;cursor:grab;will-change:transform}
.pcard-stage.is-pinching{cursor:grabbing}
.pcard-layer.is-zoomed .pcard-panel{overflow:visible}
/* 类型切换：收藏卡 / 明信片 */
.pcard-modes{
  position:relative;z-index:6;
  display:flex;gap:3px;margin:0 0 12px;padding:3px;border-radius:999px;
  background:rgba(16,23,17,.52);border:1px solid rgba(255,255,255,.13);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.pcard-mode{
  font:inherit;font-size:12px;font-weight:600;letter-spacing:.06em;cursor:pointer;
  min-height:32px;padding:0 17px;border:0;border-radius:999px;
  color:rgba(246,241,226,.68);background:transparent;
  transition:background .18s,color .18s,transform .12s;
}
.pcard-mode.on{color:var(--ink);background:#f3edde;box-shadow:0 2px 8px rgba(0,0,0,.22)}
.pcard-mode:active{transform:scale(.97)}
.pcard-mode:focus-visible{outline:2px solid #fff;outline-offset:2px}

/* ---------- 明信片卡面（横版 3:2） ---------- */
.pcard-post .off-pcard-inner{background:#fbf7ec}
.pcard-post.off-pcard-front .off-pcard-inner{padding:9px 9px 0}
.pcard-post-photo{
  position:relative;flex:1;min-height:0;border-radius:9px;overflow:hidden;
  background:var(--paper-2);
}
.pcard-post-caption{
  flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:7px 4px 8px;
}
.pcard-post-title-wrap{min-width:0}
.pcard-post-title{
  font-family:var(--f-display);font-size:18px;font-weight:400;line-height:1.15;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.pcard-post-sub{
  margin-top:2px;font-size:9px;letter-spacing:.02em;color:var(--ink-4);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.pcard-post-meta{flex:0 0 auto;text-align:right;font-size:8px;letter-spacing:.08em;color:var(--ink-4)}
.pcard-post-meta b{
  display:block;font-family:var(--f-display);font-weight:400;font-size:11px;
  color:var(--ink-3);font-variant-numeric:tabular-nums;
}
.pcard-post-meta span{display:block;margin-top:1px}
/* 卡背：左信笺右邮寄面 */
.off-pcard-inner.pcard-post-back{
  display:flex;flex-direction:row;padding:12px 13px 11px;
  background:
    radial-gradient(120% 90% at 8% 0%,rgba(255,255,255,.72),rgba(255,255,255,0) 62%),
    repeating-linear-gradient(0deg,rgba(122,82,48,.03) 0 1px,rgba(0,0,0,0) 1px 5px),
    linear-gradient(160deg,#f9f2e2,#f0e5cd);
}
.off-pcard-inner.pcard-post-back::before{
  content:'';position:absolute;inset:5px;border:1px solid rgba(122,82,48,.24);border-radius:10px;pointer-events:none;
}
.pcard-post-left{
  position:relative;z-index:1;flex:1.12;min-width:0;display:flex;flex-direction:column;
  padding-right:12px;border-right:1px dashed rgba(122,82,48,.32);
}
.pcard-post-kicker{font-size:8px;letter-spacing:.2em;color:var(--cinnabar)}
.pcard-post-letter{
  flex:1;min-height:0;margin-top:6px;font-size:11.5px;line-height:1.62;color:var(--ink-2);
  font-family:"Kaiti SC","STKaiti","KaiTi",var(--f-display);
  overflow:hidden;
}
.pcard-post-sign{
  display:flex;align-items:flex-end;justify-content:space-between;gap:8px;margin-top:5px;
  font-size:9px;color:var(--ink-3);
}
.pcard-post-sign span{
  font-family:"Kaiti SC","STKaiti","KaiTi",var(--f-display);font-size:12px;color:var(--ink-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.pcard-post-sign em{flex:0 0 auto;font-style:normal;color:var(--ink-4);font-variant-numeric:tabular-nums}
.pcard-post-right{position:relative;z-index:1;flex:.88;min-width:0;display:flex;flex-direction:column;padding-left:12px}
.pcard-post-stamp{
  position:absolute;right:0;top:0;width:42px;height:48px;border-radius:3px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  color:var(--cinnabar);background:rgba(176,58,46,.06);
  border:1px dashed rgba(176,58,46,.55);
  box-shadow:inset 0 0 0 2px rgba(255,255,255,.6);
  transform:rotate(3deg);
}
.pcard-post-stamp svg{width:13px;height:13px}
.pcard-post-stamp b{font-size:9px;letter-spacing:.08em}
.pcard-post-stamp em{font-style:normal;font-size:8px;opacity:.8}
.pcard-post-mark{
  position:absolute;right:24px;top:31px;width:58px;height:58px;border-radius:50%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  border:1px dashed rgba(44,62,45,.5);color:rgba(44,62,45,.62);
  font-size:7px;letter-spacing:.06em;text-align:center;
  transform:rotate(-9deg);opacity:.85;
}
.pcard-post-mark b{font-size:8px;font-weight:600;max-width:46px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pcard-post-addr{margin-top:auto;padding-top:8px}
.pcard-post-addr > span{display:block;font-size:7.5px;letter-spacing:.16em;color:var(--ink-4)}
.pcard-post-line{
  margin-top:2px;padding-bottom:2px;border-bottom:1px solid rgba(122,82,48,.35);
  font-size:9px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.pcard-post-addr i{display:block;height:1px;background:rgba(122,82,48,.22);margin-top:9px}
.pcard-photo-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:opacity .28s ease}
.pcard-photo-img[data-state="loading"]{opacity:0}
.pcard-photo-empty{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:8px;color:var(--ink-3);font-size:12px;
}
.pcard-photo-empty svg{width:40px;height:40px;opacity:.55}
.pcard-layer .off-deck-tools{margin-top:14px}
.pcard-layer .off-deck-flipbtn{
  color:#f6f1e2;background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.24);
}
.pcard-layer .off-deck-flipbtn:active{background:rgba(255,255,255,.26)}
.pcard-layer .off-deck-flipbtn:disabled{opacity:.55;cursor:wait}
.pcard-layer .off-deck-flipbtn:focus-visible{outline-color:#fff}
.pcard-layer .off-deck-hint{color:rgba(246,241,226,.72)}
.pcard-layer.is-zoomed .off-deck-tools,
.pcard-layer.is-zoomed .off-deck-hint,
.pcard-layer.is-zoomed .pcard-thumbs{visibility:hidden;pointer-events:none}
.pcard-zoom-reset{
  position:absolute;left:50%;bottom:max(16px,env(safe-area-inset-bottom,0px));z-index:7;
  transform:translateX(-50%);display:none;align-items:center;justify-content:center;
  min-height:38px;padding:0 18px;border-radius:999px;cursor:pointer;
  font:inherit;font-size:12px;font-weight:600;letter-spacing:.08em;
  color:#f6f1e2;background:rgba(16,23,17,.8);border:1px solid rgba(255,255,255,.3);
  box-shadow:0 8px 20px rgba(0,0,0,.3);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
}
.pcard-layer.is-zoomed .pcard-zoom-reset{display:inline-flex}
.pcard-zoom-reset:active{transform:translateX(-50%) scale(.96)}
.pcard-zoom-reset:focus-visible{outline:2px solid #fff;outline-offset:2px}
.pcard-layer .off-pcard-intro.is-scroll:not(.is-scroll-end){
  -webkit-mask-image:linear-gradient(180deg,#000 max(calc(100% - 16px),14px),rgba(0,0,0,0));
  mask-image:linear-gradient(180deg,#000 max(calc(100% - 16px),14px),rgba(0,0,0,0));
}
.pcard-thumbs{
  display:flex;align-items:center;gap:8px;max-width:100%;margin-top:16px;padding:6px 9px;
  overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;
  background:rgba(16,23,17,.42);border:1px solid rgba(255,255,255,.09);border-radius:16px;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.pcard-thumbs::-webkit-scrollbar{display:none}
.pcard-thumb{
  flex:0 0 auto;width:48px;height:48px;padding:0;border-radius:10px;overflow:hidden;cursor:pointer;
  border:2px solid transparent;background:var(--paper-2);opacity:.7;
  transition:opacity .18s,border-color .18s,transform .15s;
}
.pcard-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.pcard-thumb.on{border-color:#fff;opacity:1;box-shadow:0 3px 10px rgba(0,0,0,.28)}
.pcard-thumb:active{transform:scale(.94)}
.pcard-thumb:focus-visible{outline:2px solid #fff;outline-offset:2px}
.pcard-thumb-count{
  flex:0 0 auto;margin-left:2px;font-size:10.5px;color:rgba(246,241,226,.75);
  font-variant-numeric:tabular-nums;
}
/* 矮屏（如 568/640 高）收小卡片，保证翻面按钮和缩略图不落到折叠线外；
   卡片不能缩太窄——正方形照片会吃掉卡面下半张，把树名压扁、挤掉地点行和卡背介绍 */
@media(max-height:640px){
  .pcard-modes{margin-bottom:9px}
  .pcard-layer{
    --pcard-collect-w:min(calc(100vw - 40px),244px);
    --pcard-post-w:min(calc(100vw - 32px),340px);
  }
  .pcard-layer .off-deck-tools{margin-top:8px}
  .pcard-layer .off-deck-hint{margin-top:5px}
  .pcard-thumbs{margin-top:9px;padding:4px 7px}
  .pcard-thumb{width:40px;height:40px}
}

/* ---------- 打卡摘要与记录列表 ---------- */
.ck-latest{
  display:flex;gap:12px;align-items:flex-start;margin-top:10px;
  padding:12px;border-radius:14px;background:var(--accent-light);border:1px solid rgba(90,122,92,.18);
}
.ck-latest-photos{display:flex;gap:6px;flex:0 0 auto}
.ck-latest-photos img{width:56px;height:56px;border-radius:10px;object-fit:cover}
.ck-latest-body{flex:1;min-width:0}
.ck-latest-date{font-size:12px;color:var(--ink-3)}
.ck-latest-note{font-size:13.5px;color:var(--ink);margin-top:4px;line-height:1.6;overflow-wrap:anywhere}
.ck-item{display:flex;gap:12px;align-items:flex-start;padding:12px 0;border-bottom:1px solid var(--paper-3)}
.ck-item:last-child{border-bottom:0}
.ck-photos{display:flex;gap:6px;flex:0 0 auto}
.ck-photos img{width:48px;height:48px;border-radius:8px;object-fit:cover}
.ck-body{flex:1;min-width:0}
.ck-date{font-size:11.5px;color:var(--ink-4);letter-spacing:.03em}
.ck-note{font-size:13px;color:var(--ink-2);margin-top:4px;line-height:1.6;overflow-wrap:anywhere}
.ck-ops{display:flex;gap:6px;flex:0 0 auto}
.ck-btn{
  font:inherit;font-size:12px;padding:6px 10px;border-radius:9px;
  border:1px solid var(--line);background:var(--raise);color:var(--ink-3);cursor:pointer;transition:.15s;
}
.ck-btn.danger{color:#a05a50}
.ck-btn.confirm{background:#b04030;border-color:#b04030;color:#fff;font-weight:600}
.off-empty-hint{font-size:12.5px;color:var(--ink-4);padding:14px 0;line-height:1.7}

/* ---------- 打卡弹层（底部 sheet） ---------- */
.sheet-mask{
  position:fixed;inset:0;z-index:1100;background:rgba(44,62,45,.45);
  display:flex;align-items:flex-end;justify-content:center;
  animation:offFadeIn .2s ease;
}
.sheet{
  width:100%;max-width:560px;background:var(--paper);
  border-radius:20px 20px 0 0;
  padding:18px 20px calc(20px + env(safe-area-inset-bottom,0px));
  max-height:86vh;max-height:86dvh;overflow-y:auto;
  animation:sheetUp .28s cubic-bezier(.32,.72,.34,1);
}
@keyframes offFadeIn{from{opacity:0}to{opacity:1}}
@keyframes sheetUp{from{transform:translateY(40%);opacity:.6}to{transform:none;opacity:1}}
.sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
.sheet-head b{font-family:var(--f-display);font-size:18px;font-weight:400;color:var(--ink)}
.sheet-close{
  width:32px;height:32px;border:0;border-radius:10px;background:var(--paper-2);
  color:var(--ink-3);cursor:pointer;display:grid;place-items:center;
}
.sheet-close svg{width:14px;height:14px}
.sheet-label{font-size:12px;color:var(--ink-3);letter-spacing:.04em;margin:14px 0 8px;display:flex;justify-content:space-between;align-items:center}
.sheet-count{font-size:11px;color:var(--ink-4)}
.cphotos{display:flex;gap:10px;flex-wrap:wrap}
.cphoto{position:relative;width:88px;height:88px;border-radius:12px;overflow:hidden;background:var(--paper-2)}
.cphoto img{width:100%;height:100%;object-fit:cover;display:block}
.cphoto.add{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  border:1.5px dashed var(--line-2);background:var(--paper-2);color:var(--ink-3);
  cursor:pointer;font:inherit;font-size:11px;
}
.cphoto.add svg{width:20px;height:20px}
.cphoto.add:disabled{opacity:.5;cursor:not-allowed}
.cphoto-remove{
  position:absolute;top:4px;right:4px;width:22px;height:22px;border:0;border-radius:50%;
  background:rgba(44,62,45,.65);color:#fff;cursor:pointer;display:grid;place-items:center;
}
.cphoto-remove svg{width:10px;height:10px}
.cphoto-remove:disabled{opacity:.5}
.checkin-status{font-size:12px;color:var(--accent);margin-top:8px}
.checkin-note{
  width:100%;font:inherit;font-size:14px;line-height:1.7;color:var(--ink);
  padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--raise);resize:none;
}
.checkin-note:focus{outline:2px solid var(--accent);outline-offset:1px}
.checkin-submit{width:100%;margin-top:16px;min-height:48px}

/* ---------- 打卡撒花 ---------- */
.confetti-wrap{position:fixed;inset:0;z-index:1300;pointer-events:none;overflow:hidden}
.confetti-wrap i{
  position:absolute;top:-16px;width:8px;height:14px;border-radius:2px;
  opacity:.95;animation:confettiFall linear forwards;
}
@keyframes confettiFall{to{transform:translateY(105vh) rotate(540deg);opacity:.9}}

/* ---------- 拼图图鉴：3×3 拼图封面 / 掉落胶囊 / 记录面板 / 获得碎片弹窗 ---------- */
.pz-cover{position:relative;display:block;width:100%;aspect-ratio:4/3;overflow:hidden;background:var(--paper-2)}
.pz-cover img{width:100%;height:100%;object-fit:cover;display:block}
.pz-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr)}
.pz-cell{
  background-size:300% 300%;background-repeat:no-repeat;
  filter:grayscale(1) brightness(.95);opacity:.4;
  box-shadow:inset 0 0 0 1px rgba(44,62,45,.12);
}
.pz-cell.got{filter:none;opacity:1;box-shadow:inset 0 0 0 1px rgba(44,62,45,.16)}
.pz-count{
  position:absolute;right:6px;bottom:6px;z-index:2;
  font-size:10.5px;color:var(--ink-2);background:rgba(250,250,247,.9);
  border-radius:999px;padding:2px 8px;letter-spacing:.02em;
}
.tag-new{
  position:absolute;left:6px;top:6px;z-index:3;
  font-size:10.5px;font-weight:600;color:#fff;background:var(--cinnabar);
  border-radius:6px;padding:2px 7px;letter-spacing:.08em;
  box-shadow:0 1px 4px rgba(176,58,46,.35);
}
.pz-hint{
  font-size:12.5px;color:var(--ink-2);line-height:1.65;margin:10px 0 2px;
  padding:9px 12px;border-radius:10px;background:var(--cinnabar-soft);
  border:1px solid rgba(176,58,46,.18);
}
.off-card.locating{box-shadow:0 0 0 3px var(--cinnabar),var(--shadow);transition:box-shadow .25s ease}
.drop-chip{
  margin-left:auto;flex:0 0 auto;cursor:pointer;font:inherit;white-space:nowrap;
  font-size:11.5px;letter-spacing:.02em;color:var(--cinnabar);
  border:1px solid rgba(176,58,46,.3);background:var(--cinnabar-soft);
  border-radius:999px;padding:5px 10px;
}
.rec-sheet{max-height:72vh;max-height:72dvh}
.rec-row{padding:11px 2px;border-bottom:1px solid var(--paper-3)}
.rec-row:last-of-type{border-bottom:0}
.rec-r1{display:flex;align-items:center;gap:8px;font-family:var(--f-display);font-size:14.5px;color:var(--ink)}
.rec-r2{display:block;font-size:12px;color:var(--ink-3);margin-top:3px}
.rec-badge{font-size:10.5px;font-weight:600;letter-spacing:.04em;border-radius:6px;padding:2px 7px;font-family:var(--f-body)}
.rec-badge.frag{background:var(--cinnabar-soft);color:var(--cinnabar)}
.rec-badge.complete{background:var(--cinnabar);color:#fff}
.rec-badge.dup{background:var(--paper-3);color:var(--ink-3)}
.frag-mask{
  position:fixed;inset:0;z-index:1400;background:rgba(44,62,45,.42);
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  display:flex;align-items:center;justify-content:center;padding:24px;
  animation:offFadeIn .2s ease;
}
.frag-box{
  width:min(84vw,320px);background:var(--paper);border-radius:18px;box-shadow:var(--shadow-lg);
  padding:20px 20px 18px;text-align:center;
  animation:fragPop .32s cubic-bezier(.32,.72,.34,1);
}
@keyframes fragPop{from{transform:translateY(14px) scale(.96);opacity:0}to{transform:none;opacity:1}}
.frag-art{position:relative;width:100%;height:170px;border-radius:12px;overflow:hidden;background:var(--paper-2);display:grid;place-items:center;margin-bottom:14px}
.frag-art img{width:100%;height:100%;object-fit:cover;animation:fragReveal .9s ease}
@keyframes fragReveal{from{filter:blur(14px) grayscale(1);opacity:.4}to{filter:none;opacity:1}}
.frag-piece{
  width:150px;height:113px;background-size:300% 300%;background-repeat:no-repeat;border-radius:10px;
  box-shadow:0 0 0 2px rgba(44,62,45,.22),var(--shadow);transform:rotate(-3deg);
}
.dt-seal{
  position:absolute;right:10px;top:10px;width:46px;height:46px;border-radius:50%;
  display:grid;place-items:center;font-family:var(--f-display);font-size:11px;line-height:1.15;
  color:#fff;background:var(--cinnabar);box-shadow:0 2px 8px rgba(176,58,46,.4);
  animation:sealIn .45s cubic-bezier(.34,1.56,.64,1) .55s both;
}
@keyframes sealIn{from{transform:scale(2.2) rotate(24deg);opacity:0}to{transform:scale(1) rotate(8deg);opacity:1}}
.frag-art.energy{background:var(--cinnabar-soft)}
.frag-energy{font-family:var(--f-display);font-size:44px;color:var(--cinnabar);line-height:1}
.frag-energy-unit{display:block;font-size:13px;color:var(--ink-3);margin-top:6px}
.frag-title{font-family:var(--f-display);font-size:19px;color:var(--ink);margin-bottom:6px}
.frag-sub{font-size:13px;color:var(--ink-2);line-height:1.7;margin-bottom:16px}
.frag-rw{color:var(--cinnabar)}
.frag-btns{display:flex;gap:10px}
.frag-btn{flex:1;min-height:44px;border-radius:12px;font:inherit;font-size:14.5px;cursor:pointer;border:1px solid transparent}
.frag-btn.main{background:var(--cinnabar);color:#fff;font-weight:600}
.frag-btn.ghost{background:transparent;border-color:var(--line-2);color:var(--ink-2)}

/* ---------- 官方图鉴：列表 / 地图切换 ---------- */
.off-top{
  position:sticky;top:0;z-index:30;
  background:rgba(250,250,247,.94);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border-bottom:1px solid var(--paper-3);
}
.off-top .off-navbar{position:static;background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;border-bottom:0;padding-bottom:8px}
.off-viewbar{display:flex;align-items:center;gap:10px;padding:0 12px 10px}
.off-viewseg{display:flex;gap:2px;padding:3px;border-radius:11px;background:var(--paper-2)}
.off-viewseg button{
  display:inline-flex;align-items:center;gap:4px;
  border:0;border-radius:9px;background:transparent;color:var(--ink-3);
  font:inherit;font-size:12px;font-weight:500;padding:6px 12px;cursor:pointer;white-space:nowrap;
  transition:background .18s ease,color .18s ease;
}
.off-viewseg button.on{background:var(--raise);color:var(--accent);font-weight:600;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.off-viewseg button svg{width:14px;height:14px;flex:0 0 auto}
.off-viewseg button:focus-visible,.off-map-tools button:focus-visible,.off-mcard-close:focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* ---------- 官方图鉴：地图视图 ---------- */
.official-map-body{display:flex;flex-direction:column;overflow:hidden;padding:0}
.off-map-wrap{
  position:relative;flex:1;min-height:0;overflow:hidden;
  background:radial-gradient(120% 80% at 18% 12%,#f0f3e6 0%,#e9edde 46%,#e3e8d8 100%);
}
.off-map-wrap::before{
  content:'';position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:
    repeating-radial-gradient(circle at 28% 38%,transparent 0 26px,rgba(90,122,92,.05) 26px 27px),
    repeating-radial-gradient(circle at 78% 72%,transparent 0 34px,rgba(90,122,92,.04) 34px 35px);
}
.off-map-canvas{position:absolute;inset:0;z-index:1;background:transparent}
.off-map-canvas,.off-map-canvas *{touch-action:none}
.off-map-state{
  position:absolute;inset:0;z-index:6;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;
}
.off-map-state[hidden]{display:none}
.off-map-state[data-kind="hint"]{
  inset:auto;left:50%;top:54px;transform:translateX(-50%);
  display:block;padding:0;text-align:left;
}
.off-map-loading{
  display:inline-flex;align-items:center;gap:8px;
  padding:10px 14px;border-radius:999px;background:rgba(255,255,252,.88);
  font-size:12.5px;color:var(--ink-3);box-shadow:0 2px 10px rgba(44,62,45,.08);
}
.off-map-loading i{
  width:14px;height:14px;border-radius:50%;
  border:2px solid rgba(90,122,92,.25);border-top-color:var(--accent);
  animation:offMapSpin .8s linear infinite;
}
@keyframes offMapSpin{to{transform:rotate(360deg)}}
.off-map-fallback{
  max-width:320px;padding:24px 22px 20px;border-radius:20px;
  background:rgba(255,255,252,.95);border:1px solid var(--line);box-shadow:var(--shadow);
}
.off-map-fallback-ic{
  width:52px;height:52px;margin:0 auto 12px;border-radius:50%;
  display:grid;place-items:center;background:var(--accent-light);color:var(--accent);
}
.off-map-fallback-ic svg{width:26px;height:26px}
.off-map-fallback b{display:block;font-family:var(--f-display);font-size:18px;font-weight:400;color:var(--ink)}
.off-map-fallback p{font-size:12.5px;line-height:1.7;color:var(--ink-3);margin:6px 0 16px}
.off-map-fallback-btns{display:flex;gap:8px;justify-content:center}
.off-map-fallback-btns .btn{flex:0 0 auto;min-width:96px}
.off-map-hint{
  display:inline-flex;align-items:center;gap:10px;max-width:calc(100vw - 48px);
  padding:8px 12px;border-radius:999px;background:rgba(255,255,252,.96);
  border:1px solid var(--line);box-shadow:0 3px 12px rgba(44,62,45,.1);
  font-size:11.5px;color:var(--ink-3);
}
.off-map-hint span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.off-map-hint button{border:0;background:none;padding:0;color:var(--accent);font:inherit;font-weight:600;cursor:pointer;white-space:nowrap}
.off-map-pill{
  position:absolute;left:12px;top:12px;z-index:6;
  display:inline-flex;align-items:center;gap:5px;
  padding:6px 10px;border-radius:999px;
  background:rgba(255,255,252,.93);border:1px solid var(--line);
  box-shadow:0 2px 8px rgba(44,62,45,.1);
  font:inherit;font-size:11.5px;color:var(--ink-2);cursor:pointer;touch-action:manipulation;
}
.off-map-pill svg{width:12px;height:12px;color:var(--accent)}
.off-map-pill svg:last-child{width:10px;height:10px;color:var(--ink-4);transition:transform .18s ease}
.off-map-pill.on svg:last-child{transform:rotate(180deg)}
.off-map-pill:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.off-map-punch{
  position:absolute;left:12px;right:12px;top:47px;z-index:6;
  max-height:min(52vh,380px);overflow:auto;-webkit-overflow-scrolling:touch;
  display:flex;flex-direction:column;gap:2px;padding:8px;
  border-radius:16px;background:rgba(255,255,252,.97);border:1px solid var(--line);
  box-shadow:0 10px 28px rgba(44,62,45,.18);
}
.off-map-punch[hidden]{display:none}
/* 地区级联胶囊：数据真的跨省/跨市才会出现这一行 */
.off-map-filters{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  padding:2px 2px 9px;margin-bottom:5px;border-bottom:1px solid var(--paper-3);
}
.off-map-filter-lab{font-size:10.5px;letter-spacing:.04em;color:var(--ink-4);margin-right:1px}
.off-map-chip{
  display:inline-flex;align-items:baseline;gap:3px;padding:7px 12px;border-radius:999px;
  background:var(--paper);border:1px solid var(--line);color:var(--ink-2);
  font:inherit;font-size:12.5px;cursor:pointer;touch-action:manipulation;transition:.14s ease;
}
.off-map-chip em{font-style:normal;font-size:10.5px;color:var(--ink-4)}
.off-map-chip.on{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.off-map-chip.on em{color:rgba(255,255,252,.7)}
.off-map-chip:active{transform:scale(.96)}
.off-map-chip:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.off-punch-head{
  display:flex;align-items:baseline;justify-content:space-between;
  padding:4px 10px;font-size:11px;letter-spacing:.04em;color:var(--ink-4);
}
.off-punch-head em{font-style:normal;color:var(--ink-3)}
.off-prow{
  display:flex;align-items:center;gap:8px;min-width:0;text-align:left;
  min-height:30px;padding:4px 10px;border:0;border-radius:9px;background:none;color:var(--ink-2);
  font:inherit;font-size:13px;line-height:1.35;cursor:pointer;touch-action:manipulation;
}
/* 我的树木地图快切列表里的树龄，跟在树名后面，不抢地点 */
.off-prow-age{flex:0 0 auto;font-size:11px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.off-prow:active{background:var(--paper-2)}
.off-prow:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.off-prow.dim{color:var(--ink-4);cursor:default}
.off-prow.dim:active{background:none}
.off-prow-name{flex:0 0 auto;max-width:46%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;color:var(--ink)}
.off-prow-loc{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;color:var(--ink-4)}
.off-prow-done{flex:0 0 auto;display:grid;place-items:center;color:var(--accent)}
.off-prow-done svg{width:13px;height:13px}
.off-prow-tag{flex:0 0 auto;font-size:10.5px;color:var(--ink-4)}
.off-map-tools{
  position:absolute;right:12px;top:50%;transform:translateY(-50%);z-index:5;
  display:flex;flex-direction:column;gap:8px;transition:opacity .18s ease;
}
/* 快切列表整宽盖过来时，工具列收掉：看不见的按钮不许还能点 */
.off-map-wrap.punch-open .off-map-tools{opacity:0;pointer-events:none}
.off-map-tools[hidden]{display:none}
.off-map-tools button{
  width:40px;height:40px;border-radius:12px;cursor:pointer;
  display:grid;place-items:center;
  background:rgba(255,255,252,.95);border:1px solid rgba(212,212,204,.9);color:var(--ink-2);
  box-shadow:0 2px 8px rgba(44,62,45,.12);touch-action:manipulation;
  transition:transform .14s ease;
}
.off-map-tools button:active{transform:scale(.94)}
.off-map-tools button svg{width:18px;height:18px}
.off-map-note{
  position:absolute;left:50%;bottom:calc(10px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);z-index:4;
  padding:4px 10px;border-radius:999px;background:rgba(250,250,247,.82);
  font-size:10.5px;color:var(--ink-3);white-space:normal;text-align:center;line-height:1.45;
  width:max-content;max-width:calc(100% - 24px);pointer-events:none;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.off-map-card{
  position:absolute;left:10px;right:10px;bottom:calc(10px + env(safe-area-inset-bottom,0px));z-index:8;
  padding:10px 12px 12px;border-radius:20px;
  background:rgba(255,255,252,.98);border:1px solid rgba(212,212,204,.9);box-shadow:var(--shadow-lg);
  transform:translateY(calc(100% + 24px));transition:transform .28s cubic-bezier(.32,.72,0,1);
  touch-action:none;
}
.off-map-card.on{transform:translateY(0)}
.off-map-card[hidden]{display:none}
.off-map-card.dragging{transition:none}
.off-mcard-grip{width:36px;height:4px;margin:0 auto 10px;border-radius:2px;background:var(--line)}
.off-mcard-close{
  position:absolute;right:8px;top:8px;width:30px;height:30px;border:0;border-radius:50%;
  display:grid;place-items:center;background:var(--paper-2);color:var(--ink-3);cursor:pointer;
}
.off-mcard-close svg{width:14px;height:14px}
.off-mcard-main{display:flex;gap:12px;padding-right:24px}
.off-mcard-cover{flex:0 0 82px;width:82px;height:82px;border-radius:12px;overflow:hidden;background:var(--paper-2)}
.off-mcard-cover .pz-cover{height:100%;aspect-ratio:auto}
.off-mcard-info{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}
.off-mcard-name{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-family:var(--f-display);font-size:17px;color:var(--ink)}
.off-mcard-done{
  font-family:var(--f-body);font-size:10px;font-weight:600;color:var(--accent);
  background:var(--accent-light);border-radius:999px;padding:2px 7px;
}
.off-mcard-py{font-size:10.5px;color:var(--ink-4);letter-spacing:.04em;margin-top:2px}
.off-mcard-info .off-card-loc{margin-top:5px}
.off-mcard-meta{display:flex;flex-wrap:wrap;gap:3px 4px;margin-top:5px;font-size:10.5px;color:var(--ink-3)}
.off-mcard-meta span+span::before{content:'·';margin-right:4px;color:var(--ink-4)}
.off-mcard-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:10px}
.off-mcard-actions .btn.primary{flex:0 0 auto;min-width:96px}

/* ---------- 我的树木地图：点位缺失、错误与待定位列表 ---------- */
.my-map-wrap .off-map-pill{left:auto;right:12px}
.my-map-fallback-body{padding-bottom:calc(var(--tab-h) + 24px + env(safe-area-inset-bottom,0px))}
.my-map-fallback{
  margin:16px;padding:26px 22px 22px;border-radius:20px;text-align:center;
  background:var(--raise);border:1px solid var(--line);box-shadow:0 2px 14px rgba(44,62,45,.06);
}
.my-map-fallback-ic{
  width:52px;height:52px;margin:0 auto 12px;border-radius:50%;
  display:grid;place-items:center;background:var(--accent-light);color:var(--accent);
}
.my-map-fallback-ic svg{width:26px;height:26px}
.my-map-fallback h3{font-family:var(--f-display);font-size:18px;font-weight:400;color:var(--ink)}
.my-map-fallback p{font-size:12.5px;line-height:1.7;color:var(--ink-3);margin:6px 0 16px;overflow-wrap:anywhere}
.my-map-fallback-actions{display:flex;gap:8px;justify-content:center}
.my-map-fallback .btn{flex:0 0 auto;min-width:96px}
.my-map-pending{margin:0 16px;border-radius:16px;background:var(--raise);border:1px solid var(--line);overflow:hidden}
.my-map-pending-head{
  display:flex;align-items:baseline;justify-content:space-between;padding:12px 14px 8px;
  font-size:12px;color:var(--ink-3);
}
.my-map-pending-head span{font-family:var(--f-display);font-size:14px;color:var(--ink)}
.my-map-pending-head em{font-style:normal;font-size:11px;color:var(--ink-4)}
.my-map-prow{
  display:flex;align-items:center;gap:10px;width:100%;padding:11px 14px;
  border:0;border-top:1px solid var(--paper-3);background:none;font:inherit;
  text-align:left;cursor:pointer;
}
.my-map-prow:active{background:var(--paper-2)}
.my-map-prow:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.my-map-prow-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.my-map-prow-main b{font-size:13px;color:var(--ink);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.my-map-prow-main small{font-size:11px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.my-map-prow-go{flex:0 0 auto;display:grid;place-items:center;color:var(--ink-4)}
.my-map-prow-go svg{width:14px;height:14px}
.my-map-punch-head{
  display:flex;align-items:baseline;justify-content:space-between;
  padding:9px 10px 4px;font-size:11px;letter-spacing:.04em;color:var(--ink-4);
}
.my-map-punch-head:first-child{padding-top:2px}
.my-map-punch-head em{font-style:normal;color:var(--ink-3)}
.my-map-card-cover{display:grid;place-items:center}
.my-map-card-cover img{width:100%;height:100%;object-fit:cover;display:block}
.my-map-card-noimg{color:var(--ink-4)}
.my-map-card-noimg svg{width:28px;height:28px}

/* ---------- 地图点位与聚合气泡 ---------- */
.off-marker{  position:relative;width:36px;height:46px;cursor:pointer;touch-action:manipulation;
  filter:drop-shadow(0 3px 5px rgba(44,62,45,.28));
}
.off-marker-in{
  position:absolute;left:1px;top:0;width:34px;height:34px;border-radius:50%;
  display:grid;place-items:center;color:#4e6b4f;
  background:#fffdf6;border:2px solid #5a7a5c;
  transition:transform .16s ease;
}
.off-marker-in svg{width:16px;height:16px}
.off-marker-tail{
  position:absolute;left:50%;bottom:2px;width:10px;height:10px;
  background:#fffdf6;border-right:2px solid #5a7a5c;border-bottom:2px solid #5a7a5c;
  transform:translateX(-50%) rotate(45deg);border-radius:0 0 3px 0;
}
.off-marker.checked .off-marker-in{background:#5a7a5c;border-color:#4d6c50;color:#fff}
.off-marker.checked .off-marker-tail{background:#5a7a5c;border-color:#4d6c50}
/* 当前打开卡片的那根针：墨绿实心 + 外圈光晕，与「已打卡」的鼠尾草绿分开 */
.off-marker.active .off-marker-in{
  background:var(--ink);border-color:var(--ink);color:var(--paper);
  box-shadow:0 0 0 6px rgba(44,62,45,.18);transform:scale(1.06);
}
.off-marker.active .off-marker-tail{background:var(--ink);border-color:var(--ink)}
.off-marker:active .off-marker-in{transform:scale(.92)}
.off-cluster{
  width:50px;height:50px;border-radius:50%;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:rgba(255,253,246,.97);border:2px solid rgba(90,122,92,.9);
  box-shadow:0 4px 14px rgba(44,62,45,.2),0 0 0 6px rgba(90,122,92,.08);
  color:#3f5c42;font-family:var(--f-display);line-height:1;
  touch-action:manipulation;
}
.off-cluster.lg{width:56px;height:56px}
.off-cluster b{font-size:18px;font-weight:600}
.off-cluster em{font-style:normal;font-family:var(--f-body);font-size:9px;color:var(--ink-3);margin-top:2px}
/* 我的位置：蓝点是玩家自己，与墨绿的树针分开；精度圈由高德按真实误差画 */
.off-me{position:relative;width:28px;height:28px}
.off-me-dot{
  position:absolute;left:50%;top:50%;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;
  background:#2f6bd8;border:2px solid #fff;box-shadow:0 1px 4px rgba(44,62,45,.35);
}
.off-me-halo{position:absolute;inset:0;border-radius:50%;background:rgba(47,107,216,.18)}
/* 定位中：转一下就够，别把按钮做成进度条 */
.off-map-tools button.busy{color:var(--ink-4)}
.off-map-tools button.busy svg{animation:off-locate-spin .9s linear infinite}
@keyframes off-locate-spin{to{transform:rotate(360deg)}}

/* ---------- 平板适配 ---------- */
@media (min-width:768px){
  /* 特辑页与名树详情页共用容器：平板下不再随 .app 全宽铺开，收窄居中与详情页口径一致。
     width 必须写死：.body 是 .screen 的弹性子项，横向 auto 外边距会顶掉 stretch，
     容器被收成内容宽——地图页只剩一条 174px 的窄柱，针和工具列全被切掉 */
  .official-scroll{width:100%;max-width:760px;margin:0 auto}
  .off-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .off-navbar{padding-left:16px;padding-right:16px}
  .off-viewbar{padding-left:16px;padding-right:16px}
}
@media (prefers-reduced-motion:reduce){
  .sheet,.sheet-mask{animation:none}
  .off-map-tools button.busy svg{animation:none}
  .confetti-wrap{display:none}
  .off-bar i,.oa-bar i{transition:none}
  .frag-box,.frag-mask,.dt-seal,.frag-art img{animation:none}
  .off-card.locating{transition:none}
  .off-map-card{transition:none}
  .off-map-loading i{animation:none}
  .off-deck-flip{transition:none}
  .off-deck-flip .off-pcard{transition:none}
  .off-deck-stage.enter-next,.off-deck-stage.enter-prev{animation:none}
}
