:root{
  /* ── 主题变量 ──────────────────────────────────────────────
     这一整块是【亮色】，值全部照搬改造前的原值，所以亮色渲染不变。
     暗色在文件末尾的 [data-theme="dark"] 里覆盖。
     命名按语义不按字面：--surface 是「卡片的底」，
     暗色下它该是深的，名字不用改。

     最容易出错的是 --on-fg。站上有十二处写的是
       background:var(--fg); color:#fff
     暗色下 --fg 翻成近白，那个写死的 #fff 就成了白字白底，
     按钮文字整个消失。所以「压在 --fg 上面的颜色」必须是变量。

     另一类【刻意不做成变量】：压在照片上的白色 —— 首屏字幕、
     灯箱箭头、轮播圆点、缩略图角标、.nav.over 的品牌字。
     那些压的是照片，照片在两个主题下长得一样，跟着翻反而看不见。 */

  /* 底 */
  --bg:#FAFAF9;            /* 前台页面底 */
  --bg2:#F6F6F4;           /* 后台页面底 */
  --surface:#fff;          /* 卡片、面板、输入框 */
  --surface2:#F0F0EE;      /* 次级填充：hover、选中、小标签 */
  --surface3:#F2F2EE;      /* 空占位块 */
  --imgbg:#eee;            /* 图片位的底 */
  --imgbg2:#E5E5E3;        /* 同上，另一档；也用于细分隔块 */
  --avbg:#ddd;             /* 头像圆底，比 --imgbg 深一档 */
  --nav-bg:rgba(250,250,249,.97);   /* 吸顶导航的半透明底 */

  /* 字 */
  --fg:#1A1A1A;            /* 正文 */
  --fg2:#6B6B6B;           /* 次级 */
  --fg3:#A5A5A0;           /* 弱：计数、说明 */
  --fg4:#BDBDB8;           /* 更弱：label 上的「选填」 */
  --fg5:#C9C9C4;           /* 最弱：placeholder、面包屑斜杠 */
  --fg6:#8A8A85;           /* 灰底小标签上的字 */
  --on-fg:#fff;            /* 压在 --fg 上面 */
  --prose:#3a3a3a;         /* 长段落：关于页、简介、系列序言 */
  --prose2:#4a4a4a;        /* 长段落，次级 */

  /* 线 */
  --line:#E5E5E3;          /* 主分割线、边框 */
  --line2:#D8D8D4;         /* 虚线框 */
  --line3:#C9C9C4;         /* 虚线框，重一点 */
  --line4:#BDBDB8;         /* hover 边框 */
  --line5:#9A9A95;         /* 输入框聚焦 */

  /* 状态色。暗色下要降饱和 —— 原色搬到暗底上会发脏 */
  --danger:#A8452F; --danger2:#8C2F2F; --on-danger:#fff;
  --danger-bg:#FBF3F3; --danger-bg2:#FDF6F4; --danger-bg3:#FDF7F5;
  --danger-line:#E8CEC7; --danger-line2:#C08070;
  --warn:#8A6A2F; --warn2:#8A6A1F; --warn-bg:#FBF8EE; --warn-bg2:#F3EBDC;
  --warn-line:#C9A227;
  --ok:#3C7A4E; --ok2:#2F6B4F;
  --arch-bg:#EFEDE7; --arch-fg:#6E6A60;
  /* 状态角标的底色（永远配白字，两个主题下都得是深的） */
  --stag-ok:#2F6B4F; --stag-pending:#8A6A1F; --stag-rejected:#8C2F2F; --stag-draft:#6B6B6B;
  --soft:#FAFAF7; --soft2:#FCFCFA; --bar:#EAEAE6; --mark:#C0BCB2;

  /* 灯箱与大图预览：它们【本来就是深色】，不属于主题。
     暗色下要比页面底【更深】，否则两层糊在一起 ——
     所以暗色里 --dbg 压到纯黑，而页面底停在 #131313。 */
  --dbg:#0A0A0A; --dfg:#F5F5F5; --dfg2:#8A8A8A; --dfg3:#B9B9B4; --dline:#2A2A2A;
  --serif: Georgia,"Songti SC","Source Han Serif SC",serif;
  --sans: -apple-system,BlinkMacSystemFont,"Helvetica Neue","PingFang SC",sans-serif;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:auto}
body{background:var(--bg);color:var(--fg);font-family:var(--sans);
     font-size:15px;line-height:1.7;-webkit-font-smoothing:antialiased}
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
.wrap{max-width:1440px;margin:0 auto;padding:0 48px}

/* ---------- 数据加载中 / 加载失败 ----------
   booting 这个类由 db.js 加、也由 db.js 去掉。
   如果 db.js 压根没跑起来，类就不会被加上，页面照常显示 —— 故意做成这样，
   免得一个脚本错误把整站变成白屏。 */
body{transition:opacity .28s ease}
body.booting{opacity:0}
.loaderr{position:fixed;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:10px;padding:40px;
  text-align:center;background:var(--bg);z-index:200}
.loaderr b{font-family:var(--serif);font-weight:400;font-size:20px}
.loaderr span{font-size:12px;color:var(--fg2);max-width:520px;line-height:1.7;
  font-family:ui-monospace,Menlo,monospace;word-break:break-all}

/* ---------- nav ---------- */
.nav{position:fixed;top:0;left:0;right:0;z-index:50;
     display:flex;align-items:center;justify-content:space-between;
     padding:28px 48px;
     transition:transform .38s cubic-bezier(.2,.7,.2,1),background .3s,padding .3s,box-shadow .3s}
.nav.hide{transform:translateY(-105%)}
.nav.solid{border-bottom:1px solid var(--line);background:var(--bg);padding:22px 48px}
body.pad{padding-top:78px}
.nav .crumb{font-size:12px;color:var(--fg2);margin-left:14px;letter-spacing:.04em}
.nav .crumb::before{content:"/";margin-right:12px;color:var(--fg5)}
.brand{font-family:var(--serif);font-size:20px;letter-spacing:.06em}
.brand em{font-style:normal;font-size:11px;letter-spacing:.28em;
     opacity:.55;margin-left:10px;vertical-align:2px}
.navlinks{display:flex;gap:32px;font-size:13px;letter-spacing:.04em}
.nav.over{position:fixed;transition:background .35s ease,padding .35s ease,box-shadow .35s}
.nav.over .brand,.nav.over .navlinks{color:#fff;transition:color .35s}
.nav.over .navlinks a{opacity:.8}
.nav.over.stuck{background:var(--nav-bg);padding:18px 48px;
  box-shadow:0 1px 0 var(--line)}
.nav.over.stuck .brand,.nav.over.stuck .navlinks{color:var(--fg)}
.nav.over.stuck .navlinks a{opacity:.65}
.nav.over.stuck .navlinks a.on{opacity:1}
/* 导航下划线滑入 */
.navlinks a{position:relative;padding-bottom:3px}
.navlinks a::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:currentColor;transform:scaleX(0);transform-origin:right;
  transition:transform .3s cubic-bezier(.2,.7,.2,1)}
.navlinks a:hover::after,.navlinks a.on::after{transform:scaleX(1);transform-origin:left}

/* ---------- 导航里往下展开的摄影师菜单 ---------- */
.navdrop{position:relative;display:inline-flex}
.dropwrap{position:absolute;top:100%;left:50%;width:296px;padding-top:20px;
  transform:translateX(-50%) translateY(-8px);
  opacity:0;pointer-events:none;
  transition:opacity .26s cubic-bezier(.2,.7,.2,1),transform .26s cubic-bezier(.2,.7,.2,1)}
.navdrop:hover .dropwrap,.navdrop.open .dropwrap{
  opacity:1;pointer-events:auto;transform:translateX(-50%) translateY(0)}
.dropwrap .dinner{display:block;background:var(--bg);border:1px solid var(--line);
  box-shadow:0 20px 44px rgba(0,0,0,.10);padding:8px}
.navlinks .dropwrap a{display:flex;align-items:center;gap:13px;padding:9px 11px;
  color:var(--fg);opacity:1;transition:background .2s}
.navlinks .dropwrap a::after{display:none}
.navlinks .dropwrap a:hover{background:var(--surface2)}
.dropwrap .da{display:block;width:40px;height:40px;border-radius:50%;overflow:hidden;
  flex:none;background:var(--imgbg2)}
.dropwrap .da img{width:100%;height:100%;object-fit:cover}
.dropwrap b{font-weight:500;font-size:14px;display:block;line-height:1.4}
.dropwrap i{font-style:normal;font-size:11px;color:var(--fg2)}
.navlinks .dropwrap a.dall{justify-content:center;font-size:12px;color:var(--fg2);
  border-top:1px solid var(--line);margin-top:6px;padding-top:12px}

/* ---------- hero ---------- */
.hero{position:relative;height:100vh;overflow:hidden;background:#000;
  perspective:1500px;perspective-origin:50% 46%}
.hstage{position:absolute;inset:0;transform-style:preserve-3d;
  will-change:transform,opacity}
/* 新的一张从很远处推上来，旧的一张越过镜头退场 —— 这是纵深感的来源 */
.hero .slide{position:absolute;inset:0;
  opacity:0;transform:translateZ(-300px) scale(1.26);
  transition:opacity 1.15s ease,transform 1.5s cubic-bezier(.16,.84,.3,1)}
.hero .slide.on{opacity:1;transform:translateZ(0) scale(1.03);z-index:2}
.hero .slide.out{opacity:0;transform:translateZ(240px) scale(1.06);z-index:1}
.hero .slide .ph{position:absolute;inset:-48px;overflow:hidden;  /* 留出视差位移的余量 */
  transition:transform .55s cubic-bezier(.2,.7,.2,1)}
.hero .slide.on .ph img{animation:kb 11s linear forwards}
@keyframes kb{from{transform:scale(1.0)}to{transform:scale(1.07)}}
.hero .slide .cap{opacity:0;
  transition:opacity .8s ease .4s,transform .55s cubic-bezier(.2,.7,.2,1)}
