/* —— 字体·全部自托管+真子集化（国内直连可靠, 离线可用, 不依赖任何 CDN）——
 *  1) 像素正文 Fusion Pixel 12px Proportional (© TakWolf, OFL)
 *  2) 入口页/老登版衬线 Noto Serif CJK SC (© Google, OFL) —— 原先走 fonts.googleapis.com,
 *     国内被墙, 而且是 <head> 里的阻塞样式表, 首屏要一直白屏等它超时, 现已彻底移除。
 *  三个 woff2 都是 `python3 tools/build-fonts.py` 按仓库真实用字裁出来的(全量 1.39MB → 380KB)；
 *  改了 config.js 文案后重跑一次即可。子集里没有的生僻字会逐字回退系统字体, 不会出方块。
 *
 *  ★ @font-face 三条声明不在这里, 在 index.html 的 <head> 里由一小段 http(s) 判断注入 ——
 *    file:// 直开时页面 origin 是 null, 字体请求一律走 CORS 被浏览器拒绝, 声明留在这里
 *    只会让控制台刷红字且拿不到字体。注入没有额外请求, 首屏发现时机与写在这里一致。 */
:root{
  --wood-dark:#5b2c0e; --wood:#8c4615; --wood-light:#b3661f;
  --orange:#e8943a; --cream:#ffe6b0; --cream-deep:#f6d291;
  --text:#5b2c0e; --red:#c0392b;
  --night1:#1b1035; --night2:#3a2360; --night3:#6a4587;
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;overflow:hidden;overscroll-behavior:none}
body{
  font-family:'Fusion Pixel 12px Proportional SC','Zpix',monospace;
  color:var(--text); background:#1b1035; touch-action:none;
  -webkit-user-select:none;user-select:none;
}
canvas{image-rendering:pixelated;display:block}
#game{position:fixed;inset:0;width:100%;height:100%;background:#2a6b30}

/* ============ 星露谷面板通用 ============ */
.sdv-panel{
  background:var(--cream);
  border:4px solid var(--wood-dark);
  box-shadow:inset 0 0 0 4px var(--orange), inset 0 0 0 8px var(--cream-deep), 0 6px 0 rgba(0,0,0,.25);
  border-radius:6px; padding:20px 16px; position:relative;
}
.plank{
  display:inline-block;
  background:linear-gradient(180deg,var(--wood-light),var(--wood));
  color:#ffefc9; border:4px solid var(--wood-dark);
  box-shadow:0 5px 0 rgba(0,0,0,.3), inset 0 3px 0 rgba(255,255,255,.18);
  border-radius:4px; padding:8px 22px; font-size:19px; letter-spacing:3px;
  text-shadow:2px 2px 0 rgba(0,0,0,.35); margin-bottom:18px;
}
.sdv-btn{
  font-family:inherit;cursor:pointer;
  background:linear-gradient(180deg,#ffd789,#f0a94e);
  color:var(--wood-dark);
  border:4px solid var(--wood-dark);
  box-shadow:0 5px 0 var(--wood-dark), inset 0 3px 0 rgba(255,255,255,.5);
  border-radius:4px; font-size:17px; letter-spacing:2px; padding:12px 22px;
  transition:transform .08s, box-shadow .08s;
}
.sdv-btn:active{transform:translateY(4px);box-shadow:0 1px 0 var(--wood-dark)}
.sdv-btn.ghost{background:transparent;color:#d9c4f0;border-color:#d9c4f0;box-shadow:none;font-size:13px;padding:8px 14px}
.sdv-btn.small{font-size:13px;padding:7px 12px;box-shadow:0 3px 0 var(--wood-dark)}
.sdv-btn.danger{background:linear-gradient(180deg,#ff9d8a,#e06a50);color:#fff}

.px-heart{
  display:inline-block;width:22px;height:20px;vertical-align:middle;
  background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 12" shape-rendering="crispEdges"><path fill="%23e0457b" d="M2 1h3v1h1v1h1V2h1V1h3v1h1v3h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v-1H4V9H3V8H2V7H1V6H0V2h1V1h1z"/><path fill="%23ff7daa" d="M2 2h2v1H3v2H2z"/></svg>') no-repeat center/contain;
  animation:beat 1.2s ease-in-out infinite;
}
@keyframes beat{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}

/* ============ 标题屏 ============ */
/* 默认隐藏：入口门在它上面(z-index 70)，以前它一直垫在底下渲染 ——
 * 40 颗星星白跑动画，还把 190KB 中文像素字体在入口页就拉下来了。
 * 进星露谷的各个入口(gate18 / 从请帖返回)都会显式 style.display='flex'，内联样式优先级更高。 */
#title{
  position:fixed;inset:0;z-index:50;display:none;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;padding:20px;
  background:linear-gradient(180deg,var(--night1),var(--night2) 60%,var(--night3));
}
#title .stars{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.star{position:absolute;background:#ffe9a8;animation:twinkle 2.4s ease-in-out infinite}
@keyframes twinkle{0%,100%{opacity:.15}50%{opacity:1}}
#title h1{
  color:#fff;font-size:26px;letter-spacing:4px;line-height:1.6;font-weight:normal;
  text-shadow:3px 3px 0 #b3478f,5px 5px 0 rgba(0,0,0,.4);margin-bottom:6px;position:relative;
}
#title .sub{color:#d9c4f0;font-size:13px;letter-spacing:2px;margin-bottom:22px;position:relative}
#title .pick{color:#ffe9a8;font-size:15px;letter-spacing:3px;margin-bottom:14px;position:relative}
.char-row{display:flex;gap:18px;justify-content:center;margin-bottom:22px;position:relative}
.char-card{
  background:rgba(255,240,210,.08);border:3px solid #8a6db0;border-radius:6px;
  padding:14px 18px;cursor:pointer;transition:transform .12s, border-color .12s, background .12s;
}
.char-card:active{transform:scale(.94)}
/* 角色卡里放的是 config 里那两张头像照片，沿用请帖相框的木框+白衬纸+金内圈，
   免得白底头像直接浮在夜色背景上 */
.char-card .cc-frame{display:inline-block;position:relative;padding:6px;border-radius:5px;background:#fff;
  border:3px solid #5b2c0e;box-shadow:0 4px 0 rgba(0,0,0,.32), inset 0 2px 0 rgba(255,255,255,.5)}
.char-card .cc-frame::after{content:"";position:absolute;inset:6px;border:1px solid rgba(224,180,74,.9);
  border-radius:2px;pointer-events:none}
.char-card canvas{width:88px;height:100px;display:block;margin:0 auto;border-radius:2px}
.char-card canvas.photo{image-rendering:auto}   /* 真实照片交给浏览器平滑缩放，不走像素化 */
.char-card:hover .cc-frame{border-color:#8c4a16;box-shadow:0 4px 0 rgba(0,0,0,.32), 0 0 14px rgba(255,215,137,.45)}
.char-card .nm{color:#ffe9a8;font-size:15px;margin-top:8px;letter-spacing:2px}
.char-card:hover{border-color:#ffd789;background:rgba(255,240,210,.16)}
#title .tip{color:#9b87c4;font-size:11px;margin-top:16px;line-height:1.9;position:relative}
#guestHello{
  position:relative;margin-bottom:14px;display:none;
  background:rgba(255,216,77,.12);border:3px solid #c9a86a;border-radius:4px;
  color:#ffe9a8;font-size:13px;letter-spacing:1px;padding:8px 16px;line-height:1.8;
}

/* ============ HUD ============ */
#hud{position:fixed;left:0;right:0;top:0;z-index:20;display:none;pointer-events:none;
  padding:10px;padding-top:max(10px, env(safe-area-inset-top));}
/* 任务+状态合并木板：固定右上角 */
#questBar{
  position:absolute;right:10px;top:max(10px, env(safe-area-inset-top));
  width:fit-content;max-width:min(232px, calc(100vw - 190px));
  text-align:center;line-height:1.5;
  background:linear-gradient(180deg,var(--wood-light),var(--wood));
  border:3px solid var(--wood-dark);border-radius:4px;
  color:#ffefc9;font-size:12px;letter-spacing:1px;padding:6px 10px;
  box-shadow:0 4px 0 rgba(0,0,0,.3);text-shadow:1px 1px 0 rgba(0,0,0,.4);
}
#questBar .quest-line{display:flex;align-items:center;gap:7px;text-align:left}
#questBar .dot{width:8px;height:8px;background:#ffd84d;flex:none;animation:beat 1s infinite}
/* 木板下半：倒计时/金币/心/星（同一块板, 虚线隔开） */
#boardInfo{
  margin-top:5px;padding-top:5px;border-top:2px dashed rgba(255,239,201,.3);
  display:flex;flex-direction:column;gap:1px;align-items:center;
}
#boardInfo .bi-top{font-size:11px;color:#ffefc9;display:flex;align-items:center;gap:5px;justify-content:center}
#boardInfo .bi-sep{opacity:.6}
#boardInfo .bi-coin{width:9px;height:9px;border-radius:50%;flex:none;
  background:radial-gradient(circle at 35% 35%, #ffec8a, #ffd84d 55%, #e8943a);border:1px solid #8c5a16}
#biHearts,#biStars{font-size:11px;letter-spacing:2px;line-height:1.25;text-shadow:none}
#biHearts .on{color:#ff5c8a}  #biHearts .off{color:rgba(30,18,26,.5)}
#biStars .on{color:#ffd84d}   #biStars .off{color:rgba(30,18,26,.5)}
/* 物品栏：左侧竖列（右上被木板占用） */
#itemBar{
  position:absolute;left:10px;top:calc(max(10px, env(safe-area-inset-top)) + 50px);
  display:flex;flex-direction:column;align-items:flex-start;gap:4px;
}
/* 物品栏格子：星露谷背包槽位风(木框+内浅底+高光) */
.chip{
  background:linear-gradient(180deg,#ffd9a8,#e8b06a);
  border:2px solid #5a3413;border-radius:5px;
  box-shadow:inset 0 2px 0 rgba(255,255,255,.5), inset 0 -2px 0 rgba(90,52,19,.35), 0 2px 0 rgba(0,0,0,.25);
  color:#5b2c0e;font-size:12px;font-weight:bold;padding:4px 7px;letter-spacing:1px;
}
/* 章节进度星已并入画布右上角木牌 HUD，DOM 容器隐藏 */
#progress{display:none}
/* 商店老板栏 */
.shop-keeper{
  display:flex;align-items:center;gap:10px;margin:4px 0 6px;
  background:rgba(140,90,43,.15);border:2px dashed rgba(140,70,21,.35);border-radius:8px;padding:6px 10px;
}
.shop-keeper img{width:52px;height:52px;image-rendering:pixelated;border:2px solid var(--wood-dark);border-radius:6px;background:#cfe6f4}
.shop-keeper .sk-line{font-size:13px;color:#6b3a12;text-align:left;line-height:1.5}
#menuBtns{position:absolute;left:10px;top:max(10px, env(safe-area-inset-top));display:flex;gap:8px;pointer-events:auto}
.mini-btn{
  width:40px;height:40px;font-size:17px;padding:0;font-family:inherit;cursor:pointer;
  background:linear-gradient(180deg,#ffd789,#f0a94e);color:var(--wood-dark);
  border:3px solid var(--wood-dark);border-radius:4px;
  box-shadow:0 3px 0 var(--wood-dark);
}
.mini-btn:active{transform:translateY(3px);box-shadow:none}

/* 屏幕边缘指引箭头 */
#edgeArrow{
  position:fixed;z-index:18;width:0;height:0;display:none;pointer-events:none;
  border-left:11px solid transparent;border-right:11px solid transparent;
  border-bottom:18px solid #ffd84d;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.4));
}

/* ============ 虚拟摇杆 / 按键 ============ */
#padL{position:fixed;left:0;bottom:0;width:55%;height:46%;z-index:15;display:none}
#stickBase{
  position:absolute;width:84px;height:84px;border-radius:50%;display:none;
  background:rgba(91,44,14,.35);border:3px solid rgba(255,230,176,.5);
  transform:translate(-50%,-50%);
}
#stickNub{
  position:absolute;width:38px;height:38px;border-radius:50%;
  background:rgba(255,230,176,.85);border:3px solid var(--wood-dark);
  left:50%;top:50%;transform:translate(-50%,-50%);
}
/* 摇杆位置提示：静止时显示一个虚线圆环+提示文字, 首次拖动后淡出 */
#padHint{position:fixed;left:42px;bottom:64px;z-index:14;display:none;
  flex-direction:column;align-items:center;pointer-events:none;
  opacity:.92;transition:opacity .5s;animation:padPulse 1.8s ease-in-out infinite}
#padHint.gone{opacity:0}
#padRing{width:74px;height:74px;border-radius:50%;
  border:3px dashed rgba(255,230,176,.75);background:rgba(91,44,14,.28);
  display:flex;align-items:center;justify-content:center}
#padDot{width:30px;height:30px;border-radius:50%;
  background:rgba(255,230,176,.7);border:3px solid var(--wood-dark)}
