/* ==========================================================================
   星阮之芸 · 袁德华艺术网站  THE LIGHT OF ALL THINGS — The Art of Yuan Dehua
   全站样式  /  Global stylesheet
   ========================================================================== */

/* ---------- 1. 变量与基础 ---------- */
:root{
  --ink:#07080f;            /* 墨底 */
  --ink-2:#0d1020;
  --ink-3:#141833;
  --gold:#c9a227;
  --gold-2:#e8c46a;
  --gold-3:#f4e3b0;
  --cinnabar:#b8342a;       /* 朱砂 */
  --jade:#2f7d6f;
  /* 翠绿：主视觉「袁德华 · YUAN DEHUA」专用。
     翠绿比墨绿亮得多，压在深蓝暗紫背景上对比度 7.1:1，不存在看不清的问题，
     所以这里可以直接取传统「翠」色本身，不用像墨绿那样为了可读性提亮。 */
  --emerald:#3eb370;
  --paper:#f6f2e8;          /* 宣纸 */
  --text:#e9e6de;
  --text-dim:#a9a49a;
  --line:rgba(233,230,222,.14);
  --maxw:1280px;
  --serif:"Noto Serif SC","Source Han Serif SC","Songti SC",SimSun,"STSong",Georgia,serif;
  --sans:"Noto Sans SC","PingFang SC","Microsoft YaHei",-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --shadow:0 18px 50px rgba(0,0,0,.55);
  --r:14px;
}

*{box-sizing:border-box}
/* text-size-adjust:100% —— iPhone 竖屏转横屏时 Safari 会自作主张放大正文字号，
   把已经排好的版面撑变形。100% = 不许它动，字号由我们的媒体查询说了算。 */
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{
  margin:0;
  background:var(--ink);
  color:var(--text);
  font-family:var(--sans);
  font-size:16px;
  line-height:1.85;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
body::before{ /* 旧的纯 CSS 星尘底纹已被 #cosmos 宇宙背景取代（见第 1.5 节） */
  content:none;
}

/* ---------- 1.5 宇宙背景（固定多层，做出景深与电影感）----------
   由 app.js 的 mountCosmos() 注入到 <body> 最前面，8 个页面自动生效。
   由远及近：油画原图（缓慢推轨）→ 视差星点+流星 canvas → 光束 → 调色暗角 → 胶片颗粒 → 开场黑幕。

   ★ 两个旋钮，调背景就改这两个数，别的都不用动：
     --bg-dim  油画的亮度/可见度（0=纯墨底看不见画，1=原图全亮）
     --bg-veil 压在画上的暗纱（越大文字越清楚、画面越沉；越小画面越亮、文字越吃力）
   两者是一对：把 dim 调高了觉得字看不清，就把 veil 也调高一点找平衡。
   2026-07-26 用户要求再提亮一档：dim .62→.74、veil .34→.30、油画 brightness .86→.94。
   这是可读性还撑得住的上限附近，再往上正文就要开始吃力了。 */
:root{ --bg-dim:.74; --bg-veil:.30; }

#cosmos{
  position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;
  background:var(--ink);
}

/* 远景容器：只负责视差位移（transform 由 app.js 写），
   故意向外溢出留出位移余量，免得画面移动时露出边缘空白。 */
.cosmos-far{position:absolute;inset:-7% -5%;will-change:transform}

/* 真正贴图的一层。transform 归 CSS 的推轨动画，opacity 归开场淡入，
   两条动画各管各的属性，互不打架——所以不能把它们合成一条。 */
.cosmos-shot{
  position:absolute;inset:0;
  background:url(../img/bg/cosmos-sm.jpg) center center/cover no-repeat;
  /* 往深蓝暗紫压：降饱和收住橙红、色相微偏蓝紫、留住亮度靠 --bg-veil 去压 */
  filter:saturate(.92) hue-rotate(-8deg) brightness(.94) contrast(1.04);
  opacity:var(--bg-dim);
  animation:cosmos-push 72s ease-in-out infinite alternate,
            cosmos-fade 2600ms ease-out both;
  will-change:transform,opacity;
}
@media(min-width:820px){ .cosmos-shot{ background-image:url(../img/bg/cosmos.jpg); } }
/* 缓慢推轨（Ken Burns）：72 秒一个来回，慢到不会分散注意力，但画面始终"活着" */
@keyframes cosmos-push{
  from{ transform:scale(1.04) translate3d(-.8%,.6%,0) }
  to  { transform:scale(1.13) translate3d(.9%,-.9%,0) }
}
@keyframes cosmos-fade{ from{opacity:0} to{opacity:var(--bg-dim)} }

/* 中景：星点画布（含流星），各景深以不同速度视差移动 */
.cosmos-stars{position:absolute;inset:0;width:100%;height:100%}

/* 九道极淡的光束缓慢扫过，像放映机的光柱。
   角度/宽度/速度/延迟/浓度全部错开——九道一模一样的斜杠会像百叶窗，不像光。
   单道浓度只有原来一道时的三分之一左右，九道偶尔重叠也不会糊成一片白。 */
.cosmos-beam{
  position:absolute;top:-45%;height:190%;
  background:linear-gradient(90deg,transparent,
             rgba(150,175,255,.05) 40%,rgba(198,170,255,.085) 52%,
             rgba(150,175,255,.04) 62%,transparent);
  mix-blend-mode:screen;
  animation:cosmos-beam var(--bt) linear infinite;
  animation-delay:var(--bd);
}
@keyframes cosmos-beam{
  0%  { transform:translate3d(0,0,0) rotate(var(--ba));      opacity:0 }
  14% { opacity:var(--bo) }
  86% { opacity:var(--bo) }
  100%{ transform:translate3d(var(--bx),0,0) rotate(var(--ba)); opacity:0 }
}
/* 九道各自的参数：--ba 角度 / --bo 浓度 / --bt 周期 / --bd 起始延迟 / --bx 行程
   ⚠ 必须写成 .cosmos-beams > .cosmos-beam:nth-child(N)：光束前面还有远景层和画布，
     直接对 #cosmos 用 nth-child 会从 1 数到远景层，九道全都对不上号。 */
.cosmos-beams{position:absolute;inset:0;overflow:hidden}
.cosmos-beams>.cosmos-beam:nth-child(1){left:-70%;width:46%;--ba:13deg; --bo:.62;--bt:34s;--bd:0s;   --bx:420%}
.cosmos-beams>.cosmos-beam:nth-child(2){left:-80%;width:28%;--ba:9deg;  --bo:.40;--bt:47s;--bd:-6s;  --bx:560%}
.cosmos-beams>.cosmos-beam:nth-child(3){left:-60%;width:62%;--ba:18deg; --bo:.30;--bt:58s;--bd:-19s; --bx:330%}
.cosmos-beams>.cosmos-beam:nth-child(4){left:-90%;width:22%;--ba:6deg;  --bo:.52;--bt:29s;--bd:-11s; --bx:640%}
.cosmos-beams>.cosmos-beam:nth-child(5){left:-55%;width:38%;--ba:22deg; --bo:.34;--bt:41s;--bd:-25s; --bx:390%}
.cosmos-beams>.cosmos-beam:nth-child(6){left:-75%;width:52%;--ba:-8deg; --bo:.28;--bt:63s;--bd:-3s;  --bx:360%}
.cosmos-beams>.cosmos-beam:nth-child(7){left:-85%;width:18%;--ba:15deg; --bo:.58;--bt:26s;--bd:-16s; --bx:700%}
.cosmos-beams>.cosmos-beam:nth-child(8){left:-65%;width:44%;--ba:-4deg; --bo:.36;--bt:52s;--bd:-31s; --bx:400%}
.cosmos-beams>.cosmos-beam:nth-child(9){left:-95%;width:32%;--ba:11deg; --bo:.44;--bt:38s;--bd:-8s;  --bx:520%}

/* 近景：调色 + 暗角，保证正文可读。三段暗纱的浓度都跟着 --bg-veil 走 */
.cosmos-grade{
  position:absolute;inset:0;
  background:
    radial-gradient(120% 88% at 50% -8%, rgba(72,44,140,.34), transparent 62%),
    radial-gradient(96% 76% at 6% 104%, rgba(16,24,84,.40), transparent 64%),
    linear-gradient(180deg,
      rgba(7,8,15,calc(var(--bg-veil) * 1.45)) 0%,
      rgba(7,8,15,calc(var(--bg-veil) * .80)) 34%,
      rgba(7,8,15,calc(var(--bg-veil) * 1.60)) 100%);
  box-shadow:inset 0 0 260px 90px rgba(7,8,15,.66);
}

/* 胶片颗粒：只靠 transform 跳位，不重绘噪声图，开销极小 */
.cosmos-grain{
  position:absolute;inset:-140px;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='150' height='150'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='150' height='150' filter='url(%23n)'/%3E%3C/svg%3E");
  animation:cosmos-grain 1s steps(5) infinite;
}
@keyframes cosmos-grain{
  0%  {transform:translate3d(0,0,0)}      20% {transform:translate3d(-7px,5px,0)}
  40% {transform:translate3d(6px,-6px,0)} 60% {transform:translate3d(-5px,-4px,0)}
  80% {transform:translate3d(7px,6px,0)}  100%{transform:translate3d(0,0,0)}
}

/* 开场：整块黑幕淡出，做出"起片"的那一下 */
.cosmos-open{
  position:absolute;inset:0;background:var(--ink);
  animation:cosmos-open 2400ms cubic-bezier(.2,.68,.24,1) both;
}
@keyframes cosmos-open{ 0%{opacity:1} 70%{opacity:.16} 100%{opacity:0} }

/* 系统开了"减弱动效"：留住画面和景深，砍掉所有会动的东西 */
@media(prefers-reduced-motion:reduce){
  .cosmos-far{transition:none!important}
  .cosmos-shot{animation:none;transform:scale(1.07);opacity:var(--bg-dim)}
  .cosmos-beam,.cosmos-beams,.cosmos-grain,.cosmos-open{display:none}
}

img{max-width:100%;display:block}
a{color:var(--gold-2);text-decoration:none;transition:.25s}
a:hover{color:var(--gold-3)}
h1,h2,h3,h4{font-family:var(--serif);font-weight:600;line-height:1.3;margin:0 0 .6em}
p{margin:0 0 1.1em}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px;position:relative;z-index:1}
.narrow{max-width:860px}
.center{text-align:center}
.dim{color:var(--text-dim)}
.gold{color:var(--gold-2)}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}

/* ---------- 2. 顶部导航 ---------- */
.topbar{
  position:sticky;top:0;z-index:60;
  background:rgba(7,8,15,.82);
  backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);
}
.topbar-in{max-width:var(--maxw);margin:0 auto;padding:12px 28px;display:flex;align-items:center;gap:22px}
.brand{display:flex;align-items:center;gap:12px;flex-shrink:0}
.brand-mark{
  width:42px;height:42px;border-radius:50%;flex-shrink:0;
  background:
    radial-gradient(circle at 50% 50%,var(--gold-3) 0 12%,var(--cinnabar) 12% 26%,#2a2f6b 26% 44%,var(--gold) 44% 52%,#0a0c18 52% 100%);
  box-shadow:0 0 0 1px rgba(232,196,106,.5),0 0 22px rgba(201,162,39,.35);
}
.brand-txt{display:flex;flex-direction:column;line-height:1.25}
.brand-cn{font-family:var(--serif);font-size:19px;letter-spacing:.16em;color:var(--gold-3)}
.brand-en{font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--text-dim)}

.nav{display:flex;gap:4px;margin-left:auto;flex-wrap:wrap}
.nav a{
  color:var(--text);font-size:14px;padding:9px 13px;border-radius:8px;
  white-space:nowrap;letter-spacing:.03em;
}
.nav a:hover{background:rgba(232,196,106,.1);color:var(--gold-3)}
.nav a.on{color:var(--gold-2);background:rgba(232,196,106,.13)}