.hero .slide.on .cap{opacity:1}
.hero img{width:100%;height:100%;object-fit:cover}
.hnav{position:absolute;top:0;bottom:0;width:110px;z-index:6;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  color:#fff;font-size:30px;opacity:0;transition:opacity .25s;user-select:none}
.hnav:hover{opacity:.9}
.hnav.prev{left:0} .hnav.next{right:0}
.hero:hover .hnav{opacity:.45}
.dots i{cursor:pointer;transition:background .25s,width .25s}
.hero .grad{position:absolute;inset:0;
  background:linear-gradient(to bottom,rgba(0,0,0,.38) 0%,rgba(0,0,0,0) 26%,
             rgba(0,0,0,0) 46%,rgba(0,0,0,.62) 100%)}
.hero .cap{position:absolute;left:48px;bottom:88px;color:#fff}
.hero .cap h1{font-family:var(--serif);font-weight:400;
  font-size:clamp(32px,5vw,64px);line-height:1.12;letter-spacing:.01em}
.hero .cap .loc{margin-top:14px;font-size:15px;opacity:.86;letter-spacing:.02em}
.hero .cap .by{margin-top:4px;font-size:12px;opacity:.6;letter-spacing:.1em;text-transform:uppercase}
.dots{position:absolute;left:50%;transform:translateX(-50%);bottom:42px;display:flex;gap:10px}
.dots i{width:5px;height:5px;border-radius:50%;background:rgba(255,255,255,.35)}
/* 轮播圆点压在首屏照片上，跟 .dots i 的半透明白是一套，写死 */
.dots i.on{background:#fff;width:22px;border-radius:3px}
.hint{position:absolute;right:48px;bottom:40px;color:rgba(255,255,255,.7);cursor:pointer;
  font-size:11px;letter-spacing:.18em;display:flex;align-items:center;gap:10px;z-index:6}
.hint:hover{color:#fff}
.hint i{display:block;width:1px;height:34px;background:rgba(255,255,255,.45);
  animation:drop 2.2s ease-in-out infinite;transform-origin:top}
@keyframes drop{0%,100%{transform:scaleY(.4);opacity:.4}50%{transform:scaleY(1);opacity:1}}

/* ---------- section ---------- */
.sec{padding:96px 0}
.sechead{display:flex;align-items:baseline;justify-content:space-between;
  padding-bottom:22px;margin-bottom:40px;border-bottom:1px solid var(--line)}
.sechead h2{font-family:var(--serif);font-weight:400;font-size:24px;letter-spacing:.02em}
.sechead .sub{font-size:13px;color:var(--fg2)}

/* ---------- 作品网格：两列 + 大间距 + 图注在下 ---------- */
.cols{column-count:2;column-gap:72px}
.card{break-inside:avoid;margin:0 0 84px;display:block;position:relative}
.card .ph{position:relative;background:var(--surface2);overflow:hidden}
.card img{width:100%;transition:transform 1.2s cubic-bezier(.2,.6,.2,1)}
.card:hover img{transform:scale(1.02)}
.card .cap{padding-top:14px;display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.card .cap .who{font-size:10px;letter-spacing:.2em;color:var(--fg3);text-transform:uppercase;
  flex:none;min-width:52px}
.card .cap b{font-weight:400;font-size:16px}
.card .cap .loc{font-size:12px;color:var(--fg2)}
.card .serieschip{position:absolute;top:14px;left:14px;font-size:10px;letter-spacing:.12em;
  background:rgba(0,0,0,.5);color:#fff;padding:4px 9px;
  opacity:0;transform:translateY(-4px);transition:opacity .3s,transform .3s}
.card:hover .serieschip{opacity:1;transform:none}
/* 悬停时右下角的放大标记 */
.card .zoom{position:absolute;right:14px;bottom:14px;width:36px;height:36px;
  display:flex;align-items:center;justify-content:center;font-size:15px;
  background:rgba(255,255,255,.92);color:#1A1A1A;
  opacity:0;transform:translateY(6px);transition:opacity .3s,transform .3s}
.card:hover .zoom{opacity:1;transform:none}
.card .cap b{transition:opacity .25s}
.card:hover .cap b{opacity:.55}

/* 筛选 chips */
.chips{display:flex;gap:8px;margin:0 0 40px}
.chip{font-size:12px;letter-spacing:.04em;padding:7px 16px;border:1px solid var(--line);
  color:var(--fg2);cursor:pointer;background:none;
  transition:border-color .25s,color .25s,background .25s}
.chip:hover{border-color:var(--line4);color:var(--fg)}
.chip.on{background:var(--fg);border-color:var(--fg);color:var(--on-fg)}

/* 加载更多 */
.more{display:block;margin:12px auto 0;background:none;border:1px solid var(--line);
  padding:14px 34px;cursor:pointer;font-family:inherit;
  transition:border-color .25s,background .25s}
.more span{font-size:13px;color:var(--fg2);transition:color .25s}
.more:hover{border-color:var(--fg);background:var(--fg)}
.more:hover span{color:var(--on-fg)}
.more:active{transform:translateY(1px)}

/* 滚动入场 */
.rv{opacity:0;transform:translateY(14px)}
.rv.in{opacity:1;transform:none;
  transition:opacity .6s cubic-bezier(.2,.7,.2,1),transform .6s cubic-bezier(.2,.7,.2,1)}

/* 回到顶部 */
.totop{position:fixed;right:28px;bottom:28px;width:42px;height:42px;z-index:40;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  background:var(--fg);color:var(--on-fg);font-size:15px;
  opacity:0;transform:translateY(10px);pointer-events:none;transition:all .3s}
.totop.on{opacity:.85;transform:none;pointer-events:auto}
.totop:hover{opacity:1}

/* 灯箱（覆盖层） */
body.lbopen{overflow:hidden}
.lbox{position:fixed;inset:0;z-index:100;background:var(--dbg);color:var(--dfg);
  opacity:0;pointer-events:none;transition:opacity .28s ease}
.lbox.on{opacity:1;pointer-events:auto}
.lbstage{position:absolute;inset:64px 108px 118px;display:flex;align-items:center;justify-content:center}
.lbstage img{max-width:100%;max-height:100%;object-fit:contain;
  opacity:0;transform:scale(.985);transition:opacity .45s ease,transform .45s ease}
.lbstage img.ready{opacity:1;transform:none}
.lbox .lbtop{position:absolute;top:0;left:0;right:0;display:flex;justify-content:space-between;
  padding:24px 30px;font-size:12px;color:var(--dfg2);letter-spacing:.06em;z-index:2}
.lbox .x{color:var(--dfg2);font-size:18px;line-height:1;cursor:pointer;transition:color .2s,transform .2s}
.lbox .x:hover{color:#fff;transform:rotate(90deg)}
.lbox .arrow{position:absolute;top:0;bottom:0;width:96px;display:flex;align-items:center;
  justify-content:center;color:rgba(255,255,255,.4);font-size:28px;cursor:pointer;
  transition:color .2s,background .3s;user-select:none}
.lbox .arrow:hover{color:#fff;background:rgba(255,255,255,.04)}
.lbox .arrow.l{left:0} .lbox .arrow.r{right:0}
.lbox .lbbar{position:absolute;left:0;right:0;bottom:0;border-top:1px solid var(--dline);
  padding:18px 30px 20px;display:flex;align-items:flex-end;justify-content:space-between;gap:40px}
.lbox .lbbar h3{font-family:var(--serif);font-weight:400;font-size:20px}
.lbox .lbbar .loc{font-size:13px;color:var(--dfg2);margin-top:4px}
.lbox .note i{font-style:normal;font-size:12px;color:var(--dfg2);cursor:pointer;
  border-bottom:1px solid var(--dline);display:inline-block;margin-top:10px;
  padding-bottom:2px;transition:color .2s,border-color .2s}
.lbox .note i:hover{color:var(--dfg);border-color:var(--dfg2)}
.lbox .note p{max-width:560px;font-size:13px;line-height:1.8;color:var(--dfg3);
  max-height:0;overflow:hidden;transition:max-height .4s ease,margin .4s ease}
.lbox .note.open p{max-height:140px;margin-top:10px}
.lbox .exif{display:flex;gap:26px;font-size:11px;color:var(--dfg2);letter-spacing:.05em;flex:none}
.lbox .exif div b{display:block;color:var(--dfg);font-weight:400;font-size:12px;margin-top:2px}

/* 搜索 */
.searchbtn{display:flex;align-items:center;gap:7px;cursor:pointer}
.searchbtn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:1.6}
.srch{position:fixed;inset:0;z-index:60;background:rgba(250,250,249,.985);
  opacity:0;pointer-events:none;transition:opacity .25s ease}
.srch.on{opacity:1;pointer-events:auto}
.srch .box{max-width:1000px;margin:0 auto;padding:110px 48px 0}
.srch input{width:100%;border:none;border-bottom:1px solid var(--line);background:none;
  font-family:var(--serif);font-size:38px;padding:0 0 18px;outline:none;color:var(--fg);
  transition:border-color .25s}
.srch input:focus{border-color:var(--fg)}
.srch input::placeholder{color:var(--fg5)}
.srch .hintrow{display:flex;justify-content:space-between;margin-top:14px;
  font-size:12px;color:var(--fg3);letter-spacing:.03em}
.srch .hintrow kbd{font-family:var(--sans);border:1px solid var(--line);
  padding:1px 6px;font-size:11px;margin:0 2px}
.srch .res{margin-top:38px;max-height:50vh;overflow:auto}
.srch .r{display:flex;gap:18px;align-items:center;padding:11px 10px;cursor:pointer;
  transition:background .18s}
.srch .r:hover,.srch .r.sel{background:var(--surface2)}
.srch .grp{font-size:10px;letter-spacing:.2em;color:var(--fg3);text-transform:uppercase;
  padding:18px 10px 8px;border-bottom:1px solid var(--line);margin-bottom:6px}
.srch .res > .grp:first-child{padding-top:2px}
.srch .r .t{width:88px;height:60px;flex:none;overflow:hidden;background:var(--imgbg2)}
.srch .r .t.av{width:60px;height:60px;border-radius:50%;margin:0 14px}
.srch .r .t img{width:100%;height:100%;object-fit:cover}
.srch .r b{font-weight:400;font-size:16px}
.srch .r .m{font-size:12px;color:var(--fg2);margin-top:3px}
.srch .r .who{margin-left:auto;font-size:11px;letter-spacing:.16em;color:var(--fg3);
  text-transform:uppercase;flex:none}
.srch .empty{padding:28px 10px;color:var(--fg2);font-size:14px}
.srch .close{position:absolute;top:26px;right:42px;font-size:20px;color:var(--fg2);
  cursor:pointer;transition:transform .2s,color .2s}
.srch .close:hover{color:var(--fg);transform:rotate(90deg)}
body.srchopen{overflow:hidden}


/* ---------- 首页的摄影师：大头像 + 简介，两列错落 ---------- */
.pgrid{display:grid;grid-template-columns:1fr 1fr;gap:52px 64px;padding-bottom:8px}
.pgrid > *:nth-child(even){margin-top:72px}      /* 错落 */
.pgrid .pc{display:flex;gap:26px;align-items:flex-start;padding:22px;
  transition:background .28s}
a.pc:hover{background:var(--surface2)}
.pgrid .pcav{width:138px;height:138px;border-radius:50%;overflow:hidden;flex:none;
  background:var(--imgbg2)}
.pgrid .pcav img{width:100%;height:100%;object-fit:cover;
  transition:transform 1.1s cubic-bezier(.2,.6,.2,1)}
a.pc:hover .pcav img{transform:scale(1.07)}
.pgrid h3{font-family:var(--serif);font-weight:400;font-size:27px;line-height:1.15}
.pgrid .en{font-size:10px;letter-spacing:.2em;color:var(--fg3);text-transform:uppercase;
  margin-top:7px}
.pgrid .bio{margin-top:13px;font-size:13.5px;line-height:1.85;color:var(--prose2)}
.pgrid .n{margin-top:12px;font-size:12px;color:var(--fg2);
  display:inline-block;border-bottom:1px solid var(--line);padding-bottom:2px;
  transition:border-color .25s}
a.pc:hover .n{border-color:var(--fg)}
.pgrid .empty{border:1px dashed var(--line3);display:flex;align-items:center;
  justify-content:center;font-size:20px;color:var(--fg3);background:none}

/* ---------- members（内页「其他摄影师」用的紧凑版） ---------- */
.members{display:flex;gap:56px;flex-wrap:wrap}
.mem{display:flex;align-items:center;gap:14px;padding:10px 14px 10px 10px;
  transition:background .2s}
a.mem:hover{background:var(--surface2)}
.mem .av{width:48px;height:48px;border-radius:50%;overflow:hidden;background:var(--avbg);flex:none}
.mem .av img{width:100%;height:100%;object-fit:cover}
.mem b{font-weight:500;font-size:15px;display:block}
.mem span{font-size:12px;color:var(--fg2)}

/* ---------- footer ---------- */
footer{border-top:1px solid var(--line);padding:44px 0 64px;
  font-size:12px;color:var(--fg2);display:flex;justify-content:space-between}

/* ---------- photographer ---------- */
.phead{padding:80px 0 56px;border-bottom:1px solid var(--line);
  display:flex;gap:64px;align-items:flex-start}
.phead h1{font-family:var(--serif);font-weight:400;font-size:46px;line-height:1.1}
.phead .en{font-size:11px;letter-spacing:.26em;color:var(--fg2);
  text-transform:uppercase;margin-top:12px}
.phead .bio{max-width:520px;font-size:15px;color:var(--prose)}
.phead .gear{margin-top:18px;font-size:12px;color:var(--fg2);letter-spacing:.03em}
.phead .links{margin-top:10px;font-size:12px}
.phead .links a{border-bottom:1px solid var(--line)}
.band{position:relative;margin:44px 0;height:300px;overflow:hidden;background:#111}
.band img{width:100%;height:100%;object-fit:cover;opacity:.82}
.band .bc{position:absolute;left:40px;bottom:34px;color:#fff}
.band .bc .k{font-size:10px;letter-spacing:.22em;opacity:.7;text-transform:uppercase}
.band .bc h3{font-family:var(--serif);font-weight:400;font-size:30px;margin:8px 0 6px}
.band .bc p{font-size:13px;opacity:.8}

/* ---------- series page ---------- */
.shead{padding:96px 0 12px;text-align:center}
.shead .k{font-size:11px;letter-spacing:.24em;color:var(--fg2);text-transform:uppercase}
.shead h1{font-family:var(--serif);font-weight:400;font-size:52px;margin:16px 0 12px}
.shead .m{font-size:13px;color:var(--fg2)}
.snote{max-width:640px;margin:40px auto 0;font-size:15px;line-height:1.9;color:var(--prose)}
.stream{padding:88px 0 40px}
.shot{max-width:1200px;margin:0 auto 96px}
.shot .cap{margin-top:16px;display:flex;gap:14px;align-items:baseline}
.shot .cap b{font-weight:500;font-size:15px}
.shot .cap span{font-size:12px;color:var(--fg2)}
.shot .note{margin-top:8px;max-width:640px;font-size:14px;color:var(--prose2);line-height:1.8}

/* ---------- 系列预览页（方向 B 阶段一）----------
   默认排版：竖排一列、大留白、配文限宽。以上面 .shead/.shot 为起点，
   留白再放宽一档 —— 这一页是「作品集」而不是「照片列表」，
   所以每张都占满一屏的注意力，滚动节奏靠 120px 的块间距定。

   颜色全部走语义变量，所以暗色不需要单独一套规则；
   唯一写死的是状态角标上的白字，见 .pvst。 */
.pvstrip{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:28px;
  padding:11px 15px;border:1px solid var(--line);background:var(--surface);font-size:12px}
.pvstrip .pvsay{color:var(--fg2)}
.pvstrip .pvgo{margin-left:auto;color:var(--fg2);white-space:nowrap;
  border-bottom:1px solid var(--line3);padding-bottom:1px}
.pvstrip .pvgo:hover{color:var(--fg);border-color:var(--fg)}

/* 行内状态角标。不能复用 .stag —— 那个是 position:absolute，
   专门压在缩略图角上的。底色沿用同一组变量：它们永远配白字，
   所以在亮暗两个主题下都是深的（见 .stag 处的说明）。 */
.pvst{display:inline-block;flex:none;font-size:10px;letter-spacing:.08em;
  padding:3px 8px;color:#fff;background:var(--stag-draft)}
.pvst.approved{background:var(--stag-ok)}
.pvst.pending{background:var(--stag-pending)}
.pvst.rejected{background:var(--stag-rejected)}
.pvst.draft{background:var(--stag-draft)}
.pvst.archived{background:var(--arch-bg);color:var(--arch-fg)}

.pvhead{padding:104px 0 0;text-align:center}
.pvstrip + .pvhead{padding-top:64px}
.pvhead .k{font-size:11px;letter-spacing:.24em;color:var(--fg2);text-transform:uppercase}
.pvhead .k a{border-bottom:1px solid var(--line3);padding-bottom:1px}
.pvhead .k a:hover{border-color:var(--fg)}
.pvhead h1{font-family:var(--serif);font-weight:400;font-size:56px;
  line-height:1.15;margin:18px 0 14px}
.pvhead .m{font-size:13px;color:var(--fg2)}
.pvpre{max-width:640px;margin:46px auto 0;font-size:15px;line-height:1.95;
  color:var(--prose);text-align:left}
.pvpre p + p{margin-top:1.05em}

.pvstream{padding:104px 0 40px}
.pvb{max-width:1200px;margin:0 auto 120px}
.pvb:last-child{margin-bottom:56px}
/* 图位先按原图比例撑开，免得图一张张下来时整页往下跳 */
.pvimg{background:var(--imgbg);overflow:hidden}
.pvimg img{width:100%;height:100%;object-fit:cover}
.pvcap{margin-top:18px}
.pvcap b{font-weight:500;font-size:16px;margin-right:14px}
.pvcap span{font-size:12px;color:var(--fg2)}
.pvtx{margin-top:10px;max-width:640px;font-size:14.5px;line-height:1.85;color:var(--prose2)}
.pvtx p + p{margin-top:.8em}
.pvwarn{margin-top:12px;display:flex;align-items:center;gap:9px;
  font-size:11.5px;color:var(--warn)}

.pvghost{max-width:1200px;margin:0 auto 64px;padding:12px 15px;
  background:var(--soft);border-left:2px solid var(--line3);
  font-size:12px;line-height:1.75;color:var(--fg2)}
.pvempty,.pvfail{padding:160px 0;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:8px}
.pvempty b,.pvfail b{font-family:var(--serif);font-weight:400;font-size:24px}
.pvempty span,.pvfail span{font-size:13px;color:var(--fg2);max-width:520px;line-height:1.7}

/* ---------- 系列卡片的放大预览弹窗（批二）----------
   比普通 .cfm 宽得多：里面装的是真的排版预览，窄了就看不出效果。
   三段式 —— 头（标题+关闭）/ 中（预览，自己滚）/ 底（操作，固定不滚）。 */
.serpanel .cfmin.sp{max-width:1080px;width:100%;max-height:88vh;padding:0;
  display:flex;flex-direction:column}
.sphead{display:flex;align-items:center;gap:12px;padding:16px 20px;
  border-bottom:1px solid var(--line);flex:none}
.sphead b{font-size:15px;font-weight:500;flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.spx{flex:none;width:30px;height:30px;font-size:19px;line-height:1;cursor:pointer;
  border:1px solid var(--line);background:none;color:var(--fg2)}
.spx:hover{color:var(--fg);border-color:var(--fg)}
.sploading{padding:60px 20px;text-align:center;font-size:13px;color:var(--fg2)}
/* 预览那一段自己滚。缩一档间距 —— 弹窗不是整页，
   原样的 104px 留白在这里会让人以为内容没加载出来。 */
.spwrap{flex:1;min-height:0;overflow:auto;padding:0 20px 8px}
.spwrap .pvhead{padding:28px 0 0}
.spwrap .pvstream{padding:28px 0 8px}
.spwrap .pvb{margin-bottom:44px}
.spwrap .pvstrip{margin-top:16px}
/* 状态条里那个「我的系列 → / 系列审核 →」在弹窗里是多余的：
   你就是从那个列表点开的，它只会让人以为点了会跳走。 */
.spwrap .pvstrip .pvgo{display:none}
.spwrap .pvempty,.spwrap .pvfail{padding:72px 0}
/* 操作条：统一大小、统一间距。审核那三个按钮原先大小不一又挨在一起。 */
.spacts{flex:none;display:flex;flex-wrap:wrap;gap:10px;align-items:center;
  padding:14px 20px;border-top:1px solid var(--line);background:var(--soft)}
.spacts .btn{font-size:12.5px;padding:9px 18px}
/* 删除推到最右边，和其余动作隔开 —— 不可逆的那个别挨着常用的 */
.spacts .btn.warn{margin-left:auto;color:var(--danger)}

/* 照片弹窗的正文（批六）。系列弹窗那边正文是整页预览，照片这边是
   「一张大图 + 它的全部信息」，所以只有这一块不一样，外面三段
   （.sphead / .spwrap / .spacts）完全共用。
   图在上、信息在下：横排会让竖幅照片挤成一条。 */
.phv{padding:20px 0 4px}
.phvimg{background:var(--imgbg);display:flex;align-items:center;justify-content:center;
  max-height:62vh;overflow:hidden}
.phvimg img{max-width:100%;max-height:62vh;object-fit:contain;display:block}
.phvside{padding:18px 0 0}
.phvtop{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:11px}
.phvser{font-size:11.5px;color:var(--fg2)}
.phvline{font-size:13px;color:var(--fg)}
/* EXIF 用等宽数字，几张照片连着看时参数不会左右跳 */
.phvexif{font-size:11.5px;color:var(--fg3);margin-top:5px;font-variant-numeric:tabular-nums}
.phvnote{font-size:13px;line-height:1.85;color:var(--fg2);margin:14px 0 0;
  white-space:pre-wrap;max-width:62em}
.phvside .why,.phvside .warn{margin-top:14px}

/* ---------- 批量操作（批七）---------- */

/* 「选择」入口。刻意做成一个【文字按钮】而不是操作条：
   顶部那条常驻按钮条刚拆掉（见 PROJECT_STATUS「只有一处入口」那节），
   别又长回来。它跟在 lead / 计数行右边，不吸顶、不占一整行。 */
.leadrow{display:flex;align-items:baseline;gap:16px;margin-bottom:30px}
.leadrow .lead{margin-bottom:0;flex:1;min-width:0}
.noterow{display:flex;align-items:baseline;gap:16px}
.selgo{flex:none;font-family:inherit;font-size:12px;cursor:pointer;
  background:none;border:1px solid var(--line3);border-radius:8px;
  padding:5px 13px;color:var(--fg2);transition:color .2s,border-color .2s}
.selgo:hover{color:var(--fg);border-color:var(--fg)}

/* 选择模式下的卡片。整张卡是「选中/取消」，所以不放复选框控件 ——
   缩略图角上一个勾就够，选中时整张卡描边加深。 */
.selable{cursor:pointer}
.selable .selck{position:absolute;top:10px;right:10px;width:20px;height:20px;
  border-radius:50%;border:1px solid var(--line4);background:var(--surface);
  display:flex;align-items:center;justify-content:center}
.selable .selck::after{content:'';width:9px;height:5px;margin-top:-2px;
  border-left:1.5px solid var(--on-fg);border-bottom:1.5px solid var(--on-fg);
  transform:rotate(-45deg);opacity:0}
.selon .selck{background:var(--fg);border-color:var(--fg)}
.selon .selck::after{opacity:1}
.selon{outline:2px solid var(--fg);outline-offset:-1px}
/* 审核队列那一行的缩略图也要能放下这个勾 */
.qitem .th,.qitem .qth{position:relative}
/* 选择模式下行内按钮灰掉：你要么在挨个判，要么在挑一批 */
.selable .acts button,.selable .rejectbox button{opacity:.35}

/* 底部那条。只在选择模式下存在 —— 所以它不违反「顶部不加常驻操作条」。
   放底部而不是顶部：拇指够得着，而且不遮住刚点过的那张卡。

   ⚠️ z-index 【必须低于 .cfm 的 90】。原先写的是 95，于是确认框开着的时候
   这条还浮在遮罩之上、按钮照样点得动 —— 实测能开出第二个确认框，
   两个都确认就是两批并发跑。80 这一档在后台页里是空的
   （.cfm 90 / .bigview 120 / .toast 130，后台页没有前台那个 .nav 50）。
   改这个数之前先看一遍上面那几个。 */
.selfoot{position:fixed;left:0;right:0;bottom:0;z-index:80;
  background:var(--bg2);border-top:1px solid var(--line);
  box-shadow:0 -8px 24px rgba(0,0,0,.18)}
.sfin{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:12px 40px;max-width:1400px;margin:0 auto}
.sfn{font-size:12.5px;font-weight:500;flex:none;min-width:6.5em}
.sfsep{flex:1}
.selfoot .btn{font-size:12.5px;padding:8px 16px}
.selfoot .btn.off{opacity:.3}
.selfoot .sfx{margin-left:4px}
/* 底部条是 fixed，不垫高的话最后一行卡片永远被压在下面点不着；
   toast 默认在 bottom:34px，也正好落在条子里。
   两者都跟着 --selfooth 走 —— 那是 selFoot() 把条子【量出来】写上的
   （见 admin.js 里那段）。不写死数字：条子有几个按钮取决于选中了什么，
   实测会从 199px 长到 248px，固定值追不上。
   兜底的 72px 是桌面单行的高度，只在变量还没写上的那一帧用得到。 */
body.selmode .main{padding-bottom:calc(var(--selfooth, 72px) + 36px)}
body.selmode .toast{bottom:calc(var(--selfooth, 72px) + 20px)}

/* 「我的系列」的状态分区小标题（批四）。
   和侧栏的 .grp 同一档字号字距，但多一条横线 —— 它要在一列卡片之间
   把节奏切开，光靠间距分不出来。 */
/* 吸顶（八-4）。它是【内容结构】，像表格的表头 —— 和上一轮拆掉的那条
   「常驻按钮条」不是一回事：那条是页面级的工具栏、一直占着位置；
   这个薄薄一行，而且滚过这一组就换成下一组的标题。
   吸顶顺带解决了「选择入口够不着」：滚到哪一组，那一组的
   「选这组」就贴在顶上，不用翻回页首。

   top:0 —— 后台页没有吸顶导航（侧栏就是导航）。
   背景必须是不透明的 --bg：卡片会从它底下滚过去。
   z-index 5 只要压住卡片就够，别往上加 —— 底部条 80、.cfm 90 在它上面。
   组间距仍然用 margin：贴住时 margin 不参与，但那时标题已经在视窗最上方，
   上面没有内容会从缝里露出来，所以不用改成 padding。
   只补了一点 padding-top，让贴住的那一条不至于贴着字。 */
.sergrp{position:sticky;top:0;z-index:5;background:var(--bg);
  display:flex;align-items:center;gap:9px;
  margin:30px 0 12px;padding:8px 0 7px;border-bottom:1px solid var(--line)}
.sergrp:first-of-type{margin-top:20px}
.sergrp b{font-size:11px;font-weight:400;letter-spacing:.16em;color:var(--fg2);
  text-transform:uppercase}
.sergrp i{font-style:normal;font-size:11px;color:var(--fg3);
  font-variant-numeric:tabular-nums}
/* 分区标题右边那个「选这组 / 取消这组」（八-2）。
   推到最右、做得很轻 —— 它每一组都有一个，做重了整页就成了一排按钮。
   平时几乎看不见，鼠标扫过去才亮起来。 */
.sergrp .grpsel{margin-left:auto;flex:none;font-family:inherit;font-size:11px;
  cursor:pointer;background:none;border:1px solid transparent;border-radius:7px;
  padding:3px 9px;color:var(--fg3);transition:color .2s,border-color .2s}
.sergrp .grpsel:hover{color:var(--fg);border-color:var(--line3)}
/* 选择模式下让它亮一档 —— 那时它是主要的操作方式 */
body.selmode .sergrp .grpsel{color:var(--fg2);border-color:var(--line3)}
body.selmode .sergrp .grpsel:hover{color:var(--fg);border-color:var(--fg)}

/* 系列卡片：整张可点，按钮已经全部收进弹窗 */
.wcard.serc{cursor:pointer}
.wcard.serc:hover{border-color:var(--line4)}
.wcard.serc:focus-visible{outline:2px solid var(--fg);outline-offset:2px}
/* 审核卡片底部那句「点开看」 */
.qopen{margin-top:12px;font-size:12px;color:var(--fg2)}
.qitem{cursor:pointer}
.qitem:hover{border-color:var(--line4)}
.qitem:focus-visible{outline:2px solid var(--fg);outline-offset:2px}

/* ---------- 系列预览页 · 编辑态（一-3）----------
   编辑和观赏刻意长得不一样。观赏那套是 1200px 宽、块间 120px，
   12 张的系列有一万像素高 —— 在那上面拖一次要跨大半个系列。
   所以编辑态把每张压成一行矮卡片，整个系列一两屏装得下，
   真实版式点「预览」看。两套 CSS 互不打扰，阶段二改观赏视觉时
   不用顺带验编辑态有没有被改坏。 */

/* 顶上那条开关。sticky 贴在导航下面 —— 导航是 position:fixed、
   高 78px（见 body.pad），z-index 50，所以这里压低一档。
   底色必须不透明，否则滚动时照片会从它后面透出来。 */
.pvbar{position:sticky;top:78px;z-index:40;display:flex;align-items:center;gap:12px;
  margin-top:20px;padding:10px 14px;border:1px solid var(--line);background:var(--bg)}
.pvtabs{display:flex}
.pvtabs button{font-family:inherit;font-size:11.5px;padding:6px 14px;cursor:pointer;
  border:1px solid var(--line);background:none;color:var(--fg2);transition:all .2s}
.pvtabs button + button{border-left:none}
.pvtabs button:hover{color:var(--fg)}
.pvtabs button.on{background:var(--fg);border-color:var(--fg);color:var(--on-fg)}
.pvstat{margin-left:auto;font-size:11.5px;color:var(--fg2);
  font-variant-numeric:tabular-nums}
.pvstat.bad{color:var(--danger)}

/* 说明条上「为什么这里不给编辑」那一句 */
.pvstrip .pvwhy{color:var(--fg3);font-size:11.5px}

.pvedit{max-width:1080px;margin:0 auto;padding:30px 0 72px}
.pvehint{font-size:12px;color:var(--fg2);line-height:1.8;margin-bottom:20px}
.pvehint i{display:block;font-style:normal;font-size:11.5px;color:var(--fg3)}
.pvedit .pvghost{max-width:none;margin-bottom:22px}

.pvpref{display:block;margin-bottom:28px}
.pvpref b{font-size:12px;font-weight:500}
.pvpref i{display:block;font-style:normal;font-size:11px;color:var(--fg3);margin:2px 0 7px}

.pvelist{display:flex;flex-direction:column;gap:10px}
.pve{display:flex;align-items:flex-start;gap:14px;padding:12px;
  border:1px solid var(--line);background:var(--surface)}
.pve.dragging{opacity:.4}
/* 放下的位置：拖过的那一行上边或下边画一条线 */
.pve.over-a{box-shadow:0 -2px 0 var(--fg)}
.pve.over-b{box-shadow:0 2px 0 var(--fg)}

/* 手柄。只有精确指针（鼠标）才发得出来，见 preview.js 的 ctx.fine */
.pveh{flex:none;align-self:center;cursor:grab;user-select:none;
  padding:6px 2px;color:var(--fg5);font-size:15px;line-height:1}
.pveh:hover{color:var(--fg2)}
.pveh:active{cursor:grabbing}

.pvet{position:relative;flex:none;width:150px;height:100px;background:var(--imgbg);
  overflow:hidden}
.pvet img{width:100%;height:100%;object-fit:cover}
/* 序号。换完位置由 marks() 直接改 textContent，不重画整页 */
.pvet u{position:absolute;left:0;top:0;text-decoration:none;font-size:10px;
  padding:2px 6px;background:rgba(10,10,10,.62);color:#fff;
  font-variant-numeric:tabular-nums}

.pvef{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
.pvem{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--fg3)}

.pveb{flex:none;display:flex;flex-direction:column;gap:6px}
.pveb button{font-family:inherit;font-size:12px;line-height:1;width:28px;height:26px;
  cursor:pointer;border:1px solid var(--line);background:none;color:var(--fg2);
  transition:all .2s}
.pveb button:hover:not(:disabled){border-color:var(--fg);color:var(--fg)}
.pveb button:disabled{opacity:.3;cursor:not-allowed}

/* ---------- admin ---------- */
.adm{display:flex;min-height:900px}
.side{width:232px;flex:none;border-right:1px solid var(--line);padding:28px 0}
.side .brand{padding:0 24px 28px}
.side a{display:block;padding:9px 24px;font-size:13px;color:var(--fg2)}
.side a.on{color:var(--fg);background:var(--surface2);border-left:2px solid var(--fg);padding-left:22px}
/* 「＋ 新建」那一项：圆角描边框，和下面几条纯文字的入口拉开一档。
   它是这个后台里唯一「开始做一件事」的入口，其余都是「去看已有的东西」。
   .on 的左边竖线在圆角框上会显得别扭，所以这里把它盖掉、换成整框加深。
   （原来这个类叫 .up、那一项叫「上传」；现在它盖着上传和新建系列两件事。） */
.side a.new{margin:2px 16px 4px;padding:9px 14px;border:1px solid var(--line3);
  border-radius:10px;color:var(--fg)}
.side a.new:hover{border-color:var(--fg);background:var(--surface2)}
.side a.new.on{border-color:var(--fg);background:var(--surface2);border-left-width:1px;
  padding-left:14px}
.side .grp{font-size:10px;letter-spacing:.16em;color:var(--fg3);padding:22px 24px 6px;text-transform:uppercase}
.side .badge{float:right;background:var(--fg);color:var(--on-fg);font-size:10px;padding:1px 6px;border-radius:9px}
.main{flex:1;padding:36px 40px}
.main h1{font-family:var(--serif);font-weight:400;font-size:28px;margin-bottom:6px}
.main .lead{font-size:13px;color:var(--fg2);margin-bottom:30px}
.qitem{display:flex;gap:24px;border:1px solid var(--line);padding:16px;margin-bottom:16px;background:var(--surface)}
.qitem .th{width:210px;height:140px;flex:none;overflow:hidden;background:var(--imgbg)}
.qitem .th img{width:100%;height:100%;object-fit:cover}
.qitem .body{flex:1}
.qitem h4{font-size:16px;font-weight:500}
.qitem .sub{font-size:12px;color:var(--fg2);margin-top:3px}
.qitem .fields{display:flex;gap:30px;margin-top:14px;font-size:11px;color:var(--fg2)}
.qitem .fields b{display:block;color:var(--fg);font-weight:400;font-size:12px;margin-top:2px}
.qitem .nt b{font-weight:400;color:var(--fg3);margin-right:8px;font-size:11px;letter-spacing:.08em;text-transform:uppercase}
.qitem .nt{margin-top:12px;font-size:12px;color:var(--prose2);max-width:520px;
  border-left:2px solid var(--line);padding-left:10px}
.acts{display:flex;flex-direction:column;gap:8px;justify-content:center}

/* ---------- 后台：补充 ---------- */
body[data-page]{background:var(--bg2)}
.adm{min-height:100vh}
.side{background:var(--bg);display:flex;flex-direction:column}
.side .brand a{display:block}
.side .brand em{display:block;margin:4px 0 0;font-size:9px;letter-spacing:.28em;opacity:.5}
.side a{transition:color .2s,background .2s}
.side a:hover{color:var(--fg)}
.side a.off{opacity:.42;cursor:default}
.side a.off:hover{color:var(--fg2)}
.sidefoot{margin-top:auto;padding:22px 24px 4px;border-top:1px solid var(--line)}
.sidefoot .demo{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.sidefoot .demo span{font-size:9px;letter-spacing:.16em;color:var(--fg3);
  text-transform:uppercase;width:100%;margin-bottom:2px}
.sidefoot button{font-family:inherit;font-size:11px;padding:4px 10px;cursor:pointer;
  border:1px solid var(--line);background:none;color:var(--fg2);transition:all .2s}
.sidefoot button:hover{border-color:var(--line4);color:var(--fg)}
.sidefoot button.on{background:var(--fg);border-color:var(--fg);color:var(--on-fg)}
.langbtn2,.thmsel2{width:100%;margin-top:4px}

/* 按钮 */
.btn{font-family:inherit;font-size:12px;padding:9px 16px;cursor:pointer;white-space:nowrap;
  border:1px solid var(--fg);background:var(--fg);color:var(--on-fg);transition:all .2s}
.btn:hover{opacity:.84}
.btn.g{background:none;color:var(--fg)}
.btn.g:hover{background:var(--surface2);opacity:1}
.btn.t{background:none;border-color:transparent;color:var(--fg2);text-decoration:underline;
  text-underline-offset:3px}
.btn.t:hover{color:var(--fg);background:none}
.btn.danger{background:var(--danger2);border-color:var(--danger2)}
.btn.sm{font-size:11px;padding:6px 12px}
.btn.big{padding:13px 26px;font-size:13px}
.btn.off{opacity:.4;cursor:default}
.btn:disabled{opacity:.35;cursor:not-allowed}

/* 队列 */
.qcount{font-size:11px;letter-spacing:.14em;color:var(--fg3);text-transform:uppercase;
  margin-bottom:14px}
.qitem{transition:opacity .3s,transform .3s}
.qitem.gone{opacity:0;transform:translateY(-8px)}
.qitem .th{cursor:zoom-in}
.rejectbox{display:none;margin-top:14px;border-top:1px solid var(--line);padding-top:14px}
.rejectbox.on{display:block}
.rejectbox .rt{font-size:13px;font-weight:500}
.rejectbox .rh{font-size:11px;color:var(--fg2);margin:3px 0 8px}
.rejectbox textarea,.ufields textarea,.ufields input,.ufields select,
.pvpref textarea,.pvef input,.pvef textarea{
  width:100%;font-family:inherit;font-size:13px;padding:9px 11px;
  border:1px solid var(--line);background:var(--surface);color:var(--fg);resize:vertical;outline:none;
  transition:border-color .2s}
.rejectbox textarea:focus,.ufields textarea:focus,.ufields input:focus,
.pvpref textarea:focus,.pvef input:focus,.pvef textarea:focus{border-color:var(--line5)}
.rejectbox .rb{display:flex;gap:8px;margin-top:9px}

/* 空状态 */
.blank{border:1px dashed var(--line2);padding:64px 20px;text-align:center;background:var(--surface)}
.blank b{display:block;font-family:var(--serif);font-weight:400;font-size:19px}
.blank span{font-size:13px;color:var(--fg2);display:block;margin-top:6px}

/* 「新建」选择页：并排两张大卡。
   左边是 <a>（真链接，中键能开新标签页），右边是 <button>（开弹层）——
   所以这里【全部用类选择器】，再把 button 的默认外观复位掉，
   让两张卡长得一模一样。写成 .pick a / .pick button 就得维护两套。 */
.pick{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:760px}
.pick .pk{display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:232px;padding:40px 26px;text-align:center;
  background:var(--surface);border:1px solid var(--line);
  /* button 的复位。line-height 是【必须】的一条，不是凑数：
     <button> 的 UA 默认 line-height:normal 不继承 body 的 1.7，
     漏掉它，button 里那行标题的行盒比 <a> 里矮 6px，
     居中之后两张卡的标题差 3px —— 实测量出来的。 */
  font-family:inherit;font-size:inherit;color:inherit;line-height:inherit;
  appearance:none;-webkit-appearance:none;
  cursor:pointer;transition:border-color .2s,background .2s}
.pick .pk:hover{border-color:var(--fg);background:var(--surface2)}
.pick .pk b{font-family:var(--serif);font-weight:400;font-size:21px}
.pick .pk span{font-size:12.5px;color:var(--fg2);margin-top:9px;line-height:1.7;max-width:19em}

/* 我的作品 */
.tabs{display:flex;gap:22px;border-bottom:1px solid var(--line);margin-bottom:24px}
.tabs a{font-size:13px;color:var(--fg2);padding-bottom:10px;cursor:pointer;
  border-bottom:1px solid transparent;margin-bottom:-1px;transition:color .2s,border-color .2s}
.tabs a:hover{color:var(--fg)}
.tabs a.on{color:var(--fg);border-bottom-color:var(--fg)}
.tabs i{font-style:normal;font-size:11px;color:var(--fg3)}
.wgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:20px}
.wcard{background:var(--surface);border:1px solid var(--line);display:flex;flex-direction:column}
.wcard .wth{position:relative;height:168px;overflow:hidden;background:var(--imgbg);cursor:zoom-in}
.wcard .wth img{width:100%;height:100%;object-fit:cover}
.wcard .wb{padding:13px 14px 12px;display:flex;flex-direction:column;flex:1}
.wcard .wb > b{font-weight:500;font-size:14px}
.wcard .wb > span{font-size:11.5px;color:var(--fg2);margin-top:3px}
/* flex-wrap 是【止血】：系列卡片上一度有五个按钮，而这里原先没有换行，
   第五个（正好是「删除」）被挤出卡片边界，看得见一点、点不着 ——
   「系列删不掉」这个 bug 的一半就是它。
   批二会把这些操作收进弹窗、卡片重新变清爽，到那时这一行仍然该留着：
   按钮数量是会变的，一行排不下就该换行，而不是溢出。 */
.wcard .wacts{margin-top:auto;padding-top:11px;display:flex;gap:4px;flex-wrap:wrap}
.stag{position:absolute;top:10px;left:10px;font-size:10px;letter-spacing:.08em;
  padding:3px 8px;color:#fff;background:rgba(0,0,0,.6)}
/* .stag 的四种底色单独成组：它们永远配白字（压在缩略图上），
   所以在两个主题下都必须是【深色】。不能复用 --danger2/--warn2 ——
   那两个还要当「浅底上的文字色」，暗色下得翻成亮色，正好相反。 */
.stag.published{background:var(--stag-ok)}
.stag.pending{background:var(--stag-pending)}
.stag.rejected{background:var(--stag-rejected)}
.stag.draft{background:var(--stag-draft)}
.wcard .why{margin-top:10px;background:var(--danger-bg);border-left:2px solid var(--danger2);
  padding:9px 11px;font-size:12px;line-height:1.7;color:var(--prose2)}
.wcard .why b{display:block;font-size:10px;letter-spacing:.1em;color:var(--danger2);
  text-transform:uppercase;margin-bottom:4px;font-weight:500}
.wcard .why .btn{margin-top:9px}
.warn{margin-top:9px;font-size:11.5px;color:var(--warn2);background:var(--warn-bg);
  border-left:2px solid var(--warn-line);padding:7px 10px;line-height:1.6}

/* 上传 */
.drop{display:block;border:1px dashed var(--line3);background:var(--surface);padding:52px 20px;
  text-align:center;cursor:pointer;transition:border-color .25s,background .25s}
.drop:hover,.drop.over{border-color:var(--fg);background:var(--surface2)}
.drop b{display:block;font-family:var(--serif);font-weight:400;font-size:21px}
.drop span{display:block;font-size:13px;color:var(--fg2);margin-top:7px}
.drop i{display:block;font-style:normal;font-size:11.5px;color:var(--fg3);margin-top:14px}
/* 「正在往《X》里传」——上传页的系列上下文横幅（一-4）。
   摆在拖放框【上面】：它是这一整页的前提，不是某张照片的属性。 */
.ucx{margin:0 0 16px;padding:12px 15px;border:1px solid var(--line);
  background:var(--soft);display:flex;flex-direction:column;gap:4px}
.ucxa{display:flex;align-items:center;gap:10px}
.ucxa b{font-weight:500;font-size:13px}
.ucx span{font-size:11.5px;color:var(--fg2);line-height:1.7}
.ucx .ucxwarn{color:var(--warn)}
.ucxoff{margin-left:auto;flex:none;font-size:11.5px;color:var(--fg2);white-space:nowrap;
  border-bottom:1px solid var(--line3);padding-bottom:1px}
.ucxoff:hover{color:var(--fg);border-color:var(--fg)}

/* 「12 张已放进《X》」+「去排版 →」。绿色左边线是唯一的成功信号 ——
   队列清空之后 .ubar 会整条隐藏，这块得自己站得住。 */
.udone{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 16px;
  padding:12px 15px;border:1px solid var(--line);border-left:2px solid var(--ok);
  background:var(--soft)}
.udone span{font-size:12.5px;color:var(--fg2)}
.udone .btn{margin-left:auto;flex:none;text-decoration:none}

.uhead{display:flex;align-items:center;justify-content:space-between;
  margin:26px 0 12px;font-size:11px;letter-spacing:.12em;color:var(--fg3);text-transform:uppercase}
.ucard{display:flex;gap:22px;background:var(--surface);border:1px solid var(--line);
  padding:16px;margin-bottom:14px}
.ucard .uth{width:190px;height:150px;flex:none;overflow:hidden;background:var(--imgbg);cursor:zoom-in}
.ucard .uth img{width:100%;height:100%;object-fit:cover}
.ucard .ub{flex:1;min-width:0}
.urow{display:flex;align-items:center;justify-content:space-between;gap:12px}
.fname{font-size:12px;color:var(--fg2);font-family:ui-monospace,Menlo,monospace}
.uexif{font-size:11.5px;color:var(--fg2);margin:6px 0 12px}
/* 上传状态：每张图自己的进度与结果 */
.ustate{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:8px 0 2px;
  font-size:12px;min-height:20px}
.ustate b{font-weight:500;color:var(--fg2)}
.ustate b.ok{color:var(--ok)}
.ustate b.bad{color:var(--danger)}
.ustate b.half{color:var(--warn)}
/* 确认框：下架和删除都不好撤销，不该一键就走 */
.cfm{position:fixed;inset:0;z-index:90;display:flex;align-items:center;
  justify-content:center;background:rgba(20,20,18,.42);padding:24px}
.cfmin{background:var(--surface);border:1px solid var(--line);max-width:420px;width:100%;
  padding:26px 28px 22px}
.cfmin b{display:block;font-size:17px;font-weight:500;margin-bottom:10px}
.cfmin p{font-size:13px;line-height:1.7;color:var(--fg2);margin:0}
.cfmrefs{margin:14px 0 0;padding:12px 14px;list-style:none;background:var(--soft);
  border:1px solid var(--line);font-size:12px;line-height:1.8;color:var(--fg2)}
.cfmrefs li.lead{color:var(--fg);margin-bottom:4px}
.cfmrefs li:not(.lead):before{content:'· '}
/* 批量删除确认框里的第二块：「这些还被用着」。和上面那块要分得开 ——
   第一块是「要删什么」，这一块是「删了会牵连什么」，性质不同。 */
.cfmrefs.warnrefs{background:var(--warn-bg2);border-color:var(--warn);color:var(--warn)}
.cfmrefs.warnrefs li.lead{color:var(--warn)}
/* 一次删几十项时标题列表不该把按钮顶出屏幕 */
.cfmin .cfmrefs{max-height:32vh;overflow:auto}
.cfmacts{display:flex;gap:10px;justify-content:flex-end;margin-top:20px}
.btn.danger{background:var(--danger);border-color:var(--danger);color:var(--on-danger)}
.btn.sm.warn{color:var(--danger)}
.stag.archived{background:var(--arch-bg);color:var(--arch-fg)}
.wcard.archived .wth img{opacity:.55}
/* 上传入口：和作品卡片一样的footprint，但一眼看得出是入口不是作品 */
.upcard{align-items:center;justify-content:center;text-align:center;gap:2px;
  border-style:dashed;border-color:var(--line2);background:var(--soft2);
  min-height:248px;text-decoration:none;transition:border-color .16s,background .16s}
.upcard:hover{border-color:var(--fg2);background:var(--surface)}
.upcard .upmark{font-size:26px;line-height:1;color:var(--mark);margin-bottom:10px;
  font-weight:300}
.upcard:hover .upmark{color:var(--fg2)}
.upcard b{font-size:14px;font-weight:500;color:var(--fg)}
.upcard span{font-size:11.5px;color:var(--fg2);padding:0 22px;line-height:1.6}
.main .note{font-size:12.5px;color:var(--fg2);margin:-4px 0 16px}
.tabs.sub{margin-top:-6px;padding-top:0;border-top:none}
.tabs.sub a{font-size:12px}
.wcard .wb span.who{font-size:11.5px;color:var(--fg);letter-spacing:.04em;
  text-transform:uppercase;margin-bottom:2px}
/* 编辑弹层 */
.cfmin.wide{max-width:560px}
.edthead{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
  margin-bottom:14px}
.edthead b{margin:0}
.edthead span{font-size:12px;color:var(--fg2);display:flex;align-items:center;gap:8px}
.edt .ufields{margin-top:12px}
.edt .note{margin:10px 0 0;padding:10px 12px;background:var(--soft);
  border:1px solid var(--line);font-size:12px;line-height:1.6}
.dlrow{display:flex;gap:10px;align-items:flex-start;margin-top:4px;
  padding:12px 0 0;border-top:1px solid var(--line);cursor:pointer}
.dlrow input{margin-top:3px;flex:none}
.dlrow span{font-size:12px;color:var(--fg2);line-height:1.6}
.dlrow span b{display:block;font-size:13px;font-weight:500;color:var(--fg);margin-bottom:2px}
.edterr{font-size:12px;color:var(--danger);margin-top:10px;min-height:1px;line-height:1.6}
/* 系列卡片没封面时 */
.wcard .wth .nocover{width:100%;height:100%;display:flex;align-items:center;
  justify-content:center;font-size:11.5px;color:var(--fg3);background:var(--surface3);
  letter-spacing:.06em}
/* 新建系列那一格用 button，得抹掉浏览器默认样式 */
button.upcard{font:inherit;cursor:pointer;-webkit-appearance:none;appearance:none}

/* 封面选择器 */
.coverbox{margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}
.coverhead{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}
.coverhead b{font-size:13px;font-weight:500}
.coverhead span{font-size:11.5px;color:var(--fg2)}
.coverpick{display:flex;gap:8px;overflow-x:auto;padding:2px 2px 8px;
  scrollbar-width:thin}
.cpick{flex:none;width:76px;height:58px;padding:0;border:1px solid var(--line);
  background:var(--surface3);cursor:pointer;overflow:hidden;font:inherit;font-size:10.5px;
  color:var(--fg2);display:flex;align-items:center;justify-content:center;
  -webkit-appearance:none;appearance:none}
.cpick img{width:100%;height:100%;object-fit:cover;display:block}
.cpick.on{outline:2px solid var(--fg);outline-offset:1px;border-color:var(--fg)}
.cpick:hover{border-color:var(--fg2)}

/* 系列成员构成 */
.serpsec{margin-top:16px}
.serpsec > b{display:block;font-size:12px;font-weight:500;color:var(--fg2);
  letter-spacing:.04em;margin-bottom:8px}
.serprow{display:flex;flex-wrap:wrap;gap:8px}
.serpempty{font-size:12px;color:var(--fg3);padding:10px 0}
.serp{position:relative;width:106px;padding:0;border:1px solid var(--line);
  background:var(--surface3);cursor:pointer;overflow:hidden;font:inherit;text-align:left;
  -webkit-appearance:none;appearance:none;display:block}
.serp img{width:100%;height:70px;object-fit:cover;display:block}
.serp .serpt{display:block;font-size:11px;padding:5px 6px 6px;color:var(--fg);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.serp .serpst,.serp .serpmv{display:block;font-size:9.5px;padding:0 6px 5px;
  color:var(--fg2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.serp .serpmv{color:var(--warn)}
/* 列表末尾的「上传照片」入口。虚线框、和照片格子一样大，
   一眼看得出是「加新的」而不是某张已有的照片。 */
.serp.serpadd{display:flex;flex-direction:column;align-items:center;justify-content:center;
  height:100px;border-style:dashed;border-color:var(--line3);background:none;
  text-decoration:none;gap:2px}
.serp.serpadd:hover{border-color:var(--fg);background:var(--surface2)}
/* 比下面那条 .serp .serpx 多一个类，所以不靠先后顺序也盖得住它；
   但 background / border 都得显式关掉 —— 那条给角标做了白底描边。 */
.serp.serpadd .serpx{position:static;width:auto;height:auto;background:none;border:none;
  font-size:19px;line-height:1;color:var(--fg2)}
.serp.serpadd .serpt{padding:0;color:var(--fg2);white-space:normal;text-align:center}
.serp .serpx{position:absolute;top:4px;right:4px;width:18px;height:18px;
  display:flex;align-items:center;justify-content:center;font-size:13px;
  background:rgba(255,255,255,.92);color:var(--fg);border:1px solid var(--line)}
.serp.on{border-color:var(--fg);outline:1px solid var(--fg);outline-offset:-2px}
.serp.on .serpx{background:var(--fg);color:var(--on-fg);border-color:var(--fg)}
.serp:disabled{opacity:.5;pointer-events:none}
.serp:hover{border-color:var(--fg2)}
.wacts .btn i{font-style:normal;opacity:.55;margin-left:3px}
/* 系列审核卡片里那一排照片 —— 系列审的是「放在一起对不对」 */
/* 系列审核卡片（批二收尾）：改成和审核照片的卡片一个尺寸。
   以前 .qth 压根没有尺寸规则，封面图按原尺寸铺开，一张卡片就占掉大半屏，
   审几个系列要滚半天。现在和 .qitem .th 对齐，一屏能扫过好几条；
   要细看就点开弹窗，那里是真实排版。 */
.qitem.sq{padding:14px;gap:18px;margin-bottom:12px}
.qitem.sq .qth{width:150px;height:100px;flex:none;overflow:hidden;background:var(--imgbg)}
.qitem.sq .qth img{width:100%;height:100%;object-fit:cover}
.qitem.sq .qhead{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.qitem.sq .qhead h3{font-size:15px;font-weight:500}
.qitem.sq .qmeta{font-size:11.5px;color:var(--fg2);margin-top:3px}
.qitem.sq .qrow{font-size:11.5px;color:var(--fg2);margin-top:7px}
.qitem.sq .qrow b{font-weight:400;color:var(--fg3);margin-right:7px}
.qitem.sq .warn{margin-top:8px}
/* 角标在这张卡片里是行内的，不是压在缩略图上的 —— 别继承 .stag 的绝对定位 */
.qitem.sq .stag{position:static;padding:2px 7px}

.qshots{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 4px;align-items:center}
.qshot{display:block;width:72px;height:52px;overflow:hidden;background:var(--surface3);
  border:1px solid var(--line)}
.qshot img{width:100%;height:100%;object-fit:cover;display:block}
.qmore{font-size:11.5px;color:var(--fg2);padding-left:2px}
.qth .nocover{width:100%;height:100%;display:flex;align-items:center;
  justify-content:center;font-size:11.5px;color:var(--fg3);background:var(--surface3)}
.stag.touched{background:var(--warn-bg2);color:var(--warn)}








/* 必填没填：标出来，但别做成刺眼的红 */
.ufields label.bad input,
.ufields label.bad textarea{border-color:var(--danger-line2);background:var(--danger-bg3)}
.warn.bad{color:var(--danger);border-color:var(--danger-line);background:var(--danger-bg2)}
.usaving{margin-left:auto;align-self:center;font-size:12px;color:var(--fg2);
  font-variant-numeric:tabular-nums}
.ubar button[disabled]{opacity:.45;pointer-events:none}

.ustate b.wait{color:var(--fg3)}
.ustate i{font-style:normal;font-size:11px;color:var(--fg3);
  font-family:ui-monospace,Menlo,monospace}
.ustate i.bad{color:var(--danger)}
.ustate .btn.sm{padding:2px 10px}
.ubarline{flex:1;min-width:120px;height:3px;background:var(--bar);overflow:hidden}
.ubarline i{display:block;height:100%;background:var(--fg);
  transition:width .18s linear}
.ucount{font-variant-numeric:tabular-nums}

.uexif span.wait{background:none;border:1px dashed var(--line2);color:var(--fg3)}
.uexif span{display:inline-block;font-size:9px;letter-spacing:.12em;text-transform:uppercase;
  background:var(--surface2);padding:2px 7px;margin-right:8px;color:var(--fg6)}
.ltabs{display:flex;gap:4px;margin-bottom:10px}
.ltabs button{font-family:inherit;font-size:11px;padding:4px 12px;cursor:pointer;
  border:1px solid var(--line);background:none;color:var(--fg2);transition:all .2s}
.ltabs button.on{background:var(--fg);border-color:var(--fg);color:var(--on-fg)}
.ufields{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}
.ufields label{font-size:11px;color:var(--fg2);display:block}
.ufields label.wide{grid-column:1/-1}
.ufields label i{font-style:normal;font-size:10px;color:var(--fg4);margin-left:4px}
.ufields input,.ufields textarea,.ufields select{margin-top:4px}
.ubar{display:flex;gap:10px;margin-top:22px;padding-top:20px;border-top:1px solid var(--line)}

/* 大图 */
.bigview{position:fixed;inset:0;z-index:120;background:rgba(10,10,10,.94);
  display:flex;align-items:center;justify-content:center;padding:48px;
  opacity:0;pointer-events:none;transition:opacity .25s;cursor:zoom-out}
.bigview.on{opacity:1;pointer-events:auto}
.bigview img{max-width:100%;max-height:100%;object-fit:contain}
/* .bigview 的底是 rgba(10,10,10,.94) —— 两个主题下都是近黑。
   所以关闭按钮要走灯箱那套 --dfg2，不能跟页面主题走：
   跟着走的话暗色下会变成深灰压在近黑上，几乎看不见。
   亮色下这一处从 #8A8A85 变成 #8A8A8A（差 1 个单位，肉眼无差）。 */
.bigview .x{position:absolute;top:24px;right:30px;color:var(--dfg2);font-size:20px;cursor:pointer}
.bigview .x:hover{color:#fff}

/* 提示条 */
.toast{position:fixed;left:50%;bottom:34px;transform:translate(-50%,14px);z-index:130;
  background:var(--fg);color:var(--on-fg);font-size:13px;padding:12px 22px;
  opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;max-width:80vw}
.toast.on{opacity:1;transform:translate(-50%,0)}
.btn{font-size:12px;padding:8px 18px;border:1px solid var(--fg);background:var(--fg);color:var(--on-fg);
  text-align:center;letter-spacing:.04em}
.btn.g{background:transparent;color:var(--fg)}
.btn.t{border-color:var(--line);color:var(--fg2)}
.tabs{display:flex;gap:26px;border-bottom:1px solid var(--line);margin-bottom:26px;font-size:13px}
.tabs a{padding-bottom:10px;color:var(--fg2)}
.tabs a.on{color:var(--fg);border-bottom:1px solid var(--fg)}
.tabs a i{font-style:normal;color:var(--fg3);margin-left:4px}

/* ---------- 语言切换 ---------- */
/* 语言按钮和主题下拉共用一个盒子。
   选择器必须写成 .navlinks .langbtn：上面有
   `.navlinks a{padding-bottom:3px}`（给导航项的下划线动画留位），
   特异度 (0,1,1) 高于 .langbtn 的 (0,1,0)，所以 padding:0 8px
   会被它盖掉、padding-bottom 变回 3px，文字被往上顶 3px。
   实测语言按钮上边距 0.7px、下边距 3.6px —— 就是这么偏的。
   提到 (0,2,0) 之后这条才说得上话。 */
.langbtn,.thmsel,
.navlinks .langbtn,.navlinks .thmsel{
  display:flex;align-items:center;justify-content:center;
  min-width:36px;height:23px;padding:0 8px;border:1px solid currentColor;
  font-size:11px;letter-spacing:.1em;opacity:.5;line-height:1;
  transition:opacity .25s,background .25s,color .25s}
.langbtn:hover,.thmsel:hover,.thmsel:focus{opacity:1}
.langbtn::after,.thmsel::after{display:none}
.nav.solid .langbtn:hover,.nav.over.stuck .langbtn:hover,
.nav.solid .thmsel:hover,.nav.over.stuck .thmsel:hover{background:var(--fg);color:var(--on-fg)}
/* 这个 hover 出现在【压着首屏照片】的透明导航上，不是压在页面底上。
   所以底色必须写死白色 —— 用 var(--surface) 的话暗色下会变成
   深底配 #111 深字，整块看不见。 */
.nav.over:not(.stuck) .langbtn:hover,
.nav.over:not(.stuck) .thmsel:hover{background:#fff;color:#111}
.mmenu .mlang{color:var(--fg2);font-size:20px!important}

/* ---------- 内页底部：返回主页 ---------- */
.backhome{display:flex;align-items:center;gap:20px;margin-top:36px;
  padding:30px 34px;border:1px solid var(--line);
  transition:background .3s,border-color .3s,color .3s}
.backhome:hover{background:var(--fg);border-color:var(--fg);color:var(--on-fg)}
.backhome .ar{font-size:20px;line-height:1;transition:transform .3s}
.backhome:hover .ar{transform:translateX(-7px)}
.backhome .tx b{display:block;font-family:var(--serif);font-weight:400;font-size:18px}
.backhome .tx i{font-style:normal;font-size:12px;color:var(--fg2);transition:color .3s}
.backhome:hover .tx i{color:rgba(255,255,255,.72)}

/* ---------- 登录 ---------- */
.signin{max-width:420px;margin:0 auto;padding:96px 0 40px}
.signin .k{font-size:11px;letter-spacing:.24em;color:var(--fg2);
  text-transform:uppercase;text-align:center}
.signin h1{font-family:var(--serif);font-weight:400;font-size:38px;
  text-align:center;margin:16px 0 0}
.signin .lead{font-size:13.5px;line-height:1.9;color:var(--fg2);
  margin:18px 0 36px;text-align:center}
.sform label{display:block;margin-bottom:18px}
.sform label span{display:block;font-size:11px;letter-spacing:.14em;
  color:var(--fg2);text-transform:uppercase;margin-bottom:7px}
.sform input{width:100%;font-family:inherit;font-size:15px;padding:12px 14px;
  border:1px solid var(--line);background:var(--surface);color:var(--fg);outline:none;
  transition:border-color .2s}
.sform input:focus{border-color:var(--fg)}
.sform .btn{width:100%;margin-top:8px}
.sform .serr{font-size:13px;color:var(--danger2);background:var(--danger-bg);
  border-left:2px solid var(--danger2);padding:10px 12px;margin-bottom:16px;line-height:1.7}
.sform .shint{font-size:12px;color:var(--fg2);text-align:center;margin-top:18px}

/* 后台侧边栏里的当前用户 */
.side .whoami{padding:9px 24px;font-size:13px;color:var(--fg)}
.side .whoami em{font-style:normal;display:block;font-size:11px;color:var(--fg2);
  margin-top:2px}
.side .signout{width:100%;margin-top:10px}

@media (max-width:760px){
  .signin{padding:56px 0 24px}
  .signin h1{font-size:30px}
}

/* ---------- 关于 ---------- */
.about{max-width:660px;margin:0 auto;padding:88px 0 8px}
.about .k{font-size:11px;letter-spacing:.24em;color:var(--fg2);text-transform:uppercase;
  text-align:center}
.about h1{font-family:var(--serif);font-weight:400;font-size:44px;line-height:1.2;
  text-align:center;margin:16px 0 8px}
.about p{margin-top:26px;font-size:16px;line-height:1.95;color:var(--prose)}
.plist{max-width:820px;margin:0 auto}
.pcard{display:flex;gap:28px;padding:34px 0;border-bottom:1px solid var(--line)}
.pcard:last-child{border-bottom:none}
.pcard .av{width:86px;height:86px;border-radius:50%;overflow:hidden;flex:none;background:var(--imgbg2)}
.pcard .av img{width:100%;height:100%;object-fit:cover}
.pcard h3{font-family:var(--serif);font-weight:400;font-size:24px}
.pcard .en{font-size:10px;letter-spacing:.22em;color:var(--fg3);text-transform:uppercase;margin-top:5px}
.pcard .bio{margin-top:12px;font-size:14px;line-height:1.85;color:var(--prose2);max-width:520px}
.pcard .gear{margin-top:10px;font-size:12px;color:var(--fg2)}
.pcard .go{margin-top:12px;font-size:12px;display:inline-block;
  border-bottom:1px solid var(--line);padding-bottom:2px;transition:border-color .25s}
.pcard .go:hover{border-color:var(--fg)}
.contact{max-width:820px;margin:0 auto}
.contact div{display:flex;gap:28px;padding:14px 0;border-bottom:1px solid var(--line);font-size:14px}
.contact div:last-child{border-bottom:none}
.contact span{flex:none;width:88px;color:var(--fg2);font-size:12px;padding-top:2px}
.contact b{font-weight:400;color:var(--prose)}

/* ================= 手机菜单 ================= */
.burger{display:none;align-items:center;gap:7px;cursor:pointer;font-size:13px;white-space:nowrap}
.navlinks a,.nav .crumb,.brand{white-space:nowrap}
.burger .bars{display:block;width:17px;height:9px;position:relative}
.burger .bars::before,.burger .bars::after{content:"";position:absolute;left:0;right:0;
  height:1px;background:currentColor;transition:transform .3s}
.burger .bars::before{top:0} .burger .bars::after{bottom:0}
.mmenu{position:fixed;inset:0;z-index:70;background:var(--bg);
  display:flex;flex-direction:column;justify-content:center;padding:0 28px;
  opacity:0;pointer-events:none;transition:opacity .25s}
.mmenu.on{opacity:1;pointer-events:auto}
.mmenu a{font-family:var(--serif);font-size:30px;padding:15px 0;
  border-bottom:1px solid var(--line);display:block}
.mmenu a:last-of-type{border-bottom:none}
.mmenu .mgrp{font-size:10px;letter-spacing:.22em;text-transform:uppercase;
  color:var(--fg3);padding:20px 0 6px;border-bottom:1px solid var(--line)}
.mmenu a.msub{font-size:22px;padding:11px 0 11px 18px;color:var(--fg2)}
.mmenu a.msub:active{color:var(--fg)}
.mmenu .x{position:absolute;top:24px;right:26px;font-size:22px;color:var(--fg2)}
body.menuopen{overflow:hidden}

/* ================= 平板 ================= */
@media (max-width:1100px){
  .wrap{padding:0 32px}
  .nav{padding:22px 32px} .nav.over.stuck{padding:16px 32px}
  .cols{column-gap:40px} .card{margin-bottom:56px}
  .phead{gap:36px} .hero .cap{left:32px}
  .hint{right:32px} .lbstage{inset:60px 80px 118px}
}

/* ================= 手机 ================= */
@media (max-width:760px){
  .wrap{padding:0 20px}
  .nav{padding:18px 20px} .nav.over.stuck{padding:14px 20px}
  .navlinks{gap:16px}
  .nav .crumb{font-size:11px;margin-left:10px;max-width:40vw;overflow:hidden;text-overflow:ellipsis}
  .nav .crumb::before{margin-right:8px}
  .brand em{display:none}                 /* 手机上只留中文站名 */
  .navlinks a:not(.searchbtn):not(.burger){display:none}
  .searchbtn span{display:none}           /* 只留放大镜 */
  .navlinks a.burger{display:flex}
  /* 手机上导航塞不下，主题按钮也收起来 —— 它进抽屉（.mtheme）。
     登录页没有抽屉，所以那里两个按钮都留在导航里，
     否则手机上根本切不了主题和语言。 */
  .navlinks .thmsel{display:none}
  .nav.nodrawer .navlinks .thmsel,
  .nav.nodrawer .navlinks a.langbtn{display:flex}

  /* 首屏 */
  .hero .cap{left:20px;right:20px;bottom:74px}
  .hero .cap .loc{font-size:13px;margin-top:10px}
  .hnav{display:none}                      /* 手机靠滑动，箭头会挡住点击 */
  .hint{right:20px;bottom:34px}
  .dots{bottom:34px}

  /* 作品流：单列 */
  .sec{padding:56px 0}
  .sechead{margin-bottom:24px;padding-bottom:16px}
  .sechead h2{font-size:21px}
  .cols{column-count:1;column-gap:0}
  .card{margin-bottom:44px}
  .card .cap{padding-top:11px;gap:8px}
  .card .cap b{font-size:15px}
  .card .zoom{display:none}
  .chips{gap:6px;margin-bottom:28px;overflow-x:auto;padding-bottom:4px}
  .chip{padding:7px 13px;flex:none}
  .more{padding:13px 24px;width:100%}

  /* 摄影师 */
  .pgrid{grid-template-columns:1fr;gap:8px}
  .pgrid > *:nth-child(even){margin-top:0}
  .pgrid .pc{padding:16px 0;gap:18px}
  .pgrid .pcav{width:92px;height:92px}
  .pgrid h3{font-size:22px}
  .pgrid .bio{font-size:13px;margin-top:10px}
  .members{gap:6px 20px;flex-direction:column;align-items:flex-start}
  .mem{width:100%}
  .phead{flex-direction:column;gap:24px;padding:64px 0 40px}
  .phead>div:first-child{width:auto!important}
  .phead h1{font-size:36px}
  .band{height:210px;margin:30px 0}
  .band .bc{left:20px;bottom:20px}
  .band .bc h3{font-size:22px}

  /* 系列页 */
  .shead{padding:56px 0 8px}
  .shead h1{font-size:30px}
  .snote{font-size:14px;line-height:1.8;margin-top:28px}
  .stream{padding:44px 0 16px}
  .shot{margin-bottom:52px}
  .shot .cap{flex-wrap:wrap;gap:6px;margin-top:12px}
  .shot .note{font-size:13px}

  /* nodrawer 的导航（登录页、预览页）窄屏下不收进汉堡，语言和主题两个
     控件一直占着右边，所以面包屑得让位 —— 40vw 那档实测和主题下拉
     正好贴在一起、中间 0px，长一点的系列名看着就像压在控件上。 */
  .nav.nodrawer .crumb{max-width:28vw;margin-right:12px}

  /* 系列预览页。留白整体收一半 —— 桌面上 120px 的块间距在手机上
     要滚两屏才见下一张，节奏就断了 */
  .pvstrip{margin-top:16px;padding:10px 12px;font-size:11.5px;gap:9px}
  .pvstrip .pvgo{margin-left:0}
  .pvhead{padding:56px 0 0}
  .pvstrip + .pvhead{padding-top:36px}
  .pvhead h1{font-size:32px;margin:14px 0 10px}
  .pvpre{font-size:14px;line-height:1.85;margin-top:28px}
  .pvstream{padding:48px 0 16px}
  .pvb{margin-bottom:58px}
  .pvcap{margin-top:13px}
  .pvcap b{font-size:15px;margin-right:10px}
  .pvtx{font-size:13px;margin-top:8px}
  .pvghost{margin-bottom:36px;font-size:11.5px}
  .pvempty,.pvfail{padding:96px 0}
  .pvempty b,.pvfail b{font-size:20px}

  /* 编辑态。手机上没有精确指针 → 没有拖拽手柄（preview.js 的 ctx.fine），
     顺序全靠右边那两个按钮，所以它们要比桌面更好点。 */
  .pvbar{top:70px;margin-top:12px;padding:9px 11px;gap:9px;flex-wrap:wrap}
  .pvtabs button{padding:6px 11px;font-size:11px}
  .pvedit{padding:20px 0 48px}
  .pvehint{font-size:11.5px;margin-bottom:16px}
  .pve{gap:10px;padding:10px}
  .pvet{width:88px;height:66px}
  .pveb button{width:34px;height:32px}

  /* 系列弹窗在窄屏上几乎占满：留白让给内容，
     顶和底固定、中间那段预览自己滚。 */
  .serpanel{padding:0;align-items:stretch}
  .serpanel .cfmin.sp{max-height:100vh;max-width:none}
  .sphead{padding:12px 14px}
  .sphead b{font-size:14px}
  .spwrap{padding:0 14px 6px}
  .spwrap .pvhead{padding:18px 0 0}
  .spwrap .pvhead h1{font-size:26px}
  .spwrap .pvstream{padding:18px 0 4px}
  .spwrap .pvb{margin-bottom:28px}
  /* 手机上按钮要能戳得着，所以放开成两列而不是挤成一行 */
  .spacts{padding:12px 14px;gap:8px}
  .spacts .btn{flex:1 1 calc(50% - 4px);padding:11px 12px;font-size:12px}
  .spacts .btn.warn{margin-left:0}
  /* 照片弹窗：窄屏上图矮一档，给下面的信息留出屏幕 */
  .phv{padding:14px 0 2px}
  .phvimg,.phvimg img{max-height:48vh}
  .phvside{padding:14px 0 0}
  .phvline{font-size:12.5px}
  /* 照片弹窗【不拉满高】。上面那条 .serpanel{align-items:stretch} 是给
     系列预览用的 —— 那里面是整页排版，本来就长，拉满才对。
     一张照片加几行信息撑不满一屏，拉满之后动作条被顶到屏幕最底下，
     中间空出一大片（实测：内容区 898px、图只占 258px）。 */
  .serpanel.phpanel{align-items:center;padding:14px}
  .serpanel.phpanel .cfmin.sp{max-height:92vh}

  /* 系列审核卡片：窄屏下封面转到上面，整条竖排 */
  .qitem.sq{flex-direction:column;gap:12px}
  .qitem.sq .qth{width:100%;height:150px}

  /* 灯箱 */
  .lbstage{inset:54px 0 158px}
  .lbox .arrow{display:none}               /* 左右滑动代替 */
  .lbox .lbtop{padding:18px 20px}
  .lbox .lbbar{flex-direction:column;align-items:flex-start;gap:12px;padding:14px 20px 18px}
  .lbox .lbbar h3{font-size:18px}
  .lbox .exif{flex-wrap:wrap;gap:10px 18px}
  .lbox .note p{max-width:none}

  /* 搜索 */
  .srch .box{padding:84px 20px 0}
  .srch input{font-size:24px;padding-bottom:14px}
  .srch .hintrow .keys{display:none}
  .srch .res{margin-top:24px;max-height:62vh}
  .srch .r{gap:12px;padding:10px 6px}
  .srch .r .t{width:64px;height:46px}
  .srch .r .t.av{width:46px;height:46px;margin:0 9px}
  .srch .r b{font-size:15px}
  .srch .r .who{font-size:10px}
  .srch .close{top:20px;right:20px}

  .backhome{padding:22px 20px;gap:14px;margin-top:26px}
  .backhome .tx b{font-size:16px}
  .langbtn,.thmsel,
  .navlinks .langbtn,.navlinks .thmsel{min-width:32px;height:21px;padding:0 6px;font-size:10px}
  .hero{perspective:1000px}
  .totop{right:16px;bottom:16px;width:38px;height:38px}
  footer{flex-direction:column;gap:8px;padding:32px 0 44px}

  /* 后台 */
  .adm{flex-direction:column}
  .side{width:auto;border-right:none;border-bottom:1px solid var(--line);padding:18px 0}
  .main{padding:24px 20px}
  /* 选择页的两张卡窄屏上摞起来，并且矮一档 —— 并排时的 232px 是为了
     和旁边那张齐高，摞起来就没这个必要，再高就把第二张顶出屏幕了。 */
  .pick{grid-template-columns:1fr;gap:14px;max-width:none}
  .pick .pk{min-height:168px;padding:30px 22px}
  .pick .pk b{font-size:19px}
  /* 批量：窄屏上 lead 和「选择」摞起来，底部条的按钮放开成两列 */
  .leadrow,.noterow{flex-wrap:wrap;gap:8px 12px}
  /* 窄屏的底部条：瘦身（八-4）。
     原先 199px 高、四行 —— 计数独占一行、清空+下架一行、删除独占一行、
     取消又独占一行。占掉 418px 视窗的一半。

     重排成两段：
       第一行  计数 ——————— 清空/全选  取消     （后两个按内容宽，靠右）
       第二行起 动作按钮，两列
     「清空/全选」和「取消」都是【管选中集的】，和「下架/删除」不同类，
     放一起、按内容宽，不跟动作抢半宽。

     DOM 顺序没动 —— 桌面版还是「计数 · 清空 ———— 动作… · 取消」，
     只有窄屏靠 order 重排。.sfsep 在桌面是把动作推到右边的弹簧，
     这里改成一个零高的整行占位，当「强制换行」用。 */
  .sfin{padding:10px 20px;gap:8px}
  .sfn{order:-3;flex:1 1 auto;min-width:0;font-size:12px}
  /* [data-sf]:not(.sfx) = 清空 / 全选 */
  .selfoot [data-sf]:not(.sfx){order:-2;flex:none;padding:6px 12px}
  .selfoot .sfx{order:-1;flex:none;margin-left:0;padding:6px 10px}
  .sfsep{order:0;flex:0 0 100%;height:0;margin:0}
  .selfoot [data-sfop]{order:1;flex:1 1 calc(50% - 4px);padding:11px 10px;font-size:12px}
  /* 垫高和 toast 的位置都跟着 --selfooth 走（见上面那段），
     窄屏不用另写死一份 —— 条子摞成两列时量出来的值自己就变高了。 */
  .qitem{flex-direction:column}
  .qitem .th{width:100%;height:180px}
  .qitem .fields{flex-wrap:wrap;gap:12px 24px}
  .acts{flex-direction:row;flex-wrap:wrap}
  .sidefoot{padding:16px 20px 4px}
  .wgrid{grid-template-columns:1fr;gap:14px}
  .ucard{flex-direction:column;gap:14px}
  .ucard .uth{width:100%;height:200px}
  .ufields{grid-template-columns:1fr}
  .ubar{flex-direction:column}
  .tabs{gap:14px;overflow-x:auto;padding-bottom:2px}
  .tabs a{white-space:nowrap}
  .bigview{padding:16px}
}

@media (prefers-reduced-motion: reduce){
  *{animation:none!important;transition-duration:.01ms!important}
  .rv{opacity:1;transform:none}
}


/* 主题下拉。用原生 <select>：手机上直接调出系统选择器，
   键盘和读屏都是浏览器给的。代价是默认样式要逐条抹掉 ——
   灰底、buttontext 颜色、自带字体、圆角、右侧箭头槽。
   注意用 font-family:inherit 而不是 font:inherit：后者是简写，
   会把上面那条规则里的 font-size:11px 一起重置掉。 */
.thmsel{min-width:auto;padding:0 8px;cursor:pointer;
  font-family:inherit;color:inherit;background:transparent;
  -webkit-appearance:none;appearance:none;border-radius:0;
  border:1px solid currentColor;
  text-align:center;text-align-last:center;outline:none}
.thmsel:focus-visible{outline:1px solid currentColor;outline-offset:2px}
/* 展开的那张列表是系统画的，跟不了 currentColor —— 不显式给底和字，
   暗色下会是白底黑字。 */
.thmsel option{background:var(--surface);color:var(--fg);text-align:left}

/* 后台侧栏：和旁边的语言按钮一样占满一行、一样高。
   高度【不能】继承 .thmsel 的 height:23px —— 那个值在窄屏的
   媒体查询里会被改成 21px（那条规则本来是给导航里的按钮用的），
   于是侧栏里语言按钮 23px、下拉 21px，差一截。
   这里改成和 .sidefoot button 同一套算法：靠 padding 撑高。 */
.sidefoot .thmslot{display:block}
.sidefoot .thmsel2{height:auto;padding:4px 10px;font-size:11px;letter-spacing:.1em;
  /* line-height 也得跟着 button 走。共用规则里是 line-height:1，
     文字盒只有 11px；而 .sidefoot button 用默认行高，约 13px。
     差这 2px，侧栏里语言按钮 23 高、下拉 21 高，并排看得出来。 */
  line-height:normal}

/* 手机抽屉里那一行：左边「主题」，右边下拉 */
.mthrow{display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:14px 0;border-top:1px solid var(--line)}
.mthrow > span{font-size:15px;color:var(--fg2)}
.mthsel{opacity:.8;min-width:104px;height:28px}

/* ============================================================
   暗色（B · 中性纯灰）
   ============================================================
   只有这一个块。「跟随系统」不在 CSS 里判 —— <head> 那段脚本
   把 system 解析成 light|dark 之后写进 <html data-theme>，
   所以这里不需要再写一遍 @media (prefers-color-scheme: dark)。
   同一套暗色写两遍是最容易长期漂移的地方。

   几条定下来的原则：
   · 页面底停在 #131313，不用纯黑 —— 亮照片压在纯黑上边缘会泛光。
     纯黑留给灯箱，让它比页面【更深一层】，两层才分得开。
   · 压在照片上的层（首屏字幕、灯箱箭头、轮播圆点、.stag 角标）
     在 CSS 里就是写死的白，不在这里出现，所以不会被翻掉。
   · 状态色统一降饱和。原色（#A8452F 那种）搬到暗底上会发脏发暗。
   · 照片本身【不做任何处理】：不降亮度、不加滤镜。它们是主角。
   ============================================================ */
:root[data-theme="dark"]{
  /* 让原生控件（滚动条、输入框光标、下拉箭头）也跟着暗 */
  color-scheme: dark;

  /* 底 */
  --bg:#131313;
  --bg2:#0F0F0F;           /* 后台底比前台再深一点，和亮色的相对关系一致 */
  --surface:#1B1B1B;       /* 卡片比页面【亮】一档 —— 照片压上去才有依托 */
  --surface2:#212121;
  --surface3:#1E1E1E;
  --imgbg:#252525;
  --imgbg2:#2A2A2A;
  --avbg:#2E2E2E;
  --nav-bg:rgba(19,19,19,.97);

  /* 字。正文不用纯白 —— #FFF 压在暗底上会有光晕，读久了累 */
  --fg:#ECECEC;
  --fg2:#9A9A9A;
  --fg3:#6C6C6C;
  --fg4:#5A5A5A;
  --fg5:#4E4E4E;
  --fg6:#8A8A8A;
  --on-fg:#131313;         /* 压在近白的 --fg 上，必须是深色 */
  --prose:#C6C6C6;         /* 长段落比正文稍暗，长时间读更舒服 */
  --prose2:#BCBCBC;

  /* 线。暗色下线要比亮色【弱】：亮色靠深线分割，暗色靠亮面分割，
     线再重会把界面切得很碎 */
  --line:#2B2B2B;
  --line2:#383838;
  --line3:#424242;
  --line4:#565656;
  --line5:#6E6E6E;

  /* 状态色：降饱和、提亮度，配深底 */
  --danger:#D98A76; --danger2:#E09C8A; --on-danger:#1C1310;
  --danger-bg:#2A1E1B; --danger-bg2:#241A18; --danger-bg3:#2A1E1B;
  --danger-line:#4A342E; --danger-line2:#6E4C42;
  --warn:#D6BB82; --warn2:#D6BB82; --warn-bg:#252118; --warn-bg2:#2B2519;
  --warn-line:#8A7440;
  --ok:#82BA97; --ok2:#82BA97;
  --arch-bg:#262626; --arch-fg:#A2A2A2;

  /* 角标底色仍然是深的（它们配白字，见上面那段注释） */
  --stag-ok:#2C6349; --stag-pending:#7A5D1E; --stag-rejected:#7E2C2C; --stag-draft:#454545;

  --soft:#1E1E1E; --soft2:#181818; --bar:#2B2B2B;
  /* 上传卡片那个「＋」：#5A5A5A 压在 #181818 上只有 2.57 的对比度，
     体检查出来的。它是 26px 的大字符，按大字标准也要 3.0 —— 提到 4.0。 */
  --mark:#787878;

  /* 灯箱：压到纯黑，比页面底（#131313）更深一层。
     分割线也跟着压暗，否则在纯黑上会很突兀。 */
  --dbg:#000000; --dfg:#F0F0F0; --dfg2:#8C8C8C; --dfg3:#AEAEAE; --dline:#232323;
}