#padHintTxt{margin-top:7px;font-size:12px;color:#fff;
  text-shadow:0 1px 2px #000,0 0 4px #000;background:rgba(91,44,14,.55);
  padding:2px 8px;border-radius:8px;white-space:nowrap}
@keyframes padPulse{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
#btns{position:fixed;right:14px;bottom:26px;z-index:15;display:none;gap:14px;align-items:flex-end;
  padding-bottom:env(safe-area-inset-bottom);}
.act-btn{
  width:64px;height:64px;border-radius:50%;font-family:inherit;font-size:15px;
  background:radial-gradient(circle at 35% 30%,#ffd789,#e8943a);
  border:4px solid var(--wood-dark);color:var(--wood-dark);
  box-shadow:0 5px 0 var(--wood-dark);letter-spacing:1px;
}
.act-btn:active{transform:translateY(4px);box-shadow:0 1px 0 var(--wood-dark)}
.act-btn.b{width:52px;height:52px;font-size:13px;margin-bottom:34px;
  background:radial-gradient(circle at 35% 30%,#b8e8ff,#5aa0d8);}
/* 装备栏(工具)：底部居中, 仅户外游玩显示 */
#toolBar{position:fixed;left:50%;bottom:16px;transform:translateX(-50%);z-index:16;
  display:none;gap:7px;align-items:flex-end;padding-bottom:env(safe-area-inset-bottom)}
.tool-slot{width:42px;height:42px;cursor:pointer;position:relative;opacity:.7;
  transition:opacity .1s,transform .1s}
.tool-slot.sel{opacity:1;transform:translateY(-5px)}
.tool-slot canvas{width:42px;height:42px;image-rendering:pixelated;display:block;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.35))}
.tool-slot .tname{position:absolute;left:-3px;right:-3px;bottom:-2px;text-align:center;
  font-size:9px;letter-spacing:1px;color:#fff;text-shadow:1px 1px 0 #000,0 0 2px #000;pointer-events:none}
.tool-slot.sel .tname{color:#ffe07a}

/* ============ 对话框 ============ */
#dialog{
  position:fixed;left:50%;bottom:18px;transform:translateX(-50%);
  width:min(94%,520px);z-index:30;display:none;
  padding-bottom:env(safe-area-inset-bottom);
}
#dialog .box{
  background:var(--cream);border:4px solid var(--wood-dark);border-radius:6px;
  box-shadow:inset 0 0 0 4px var(--orange), 0 6px 0 rgba(0,0,0,.35);
  padding:14px 14px 12px;display:flex;gap:12px;align-items:flex-start;
  cursor:pointer;position:relative;
}
#dlgPortrait{flex:none;width:64px;height:64px;background:#fdf3dc;border:3px solid var(--wood-dark);border-radius:4px;overflow:hidden}
#dlgPortrait canvas{width:100%;height:100%}
#dlgMain{flex:1;min-width:0}
#dlgName{font-size:13px;color:#a3572b;margin-bottom:4px;letter-spacing:1px}
#dlgText{font-size:15px;line-height:1.8;min-height:54px;word-break:break-all}
#dlgNext{position:absolute;right:14px;bottom:8px;font-size:13px;color:#a3572b;animation:bounceY 1s infinite}
@keyframes bounceY{0%,100%{transform:translateY(0)}50%{transform:translateY(4px)}}
#dlgChoices{display:none;flex-direction:column;gap:8px;margin-top:10px}
#dlgChoices button{
  font-family:inherit;text-align:left;font-size:14px;letter-spacing:1px;cursor:pointer;
  background:#fdf3dc;border:3px solid var(--wood);border-radius:4px;
  color:var(--text);padding:9px 12px;
}
#dlgChoices button:hover,#dlgChoices button:active{background:#ffd789;border-color:var(--wood-dark)}