.tools{display:flex;align-items:center;gap:8px;flex-shrink:0}
.picker{position:relative}
.picker-btn{
  background:transparent;border:1px solid var(--line);color:var(--text);
  padding:8px 12px;border-radius:8px;font:inherit;font-size:13px;cursor:pointer;
  display:flex;align-items:center;gap:7px;transition:.25s;white-space:nowrap;
}
.picker-btn:hover{border-color:var(--gold);color:var(--gold-2)}
.picker-menu{
  position:absolute;right:0;top:calc(100% + 8px);min-width:172px;
  background:#10132a;border:1px solid var(--line);border-radius:12px;
  box-shadow:var(--shadow);padding:6px;display:none;z-index:80;
}
.picker.open .picker-menu{display:block}
.picker-menu button{
  width:100%;text-align:left;background:transparent;border:0;color:var(--text);
  font:inherit;font-size:14px;padding:9px 12px;border-radius:8px;cursor:pointer;
  display:flex;justify-content:space-between;gap:10px;
}
.picker-menu button:hover{background:rgba(232,196,106,.12);color:var(--gold-3)}
.picker-menu button[aria-checked="true"]{color:var(--gold-2)}
.picker-menu button[aria-checked="true"]::after{content:"✓"}

.cart-btn{position:relative}
.cart-count{
  position:absolute;top:-6px;right:-6px;min-width:19px;height:19px;padding:0 5px;
  background:var(--cinnabar);color:#fff;border-radius:10px;font-size:11px;
  line-height:19px;text-align:center;font-family:var(--sans);
}
.burger{display:none;background:transparent;border:1px solid var(--line);color:var(--text);
  border-radius:8px;padding:8px 11px;font-size:17px;cursor:pointer}

/* 顶栏收成汉堡菜单的断点（2026-08-10 从 1080px 下移到 900px）：
   1080px 太早了——1000px 左右的笔记本窗口很常见，在那里整条导航就被收进汉堡，
   访客得多点一下才能换页。用户反馈「首页没有完整的导航」就是这个断点造成的
   （其实所有页都一样，只是他对比那两次的窗口宽度不同）。
   ★ 900px 是量出来的下限：七项导航约 486px + 品牌区 135px + 工具区 220px
     + 内边距与间隙 ≈ 880px。再往下压会挤爆，而 body 有 overflow-x:hidden，
     挤出去的按钮不是换行而是**直接点不到**（见第 14.3 节的老账）。 */
@media(max-width:855px){
  .nav{order:3;width:100%;margin-left:0;display:none}
  .nav.open{display:flex;flex-direction:column;padding-bottom:8px}
  .burger{display:block}
  .tools{margin-left:auto}
}
/* ★ 856–1080px：导航要完整显示且**必须留在一行**。七项按原字号排不下，
   `.nav{flex-wrap:wrap}` 一换行就把顶栏从 68px 顶到 113px，顶栏高度随窗口忽高忽低
   （用户报过「顶栏高度要和其他页一致」）。这里收紧字号与内边距，省出约 70px。 */
@media(min-width:856px) and (max-width:1080px){
  .nav{gap:2px}
  .nav a{padding:9px 9px;font-size:13.5px;letter-spacing:0}
}
/* ★ 856–955px：光收紧导航还不够，再把右侧语言/币种按钮的文字收掉、只留 🌐 和 ¥
   （这套做法 ≤560px 时本来就在用，含义不丢），另把品牌中文缩一档。
   这样又省出约 100px，完整导航的下限从 960px 一路压到 856px——
   1000px 上下的笔记本窗口、乃至把窗口拖窄一些，都还能看到整条导航。 */
@media(min-width:856px) and (max-width:955px){
  .brand{gap:9px}
  .brand-cn{font-size:16.5px;letter-spacing:.1em}
  .brand-en{display:none}
  .tools{gap:6px}
  .picker-btn{padding:9px 10px;gap:5px}
  .picker-btn .pk-txt{display:none}
}

/* ---------- 3. 通用区块 ---------- */
.sec{padding:96px 0;position:relative;z-index:1}
.sec.tight{padding:64px 0}
.sec-head{margin-bottom:52px}
.sec-head.center{text-align:center}
.eyebrow{
  font-size:11.5px;letter-spacing:.36em;text-transform:uppercase;
  color:var(--gold);margin-bottom:16px;font-family:var(--sans);
}
.sec-title{font-size:clamp(26px,3.4vw,42px);margin:0 0 18px}
.sec-sub{color:var(--text-dim);max-width:760px;font-size:16.5px}
.sec-head.center .sec-sub{margin-left:auto;margin-right:auto}
.rule{
  width:64px;height:2px;margin:22px 0 0;
  background:linear-gradient(90deg,var(--gold),transparent);
}
.sec-head.center .rule{margin-left:auto;margin-right:auto;
  background:linear-gradient(90deg,transparent,var(--gold),transparent)}