/* ============ 浮层 ============ */
#overlay{
  position:fixed;inset:0;z-index:40;display:none;
  background:rgba(27,16,53,.78);
  align-items:center;justify-content:center;padding:18px;
}
#overlayCard{
  width:min(94%,480px);max-height:88svh;overflow-y:auto;overscroll-behavior:contain;
  -webkit-overflow-scrolling:touch;touch-action:pan-y;
}
#overlayCard .inner{padding:6px 2px;text-align:center}
/* 章节标题做成星露谷木牌 */
#overlayCard h3{
  font-size:17px;letter-spacing:3px;margin:2px auto 14px;color:#ffefc9;
  display:inline-block;padding:7px 18px;position:relative;
  background:linear-gradient(180deg,#b3661f,#8c4a16);
  border:3px solid #5b2c0e;border-radius:6px;
  box-shadow:0 3px 0 #5b2c0e, inset 0 2px 0 rgba(255,255,255,.18);
  text-shadow:0 2px 0 #5b2c0e;
}
#overlayCard .body{font-size:14px;line-height:2;text-align:left}
#overlayCard .center{text-align:center}
#overlayCard .ok{margin-top:16px}
#overlayCard hr{border:none;height:10px;margin:14px 0;
  background:radial-gradient(circle at 50% 0,#e0457b 3px,transparent 4px) 0 0/16px 10px repeat-x;
  opacity:.6;}
/* 请帖大标题：星露谷木牌风「WEDDING INVITATION」两行大字 */
.inv-banner{margin:-2px 0 12px;padding:14px 10px 12px;border-radius:8px;position:relative;
  background:linear-gradient(180deg,#b3661f 0%,#9a531a 45%,#7c4216 100%);
  border:4px solid #4a2510;
  box-shadow:0 5px 0 #4a2510, inset 0 3px 0 rgba(255,255,255,.20), inset 0 0 0 2px rgba(255,220,150,.25);}
.inv-banner::before,.inv-banner::after{content:"❀";position:absolute;top:8px;font-size:18px;color:#ffd1dc;opacity:.9}
.inv-banner::before{left:12px}.inv-banner::after{right:12px}
.inv-banner .t1{font-size:30px;line-height:1.04;letter-spacing:7px;font-weight:bold;color:#fff3d6;
  text-shadow:0 2px 0 #5b2c0e,0 -1px 0 #5b2c0e,2px 0 0 #5b2c0e}
.inv-banner .t2{font-size:13px;letter-spacing:2px;color:#ffe9c4;margin-top:7px;
  border-top:2px dotted rgba(255,230,180,.5);padding-top:6px;display:inline-block}
.info-row{display:flex;align-items:center;gap:10px;padding:8px 2px;font-size:14px;line-height:1.7;text-align:left}
.info-row + .info-row{border-top:3px dashed rgba(140,70,21,.25)}
.info-ico{flex:none;width:30px;height:30px;border-radius:4px;background:var(--wood);
  border:3px solid var(--wood-dark);color:#ffe9a8;display:flex;align-items:center;justify-content:center;font-size:14px}
.countdown{display:flex;justify-content:center;gap:6px;margin-top:14px}
.cd-cell{background:var(--wood-dark);color:#ffe9a8;border-radius:4px;border:3px solid #3a1d08;
  min-width:54px;padding:8px 2px;text-align:center}
.cd-cell b{display:block;font-size:20px;line-height:1.1}
.cd-cell span{font-size:10px;opacity:.85}
.tl-row{display:flex;align-items:center;gap:12px;padding:9px 2px;text-align:left}
.tl-row + .tl-row{border-top:3px dashed rgba(140,70,21,.22)}
.tl-time{flex:none;background:var(--orange);color:#fff;border:3px solid var(--wood-dark);
  border-radius:4px;padding:4px 7px;font-size:13px}
.tl-what{font-size:14px}
.letter-paper{
  background:linear-gradient(180deg,#fdf3dc,#f7e6c0);
  border:3px solid #d9b97e;border-radius:4px;padding:18px 16px;
  font-size:14px;line-height:2;text-align:left;position:relative;
  box-shadow:inset 0 0 0 2px #fdf3dc, inset 0 0 0 4px #caa86a;
}
.letter-paper::before,.letter-paper::after{content:"❀";position:absolute;color:#d98aa6;font-size:14px;opacity:.8}
.letter-paper::before{top:5px;left:7px}.letter-paper::after{bottom:3px;right:7px}
.letter-paper .sign{text-align:right;margin-top:10px;color:#8a5a2b}
.letter-ico{text-align:center;font-size:15px;letter-spacing:6px;opacity:.92;margin:2px 0 8px}
.letter-ico:last-child{margin:10px 0 2px}
/* 合照（新人介绍处，可选）：木金双框居中 */
.couple-photo{text-align:center;margin:10px 0 4px}
.couple-photo img{max-width:78%;max-height:200px;border:3px solid #8c4a16;border-radius:4px;
  box-shadow:inset 0 0 0 3px #e0b44a,0 4px 0 rgba(0,0,0,.2);image-rendering:auto;background:#fff}
.couple-row{display:flex;justify-content:center;gap:8px;align-items:center;margin:8px 0 4px}
/* 新人相框：金木双框, 四角点缀(参考星露谷请帖相框) */
.couple-row .frame{background:#fff;border:3px solid #8c4a16;border-radius:4px;padding:7px;position:relative;
  box-shadow:inset 0 0 0 3px #e0b44a, 0 3px 0 rgba(0,0,0,.18)}
.couple-row .frame::before{content:"";position:absolute;inset:3px;border:1px solid #caa86a;border-radius:2px;pointer-events:none}
.couple-row canvas{display:block;width:96px;height:96px}
.couple-row .nm{font-size:15px;margin-top:8px}
.couple-row .ds{font-size:12px;color:#8a5a2b;line-height:1.7;margin-top:4px}
/* —— 点击头像/合照/婚纱照查看大图 —— */
.couple-photo .zoomable,.couple-row .frame.zoomable,.exhibit-zoom{position:relative;display:inline-block;cursor:zoom-in}
.hero-frame.zoomable{cursor:zoom-in}
.zoomable::after{content:"🔍";position:absolute;right:5px;bottom:5px;z-index:2;
  font-size:11px;line-height:1;padding:2px 4px;border-radius:5px;
  background:rgba(91,44,14,.82);color:#ffefc9;pointer-events:none}
/* 主婚纱照四周挂着花环/垂藤/向日葵，角标怎么摆都撞图 → 关掉角标，改用下面的文字提示 */
.hero-frame.zoomable::after{display:none}
.zoomable:hover{filter:brightness(1.05)}
.zoom-hint{font-size:12px;color:#8a5a2b;opacity:.85;margin:2px 0 10px;letter-spacing:.5px}
/* 主婚纱照下方的「点看大图」提示：奶油药丸底，压在天空背景上也读得清 */
.hero-zoom-tip{margin:-12px 0 14px;text-align:center}
.hero-zoom-tip span{display:inline-block;padding:3px 10px;font-size:11px;letter-spacing:1px;color:#5b2c0e;
  background:rgba(255,247,228,.88);border:2px solid var(--wood-dark);border-radius:999px;
  box-shadow:0 2px 0 rgba(0,0,0,.14)}
/* —— 不许下载（放大是允许的，最多 200%，见 js/invite.js 的 attachZoom）——
 *  · 图片 pointer-events:none：长按/右键落在外层框上，浏览器给不出「图片另存为」；
 *    点击与所有缩放手势都绑在外层容器上，所以不影响点开和捏合
 *  · 缩略图 touch-action:pan-y 关掉原生捏合但保留竖向滚动；
 *    灯箱 touch-action:none 全关原生缩放——原生捏合没有上限，得由 attachZoom 自己算才能卡住 200%
 *  · 只作用于这几类元素：通关分享图 .share-img 不在其列，仍可长按保存/下载（那张就是给宾客转发的） */
[data-big] img,[data-big] canvas,[data-full] img,#lightboxImg,#luxBox img{
  pointer-events:none;-webkit-touch-callout:none;
  -webkit-user-drag:none;user-drag:none;-webkit-user-select:none;user-select:none}
[data-big],[data-full]{-webkit-touch-callout:none;touch-action:pan-y}
#lightbox,#luxBox{-webkit-touch-callout:none;touch-action:none;overscroll-behavior:contain}
/* —— 全屏看图：铺满屏幕、不留边框衬底，只有照片和深色底 —— */
#lightbox{position:fixed;inset:0;z-index:66;display:none;align-items:center;justify-content:center;
  padding:0;background:#0a0812;cursor:zoom-out;overflow:hidden}
#lightbox.on{display:flex;animation:lbFade .2s ease}
#lightbox.zoomed{cursor:grab}
.lb-inner{position:static;display:flex;align-items:center;justify-content:center;
  width:100%;height:100%;max-width:none;max-height:none;overflow:hidden}
/* 贴边即 100%：max-width/height 用视口单位 → offsetWidth 就是贴边尺寸，attachZoom 拿它算 200% 上限与拖动范围 */
#lightboxImg{display:block;width:auto;height:auto;max-width:100vw;max-height:100vh;max-height:100dvh;
  object-fit:contain;border:0;border-radius:0;background:none;box-shadow:none;
  transform-origin:50% 50%;will-change:transform}
/* ✕ 改为钉在屏幕右上角（图片已铺满，没有「框外」可挂了）；避开刘海/圆角安全区 */
#lightboxClose{position:fixed;z-index:2;top:calc(env(safe-area-inset-top,0px) + 12px);
  right:calc(env(safe-area-inset-right,0px) + 12px);width:40px;height:40px;border-radius:50%;
  border:3px solid #5b2c0e;background:linear-gradient(180deg,#b3661f,#8c4a16);color:#ffefc9;
  font-size:18px;line-height:1;cursor:pointer;box-shadow:0 3px 0 #5b2c0e}
#lightboxClose:hover{filter:brightness(1.08)}
/* 缩放倍数提示：缩放时短暂浮现，让宾客看得见「已经到 200% 了」 */
.lb-zoom{position:fixed;z-index:2;left:50%;transform:translateX(-50%);
  bottom:calc(env(safe-area-inset-bottom,0px) + 18px);padding:4px 12px;border-radius:999px;
  font-size:12px;letter-spacing:1px;background:rgba(0,0,0,.55);color:#fff;
  pointer-events:none;opacity:0;transition:opacity .25s}
.lb-zoom.on{opacity:1}
@keyframes lbFade{from{opacity:0}to{opacity:1}}
.seat-card{
  margin-top:12px;background:linear-gradient(180deg,#fff3cf,#ffe6a8);
  border:3px solid #c9952e;border-radius:4px;padding:12px;
  font-size:15px;letter-spacing:1px;line-height:1.9;
}
.seat-card b{color:var(--red);font-size:20px}
/* 展品图片 */
.exhibit-img{max-width:100%;max-height:42svh;border:4px solid var(--wood-dark);border-radius:4px;
  image-rendering:auto;background:#fdf3dc;margin-bottom:10px}
/* 婚纱照展板的可点区：外框接管间距，🔍 角标才能落在照片里而不是掉进下方空白 */
.exhibit-zoom{max-width:100%;margin-bottom:10px}
.exhibit-zoom .exhibit-img{margin-bottom:0;vertical-align:top}
.frag-card{
  background:linear-gradient(135deg,#fdf3dc,#ffe9c2);
  border:3px dashed #c9952e;border-radius:6px;padding:14px;margin-top:8px;
  font-size:14px;line-height:1.9;text-align:left;
}
.frag-list{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.frag-list .it{
  text-align:left;font-size:13px;background:#fdf3dc;border:3px solid var(--wood);
  border-radius:4px;padding:8px 10px;cursor:pointer;
}
.frag-list .it.lock{opacity:.55;cursor:default}

/* ============ 完整请帖 · 海报版 ============ */
/* 整张请帖以 stardewPanorama 作背景(固定铺底, 卡片透出); 卡片本身透明只留外框 */
/* 请帖整体用 _5 花藤边框(border-image 九宫格)；面板内透出 panorama */
#overlayCard:has(.poster){background:#f6e2b8;border-radius:0;
  border:26px solid transparent;border-image:url('../assets/elem/frameOrnate.png') 96 / 26px stretch;
  box-shadow:0 8px 0 rgba(0,0,0,.3)}
.poster{margin:0;padding:6px 2px 2px;border-radius:2px;
  background:url('../assets/elem/panorama.png') center top/cover fixed}
/* 顶部天空带：木牌「悬」在星露谷天空中(背景直接用 panorama 天空) */
.poster-sky{position:relative;overflow:hidden;margin:-4px -2px 6px;padding:12px 10px 8px;border-radius:8px;
  background:transparent}
.sky-cloud{position:absolute;image-rendering:pixelated;pointer-events:none;opacity:.9}
.sky-cloud.a{width:96px;top:-14px;right:-10px}
.sky-cloud.b{width:60px;bottom:-6px;left:-8px;opacity:.75}
.poster-sign{position:relative;z-index:1;display:block;width:100%;max-width:340px;margin:0 auto;
  image-rendering:auto;filter:drop-shadow(0 3px 0 rgba(0,0,0,.18))}
.poster-sub{font-size:12px;letter-spacing:2px;color:#a3572b;margin:8px 0 12px;text-align:center}
/* 主婚纱照：_6 木质相框(border-image 九宫格)居中，四周用 _11 花环/垂藤/向日葵装饰(完整露出不裁切) */
.hero-photo{position:relative;display:flex;justify-content:center;align-items:flex-start;
  margin:4px 0 20px;padding:14px 10px 24px}
.hero-frame{position:relative;z-index:2;box-sizing:border-box;width:252px;height:306px;
  border:24px solid transparent;border-image:url('../assets/elem/frameWood.png') 58 / 24px stretch;
  filter:drop-shadow(0 6px 14px rgba(0,40,10,.4))}
.hero-frame img{width:100%;height:100%;object-fit:cover;display:block;image-rendering:auto}
.hero-ph{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:8px;background:linear-gradient(160deg,#fbf3df,#ecd9b0)}
.hero-ph .o{font-size:28px;color:#c98a3a;opacity:.8}
.hero-ph .t{font-size:14px;letter-spacing:3px;color:#a3572b}
.hero-garland{position:absolute;z-index:3;top:-6px;left:50%;transform:translateX(-50%);
  width:200px;image-rendering:pixelated;filter:drop-shadow(0 2px 0 rgba(0,80,0,.2));pointer-events:none}
.hero-vine{position:absolute;z-index:3;top:6px;height:128px;image-rendering:pixelated;pointer-events:none;
  filter:drop-shadow(0 1px 0 rgba(0,70,0,.18))}
.hero-vine.l{left:26px}.hero-vine.r{right:26px;transform:scaleX(-1)}
.hero-sun{position:absolute;z-index:4;bottom:6px;height:76px;image-rendering:pixelated;
  filter:drop-shadow(0 2px 0 rgba(0,60,0,.25));pointer-events:none}
.hero-sun.l{left:20px}.hero-sun.r{right:20px;transform:scaleX(-1)}
/* 星露谷对话气泡 */
.chat-wrap{display:flex;flex-direction:column;gap:8px;margin:0 0 14px}
.chat-bubble{display:flex;align-items:center;gap:10px;text-align:left;
  background:linear-gradient(180deg,#fff7e4,#f3e2bf);
  border:3px solid var(--wood-dark);border-radius:8px;padding:8px 12px;font-size:13px;line-height:1.6;
  box-shadow:0 3px 0 rgba(0,0,0,.16), inset 0 0 0 2px #fffaf0}
.chat-bubble.r{flex-direction:row-reverse;text-align:right}
.chat-ava{flex:none;width:30px;height:30px;border-radius:50%;background:#ffe1ec;
  border:2px solid var(--wood-dark);image-rendering:pixelated}
/* 新郎 / 新娘 木牌标签 */
.role-tag{display:inline-block;background:linear-gradient(180deg,var(--wood-light),var(--wood));
  color:#ffefc9;border:2px solid var(--wood-dark);border-radius:3px;padding:2px 12px;font-size:12px;
  letter-spacing:3px;margin-top:6px;box-shadow:0 2px 0 var(--wood-dark)}
/* 婚礼回执 RSVP 卡片 */
.rsvp-card{margin:16px 0 0;padding:16px 16px 18px;text-align:center;border-radius:8px;
  background:linear-gradient(180deg,#fff7e6,#ffeccb);border:3px solid var(--wood-dark);
  box-shadow:inset 0 0 0 2px rgba(255,255,255,.5),0 4px 0 rgba(0,0,0,.12)}
.rsvp-title{font-size:15px;letter-spacing:1px;color:#6e4a23;font-weight:bold;margin-bottom:6px}
.rsvp-desc{font-size:12px;line-height:1.7;color:#5b4427;margin-bottom:12px}
.rsvp-desc b{color:#b04a2a}
.rsvp-btn{font-size:15px;letter-spacing:2px;padding:9px 26px}
.rsvp-hint{font-size:10px;color:#7a5a32;margin-top:8px;letter-spacing:.5px}
.rsvp-setup{font-size:11px;color:#7a3a2a;line-height:1.7}
.rsvp-setup b{color:#b04a2a}
/* RSVP 内嵌问卷弹层 */
#rsvpModal{position:fixed;inset:0;z-index:60;display:none;align-items:center;justify-content:center;
  background:rgba(27,16,53,.84);padding:14px}
.rsvp-frame-wrap{width:min(96%,560px);height:min(90svh,760px);display:flex;flex-direction:column;gap:8px}
.rsvp-frame-wrap iframe{flex:1;width:100%;border:4px solid var(--wood-dark);border-radius:8px;background:#fff;
  box-shadow:inset 0 0 0 4px var(--orange), 0 6px 0 rgba(0,0,0,.3)}
.rsvp-close{align-self:flex-end;font-family:inherit;cursor:pointer;font-size:14px;letter-spacing:1px;
  background:linear-gradient(180deg,#ffd789,#f0a94e);color:var(--wood-dark);
  border:3px solid var(--wood-dark);border-radius:4px;padding:7px 16px;box-shadow:0 3px 0 var(--wood-dark)}
.rsvp-fallback{text-align:center;font-size:12px;color:#e8d6a8}
.rsvp-fallback a{color:#ffe07a;text-decoration:underline;cursor:pointer}

/* 收尾·简洁落款：姓名❤姓名 一行、日期一行，各自呼吸。
 * 海报底衬是 panorama 全景图(fixed)，滚到最后正好是绿色山峦 —— 结尾这两块必须垫张纸，
 * 否则红字/褐字全糊在绿山上(实测对比度不足 3:1)。垫纸后 ≥4.6:1。 */
.poster-end{margin-top:14px;padding:14px 14px 4px;text-align:center;font-size:13px;color:#8a5a2b;
  background:rgba(255,240,205,.94);border-radius:6px 6px 0 0}
.poster-foot{margin-top:0;font-size:13px;letter-spacing:2px;color:#a3572b;text-align:center;
  background:rgba(255,240,205,.94);border-radius:0 0 6px 6px;
  border-top:2px dotted rgba(140,70,21,.4);padding:14px 14px 16px}
.poster-foot b{color:var(--red);letter-spacing:1px}
.poster-foot .pf-names{font-size:16px;letter-spacing:3px;line-height:1.5}
.poster-foot .pf-names .px-heart{margin:0 6px}
.poster-foot .pf-date{margin-top:7px;font-size:12px;letter-spacing:4px;color:#a3572b}

/* ============ 交易 / 钓鱼 ============ */
.trade-row{display:flex;align-items:center;gap:10px;padding:9px 2px;text-align:left;font-size:14px}
.trade-row + .trade-row{border-top:3px dashed rgba(140,70,21,.22)}
.trade-row .nm{flex:1}
.trade-row .pr{color:#a3572b;font-size:13px}
.ticon{width:24px;height:24px;image-rendering:pixelated;vertical-align:-6px;margin-right:2px}
/* A 键就绪发光：面前有可互动目标 */
.act-btn.ready{
  background:linear-gradient(180deg,#ffe9a8,#ffc65c);
  box-shadow:0 0 14px rgba(255,216,77,.9), 0 4px 0 rgba(0,0,0,.3);
  transform:scale(1.08);
}
.act-btn{transition:transform .15s, box-shadow .15s}
#fishUI{
  position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:42;display:none;align-items:center;gap:18px;
}
#fishTrack{
  width:42px;height:240px;background:#15324e;border:4px solid var(--wood-dark);
  border-radius:6px;position:relative;overflow:hidden;
  box-shadow:inset 0 0 0 3px #2a5a86, 0 6px 0 rgba(0,0,0,.3);
}
#fishZone{position:absolute;left:0;width:100%;height:64px;background:rgba(126,200,80,.55);border-top:2px solid #aef08a;border-bottom:2px solid #aef08a}
#fishIcon{position:absolute;left:50%;transform:translateX(-50%);font-size:20px;transition:none}
#fishSide{display:flex;flex-direction:column;gap:10px;align-items:center}
#fishProgWrap{width:18px;height:200px;background:#3a1d08;border:3px solid var(--wood-dark);border-radius:4px;position:relative;overflow:hidden}
#fishProg{position:absolute;bottom:0;left:0;width:100%;height:30%;background:linear-gradient(180deg,#ffd84d,#e8943a)}
#fishHint{
  position:fixed;left:50%;top:calc(50% + 150px);transform:translateX(-50%);
  color:#ffe9a8;font-size:13px;letter-spacing:1px;text-shadow:1px 1px 0 #000;text-align:center;line-height:1.8;
  z-index:42;display:none;
}

/* ============ 设置 / Debug 编辑器 ============ */
.set-row{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:11px 2px;font-size:14px;text-align:left}
.set-row + .set-row{border-top:3px dashed rgba(140,70,21,.22)}
.set-row .lab{flex:1}
.toggle{
  width:54px;height:28px;border-radius:14px;border:3px solid var(--wood-dark);
  background:#b9a07e;position:relative;cursor:pointer;flex:none;
}
.toggle::after{
  content:'';position:absolute;top:1px;left:2px;width:20px;height:20px;border-radius:50%;
  background:#fdf3dc;border:2px solid var(--wood-dark);transition:left .15s;
}
.toggle.on{background:#7ec850}
.toggle.on::after{left:26px}
#verRow{font-size:12px;color:#8a5a2b;display:flex;align-items:center;justify-content:center;gap:10px;margin-top:12px}
#verNum{cursor:pointer;padding:4px 6px}
#dbgExit{display:none}
.dbg-badge{
  display:none;background:#c0392b;color:#fff;font-size:11px;border-radius:3px;
  padding:2px 6px;letter-spacing:1px;vertical-align:middle;
}
body.debug .dbg-badge{display:inline-block}
body.debug #dbgExit{display:inline-block}
.ed-item{
  background:#fdf3dc;border:3px solid var(--wood);border-radius:4px;
  padding:10px;margin-bottom:10px;text-align:left;position:relative;
}
.ed-item label{font-size:12px;color:#8a5a2b;display:block;margin:6px 0 2px}
.ed-item input[type=text],.ed-item textarea,.ed-ta{
  width:100%;font-family:inherit;font-size:13px;color:var(--text);
  background:#fff8e8;border:2px solid #c9a86a;border-radius:3px;padding:6px;
}
.ed-item textarea{min-height:60px;resize:vertical}
.ed-ta{min-height:140px;resize:vertical}
.ed-del{
  position:absolute;top:6px;right:6px;width:26px;height:26px;border-radius:4px;cursor:pointer;
  background:#e06a50;color:#fff;border:2px solid #8e2a20;font-family:inherit;font-size:13px;
}
.ed-thumb{max-width:90px;max-height:60px;border:2px solid var(--wood);border-radius:3px;display:block;margin-top:4px}
.ed-btns{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:10px}

/* ============ 提示 / 粒子 ============ */
#toasts{position:fixed;left:50%;top:64px;transform:translateX(-50%);z-index:45;
  display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;width:max-content;max-width:92%}
.toast{
  background:rgba(91,44,14,.92);color:#ffe9a8;border:3px solid #3a1d08;border-radius:4px;
  font-size:13px;letter-spacing:1px;padding:8px 16px;
  box-shadow:0 4px 0 rgba(0,0,0,.3);
  animation:toastIn .25s ease-out, toastOut .4s ease-in 2.6s forwards;
}
@keyframes toastIn{from{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:none}}
@keyframes toastOut{to{opacity:0;transform:translateY(-10px)}}
.fly-heart{position:fixed;z-index:60;pointer-events:none;animation:fly 1.3s ease-out forwards}
@keyframes fly{0%{transform:translateY(0) scale(.6);opacity:1}100%{transform:translateY(-120px) scale(1.2);opacity:0}}
.confetti{position:fixed;top:-12px;z-index:55;pointer-events:none;animation:confFall linear forwards}
@keyframes confFall{to{transform:translateY(110vh) rotate(720deg)}}
#fade{position:fixed;inset:0;background:#000;opacity:0;pointer-events:none;transition:opacity .45s;z-index:48}

/* ============ 入口选择 + 低调奢华·典雅请帖 ============ */
:root{ --lux-bg:#f4efe6; --lux-bg2:#ece4d6; --lux-ink:#2e2a23; --lux-soft:#6b6253; --lux-gold:#b08d57; --lux-gold2:#caa86a; --lux-line:rgba(176,141,87,.35); }
body.lux-bg{ background:var(--lux-bg); }   /* 入口/典雅页时给 body 垫米色底, 杜绝任何视口缝隙露出深色 */
#gate,#lux{ position:fixed; inset:0; display:none; color:var(--lux-ink);
  font-family:"Wedding Serif SC","Noto Serif SC","Source Han Serif SC","Songti SC",STSong,"SimSun",serif; }
#gate{ z-index:70; display:flex; align-items:center; justify-content:center; padding:24px; transition:opacity .45s ease;
  background:radial-gradient(120% 90% at 50% 16%, #faf6ee 0%, var(--lux-bg) 55%, var(--lux-bg2) 100%); }
#gate.fade{ opacity:0; }
.gate-card{ position:relative; z-index:2; text-align:center; max-width:440px; width:100%; animation:gateIn .9s ease both; }
@keyframes gateIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
/* 名字上方呼吸金光(与暗夜请帖的辉光呼应) */
.gate-card::before{ content:""; position:absolute; left:50%; top:24px; width:260px; height:120px; transform:translateX(-50%);
  background:radial-gradient(ellipse, rgba(176,141,87,.22), transparent 70%); filter:blur(20px); z-index:-1; pointer-events:none;
  animation:gateGlow 5s ease-in-out infinite; }
@keyframes gateGlow{ 0%,100%{opacity:.45;transform:translateX(-50%) scale(1)} 50%{opacity:.85;transform:translateX(-50%) scale(1.14)} }
.gate-kicker{ font-size:12px; letter-spacing:6px; background:linear-gradient(100deg,#c9a86a,#8a6a38,#d4b06a,#8a6a38,#c9a86a);
  background-size:220% 100%; -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; color:transparent;
  animation:shine 7s linear infinite; }
.gate-names{ font-size:34px; letter-spacing:3px; margin:16px 0 2px; font-weight:500;
  background:linear-gradient(100deg,#9c7b46 0%,#d9b877 28%,#f3dca0 48%,#d9b877 70%,#9c7b46 100%);
  background-size:220% 100%; -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; color:transparent;
  animation:shine 6s linear infinite; filter:drop-shadow(0 1px 6px rgba(176,141,87,.25)); }
.gate-names .amp{ -webkit-text-fill-color:var(--lux-gold); font-style:italic; }
.gate-rule{ color:var(--lux-gold); font-size:13px; margin:6px 0; display:flex; gap:12px; align-items:center; justify-content:center; }
.gate-rule::before,.gate-rule::after{ content:""; height:1px; width:56px; background:linear-gradient(90deg,transparent,var(--lux-gold),transparent); background-size:200% 100%; animation:shine 4s linear infinite; }
.gate-q{ font-size:14px; color:var(--lux-soft); letter-spacing:2px; margin:18px 0 22px; }
.gate-btn{ display:block; width:100%; margin:12px 0; padding:15px 18px; cursor:pointer;
  background:#fffdf8; border:1px solid var(--lux-line); border-radius:2px; color:var(--lux-ink);
  font-family:inherit; text-align:center; transition:.18s; }
.gate-btn:hover{ border-color:var(--lux-gold); box-shadow:0 8px 26px rgba(176,141,87,.22); transform:translateY(-1px); }
.gate-btn .gb-main{ display:block; font-size:19px; letter-spacing:2px; position:relative; z-index:1; }
.gate-btn .gb-sub{ display:block; font-size:11px; color:var(--lux-soft); letter-spacing:1px; margin-top:6px; position:relative; z-index:1; }
/* 小孩桌：像素花瓣飘落 —— 与老登版的金色流光对仗, 一边是春日花田, 一边是暗夜流光。
 * 花瓣只落在左右两侧, 中间让给文字(靠 --x 布点, 不用遮罩, 免得半空消失) */
.gate-btn.sdv{ position:relative; overflow:hidden; background:linear-gradient(180deg,#fffdf8 0%,#fdf5e6 100%); }
.gate-btn.sdv:hover{ border-color:#cf9a62; box-shadow:0 10px 30px rgba(198,140,80,.22); }
.gate-btn.sdv .gb-petals{ position:absolute; inset:0; overflow:hidden; pointer-events:none; opacity:.9; transition:opacity .25s ease; }
.gate-btn.sdv:hover .gb-petals{ opacity:1; }
.gate-btn.sdv .gb-petals i{
  position:absolute; left:var(--x); top:0; width:var(--s); height:var(--s); image-rendering:pixelated;
  background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 7" shape-rendering="crispEdges"><path fill="%23eda0be" d="M2 0h4v1H2zM1 1h6v1H1zM0 2h8v2H0zM1 4h6v1H1zM2 5h4v1H2zM3 6h2v1H3z"/><path fill="%23ffd9e6" d="M2 1h2v1H2zM1 2h3v1H1z"/></svg>') no-repeat center/contain;
  animation:gbPetal 7.6s var(--d) linear infinite;
}
/* 两片换成暖橙(星露谷春天的野花不止一种颜色) */
.gate-btn.sdv .gb-petals i:nth-child(3){ filter:hue-rotate(-26deg) saturate(1.15); animation-duration:9.2s; }
.gate-btn.sdv .gb-petals i:nth-child(5){ filter:hue-rotate(-14deg); animation-duration:8.4s; }
@keyframes gbPetal{
  0%   { transform:translate3d(0,-14px,0) rotate(0deg); opacity:0 }
  14%  { opacity:1 }
  50%  { transform:translate3d(calc(var(--r) * .55),46px,0) rotate(168deg) }
  86%  { opacity:1 }
  100% { transform:translate3d(var(--r),104px,0) rotate(322deg); opacity:0 }
}
/* 减少动态效果：不飘了, 改成静静躺在按钮里的几片落花 */
@media (prefers-reduced-motion:reduce){
  .gate-btn.sdv .gb-petals i{ animation:none; top:var(--y); opacity:.5; }
}
.gate-btn.alt{ position:relative; overflow:hidden; background:linear-gradient(180deg,#2c2722,#211d18); color:#f0e7d6; border-color:#3a332b; }
.gate-btn.alt .gb-sub{ color:#bfa987; }
.gate-btn.alt::after{ content:""; position:absolute; top:0; left:-60%; width:38%; height:100%; background:linear-gradient(100deg,transparent,rgba(243,220,160,.32),transparent); transform:skewX(-20deg); animation:sweep 3.6s ease-in-out infinite; }
.gate-btn.alt:hover{ border-color:var(--lux-gold2); box-shadow:0 10px 30px rgba(176,141,87,.35); }
/* 浮动金尘(与暗夜星座呼应的入口版, 低调) */
.gate-mote{ position:fixed; border-radius:50%; pointer-events:none; z-index:1; filter:blur(.4px);
  background:radial-gradient(circle, rgba(196,160,100,.85), transparent 70%); animation:moteFloat linear infinite; }
@keyframes moteFloat{ 0%{ transform:translateY(24px); opacity:0 } 18%{opacity:.7} 82%{opacity:.7} 100%{ transform:translateY(-130px); opacity:0 } }
/* 典雅请帖正文（暗夜·流光·科技感） */
#lux{ z-index:55; overflow-y:auto; overflow-x:hidden; -webkit-overflow-scrolling:touch; color:#e9e2d4;
  background:radial-gradient(140% 100% at 50% -8%, #16131d 0%, #0c0a11 55%, #08070b 100%);
  --g:#d8b36a; --g2:#f3dca0; --soft:#9d9486; --line:rgba(216,179,106,.28); --glass:rgba(255,255,255,.045); }
/* 流光极光(固定铺底, 缓慢漂移) */
#lux::before,#lux::after{ content:""; position:fixed; z-index:0; pointer-events:none; border-radius:50%; filter:blur(70px); mix-blend-mode:screen; }
#lux::before{ width:62vmax; height:62vmax; left:-18vmax; top:-12vmax; background:radial-gradient(circle, rgba(120,92,205,.30), transparent 60%); animation:auroraA 18s ease-in-out infinite alternate; }
#lux::after{ width:56vmax; height:56vmax; right:-16vmax; top:34vmax; background:radial-gradient(circle, rgba(212,176,106,.26), transparent 60%); animation:auroraB 23s ease-in-out infinite alternate; }
@keyframes auroraA{ to{ transform:translate(9vmax,13vmax) scale(1.18);} }
@keyframes auroraB{ to{ transform:translate(-11vmax,-9vmax) scale(1.22);} }
#luxFx{ position:fixed; inset:0; z-index:0; pointer-events:none; }
.lux-inner{ position:relative; z-index:1; max-width:560px; margin:0 auto; padding:60px 26px 48px; }
@keyframes shine{ to{ background-position:220% 0; } }
@keyframes fadeUp{ from{opacity:0;transform:translateY(16px)} to{opacity:1;transform:none} }
@keyframes sweep{ 0%{left:-60%} 55%,100%{left:130%} }
.lux-hero{ text-align:center; }
/* 开头主婚纱照：大图压顶, 金边柔光, 入场缓升 */
.lux-hero-photo{ margin:0 auto 24px; max-width:400px; animation:fadeUp 1.1s .05s ease both; }
.lux-hero-photo[data-full]{ cursor:zoom-in; }
/* 「轻触看大图」提示：细金字，压在主图下方, 不抢主图的戏 */
.lux-tap{ margin:-16px 0 22px; text-align:center; font-size:11px; letter-spacing:3px;
  color:var(--soft); opacity:.7; animation:fadeUp 1.1s .5s ease both; }
.lux-hero-photo img{ width:100%; height:auto; max-height:460px; object-fit:cover; display:block; border-radius:16px;
  border:1px solid rgba(216,179,106,.45); box-shadow:0 18px 54px rgba(0,0,0,.55), 0 0 0 1px rgba(212,176,106,.18); }
/* 未设置主婚纱照时的占位（典雅金色虚线框） */
.lux-hero-ph{ width:100%; aspect-ratio:4/5; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:12px;
  border:1.5px dashed rgba(216,179,106,.5); border-radius:16px;
  background:linear-gradient(160deg, rgba(255,255,255,.045), rgba(216,179,106,.06)); }
.lux-hero-ph .orn{ font-size:32px; color:var(--g); opacity:.85 }
.lux-hero-ph .t{ font-size:14px; letter-spacing:5px; color:var(--soft) }
.lux-kicker{ font-size:12px; letter-spacing:8px; color:var(--g); opacity:0; animation:fadeUp 1s .15s ease both; }
.lux-names{ font-size:42px; line-height:1.16; letter-spacing:2px; margin:18px 0 12px; font-weight:500;
  background:linear-gradient(100deg,#b9a877 0%,#fff4d8 24%,var(--g2) 44%,#fff7e2 60%,#b9a877 86%);
  background-size:220% 100%; -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; color:transparent;
  animation:shine 6s linear infinite, fadeUp 1s .3s ease both; filter:drop-shadow(0 0 22px rgba(212,176,106,.20)); }
.lux-names .amp{ display:block; font-size:24px; font-style:italic; margin:3px 0; -webkit-text-fill-color:var(--g); }
.lux-date{ font-size:15px; letter-spacing:5px; color:var(--soft); opacity:0; animation:fadeUp 1s .45s ease both; }
.lux-divider{ display:flex; align-items:center; justify-content:center; gap:14px; color:var(--g); margin:30px 0; font-size:13px; }
.lux-divider::before,.lux-divider::after{ content:""; height:1px; width:74px; background:linear-gradient(90deg,transparent,var(--g),transparent); background-size:200% 100%; animation:shine 4s linear infinite; }
.lux-sec{ margin:24px 0; padding:24px 20px; border-radius:16px; background:var(--glass); border:1px solid var(--line);
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px); box-shadow:0 12px 44px rgba(0,0,0,.38), inset 0 1px 0 rgba(255,255,255,.05); }
.lux-h{ text-align:center; font-size:16px; letter-spacing:6px; font-weight:500; margin-bottom:20px; color:#f0e6cf; }
.lux-h::after{ content:""; display:block; width:34px; height:1px; margin:10px auto 0; background:linear-gradient(90deg,transparent,var(--g),transparent); }
.lux-letter{ font-size:14.5px; line-height:2.15; text-align:center; color:#d9d2c4; }
.lux-sign{ text-align:right; margin-top:16px; color:var(--soft); letter-spacing:1px; font-size:13px; }
.lux-gallery{ display:grid; grid-template-columns:repeat(2,1fr); gap:16px; perspective:900px; }
.lux-photo{ margin:0; transform-style:preserve-3d; transition:transform .22s ease, box-shadow .25s ease; }
.lux-photo img,.lux-photo-ph{ width:100%; aspect-ratio:3/4; object-fit:cover; display:block; border-radius:10px;
  border:1px solid var(--line); box-shadow:0 10px 30px rgba(0,0,0,.5); background:#181522; }
.lux-photo[data-full]{ cursor:zoom-in; } .lux-photo:hover{ box-shadow:0 18px 48px rgba(212,176,106,.28); }
.lux-photo-ph{ display:flex; align-items:center; justify-content:center; color:var(--g); font-size:13px; letter-spacing:2px; background:linear-gradient(135deg,#191622,#231d2e); }
.lux-photo figcaption{ text-align:center; font-size:12px; color:var(--soft); margin-top:8px; letter-spacing:1px; }
.lux-row{ display:flex; gap:18px; padding:13px 2px; border-bottom:1px solid var(--line); align-items:baseline; }
.lux-row:last-child{ border-bottom:none; }
.lux-lab{ flex:none; width:42px; color:var(--g); letter-spacing:3px; font-size:14px; }
.lux-val{ flex:1; line-height:1.7; font-size:14px; color:#e3dccd; }
.lux-cd{ display:flex; justify-content:center; gap:12px; margin-top:24px; }
.lux-cd .cd-cell{ background:rgba(255,255,255,.03); border:1px solid var(--line); border-radius:12px; min-width:60px; padding:10px 4px; text-align:center; box-shadow:inset 0 0 20px rgba(212,176,106,.06); }
.lux-cd .cd-cell b{ font-size:24px; display:block; line-height:1.1; color:var(--g2); text-shadow:0 0 14px rgba(212,176,106,.55); font-variant-numeric:tabular-nums; }
.lux-cd .cd-cell span{ color:var(--soft); font-size:10px; letter-spacing:1px; }
.lux-tl{ display:flex; gap:18px; align-items:baseline; padding:11px 2px; border-bottom:1px dashed var(--line); }
.lux-tl:last-child{ border-bottom:none; }
.lux-tl-t{ flex:none; width:62px; color:var(--g); letter-spacing:1px; font-size:15px; }
.lux-tl-w{ flex:1; font-size:14px; color:#e3dccd; }
.lux-rsvp-sec{ text-align:center; }
.lux-rsvp-desc{ color:var(--soft); margin-bottom:18px; line-height:1.9; font-size:13.5px; }
.lux-btn{ position:relative; overflow:hidden; font-family:inherit; cursor:pointer; padding:14px 40px; font-size:15px; letter-spacing:3px;
  background:linear-gradient(135deg,#2a2433,#181420); color:var(--g2); border:1px solid var(--g); border-radius:30px; transition:box-shadow .3s, transform .15s; }
.lux-btn::after{ content:""; position:absolute; top:0; left:-60%; width:40%; height:100%; background:linear-gradient(100deg,transparent,rgba(255,247,225,.35),transparent); transform:skewX(-20deg); animation:sweep 3.4s ease-in-out infinite; }
.lux-btn:hover{ box-shadow:0 10px 34px rgba(212,176,106,.42); transform:translateY(-2px); }
.lux-foot{ text-align:center; margin-top:44px; }
.lux-foot-names{ font-size:18px; letter-spacing:2px; color:var(--g2); }
.lux-foot-date{ font-size:12px; letter-spacing:3px; color:var(--soft); margin-top:6px; }
/* ============ 常驻返回按钮 ============
 * iOS 装到桌面(standalone)、微信/QQ 内置浏览器都没有返回手势或地址栏，
 * 屏幕左上角必须有条明路。z-index 56：压得住标题屏(50)与老登版(55)，
 * 又在灯箱(66)/入口门(70)/回执弹窗(60) 之下；开浮层时由 body.has-overlay 藏起来。 */
#navBack{
  position:fixed; z-index:56; cursor:pointer; font-family:inherit;
  top:calc(env(safe-area-inset-top, 0px) + 12px);
  left:calc(env(safe-area-inset-left, 0px) + 12px);
  display:none; align-items:center; gap:2px;
  transition:transform .1s, box-shadow .1s, color .2s, border-color .2s;
}
/* 视觉上是个小按钮，但可点区域撑到 ≥44×44（iOS HIG 下限）——
 * 这颗按钮正是给没有返回手势的人用的，按不中比没有更糟 */
#navBack::after{ content:""; position:absolute; inset:-8px -10px; }
body.has-overlay #navBack{ display:none !important; }   /* 浮层/灯箱开着时让位 */
/* 星露谷标题屏：木牌像素风，与 .sdv-btn 一套 */
#navBack.sdv{
  background:linear-gradient(180deg,#ffd789,#f0a94e); color:var(--wood-dark);
  border:3px solid var(--wood-dark); border-radius:4px;
  box-shadow:0 3px 0 var(--wood-dark), inset 0 2px 0 rgba(255,255,255,.5);
  font-size:13px; letter-spacing:2px; padding:7px 13px;
}
#navBack.sdv:active{ transform:translateY(3px); box-shadow:0 0 0 var(--wood-dark); }
/* 老登版：细金描边，与 .lux-back 一套 */
#navBack.lux{
  background:rgba(12,10,17,.55); backdrop-filter:blur(6px);
  border:1px solid rgba(216,179,106,.4); border-radius:20px;
  color:#c9bda6; font-size:12px; letter-spacing:2px; padding:7px 15px;
}
#navBack.lux:hover{ color:#f3dca0; border-color:rgba(216,179,106,.85); }
@media (prefers-reduced-motion:reduce){ #navBack{ transition:none; } }

.lux-back{ margin-top:28px; background:none; border:1px solid var(--line); border-radius:20px; padding:8px 20px; color:var(--soft); font-family:inherit; font-size:12px; letter-spacing:2px; cursor:pointer; transition:.2s; }
.lux-back:hover{ color:var(--g2); border-color:var(--g); box-shadow:0 0 18px rgba(212,176,106,.25); }
.reveal{ opacity:0; transform:translateY(30px) scale(.98); filter:blur(6px); transition:opacity .8s ease, transform .8s cubic-bezier(.2,.7,.2,1), filter .8s ease; }
.reveal.in{ opacity:1; transform:none; filter:none; }
/* 老登版灯箱：同样全屏无边框(去掉金边/圆角/柔光与内边距，只留照片) */
#luxBox{ position:fixed; inset:0; z-index:80; display:none; align-items:center; justify-content:center; background:#08070b; padding:0; cursor:zoom-out; overflow:hidden; }
#luxBox.zoomed{ cursor:grab; }
#luxBox img{ display:block; width:auto; height:auto; max-width:100vw; max-height:100vh; max-height:100dvh;
  object-fit:contain; border:0; border-radius:0; box-shadow:none; transform-origin:50% 50%; will-change:transform; }
#luxBoxClose{ position:fixed; z-index:2; top:calc(env(safe-area-inset-top,0px) + 16px); right:calc(env(safe-area-inset-right,0px) + 18px); width:40px; height:40px; border-radius:50%; background:rgba(255,255,255,.08); color:#f3dca0; border:1px solid #d8b36a; font-size:18px; cursor:pointer; backdrop-filter:blur(4px); }
@media (prefers-reduced-motion:reduce){ .lux-names,.lux-divider::before,.lux-divider::after,.lux-btn::after,#lux::before,#lux::after{ animation:none; } .reveal{ transition:opacity .4s; transform:none; filter:none; } }

/* —— 通关结算卡（玩法③）+ 分享图（UI） —— */
.score-card{margin:16px 0 0;padding:16px;border-radius:10px;text-align:center;
  background:linear-gradient(180deg,#fff6e2,#ffe9c4);border:3px solid var(--wood-dark);box-shadow:0 4px 0 rgba(91,44,14,.25)}
.score-title{font-size:16px;font-weight:bold;color:#b04a3a;letter-spacing:1px}
.score-num{margin:6px 0 2px}
.score-num b{font-size:40px;color:var(--orange);line-height:1}
.score-num span{font-size:14px;color:#a3572b;margin-left:2px}
.score-bar{height:10px;border-radius:6px;background:rgba(140,70,21,.18);overflow:hidden;margin:6px 0 12px}
.score-bar i{display:block;height:100%;border-radius:6px;background:linear-gradient(90deg,#7ec850,#ffd84d,#e8943a)}
.score-stats{display:flex;flex-wrap:wrap;justify-content:center;gap:6px 14px;font-size:12px;color:#5b4427;margin-bottom:12px}
.share-img{display:block;max-width:100%;width:300px;margin:8px auto 0;border:4px solid var(--wood-dark);
  border-radius:6px;image-rendering:auto;box-shadow:0 4px 12px rgba(0,0,0,.3)}
/* —— 小地图（📜 菜单里） —— */
.mini-wrap{margin:12px auto 4px;text-align:center}
#miniMap{display:block;margin:0 auto;width:230px;height:240px;image-rendering:pixelated;border:3px solid var(--wood-dark);border-radius:6px;background:#5fae52}
.mini-legend{font-size:11px;color:#8a5a2b;margin-top:6px;line-height:1.6}

/* —— 祝福墙（拓展②） —— */
.wish-wall{display:flex;flex-direction:column;gap:8px;margin-top:6px}
.wish-item{background:#fff6e2;border:2px solid rgba(140,70,21,.3);border-left:5px solid var(--orange);border-radius:6px;padding:9px 12px;text-align:left}
.wish-text{font-size:13px;color:#5b4427;line-height:1.7}
.wish-from{font-size:12px;color:#a3572b;text-align:right;margin-top:4px}

/* —— 通关分享图·领奖码 —— */
.gift-code{margin:10px 0 0;padding:12px;text-align:center;border-radius:8px;background:#fff6e2;border:2px dashed #b04a3a;color:#5b4427;font-size:14px}
.gift-code b{font-size:20px;letter-spacing:3px;color:#b04a3a}
.gift-code span{display:block;font-size:11px;color:#8a5a2b;margin-top:5px}
.gift-code.locked{background:#f3ece0;border-color:#9a6a3a;color:#7a5a3a}
.gift-code.locked b{color:#9a6a3a;font-size:inherit;letter-spacing:normal}