.btn{
  display:inline-flex;align-items:center;gap:9px;
  padding:13px 26px;border-radius:999px;font-size:14.5px;letter-spacing:.05em;
  border:1px solid var(--gold);color:var(--gold-2);background:transparent;
  cursor:pointer;font-family:var(--sans);transition:.28s;
}
.btn:hover{background:var(--gold);color:#0b0b12;transform:translateY(-2px)}
.btn-solid{background:linear-gradient(135deg,var(--gold),var(--gold-2));color:#0b0b12;border-color:transparent;font-weight:600}
.btn-solid:hover{filter:brightness(1.1);color:#0b0b12}
.btn-ghost{border-color:var(--line);color:var(--text)}
.btn-ghost:hover{border-color:var(--gold);background:transparent;color:var(--gold-2)}
.btn-sm{padding:9px 17px;font-size:13px}
.btn-block{width:100%;justify-content:center}
.btn[disabled]{opacity:.45;cursor:not-allowed;transform:none}
.btn-row{display:flex;gap:14px;flex-wrap:wrap}

.card{
  background:linear-gradient(160deg,rgba(20,24,51,.92),rgba(10,12,26,.92));
  border:1px solid var(--line);border-radius:var(--r);padding:30px;
  transition:.3s;height:100%;
}
.card:hover{border-color:rgba(232,196,106,.4);transform:translateY(-4px)}
/* 2026-08-10 按用户要求收小：标题原 20px、正文跟着 body 走 16px/行高1.85，
   三张卡并排时字显得胀、行距也松。收成 17.5px 标题 + 15.5px 正文/行高 1.72，
   卡片高度随之下来一截，三列排在一起紧凑得多。 */
.card h3{font-size:17.5px;color:var(--gold-3)}
.card p{font-size:15.5px;line-height:1.72}
.card p:last-child{margin-bottom:0}
.grid{display:grid;gap:24px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
/* 三列/四列栅格的降列断点（2026-08-10 下移）：
   原来两者都在 980px 降两列，而 980px 左右正是笔记本浏览器很常见的窗口宽度——
   用户在这个宽度下看到「首页艺术品收藏那三张图排成了两行」。
   `.g3` 是三张一组的卡片（每格 ~257px 够用），断点下移到 860px；
   `.g4` 一排四个（多是数字统计那种小块），再窄就挤了，仍保持 980px。 */
@media(max-width:980px){.g4{grid-template-columns:repeat(2,1fr)}}
@media(max-width:860px){.g3{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.g2,.g3,.g4{grid-template-columns:1fr}}

/* ---------- 视频播放器（配套短片 / 专访 / 新闻报道共用） ---------- */
.film{margin:0}
.film-player{
  display:block;width:100%;aspect-ratio:16/9;background:#000;
  border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);
}
/* 2026-08-03：原来写死 aspect-ratio:960/544（=1.765），是照配套短片的实际比例定的。
   新闻报道两条是 864×486 和 960×540（都是标准 16:9 = 1.778），压在 1.765 的框里
   会多出一道细黑边。改成 16/9 后三条都不差几个像素，object-fit:contain 兜住余量——
   宁可留极细的边，也不能裁掉画面（裁掉的往下是字幕条，那是报道的关键信息）。 */
.film-player{object-fit:contain}

/* 新闻报道两条之间的间距。两条各自是完整的 figure（画面 + 标题 + 说明），
   挨太近会看成一条的附属，所以给足留白。 */
.news-item + .news-item{margin-top:56px}
@media(max-width:640px){.news-item + .news-item{margin-top:38px}}
.film-player:focus-visible{outline:2px solid var(--gold-2);outline-offset:3px}
.film-fallback{padding:26px;color:var(--text-dim);text-align:center}
.film-cap{margin-top:22px}
.film-cap h3{font-size:20px;color:var(--gold-3);margin:0 0 10px}
.film-cap p{color:var(--text-dim);margin:0 0 8px}
.film-meta{font-size:13px;letter-spacing:.06em;opacity:.75}
/* 竖版预热片（2026-08-09）：9:16 的手机竖屏视频铺满横向配图位会高出一屏，
   收到 340px 并居中，配图位本身不再画边框（边框跟着窄条走会很怪）。
   ★ aspect-ratio 写在 <video> 上防止 poster 加载前布局跳动。 */
.exh-fig.portrait{border:none;background:none}
.exh-fig.portrait video{width:min(340px,100%);aspect-ratio:9/16;display:block;margin:0 auto;
  border:1px solid var(--line);border-radius:var(--r);background:#05060c}
.exh-fig.portrait figcaption{text-align:center;border-top:none;padding-top:10px}
/* 影片勘误行（2026-08-07）：片尾题词的笔误烧在画面像素里改不了，改在这里如实说明。
   ★ 必须 display:block 另起一行——它跟在「片长 · 规格」后面，接着写会连成一长条读不出来。 */
.exh-errata{display:block;margin-top:6px;font-size:12px;line-height:1.6;
  letter-spacing:0;opacity:.72;font-style:italic}

.badge{
  display:inline-block;padding:4px 11px;border-radius:999px;font-size:11.5px;
  letter-spacing:.1em;border:1px solid rgba(232,196,106,.4);color:var(--gold-2);
}
.badge-cinnabar{border-color:rgba(184,52,42,.6);color:#e59188}

/* ---------- 4. 首页主视觉 ---------- */
/* 主视觉不再单独放一张图，直接露出全站的 #cosmos 宇宙背景，整站背景连成一片。
   这里只留一层左深右透的挡光，保证左侧标题文字有足够对比度。 */
.hero{position:relative;min-height:92vh;display:flex;align-items:center;overflow:hidden}
.hero-bg{position:absolute;inset:0;z-index:0}
.hero-bg::after{
  content:"";position:absolute;inset:0;
  /* 背景提亮到 --bg-dim:.74 后，左侧这层挡光要跟着加重，否则 LOGO 和正文压不住画面。
     只加重左半边，右侧仍然透出油画，主视觉不会变成一块死黑。 */
  background:linear-gradient(90deg,rgba(7,8,15,.94) 0%,rgba(7,8,15,.72) 46%,rgba(7,8,15,.14) 100%),
             linear-gradient(0deg,var(--ink),transparent 58%);
}
.hero-in{position:relative;z-index:2;max-width:var(--maxw);margin:0 auto;padding:0 28px;width:100%}
.hero-kicker{
  font-family:var(--serif);font-size:13px;letter-spacing:.42em;color:var(--gold);
  margin-bottom:26px;text-transform:uppercase;
}
.hero h1{
  font-size:clamp(38px,6.4vw,82px);line-height:1.12;margin:0 0 12px;
  letter-spacing:.04em;
  background:linear-gradient(180deg,#fff 10%,var(--gold-3) 60%,var(--gold) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
/* 主视觉标题换成「星阮之芸」书法 LOGO。仍是 <h1>，只是内容从文字变成图片，
   所以要把上面那套「渐变裁进文字」的写法关掉，免得留个无用的裁剪背景。 */
.hero h1.hero-logo{
  background:none;-webkit-background-clip:border-box;background-clip:border-box;
  color:inherit;line-height:0;margin:0 0 14px;   /* 收窄下边距，让英文品牌名贴住 LOGO */
}
.hero-logo img{
  width:clamp(240px,40vw,560px);height:auto;
  /* 金色笔画压在深蓝暗紫的背景上容易发闷：先补一层同色微光把它托起来，
     再加一道暗影拉开与背景的距离。drop-shadow 认 PNG 的透明通道，
     只跟着笔画走，不会出现一个方框。 */
  filter:drop-shadow(0 0 30px rgba(233,185,43,.32))
         drop-shadow(0 3px 12px rgba(0,0,0,.55));
}
/* LOGO 下的英文品牌名。字号刻意压小、字距拉开，做成 LOGO 的附属行，
   不跟书法抢视线；用淡金呼应 LOGO，但比 LOGO 弱一档。 */
.hero-brand{
  font-family:var(--sans);
  font-size:clamp(11px,1.15vw,14.5px);
  letter-spacing:.36em;text-indent:.36em;   /* 字距拉开后右侧会空一格，用等量缩进补回来 */
  color:var(--gold-3);opacity:.74;
  margin:0 0 20px;
}

/* 艺术家署名用翠绿，和金色 LOGO 拉开层次。
   背景是暗的，补一道极淡的同色辉光把它托起来。 */
.hero-name{
  font-family:var(--serif);font-size:clamp(17px,2vw,24px);
  color:var(--emerald);letter-spacing:.2em;margin-bottom:26px;
  text-shadow:0 0 22px rgba(62,179,112,.30), 0 1px 3px rgba(0,0,0,.6);
}
/* 2026-08-10 按用户要求收小：原来 17.5px，比全站正文（16px）和小标题（16.5px）都大一号，
   首页读起来就比艺术家页、理念页"胀"。收到 16px + 行高 1.78，与其它页的正文齐平。 */
.hero-lead{max-width:620px;font-size:16px;line-height:1.78;color:#d8d3c8;margin-bottom:34px}
.hero-verse{
  font-family:var(--serif);font-size:15px;color:var(--gold-2);opacity:.9;
  border-left:2px solid var(--gold);padding-left:16px;margin:0 0 34px;max-width:520px;line-height:2;
}
.hero-stats{display:flex;gap:44px;flex-wrap:wrap;margin-top:52px;padding-top:32px;border-top:1px solid var(--line)}
.stat b{display:block;font-family:var(--serif);font-size:30px;color:var(--gold-2);line-height:1.2}
.stat span{font-size:12.5px;color:var(--text-dim);letter-spacing:.08em}

/* ---------- 5. 三系列 ---------- */
.series-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
@media(max-width:940px){.series-grid{grid-template-columns:1fr}}
.series{
  position:relative;border-radius:var(--r);overflow:hidden;min-height:440px;
  display:flex;align-items:flex-end;border:1px solid var(--line);
}
.series img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform .9s cubic-bezier(.2,.7,.2,1);opacity:.62}
.series:hover img{transform:scale(1.07);opacity:.78}
.series::after{content:"";position:absolute;inset:0;
  background:linear-gradient(0deg,rgba(6,7,14,.96) 8%,rgba(6,7,14,.35) 60%,transparent 100%)}
.series-txt{position:relative;z-index:2;padding:30px}
.series-glyph{font-family:var(--serif);font-size:52px;color:var(--gold-2);line-height:1;margin-bottom:12px;opacity:.95}
.series-txt h3{font-size:22px;margin-bottom:8px;color:#fff}
.series-txt p{font-size:14px;color:#cdc8bd;margin:0}
.series-txt .badge{margin-top:16px}

/* ---------- 6. 画廊 ---------- */
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:36px}
.chip{
  padding:9px 20px;border-radius:999px;border:1px solid var(--line);
  background:transparent;color:var(--text);font:inherit;font-size:13.5px;cursor:pointer;transition:.25s;
}
.chip:hover{border-color:var(--gold)}
.chip.on{background:var(--gold);border-color:var(--gold);color:#0b0b12;font-weight:600}

.works{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
/* 2026-08-10 从 980px 下移到 860px：980px 左右是很常见的窗口宽度，
   在那里降成两列会让**画廊精选是两列、首页精选是三列**，同一个站看着不一致。 */
@media(max-width:860px){.works{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){.works{grid-template-columns:1fr}}

/* 首页精选那九幅（2026-08-10）：3+3+3 按系列分行，**一行一个系列**才读得出结构，
   掉成两列分组就乱了（用户在 ~980px 宽的窗口下报过这个）。所以断点比通用作品栅格更靠后：
   980 → 760 才降两列。760px 时每格约 230px，图约 230×288，仍看得清。
   ★ 这条要写在通用规则**之后**，靠层叠顺序覆盖上面那两条媒体查询——
     同为 (0,2,0) 特异性时后写的赢。 */
@media(min-width:761px){.works.works-3{grid-template-columns:repeat(3,1fr)}}
@media(max-width:760px){.works.works-3{grid-template-columns:repeat(2,1fr)}}
@media(max-width:520px){.works.works-3{grid-template-columns:1fr}}
.work{
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden;cursor:pointer;
  background:var(--ink-2);transition:.3s;display:flex;flex-direction:column;
}
.work:hover{border-color:rgba(232,196,106,.5);transform:translateY(-5px);box-shadow:var(--shadow)}
.work-img{position:relative;aspect-ratio:4/5;overflow:hidden;background:#05060c}
.work-img img{width:100%;height:100%;object-fit:cover;transition:transform .8s cubic-bezier(.2,.7,.2,1)}
.work:hover .work-img img{transform:scale(1.06)}
.work-zoom{
  position:absolute;right:12px;bottom:12px;width:34px;height:34px;border-radius:50%;
  background:rgba(7,8,15,.75);border:1px solid var(--line);color:var(--gold-2);
  display:grid;place-items:center;font-size:15px;opacity:0;transition:.3s;
}
.work:hover .work-zoom{opacity:1}
.work-txt{padding:18px 20px 22px}
.work-txt h3{font-size:17.5px;margin:0 0 6px;color:var(--gold-3)}
.work-meta{font-size:12.5px;color:var(--text-dim);letter-spacing:.04em}

/* 灯箱 */
.lightbox{
  position:fixed;inset:0;z-index:200;background:rgba(4,5,10,.96);
  display:none;overflow-y:auto;padding:40px 20px;
}
.lightbox.open{display:block}
.lb-in{max-width:1180px;margin:0 auto;display:grid;grid-template-columns:1.15fr .85fr;gap:40px;align-items:start}
@media(max-width:940px){.lb-in{grid-template-columns:1fr}}
.lb-fig{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#05060c}
.lb-fig img{width:100%;height:auto}
.lb-body h2{font-size:clamp(22px,3vw,32px);color:var(--gold-3);margin-bottom:6px}
.lb-sub{color:var(--text-dim);font-size:14px;margin-bottom:22px;letter-spacing:.05em}
.lb-spec{list-style:none;padding:0;margin:0 0 24px;border-top:1px solid var(--line)}
.lb-spec li{display:flex;gap:18px;padding:11px 0;border-bottom:1px solid var(--line);font-size:14px}
.lb-spec li b{min-width:110px;color:var(--text-dim);font-weight:400}
.lb-close{
  position:fixed;top:22px;right:26px;z-index:210;width:44px;height:44px;border-radius:50%;
  background:rgba(20,24,51,.9);border:1px solid var(--line);color:var(--text);
  font-size:20px;cursor:pointer;transition:.25s;
}
.lb-close:hover{border-color:var(--gold);color:var(--gold-2)}

/* ---------- 6.5 电子画册 ----------
   图版用 object-fit:contain（不是画廊卡片那样的 cover）——画册要印全画面，
   裁掉边角对一本画册来说是错的。所以格子里会留深色余边，这是有意的。 */
.album-cover{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:40px;align-items:start}
.album-page{
  position:relative;margin:0;border:1px solid var(--line);border-radius:var(--r);
  overflow:hidden;background:#05060c;cursor:zoom-in;
}
.album-page img{width:100%;height:auto;display:block}
.album-book-cn{
  font-family:var(--serif);font-size:clamp(30px,4.6vw,50px);color:var(--gold-2);
  letter-spacing:.16em;text-indent:.16em;line-height:1.25;
}
.album-book-en{
  margin-top:10px;font-size:clamp(11px,1.5vw,14px);letter-spacing:.3em;text-indent:.3em;
  color:var(--gold-3);text-transform:uppercase;
}
.album-book-sub{margin-top:14px;font-size:14.5px;color:var(--text-dim);letter-spacing:.06em}
.album-imprint{margin-top:26px;font-size:14.5px;color:var(--text-dim);line-height:1.9}
.album-note{margin-top:18px;font-size:13px;line-height:1.85}

.album-text p{font-size:16.5px;line-height:2.05;margin:0 0 20px}
.album-sign{text-align:right;font-family:var(--serif);font-size:17px;color:var(--gold-3);line-height:1.9}
.album-colophon{
  margin:34px 0 0;padding:22px 26px;border-left:2px solid var(--gold);
  background:rgba(20,24,51,.35);border-radius:0 var(--r) var(--r) 0;
}
.album-colophon p{margin:0}
.album-colophon p:first-child{font-family:var(--serif);font-size:19px;color:var(--gold-2);letter-spacing:.06em}
.album-colophon p+p{margin-top:10px;font-size:13.5px;line-height:1.8}
.album-orig{margin-top:26px}

.album-count{margin:-18px 0 22px}
.chip-n{opacity:.6;font-size:12px;margin-left:2px}
.album-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:18px}
.album-cell{
  margin:0;background:var(--panel);border:1px solid var(--line);border-radius:var(--r);
  overflow:hidden;cursor:zoom-in;transition:.35s;
}
.album-cell:hover,.album-cell:focus-visible{border-color:rgba(232,196,106,.5);transform:translateY(-4px)}
.album-img{position:relative;aspect-ratio:1/1;background:#05060c}
.album-img img{width:100%;height:100%;object-fit:contain}
.album-cell:hover .work-zoom,.album-cell:focus-visible .work-zoom,
.album-page:hover .work-zoom,.album-page:focus-visible .work-zoom{opacity:1}
.album-cell figcaption{
  padding:11px 13px 13px;font-size:12.5px;color:var(--text-dim);letter-spacing:.03em;
  border-top:1px solid var(--line);
}
.album-more{margin-top:34px;text-align:center}

/* 出版栏目里的入口条 */
.album-entry{margin-top:26px}
.album-entry-in{
  display:grid;grid-template-columns:132px 1fr;gap:24px;align-items:center;
  padding:20px 24px;background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r);text-decoration:none;transition:.35s;
}
.album-entry-in:hover{border-color:rgba(232,196,106,.55);transform:translateY(-3px);box-shadow:var(--shadow)}
.album-entry-fig{display:block;border:1px solid var(--line);border-radius:4px;overflow:hidden;background:#05060c}
.album-entry-fig img{width:100%;height:auto;display:block}
.album-entry-txt{display:flex;flex-direction:column;gap:9px;align-items:flex-start}
.album-entry-t{font-family:var(--serif);font-size:20px;color:var(--gold-2);letter-spacing:.05em}
.album-entry-d{font-size:14px;color:var(--text-dim);line-height:1.8}

/* 翻阅器 */
.album-viewer{
  position:fixed;inset:0;z-index:220;background:rgba(4,5,10,.97);
  display:none;padding:56px 72px 28px;
}
.album-viewer.open{display:flex;align-items:center;justify-content:center}
.av-fig{margin:0;max-width:1180px;width:100%;text-align:center}
.av-fig img{
  max-width:100%;max-height:76vh;width:auto;height:auto;
  border:1px solid var(--line);border-radius:var(--r);background:#05060c;
}
.av-cap{
  margin-top:16px;display:flex;gap:18px;justify-content:center;flex-wrap:wrap;
  font-size:13.5px;color:var(--text-dim);letter-spacing:.04em;
}
.av-cap .av-t{color:var(--gold-3)}
.av-copy{opacity:.7}
.av-nav{
  position:fixed;top:50%;transform:translateY(-50%);z-index:230;
  width:54px;height:54px;border-radius:50%;background:rgba(20,24,51,.85);
  border:1px solid var(--line);color:var(--text);font-size:30px;line-height:1;cursor:pointer;transition:.25s;
}
.av-nav:hover{border-color:var(--gold);color:var(--gold-2)}
.av-prev{left:18px}
.av-next{right:18px}
.av-hint{
  position:fixed;left:0;right:0;bottom:16px;text-align:center;
  font-size:12px;color:var(--text-dim);opacity:.65;letter-spacing:.08em;
}

/* ===== 6.55 画册翻页动画（2026-08-08，按 PowerPoint 动画分类重做）=====

   结构：.av-stage（3D 舞台）> .av-under（新页，垫在底下）+ .av-page（旧页，浮在上面）
   翻页时**两层各跑一支动画**：
     旧页 .av-page  → 退出动画（.av-out-*）
     新页 .av-under → 进入动画（.av-in-*）
   动画结束由 JS 把内容对调。**两层必须重叠**（绝对定位），否则布局会被撑高、页面跳动。

   ★ 与第一版的区别：第一版只做了退出（旧页离开），新页是统一的淡入。
   现在按 PowerPoint 的分类做成**退出与进入一一配对**，成套出现才像一套动画。

   —— 动画清单（对应 PowerPoint 命名）——
   进入：出现/淡入/浮入/擦除/切入/缩放/弹跳/旋转/旋转缩放/百叶窗/棋盘/飞入/螺旋飞入/翻转式由远及近
   退出：消失/淡出/浮出/擦除/切出/缩放飞出/百叶窗/棋盘/螺旋飞出/翻转式远去
   另加本站特有的「翻书」（手翻纸页，画册的主效果，PowerPoint 里没有对应项）。
*/
.av-stage{
  position:relative;width:100%;max-width:1180px;
  display:flex;align-items:center;justify-content:center;
  /* 透视距离决定 3D 类动画的立体感强弱。太小会畸变得厉害，太大就没有纵深 */
  perspective:2400px;perspective-origin:50% 50%;
}
.av-stage .av-fig{position:relative}
/* 新页层：默认不占位，只有翻页时才 .show 出来 */
.av-stage .av-under{position:absolute;inset:0;display:none;align-items:center;justify-content:center;flex-direction:column}
.av-stage .av-under.show{display:flex}
.av-stage .av-page{position:relative;z-index:2;backface-visibility:hidden}

/* 点画面翻页时的光标提示。写在 CSS 里而不是 JS 设 style——
   翻页会整块替换 .av-page 的内容，JS 设在 <img> 上的样式每翻一页就丢一次。 */
.av-clickable .av-page img{cursor:pointer}

/* ============ 一、退出动画（旧页离开）============ */

/* 1. 消失 —— 瞬间无（PowerPoint「消失」）*/
@keyframes avOutNone{to{opacity:0}}
.av-out-none{animation:avOutNone .01s linear forwards}

/* 2. 淡出 */
@keyframes avOutFade{to{opacity:0}}
.av-out-fade{animation:avOutFade 0.78s ease forwards}

/* 3. 浮出 —— 向上飘走并淡出 */
@keyframes avOutFloatFwd {to{transform:translateY(-13%);opacity:0}}
@keyframes avOutFloatBack{to{transform:translateY(13%); opacity:0}}
.av-out-float.av-fwd {animation:avOutFloatFwd 0.87s cubic-bezier(.4,0,.6,1) forwards}
.av-out-float.av-back{animation:avOutFloatBack 0.87s cubic-bezier(.4,0,.6,1) forwards}

/* 4. 擦除 —— 像刮水器扫掉，用 clip-path 收边 */
@keyframes avOutWipeFwd {to{clip-path:inset(0 0 0 100%)}}
@keyframes avOutWipeBack{to{clip-path:inset(0 100% 0 0)}}
.av-out-wipe.av-fwd {animation:avOutWipeFwd 0.87s cubic-bezier(.5,0,.5,1) forwards}
.av-out-wipe.av-back{animation:avOutWipeBack 0.87s cubic-bezier(.5,0,.5,1) forwards}

/* 5. 切出 —— 整页横向推走（PowerPoint「切出」）*/
@keyframes avOutSlideFwd {to{transform:translateX(-62%) rotate(-2deg);opacity:0}}
@keyframes avOutSlideBack{to{transform:translateX(62%)  rotate(2deg); opacity:0}}
.av-out-slide.av-fwd {animation:avOutSlideFwd 0.9s cubic-bezier(.4,0,.2,1) forwards}
.av-out-slide.av-back{animation:avOutSlideBack 0.9s cubic-bezier(.4,0,.2,1) forwards}

/* 6. 缩放飞出 */
@keyframes avOutZoom{to{transform:scale(1.16);opacity:0;filter:blur(6px)}}
.av-out-zoom{animation:avOutZoom 0.9s cubic-bezier(.4,0,.6,1) forwards}

/* 7. 百叶窗 —— steps() 分段收起，比真做多个 DOM 条子省事 */
@keyframes avOutBlinds{to{clip-path:polygon(0 0,100% 0,100% 0,0 0);opacity:.15}}
.av-out-blinds{animation:avOutBlinds 0.96s steps(9,end) forwards}

/* 8. 棋盘 —— 用重复渐变做蒙版，格子逐块消失 */
@keyframes avOutCheck{
  to{-webkit-mask-size:100% 100%;mask-size:100% 100%;opacity:0}
}
.av-out-check{
  -webkit-mask-image:repeating-conic-gradient(#000 0% 25%,transparent 0% 50%);
  mask-image:repeating-conic-gradient(#000 0% 25%,transparent 0% 50%);
  -webkit-mask-size:8% 8%;mask-size:8% 8%;
  animation:avOutCheck 0.93s steps(6,end) forwards;
}

/* 9. 螺旋飞出 —— 旋转 + 缩小 + 位移，像被吸走 */
@keyframes avOutSpiralFwd {to{transform:rotate(-180deg) scale(.12) translateX(-24%);opacity:0}}
@keyframes avOutSpiralBack{to{transform:rotate(180deg)  scale(.12) translateX(24%); opacity:0}}
.av-out-spiral.av-fwd {animation:avOutSpiralFwd 1.15s cubic-bezier(.5,0,.7,1) forwards}
.av-out-spiral.av-back{animation:avOutSpiralBack 1.15s cubic-bezier(.5,0,.7,1) forwards}

/* 10. 翻转式远去 —— 绕横轴翻并推远 */
@keyframes avOutFlipFwd {to{transform:perspective(1200px) rotateX(84deg) translateZ(-260px);opacity:0}}
@keyframes avOutFlipBack{to{transform:perspective(1200px) rotateX(-84deg) translateZ(-260px);opacity:0}}
.av-out-flip{transform-style:preserve-3d}
.av-out-flip.av-fwd {transform-origin:center top;   animation:avOutFlipFwd 0.99s cubic-bezier(.5,0,.4,1) forwards}
.av-out-flip.av-back{transform-origin:center bottom;animation:avOutFlipBack 0.99s cubic-bezier(.5,0,.4,1) forwards}

/* 11. 翻书（本站特有，画册主效果）—— 绕书脊旋转 */
@keyframes avBookFwd{
  0%  {transform:rotateY(0deg);   box-shadow:0 0 0 rgba(0,0,0,0)}
  35% {                            box-shadow:-30px 12px 46px rgba(0,0,0,.5)}
  100%{transform:rotateY(-172deg); box-shadow:-6px 6px 18px rgba(0,0,0,.2)}
}
@keyframes avBookBack{
  0%  {transform:rotateY(0deg);   box-shadow:0 0 0 rgba(0,0,0,0)}
  35% {                            box-shadow:30px 12px 46px rgba(0,0,0,.5)}
  100%{transform:rotateY(172deg);  box-shadow:6px 6px 18px rgba(0,0,0,.2)}
}
.av-out-book{transform-style:preserve-3d}
/* ★ 缓动曲线要「起手慢、中段匀、收尾稳」，才像手在翻纸。
   第一版 cubic-bezier(.42,.02,.32,1) 前 200ms 就转过大半、剩下 600ms 在
   已经看不见的背面收尾 —— 观感是"啪"一下不是"翻"。
   现用 (.62,.04,.36,1)：中段匀速推过肉眼能看到的 0~120°，最后 30° 缓停。 */
.av-out-book.av-fwd {transform-origin:left center; animation:avBookFwd 1.42s cubic-bezier(.62,.04,.36,1) forwards}
.av-out-book.av-back{transform-origin:right center;animation:avBookBack 1.42s cubic-bezier(.62,.04,.36,1) forwards}
/* 纸页背面要暗下去，否则像一张纸凭空转，没有厚度感。
   ⚠ **不能用 ::after**——`.av-fig::after` 已是图片保护的挡片层（拦右键另存），
   占用它会让翻页过程中保护失效。改用 JS 插入的独立子元素 .av-shade。 */
.av-shade{
  position:absolute;inset:0;pointer-events:none;border-radius:var(--r);z-index:3;
  background:linear-gradient(90deg,rgba(0,0,0,.55),rgba(0,0,0,0) 42%);
  opacity:0;
}
.av-out-book .av-shade{animation:avShade 1.42s ease-out forwards}
.av-out-book.av-back .av-shade{background:linear-gradient(270deg,rgba(0,0,0,.55),rgba(0,0,0,0) 42%)}
@keyframes avShade{0%{opacity:0}45%{opacity:1}100%{opacity:.85}}

/* ============ 二、进入动画（新页出现）============
   与退出一一配对。新页在 .av-under 上跑，**必须 z-index 低于旧页**，
   否则新页会盖住正在离开的旧页，看不出层次。 */

/* 1. 出现 —— 瞬间有 */
@keyframes avInNone{from{opacity:1}to{opacity:1}}
.av-in-none{animation:avInNone .01s linear}

/* 2. 淡入 */
@keyframes avInFade{from{opacity:0}to{opacity:1}}
.av-in-fade{animation:avInFade 0.9s ease-out}

/* 3. 浮入 —— 从下方浮上来 */
@keyframes avInFloatFwd {from{opacity:0;transform:translateY(13%)} to{opacity:1;transform:none}}
@keyframes avInFloatBack{from{opacity:0;transform:translateY(-13%)}to{opacity:1;transform:none}}
.av-in-float.av-fwd {animation:avInFloatFwd 0.93s cubic-bezier(.2,.7,.3,1)}
.av-in-float.av-back{animation:avInFloatBack 0.93s cubic-bezier(.2,.7,.3,1)}

/* 4. 擦除 —— 从一侧刷出来 */
@keyframes avInWipeFwd {from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes avInWipeBack{from{clip-path:inset(0 0 0 100%)}to{clip-path:inset(0 0 0 0)}}
.av-in-wipe.av-fwd {animation:avInWipeFwd 0.93s cubic-bezier(.5,0,.5,1)}
.av-in-wipe.av-back{animation:avInWipeBack 0.93s cubic-bezier(.5,0,.5,1)}

/* 5. 切入 */
@keyframes avInSlideFwd {from{opacity:0;transform:translateX(48%)} to{opacity:1;transform:none}}
@keyframes avInSlideBack{from{opacity:0;transform:translateX(-48%)}to{opacity:1;transform:none}}
.av-in-slide.av-fwd {animation:avInSlideFwd 0.93s cubic-bezier(.2,.7,.3,1)}
.av-in-slide.av-back{animation:avInSlideBack 0.93s cubic-bezier(.2,.7,.3,1)}

/* 6. 缩放 */
@keyframes avInZoom{from{opacity:0;transform:scale(.82);filter:blur(4px)}to{opacity:1;transform:none;filter:none}}
.av-in-zoom{animation:avInZoom 0.96s cubic-bezier(.2,.7,.3,1)}

/* 7. 弹跳 —— 落下后弹两下 */
@keyframes avInBounce{
  0%  {opacity:0;transform:translateY(-22%) scale(.9)}
  55% {opacity:1;transform:translateY(3%)   scale(1.02)}
  75% {transform:translateY(-2%) scale(.995)}
  90% {transform:translateY(1%)}
  100%{transform:none}
}
.av-in-bounce{animation:avInBounce 1.21s cubic-bezier(.3,.7,.4,1)}

/* 8. 旋转 */
@keyframes avInSpinFwd {from{opacity:0;transform:rotate(-14deg) scale(.9)}to{opacity:1;transform:none}}
@keyframes avInSpinBack{from{opacity:0;transform:rotate(14deg)  scale(.9)}to{opacity:1;transform:none}}
.av-in-spin.av-fwd {animation:avInSpinFwd 1.02s cubic-bezier(.2,.7,.3,1)}
.av-in-spin.av-back{animation:avInSpinBack 1.02s cubic-bezier(.2,.7,.3,1)}

/* 9. 旋转缩放 */
@keyframes avInSpinZoom{from{opacity:0;transform:rotate(-24deg) scale(.6)}to{opacity:1;transform:none}}
.av-in-spinzoom{animation:avInSpinZoom 1.12s cubic-bezier(.2,.7,.3,1)}

/* 10. 百叶窗 */
@keyframes avInBlinds{from{clip-path:polygon(0 0,100% 0,100% 0,0 0);opacity:.2}to{clip-path:polygon(0 0,100% 0,100% 100%,0 100%);opacity:1}}
.av-in-blinds{animation:avInBlinds 0.99s steps(9,end)}

/* 11. 棋盘 */
@keyframes avInCheck{from{-webkit-mask-size:8% 8%;mask-size:8% 8%;opacity:0}to{-webkit-mask-size:100% 100%;mask-size:100% 100%;opacity:1}}
.av-in-check{
  -webkit-mask-image:repeating-conic-gradient(#000 0% 25%,transparent 0% 50%);
  mask-image:repeating-conic-gradient(#000 0% 25%,transparent 0% 50%);
  animation:avInCheck 0.96s steps(6,end);
}

/* 12. 飞入 —— 从画面外快速飞进来 */
@keyframes avInFlyFwd {from{opacity:0;transform:translateX(78%) translateY(-10%) scale(.86)}to{opacity:1;transform:none}}
@keyframes avInFlyBack{from{opacity:0;transform:translateX(-78%) translateY(-10%) scale(.86)}to{opacity:1;transform:none}}
.av-in-fly.av-fwd {animation:avInFlyFwd 1.02s cubic-bezier(.15,.75,.3,1)}
.av-in-fly.av-back{animation:avInFlyBack 1.02s cubic-bezier(.15,.75,.3,1)}

/* 13. 螺旋飞入 */
@keyframes avInSpiralFwd {from{opacity:0;transform:rotate(200deg) scale(.1) translateX(22%)} to{opacity:1;transform:none}}
@keyframes avInSpiralBack{from{opacity:0;transform:rotate(-200deg) scale(.1) translateX(-22%)}to{opacity:1;transform:none}}
.av-in-spiral.av-fwd {animation:avInSpiralFwd 1.27s cubic-bezier(.2,.7,.3,1)}
.av-in-spiral.av-back{animation:avInSpiralBack 1.27s cubic-bezier(.2,.7,.3,1)}

/* 14. 翻转式由远及近 */
@keyframes avInFlipFwd {from{opacity:0;transform:perspective(1200px) rotateX(-80deg) translateZ(-240px)}to{opacity:1;transform:none}}
@keyframes avInFlipBack{from{opacity:0;transform:perspective(1200px) rotateX(80deg)  translateZ(-240px)}to{opacity:1;transform:none}}
.av-in-flip{transform-style:preserve-3d}
.av-in-flip.av-fwd {transform-origin:center bottom;animation:avInFlipFwd 1.09s cubic-bezier(.2,.7,.3,1)}
.av-in-flip.av-back{transform-origin:center top;   animation:avInFlipBack 1.09s cubic-bezier(.2,.7,.3,1)}

/* 15. 翻书配套的进入：新页从书脊下方缓缓亮出 */
@keyframes avInBook{from{opacity:.5;transform:scale(.985)}to{opacity:1;transform:none}}
.av-in-book{animation:avInBook 0.93s ease-out}

/* ============ 三、路径动画 ============
   PowerPoint 的路径动画（直线/弧线/循环/自定义）在画册这个场景里
   **只有"离开的轨迹"有意义**——新页要停在正中给人看，不能沿路径乱走。
   所以路径类只做退出：弧线飞出、S 形飘出。 */
@keyframes avOutArcFwd{
  0%  {transform:translate(0,0) rotate(0)}
  100%{transform:translate(-72%,-46%) rotate(-28deg);opacity:0}
}
@keyframes avOutArcBack{
  0%  {transform:translate(0,0) rotate(0)}
  100%{transform:translate(72%,-46%) rotate(28deg);opacity:0}
}
.av-out-arc.av-fwd {animation:avOutArcFwd 1.24s cubic-bezier(.36,0,.66,-.28) forwards}
.av-out-arc.av-back{animation:avOutArcBack 1.24s cubic-bezier(.36,0,.66,-.28) forwards}

@keyframes avOutWaveFwd{
  0%  {transform:translate(0,0)}
  35% {transform:translate(-24%,9%) rotate(-6deg)}
  70% {transform:translate(-52%,-7%) rotate(5deg)}
  100%{transform:translate(-88%,4%) rotate(-9deg);opacity:0}
}
@keyframes avOutWaveBack{
  0%  {transform:translate(0,0)}
  35% {transform:translate(24%,9%) rotate(6deg)}
  70% {transform:translate(52%,-7%) rotate(-5deg)}
  100%{transform:translate(88%,4%) rotate(9deg);opacity:0}
}
.av-out-wave.av-fwd {animation:avOutWaveFwd 1.33s cubic-bezier(.45,.05,.55,.95) forwards}
.av-out-wave.av-back{animation:avOutWaveBack 1.33s cubic-bezier(.45,.05,.55,.95) forwards}

/* 减少动效：全部关掉，回到瞬时切换（JS 里也会走无动画分支） */
@media (prefers-reduced-motion:reduce){
  [class*="av-out-"],[class*="av-in-"],.av-shade{animation:none!important}
  .av-shade{opacity:0!important}
}


/* ---------- 6.6 作品图片保护 ----------
   拦顺手的复制：不让拖、不让长按弹菜单、不让把图连着选进选区。
   **这不是加密**——截屏和直接访问图片 URL 都拦不住，见《使用说明》。 */
.work-img,.album-img,.album-page,.av-fig,.lb-fig,.prod-img{
  -webkit-user-select:none;user-select:none;-webkit-touch-callout:none;
}
.work-img img,.album-img img,.album-page img,.av-fig img,.lb-fig img,.prod-img img{
  -webkit-user-drag:none;user-drag:none;pointer-events:none;
}
/* 透明挡片盖在图上：右键点到的是它，浏览器菜单里就没有"图片另存为"。
   放在 .work-zoom（z-index:2）之下，不挡放大镜提示；卡片本身的点击照常。 */
.work-img::after,.album-img::after,.album-page::after,.av-fig::after,.lb-fig::after{
  content:"";position:absolute;inset:0;z-index:1;
}
.av-fig,.lb-fig{position:relative}

/* ★ 收款码明确豁免（2026-08-07）：上面几条都是按 class 点名的，.qr-item 本来就不在其中，
   这里再写死一遍是防止日后有人把选择器改成 `.qr-box img` 之类的通配而不自知——
   收款码一旦被 pointer-events:none / touch-callout:none 罩住，手机就没法长按识别，
   等于扫码付款在手机上作废。JS 侧的对应豁免见 app.js 的 GUARD_EXEMPT。 */
.qr-box img{
  -webkit-user-drag:auto;user-drag:auto;pointer-events:auto;
  -webkit-touch-callout:default;-webkit-user-select:auto;user-select:auto;
}

/* ---------- 6.7 防伪透明水印（CSS 层）—— 已停用（2026-08-02）----------

   ⚠ 这一整节现在是关着的，**不要直接取消注释就用**，先读完下面两段。

   为什么关：水印已经用 ffmpeg 烧进图片文件本身了（770 张，见
   `_素材\burn-watermark.mjs`）。烧入的水印无论从哪拿到文件都在，网页上自然也在，
   这层 CSS 就成了第二层，两层叠起来明显偏浓、压画面。

   什么时候该重新打开：
     · 从 `_水印前原图\` 还原了图片、决定不再烧入，改回"只在网页上显示水印"；
     · 或者给某批**没有烧入**的图临时加水印（比如日后新增、还没跑过脚本的图）。
   两种情况都要先确认目标图片本身没有水印，否则还是会叠两层。

   这层的特点（和烧入层的取舍）：
     · 优点：改一个数就能调浓淡、能整体撤掉，不必重新导图，原图零损耗；
     · 缺点：**只在本站页面上生效**。别人直接访问 assets/img/... 的 URL，
       拿到的是干净原图——这正是最后改用烧入方案的原因。

   旋钮：--wm-alpha 控制浓淡（.045 极淡几乎无感，.14 明显但开始压画面）。
   --wm-size 与 --wm-tile 要配着看：字大了瓦片也得跟着大，否则四个字会被瓦片边界切断。

:root{
  --wm-alpha:.05;
  --wm-size:15px;
  --wm-tile:190px;
}

.work-img::before,.album-img::before,.album-page::before,
.av-fig::before,.lb-fig::before,.prod-img::before{
  content:"";
  position:absolute;inset:0;z-index:2;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='190' height='190'%3E%3Ctext x='95' y='88' fill='%23f4e3b0' font-family='Songti SC,SimSun,serif' font-size='15' letter-spacing='3' text-anchor='middle' transform='rotate(-30 95 95)'%3E%E6%98%9F%E9%98%AE%E4%B9%8B%E8%8A%B8%3C/text%3E%3Ctext x='95' y='106' fill='%23f4e3b0' font-family='Helvetica,Arial,sans-serif' font-size='7' letter-spacing='1.6' text-anchor='middle' transform='rotate(-30 95 95)'%3ETHE LIGHT OF ALL THINGS%3C/text%3E%3C/svg%3E");
  background-repeat:repeat;
  background-size:var(--wm-tile) var(--wm-tile);
  opacity:var(--wm-alpha);
  mix-blend-mode:screen;
}

.av-fig::before,.lb-fig::before{
  --wm-tile:250px;
  background-size:250px 250px;
}

.prod-img::before{ opacity:calc(var(--wm-alpha) * .55) }

   —— 停用区结束 ---------- */

.guard-toast{
  position:fixed;left:50%;bottom:26px;transform:translate(-50%,14px);z-index:400;
  max-width:min(92vw,520px);padding:12px 20px;border-radius:999px;
  background:rgba(20,24,51,.96);border:1px solid var(--gold);color:var(--gold-2);
  font-size:13.5px;letter-spacing:.03em;text-align:center;
  opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;
}
.guard-toast.on{opacity:1;transform:translate(-50%,0)}

/* ---------- 7. 年表 ---------- */
.timeline{position:relative;padding-left:34px;margin:0}
.timeline::before{content:"";position:absolute;left:8px;top:6px;bottom:6px;width:1px;
  background:linear-gradient(180deg,var(--gold),rgba(201,162,39,.15))}
.tl-item{position:relative;padding-bottom:32px}
.tl-item::before{
  content:"";position:absolute;left:-30px;top:9px;width:11px;height:11px;border-radius:50%;
  background:var(--ink);border:2px solid var(--gold);
}
.tl-year{font-family:var(--serif);color:var(--gold-2);font-size:17px;letter-spacing:.08em;margin-bottom:4px}
.tl-item p{margin:0;font-size:15px;color:#d3cec4}

/* ---------- 8. 引文 ---------- */
.quote{
  border-left:3px solid var(--gold);padding:6px 0 6px 26px;margin:0 0 26px;
  font-family:var(--serif);font-size:19px;line-height:1.95;color:var(--gold-3);
}
.quote cite{display:block;margin-top:12px;font-family:var(--sans);font-size:13px;
  font-style:normal;color:var(--text-dim);letter-spacing:.06em}

/* 四句诗（首页与理念页，data-render="verses"）：2026-08-10 按用户要求收小。
   这两处都是「左图右诗」的对开版式，原来 19px / 行高 1.95 / 段距 26px，
   四句摞起来比左边那张图还高一截，右栏显得头重。收成 16px / 1.62 / 14px 之后
   总高降三成多，和左图基本齐平。
   ★ 只作用在 .verses 里，**艺术家页的评论 .quote 不受影响**——那边是长段引文，
     19px 的字号正合适，一起改会把评论压得太小。 */
.verses .quote{
  font-size:16px;line-height:1.62;margin:0 0 14px;padding:3px 0 3px 20px;
}
/* 窄屏本来就是单栏，不必再为对齐左图牺牲字号，回到正文大小 */
@media(max-width:600px){ .verses .quote{font-size:16.5px;line-height:1.75;margin-bottom:16px} }

.split{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
.split.wide-left{grid-template-columns:1.15fr .85fr}
/* 右栏放大版（2026-08-09）：小传那节的配图偏小不好看，把比例反过来让图占多数。
   ★ 没有直接改 .wide-left——它还被理念页等多处用着，改了会连带动别处版面。 */
.split.wide-right{grid-template-columns:.82fr 1.18fr}
/* 更宽的右栏（2026-08-09）：五维那节的横幅星云要再大些。
   .68/1.32 之后左栏约 380px，标题「五维立体呈现」加两行说明仍排得开；
   再往下压左栏就会一行只剩五六个字，所以到此为止。 */
.split.wider-right{grid-template-columns:.68fr 1.32fr;gap:44px}
/* 顶端对齐（2026-08-09）：.split 默认 align-items:center，两栏各自垂直居中，
   于是左侧标题下的第一行正文与右侧图的上边总是错开。小传那节要求两边上边平齐，
   所以单独给一个 .split.top —— 不改 .split 本身，否则理念页等处的居中版面会跟着变。
   ★ 图那一侧要 align-self:start，不然 <figure> 会被拉伸满行高。 */
.split.top{align-items:start}
.split.top > *{align-self:start}
@media(max-width:940px){.split,.split.wide-left,.split.wide-right,.split.wider-right{grid-template-columns:1fr;gap:36px}}
.figure{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#05060c}
/* 展板类横幅图：单独成行居中，比原来挤在 .split 右栏里大约 1.5 倍。
   876px = 原两栏布局下右栏的可视宽度 ×1.5 */
.figure-wide{max-width:876px;margin:0 auto}
.figure img{width:100%}
.figure figcaption{padding:14px 18px;font-size:12.5px;color:var(--text-dim);border-top:1px solid var(--line)}

/* ---------- 9. 商店 ---------- */
.shop-note{
  border:1px dashed rgba(232,196,106,.4);border-radius:var(--r);
  padding:18px 22px;font-size:13.5px;color:var(--text-dim);margin-bottom:34px;
  background:rgba(232,196,106,.05);
}
.prods{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
@media(max-width:1100px){.prods{grid-template-columns:repeat(3,1fr)}}
@media(max-width:840px){.prods{grid-template-columns:repeat(2,1fr)}}
@media(max-width:520px){.prods{grid-template-columns:1fr}}
.prod{
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  background:var(--ink-2);display:flex;flex-direction:column;transition:.3s;
}
.prod:hover{border-color:rgba(232,196,106,.45);transform:translateY(-4px)}
.prod-img{position:relative;aspect-ratio:1/1;overflow:hidden;background:#05060c}
.prod-img img{width:100%;height:100%;object-fit:cover;transition:transform .7s}
.prod:hover .prod-img img{transform:scale(1.05)}
.prod-tag{position:absolute;left:12px;top:12px;z-index:2;background:rgba(7,8,15,.8);
  border:1px solid rgba(232,196,106,.4);color:var(--gold-2);border-radius:999px;
  padding:3px 11px;font-size:11px;letter-spacing:.08em}
.prod-body{padding:18px 18px 20px;display:flex;flex-direction:column;flex:1;gap:8px}
.prod-body h3{font-size:16px;margin:0;color:var(--gold-3);line-height:1.5}
.prod-desc{font-size:13px;color:var(--text-dim);margin:0;flex:1}
.prod-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:6px}

/* ---- 珍藏数码版画：76 幅逐幅上架（2026-07-27） ---- */
/* 画幅比例从 51×46 到 208×100 差得很远，方形卡里 cover 会把宽幅画裁掉两边，
   所以版画一律 contain 完整显示，四周留深底。这是画，裁了就是另一张画了。 */
.prod-print .prod-img img{object-fit:contain;padding:10px}
.prod-print:hover .prod-img img{transform:scale(1.03)}   /* contain 下放大要收着点，不然贴边 */
.prod-meta{display:flex;flex-wrap:wrap;gap:4px 12px;margin:0;font-size:12px;line-height:1.5}
.prod-size{color:var(--gold-2);font-variant-numeric:tabular-nums}  /* 等宽数字，竖排比尺寸时对得齐 */
.prod-cert{color:var(--text-dim);letter-spacing:.02em}
.prod-count{margin:0 0 18px;font-size:13px;color:var(--text-dim);letter-spacing:.04em}

/* ---- 画册封面 / 封底翻面（2026-08-10） ---- */
/* ★ 有正反面的商品（印刷品实拍）一律 contain，不能用卡片默认的 cover：
   1:1 的卡里 cover 会把竖版书裁掉上下，而封底**最底下那条**正是 ISBN、定价 259.00 元
   和出版人名录——翻到封底就是为了看这些，裁掉等于这个功能白做。
   （同一判断见 .prod-print：画是完整的，裁了就是另一张画。） */
.prod-cover .prod-img img{object-fit:contain;padding:10px}
.prod-cover:hover .prod-img img{transform:scale(1.03)}   /* contain 下放大要收着，不然贴边 */

/* fit:'contain' 的商品（2026-08-10）：宽幅或异形构图，例如三联组合装饰画 1999×826。
   卡片默认 1:1 裁切，这种图会只剩中间一截、看不出是三联。规则与上面封面同款，
   但语义不同所以单列一条——将来想给宽图单独调 padding 时不至于连封面一起改。 */
.prod-fit .prod-img img{object-fit:contain;padding:10px}
.prod-fit:hover .prod-img img{transform:scale(1.03)}
/* 只有 data.js 里带 back 字段的商品才会出现这个按钮（现在只有 p06 画册）。
   ★ 按钮常显，不做成 hover 才浮现：触屏上没有 hover，藏起来就等于没有这个功能。
   perspective 给在容器上，img 绕 Y 轴转才有近大远小的厚度感；只写 rotateY 没有透视是平的。 */
.prod-img{perspective:900px}
/* ★ 按钮放**右上角**不是右下角：书的文字信息全在底边——封面底下是署名、
   封底底下是 ISBN 条码、定价 259.00 元和出版人名录。放右下角正好压住条码，
   而翻到封底就是为了看这些。左上角是「限量发行」角标，两者一左一右不打架。 */
.prod-face{
  position:absolute;right:10px;top:10px;z-index:3;
  min-height:32px;padding:5px 12px;border-radius:999px;cursor:pointer;
  background:rgba(7,8,15,.82);border:1px solid rgba(232,196,106,.45);
  color:var(--gold-2);font-size:12px;letter-spacing:.06em;
  transition:background .25s,border-color .25s,color .25s;
}
.prod-face:hover{background:rgba(7,8,15,.96);border-color:var(--gold);color:var(--gold-3)}
/* 时长与 shop.js 的 TURN_MS 是一对，改一处必须改另一处。
   both 让动画结束停在 100% 帧上，避免最后一帧弹回未旋转态闪一下。 */
.prod-img.turning img{animation:prodTurn .52s ease both}
@keyframes prodTurn{
  0%  { transform:rotateY(0deg) }
  50% { transform:rotateY(88deg) }   /* 不到 90°：正好 90° 时图零宽度，会闪一帧空白 */
  100%{ transform:rotateY(0deg) }
}
/* 价格区间：比分类 chips 小一号，让层级看得出是它的下一级 */
.chips-sub{display:flex;flex-wrap:wrap;gap:8px;margin:-8px 0 16px}
.chip-sm{font-size:12px;padding:5px 13px}

.price{font-family:var(--serif);font-size:19px;color:#fff;white-space:nowrap}
.price small{font-size:12px;color:var(--text-dim);font-family:var(--sans)}

/* 购物车 */
.cart-table{width:100%;border-collapse:collapse}
.cart-table th{
  text-align:left;font-weight:400;font-size:12px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-dim);padding:0 12px 14px;border-bottom:1px solid var(--line);
}
.cart-table td{padding:18px 12px;border-bottom:1px solid var(--line);vertical-align:middle;font-size:14.5px}
.cart-table td:first-child,.cart-table th:first-child{padding-left:0}
.cart-table td:last-child,.cart-table th:last-child{padding-right:0;text-align:right}
.ct-item{display:flex;gap:16px;align-items:center}
.ct-item img{width:74px;height:74px;object-fit:cover;border-radius:10px;border:1px solid var(--line);flex-shrink:0}
/* 拍卖表第一列：缩略图 + 作品名，点开原图。沿用 .ct-item 的尺寸语言，
   只是图小一号（72px）——拍卖表有七列，第一列不能太占地方。 */
.auc-cell{display:flex;gap:12px;align-items:center;text-decoration:none;color:inherit}
.auc-cell img{
  width:72px;height:72px;object-fit:cover;border-radius:8px;
  border:1px solid var(--line);flex-shrink:0;transition:border-color .25s,transform .25s;
}
.auc-cell span{font-size:14.5px;line-height:1.4}
.auc-cell:hover img,.auc-cell:focus-visible img{border-color:var(--gold-3);transform:scale(1.04)}
.auc-cell:hover span,.auc-cell:focus-visible span{color:var(--gold-3)}
/* 无配图那条（2026-08-09）：占住与有图行相同的 72px 图位，让作品名跨行对齐在同一列。
   不画边框也不放占位图标——空着即可，有边框反而像"图裂了"。
   .noimg 自身不加 hover/指针，它不可点。 */
.auc-cell.noimg{cursor:default}
.auc-noimg{width:72px;height:72px;flex-shrink:0;display:block}
.ct-item strong{display:block;font-weight:500;color:var(--gold-3);font-size:15px}
.ct-item span{font-size:12.5px;color:var(--text-dim)}
/* 购物车里版画那行尺寸+存证号：单独一行，比品名弱一档 */
.ct-meta{display:block;margin:3px 0 1px;font-size:12px;color:var(--gold-2);opacity:.85}
/* 版画是画，购物车缩略图也不裁——76 幅里有 208×100 的宽幅 */
.ct-item img[src*="/prints/"]{object-fit:contain;background:#05060c;padding:4px}
.qty{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:999px;overflow:hidden}
.qty button{background:transparent;border:0;color:var(--text);width:32px;height:32px;cursor:pointer;font-size:15px}
.qty button:hover{background:rgba(232,196,106,.14);color:var(--gold-2)}
.qty span{min-width:34px;text-align:center;font-size:14px}
.link-x{background:transparent;border:0;color:var(--text-dim);cursor:pointer;font-size:12.5px;
  text-decoration:underline;font-family:inherit;padding:0}
.link-x:hover{color:var(--cinnabar)}

.checkout{display:grid;grid-template-columns:1.25fr .75fr;gap:44px;align-items:start}
@media(max-width:940px){.checkout{grid-template-columns:1fr}}
.panel{background:linear-gradient(160deg,rgba(20,24,51,.9),rgba(10,12,26,.9));
  border:1px solid var(--line);border-radius:var(--r);padding:28px}
.panel h3{font-size:18px;color:var(--gold-3);margin-bottom:20px}
.sum-line{display:flex;justify-content:space-between;gap:14px;padding:9px 0;font-size:14.5px}
.sum-line.total{border-top:1px solid var(--line);margin-top:10px;padding-top:16px;
  font-family:var(--serif);font-size:21px;color:var(--gold-2)}
.sum-note{font-size:12.5px;color:var(--text-dim);margin-top:16px;line-height:1.7}

/* 收款账户：选「银行电汇」后展开。账号用等宽字体 + 字距，
   便于客户逐位核对 15 位数字（易混的 0/O、1/l 在等宽下区分得开）。 */
.bank-box{border:1px solid var(--line);border-radius:10px;padding:16px 18px;margin:14px 0 4px;
  background:rgba(201,162,39,.04)}
.bank-box h4{font-family:var(--serif);font-size:15px;color:var(--gold-2);margin:0 0 12px}
.bank-list{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:0;font-size:14px}
.bank-list dt{color:var(--text-dim);font-size:13px;white-space:nowrap}
.bank-list dd{margin:0;word-break:break-word}
.bank-list dd:nth-of-type(3),.bank-list dd:nth-of-type(4){
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.06em}
@media(max-width:560px){
  .bank-list{grid-template-columns:1fr;gap:3px 0}
  .bank-list dd{margin-bottom:9px}
}

/* QR 收款码：选「扫码付款」后展开 */
.qr-box{border:1px solid var(--line);border-radius:10px;padding:16px 18px;margin:14px 0 4px;
  background:rgba(201,162,39,.04)}
.qr-box h4{font-family:var(--serif);font-size:15px;color:var(--gold-2);margin:0 0 4px}
.qr-box p{font-size:13px;color:var(--text-dim);margin:0 0 14px;line-height:1.6}
.qr-amount{color:var(--text)!important;font-size:14px!important}
.qr-amount strong{font-size:20px;color:var(--gold-2);font-family:var(--serif)}
.qr-codes{display:flex;gap:24px;flex-wrap:wrap}
.qr-item{display:flex;flex-direction:column;align-items:center;gap:8px}
.qr-item img{width:140px;height:140px;border-radius:8px;border:1px solid var(--line);object-fit:cover}
.qr-item .qr-placeholder{width:140px;height:140px;border-radius:8px;border:1px dashed var(--line);
  display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--text-dim);text-align:center;padding:8px}
.qr-item span{font-size:13px;color:var(--text-dim)}
/* 银联商务聚合码（2026-08-07）：整张竖版卡片（约 927×1620），含商户名与可用 App 图标。
   ★ 必须 object-fit:contain + auto 高度——上面那条 140×140 的 cover 会把码裁成中间一条，
     直接扫不出来。所以单码模式另给一套尺寸，别去改上面那条（占位符还在用）。 */
.qr-codes.qr-single{justify-content:flex-start}
.qr-single .qr-item{max-width:260px}
.qr-single .qr-item img{width:240px;height:auto;object-fit:contain;background:#fff;padding:0}
.qr-single .qr-apps{font-size:12px;color:var(--text-dim);text-align:center;line-height:1.5}
.qr-single .qr-merchant{font-size:12px;color:var(--text-dim);text-align:center;line-height:1.5;opacity:.85}
@media(max-width:560px){
  .qr-codes{gap:16px}
  .qr-item img,.qr-item .qr-placeholder{width:120px;height:120px}
  /* 手机上反而要更大：客户多半用另一台手机扫，码太小对不上焦 */
  .qr-single .qr-item{max-width:100%}
  .qr-single .qr-item img{width:min(280px,78vw);height:auto}
}

/* ---------- 10. 表单 ---------- */
.field{margin-bottom:18px}
.field label{display:block;font-size:12.5px;letter-spacing:.1em;color:var(--text-dim);margin-bottom:7px}
.field input,.field select,.field textarea{
  width:100%;background:rgba(5,6,12,.7);border:1px solid var(--line);color:var(--text);
  border-radius:10px;padding:12px 14px;font:inherit;font-size:14.5px;transition:.25s;
}
.field input:focus,.field select:focus,.field textarea:focus{
  outline:0;border-color:var(--gold);background:rgba(5,6,12,.95)}
.field textarea{min-height:120px;resize:vertical}
.field-row{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:560px){.field-row{grid-template-columns:1fr}}
.pay-opts{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-bottom:8px}
@media(max-width:560px){.pay-opts{grid-template-columns:1fr}}
.pay-opt{
  display:flex;align-items:center;gap:11px;border:1px solid var(--line);border-radius:10px;
  padding:13px 15px;cursor:pointer;font-size:14px;transition:.25s;
}
.pay-opt:hover{border-color:rgba(232,196,106,.5)}
.pay-opt input{accent-color:var(--gold);width:16px;height:16px}
.pay-opt.on{border-color:var(--gold);background:rgba(232,196,106,.08)}
.alert{border-radius:10px;padding:14px 16px;font-size:13.5px;margin-bottom:18px;display:none}
.alert.ok{display:block;border:1px solid rgba(47,125,111,.6);background:rgba(47,125,111,.14);color:#9fd8cb}
.alert.warn{display:block;border:1px solid rgba(232,196,106,.5);background:rgba(232,196,106,.08);color:var(--gold-3)}
/* 订购意向单的打印专用副本：屏幕上不显示（屏幕看 textarea 那份，可选中复制），
   打印时由第 13 节把它顶上来，见 shop.js 的 showResult()。 */
.order-print{display:none}

/* ---------- 11. 页脚 ---------- */
.footer{border-top:1px solid var(--line);background:rgba(5,6,12,.85);padding:64px 0 30px;position:relative;z-index:1}
.footer-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.2fr;gap:40px;margin-bottom:44px}
@media(max-width:900px){.footer-grid{grid-template-columns:1fr 1fr;gap:32px}}
@media(max-width:560px){.footer-grid{grid-template-columns:1fr}}
.footer h4{font-size:13px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);margin-bottom:16px;font-family:var(--sans)}
.footer ul{list-style:none;padding:0;margin:0}
.footer li{margin-bottom:9px;font-size:14px}
.footer a{color:var(--text-dim)}
.footer a:hover{color:var(--gold-2)}
.footer p{font-size:14px;color:var(--text-dim)}
.footer-bar{border-top:1px solid var(--line);padding-top:24px;display:flex;
  justify-content:space-between;gap:18px;flex-wrap:wrap;font-size:12.5px;color:var(--text-dim)}

/* ---------- 12. 动效 ---------- */
.rise{opacity:0;transform:translateY(26px);transition:opacity .9s ease,transform .9s cubic-bezier(.2,.7,.2,1)}
.rise.in{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){
  .rise{opacity:1;transform:none;transition:none}
  html{scroll-behavior:auto}
  .series img,.work-img img,.prod-img img{transition:none}
  /* 翻面动画整个关掉。JS 侧 noMotion() 也会走"直接换图"分支，两边都要关：
     只关一边的话，要么图换了但还在转，要么转了却半天不换。 */
  .prod-img.turning img{animation:none}
}

/* ---------- 13. 打印 ----------
   真实会被打印的三种东西：作品清单/艺术家小传（画廊、艺术家页）、
   展览与年表（做展陈资料）、订购意向单（客户打出来签字或存档）。
   原则：白底黑字省墨；屏幕专属的东西（背景、导航、按钮、播放器）一概不印；
   一条记录、一张图不许被翻页切成两半。 */
@page{ margin:16mm 14mm }

@media print{
  /* Chrome 打印默认丢背景色，这里本来就要白底，只需把阴影/动效关干净。
     print-color-adjust:exact 保证该保留的边框和 LOGO 颜色不被浏览器再优化掉。 */
  *,*::before,*::after{
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
    box-shadow:none!important;text-shadow:none!important;
    animation:none!important;transition:none!important;
  }
  html,body{background:#fff!important;color:#111!important;font-size:11pt;line-height:1.62}
  body{overflow:visible}

  /* 只在屏幕上有意义的东西：星空背景、导航、页脚、各种按钮、视频播放器 */
  #cosmos,.topbar,.footer,.tools,.burger,.nav,.filters,.btn,.btn-row,
  .work-zoom,.lb-close,.qty,.link-x,.pay-opts,.shop-note,.alert,
  .film-player,.film-fallback,.hero-bg,.cart-count,.prod-face{display:none!important}

  /* 版心放开、去掉深色卡片底，改成纸上认得出的细灰框 */
  .wrap,.hero-in,.narrow{max-width:none;padding:0}
  .sec,.sec.tight{padding:14pt 0}
  .card,.panel,.figure,.lb-fig,.series{
    background:none!important;border:1px solid #bbb!important;border-radius:0;
    padding:10pt;height:auto;transform:none!important;
  }
  .work,.prod{
    background:none!important;border:1px solid #bbb!important;border-radius:0;
    transform:none!important;
  }

  /* 金、翠绿、淡灰印在白纸上都糊。统一压成黑与深灰两级。 */
  h1,h2,h3,h4,.sec-title,.card h3,.work-txt h3,.prod-body h3,.lb-body h2,
  .brand-cn,.gold,.tl-year,.quote,.film-cap h3,.hero-name,.price,
  .sum-line.total,.series-glyph,.series-txt h3{color:#111!important}
  .dim,.sec-sub,.work-meta,.prod-desc,.eyebrow,.lb-sub,.tl-item p,
  .film-meta,figcaption,.sum-note,.quote cite,.series-txt p{color:#444!important}
  a{color:#111!important;text-decoration:none}
  .badge{border-color:#999!important;color:#333!important}
  /* 收款账户要能印出来给财务，强制显示并去掉底色 */
  .bank-box{display:block!important;background:none!important;border-color:#999!important}
  .bank-box h4{color:#111!important}
  .bank-list dt{color:#444!important}
  /* 收款码同理（2026-08-07）：客户常把它连同意向单一起打印或转给财务去扫。
     ★ 三件事都得做对，否则印出来扫不动：① 强制显示（它平时是 inline display:none）；
       ② 不缩小、保持纯白底和 exact 取色，二维码一压灰或一缩就识别不了；
       ③ break-inside:avoid 防止码被分页切成两半。 */
  .qr-box{display:block!important;background:none!important;border-color:#999!important;
    break-inside:avoid;page-break-inside:avoid}
  .qr-box h4,.qr-amount,.qr-amount strong{color:#111!important}
  .qr-single .qr-item img{width:56mm!important;height:auto!important;background:#fff!important}
  .qr-apps,.qr-merchant,.qr-item span{color:#444!important}
  .rule{background:#999!important}
  /* 拍卖记录打印出来是给财务/展陈用的数据表，七列已经吃满纸宽，
     缩略图既挤版又费墨——只印作品名 */
  .auc-cell img{display:none!important}
  .auc-noimg{display:none!important}   /* 图都不印了，占位块更不该在纸上留一块空白 */
  .auc-cell span{color:#111!important;font-size:11pt}
  /* 主视觉标题原本把金色渐变裁进文字，纸上会印成一片空白，得把文字颜色还回来 */
  .hero h1{background:none!important;-webkit-text-fill-color:#111;color:#111!important}

  .hero{min-height:0;display:block;padding:0 0 10pt}
  .hero-logo img{width:52mm;filter:none!important}
  .hero-brand{color:#333!important;opacity:1}

  /* 纸比屏幕窄得多：三列四列会把每张画压成邮票。一律降到单列，
     作品与衍生品保留两列（它们是图册式清单，两列正好一页放六张）。 */
  .g2,.g3,.g4,.series-grid,.split,.split.wide-left,.split.wide-right,.split.wider-right,
  .checkout,.lb-in,.field-row,.footer-grid{display:block!important}
  .works,.prods{display:grid!important;grid-template-columns:1fr 1fr;gap:8pt}
  /* 首页精选的 .works-3 在屏幕上是三列，但**纸上仍按两列**（一页正好六张）。
     它的特异性比上面那条 .works 高，不写死这一条就会印成三列、每张挤得很小。 */
  .works.works-3{grid-template-columns:1fr 1fr!important}

  /* 不在一条记录、一张图、一行合计的中间翻页 */
  .work,.prod,.card,.series,.tl-item,.figure,.quote,.lb-fig,.sum-line,
  tr,.film-cap,.lb-spec li{break-inside:avoid;page-break-inside:avoid}
  h1,h2,h3,.sec-title{break-after:avoid;page-break-after:avoid}

  /* 屏幕上靠 aspect-ratio + object-fit:cover 裁成统一方块，纸上要印全画面 */
  img{max-width:100%!important}
  .work-img,.prod-img{aspect-ratio:auto;overflow:visible}
  .work-img img,.prod-img img{position:static;height:auto;object-fit:contain;transform:none!important}
  .series{min-height:0;display:block;overflow:visible}
  .series img{position:static;height:auto;opacity:1!important;transform:none!important}
  .series::after{display:none}
  .series-txt{position:static;padding:8pt 0 0}

  /* 打印时灯箱正开着 = 用户在看某一件作品，那就只印这一件。
     :has() 不支持的浏览器会退回"整页打印"，不会出错，只是多印几页。 */
  .lightbox.open{
    display:block!important;position:static!important;
    background:#fff!important;padding:0!important;overflow:visible!important;
  }
  body:has(.lightbox.open) .hero,
  body:has(.lightbox.open) .sec{display:none!important}

  /* 购物车与订购意向单 */
  .cart-table th{color:#444!important;border-bottom:1px solid #999!important}
  .cart-table td{border-bottom:1px solid #ddd!important}
  .ct-item img{width:18mm;height:18mm}
  /* readonly textarea 打印时只印可见的那一屏、下面的内容会被裁掉，
     所以意向单另备了一份纯文本 .order-print，屏幕上藏着、打印时顶上。 */
  #checkoutResult .field,#contactResult .field{display:none!important}
  .order-print{
    display:block!important;white-space:pre-wrap;word-break:break-word;
    font-family:var(--sans);font-size:10.5pt;line-height:1.7;color:#111!important;
    border:1px solid #999;padding:8pt;margin:0;
  }

  /* 电子画册。翻阅器、提示条、图片挡片都只在屏幕上有意义。
     图版降到三列——一本画册的清单，三列一页放九幅，编号和尺寸还看得清。 */
  .album-viewer,.av-nav,.av-hint,.guard-toast,.album-more,.album-orig{display:none!important}
  .work-img::after,.album-img::after,.album-page::after,
  .av-fig::after,.lb-fig::after{display:none!important}
  /* 这里原本有一条隐藏 CSS 水印层的规则（::before）。6.7 节停用后它成了死代码，已删。
     注意：现在纸上**会**印出水印——因为水印已经烧进图片文件本身，CSS 关不掉它。
     若哪天需要打印无水印的稿子，只能从 `_水印前原图\` 取原图另做一份。 */
  .album-cover{display:block!important}
  .album-cell,.album-page{
    background:none!important;border:1px solid #bbb!important;border-radius:0;transform:none!important;
  }
  .album-grid{display:grid!important;grid-template-columns:repeat(3,1fr);gap:7pt}
  .album-img{aspect-ratio:auto;overflow:visible}
  .album-img img{height:auto;object-fit:contain}
  .album-cell,.album-colophon{break-inside:avoid;page-break-inside:avoid}
  .album-book-cn,.album-book-en,.album-book-sub{color:#111!important}
  .album-colophon{
    background:none!important;border-left:2px solid #999!important;border-radius:0;padding:8pt 12pt;
  }
  .album-colophon p:first-child{color:#111!important}
  .album-text p{font-size:10.5pt;line-height:1.75}
  .album-sign{color:#111!important}
}

/* ---------- 14. 移动端补强 ----------
   ⚠ 本节所有规则都关在窄屏 / 触屏媒体查询里，桌面观感（已验收）一个像素都不动。 */

/* 14.1 手机地址栏收起、展开会改变 100vh，首屏高度会跟着跳一下。
   svh（small viewport height）取的是地址栏展开时的高度，不跳。
   写在 @supports 里，老浏览器继续用上面的 92vh。 */
@supports(height:100svh){
  .hero{min-height:92svh}
}

/* 14.2 触屏没有 hover。放大镜图标本来是靠 hover 才浮现的，
   而它是"这张图能点开看大图"的唯一提示——手机上必须常显，否则没人知道能点。
   顺带关掉几个悬停位移：部分触屏浏览器点完会把 :hover 粘住，卡片会一直浮着。 */
@media(hover:none){
  .work-zoom{opacity:.92}
  .work:hover,.card:hover,.prod:hover,.btn:hover{transform:none;box-shadow:none}
  .work:hover .work-img img,.prod:hover .prod-img img,.series:hover img{transform:none}
  /* 触控目标放大到 44px（拇指的实际接触面积），避免点减号点成加号 */
  .qty button{width:44px;height:44px}
  .qty span{min-width:38px}
  .chip{min-height:44px;display:inline-flex;align-items:center}
  .prod-face{min-height:44px;padding:8px 15px;display:inline-flex;align-items:center}
  .burger{min-width:44px;min-height:44px}
  .link-x{padding:5px 0}
}

/* 14.3 顶栏在小屏会横向挤爆：品牌区和工具区都是 flex-shrink:0，
   320px 宽下「品牌 + 语言 + 币种 + 购物车 + 汉堡」的总宽超过视口，
   而 body 有 overflow-x:hidden，挤出去的按钮不是换行而是直接点不到。
   办法：收窄间距、隐藏品牌下方的英文小字、语言与币种只留图标不显示文字。 */
@media(max-width:560px){
  .topbar-in{padding:10px 16px;gap:10px}
  .brand{gap:9px}
  .brand-mark{width:34px;height:34px}
  .brand-cn{font-size:16px;letter-spacing:.1em}
  .brand-en{display:none}
  .tools{gap:6px}
  .picker-btn{padding:9px 11px;gap:6px}
  .picker-btn .pk-txt{display:none}   /* 只留 🌐 和 ¥ 这两个图标，含义不丢 */
  .picker-menu{min-width:158px}
}

/* 14.4 电子画册在窄屏。
   翻阅器的左右箭头在手机上悬在图两侧会压住画面，改成沉到底部一排；
   页面本身也支持左右滑动翻页（见 app.js 8.5 节末），箭头是给不习惯滑的人留的。 */
@media(max-width:900px){
  .album-cover{grid-template-columns:1fr;gap:26px}
  .album-entry-in{grid-template-columns:96px 1fr;gap:16px;padding:16px}
}
@media(max-width:760px){
  .album-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}
  .album-viewer{padding:52px 14px 84px}
  .av-fig img{max-height:64vh}
  .av-nav{
    top:auto;bottom:16px;transform:none;width:52px;height:52px;
  }
  .av-prev{left:calc(50% - 66px)}
  .av-next{right:calc(50% - 66px)}
  .av-hint{bottom:78px}
  .av-cap{gap:10px;font-size:12.5px}
}
@media(max-width:420px){
  .album-grid{grid-template-columns:1fr 1fr}
}

/* 14.4 汉堡菜单展开后：八个链接每个都要够大点得中；
   横屏手机（视口高才 375px）八项排下来会顶出屏幕，所以给菜单本身限高可滚动。 */
@media(max-width:1080px){
  .nav.open{
    gap:2px;padding:6px 0 10px;margin-top:8px;
    border-top:1px solid var(--line);
    max-height:min(68vh,420px);overflow-y:auto;-webkit-overflow-scrolling:touch;
  }
  .nav.open a{padding:12px 14px;font-size:15.5px;min-height:44px;display:flex;align-items:center}
}

/* 14.5 iOS Safari 有个硬规矩：聚焦一个字号小于 16px 的输入框，
   它会自动把整页放大，用户填完还得手动缩回来。把表单字号提到 16px 就不会触发。 */
@media(max-width:820px){
  .field input,.field select,.field textarea{font-size:16px}
}

/* 14.6 购物车表格：四列（商品/单价/数量/小计）加 74px 缩略图，
   窄屏下横向压不住。改成一行一张卡片，每个数值前由 CSS 补上表头文字
   （文案取自 <td data-lb>，由 shop.js 按当前语言写入，切语言自动跟着变）。 */
@media(max-width:640px){
  .cart-table thead{display:none}
  .cart-table,.cart-table tbody,.cart-table tr,.cart-table td{display:block;width:100%}
  .cart-table tr{border-bottom:1px solid var(--line);padding:16px 0}
  .cart-table tr:first-child{padding-top:0}
  .cart-table td{border:0;padding:5px 0}
  .cart-table td:first-child,.cart-table th:first-child{padding-left:0}
  .cart-table td:last-child,.cart-table th:last-child{padding-right:0;text-align:left}
  .cart-table td[data-lb]::before{
    content:attr(data-lb) "：";
    color:var(--text-dim);font-size:12.5px;letter-spacing:.06em;margin-right:8px;
  }
  .cart-table td[data-k="sum"]{font-family:var(--serif);color:var(--gold-2);font-size:16px}
  .ct-item img{width:62px;height:62px}
  /* 拍卖表窄屏：第一列是这张卡片的标题，图放大到 84px 撑住版面，
     名称跟着提一档并留出与下面数值行的间距 */
  .auc-cell{padding-bottom:6px}
  .auc-cell img{width:84px;height:84px}
  .auc-noimg{width:84px;height:84px}   /* 跟着图位一起放大，否则窄屏下又错开一列 */
  .auc-cell span{font-size:15.5px;color:var(--gold-3)}
}

/* 14.7 窄屏的留白与字号收敛：桌面的 96px 分区间距和 28px 版心留白
   放到 5.5 英寸屏上会显得空且窄，正文实际可用宽度只剩两百多像素。 */
@media(max-width:640px){
  .wrap,.hero-in{padding:0 18px}
  .sec{padding:64px 0}
  .sec.tight{padding:44px 0}
  .sec-head{margin-bottom:34px}
  .card{padding:22px}
  .panel{padding:20px}
  .hero-lead{font-size:16.5px}
  .hero-stats{gap:26px;margin-top:36px;padding-top:24px}
  .stat b{font-size:25px}
  .quote{font-size:17px;padding-left:18px}
  .timeline{padding-left:26px}
  .series{min-height:340px}
  .film-cap h3{font-size:18px}
  .lb-spec li b{min-width:84px}
  /* 灯箱：关闭按钮是 fixed 在右上角的，窄屏若把内边距压太小，它会盖在画面上，
     所以顶部专门留出 64px 给它站。 */
  .lightbox{padding:64px 12px 40px}
  .lb-close{top:12px;right:14px}
}

/* 14.8 最窄的一档（iPhone SE 一代 320px）：
   英文品牌名字距 .36em × 19 个字符会超出版心宽度被截断，收一档。 */
@media(max-width:380px){
  .hero-brand{font-size:10.5px;letter-spacing:.22em;text-indent:.22em}
  .wrap,.hero-in{padding:0 15px}
  .sec-head{margin-bottom:28px}
}

