: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)}}

/* ============ 标题屏 ============ */
#title{
  position:fixed;inset:0;z-index:50;display:flex;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)}
.char-card canvas{width:64px;height:128px;display:block;margin:0 auto}
.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{
  margin:0 auto;width:fit-content;max-width:calc(100% - 210px);
  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:13px;letter-spacing:1px;padding:7px 14px;
  box-shadow:0 4px 0 rgba(0,0,0,.3);text-shadow:1px 1px 0 rgba(0,0,0,.4);
  display:flex;align-items:center;gap:8px;
}
#questBar .dot{width:8px;height:8px;background:#ffd84d;flex:none;animation:beat 1s infinite}
#itemBar{
  margin:8px auto 0;width:fit-content;display:flex;gap:6px;
}
.chip{
  background:rgba(91,44,14,.85);border:2px solid #3a1d08;border-radius:4px;
  color:#ffe9a8;font-size:12px;padding:4px 8px;letter-spacing:1px;
}
#progress{position:absolute;right:10px;top:max(10px, env(safe-area-inset-top));display:flex;gap:4px}
#progress .ph{width:18px;height:16px;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="%23493a52" d="M2 1h3v1h1v1h1V2h1V1h3v1h1v3h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v-1H4V9H3V8H2V7H1V6H0V2h1V1h1z"/></svg>') no-repeat center/contain}
#progress .ph.on{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}
#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-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}
.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}
.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 作背景(固定铺底, 卡片透出); 卡片本身透明只留外框 */
#overlayCard:has(.poster){background:#bfe6f3;
  box-shadow:inset 0 0 0 4px var(--orange), 0 6px 0 rgba(0,0,0,.25)}
.poster{margin:-6px -2px 0;padding:8px 4px 2px;border-radius:4px;
  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}
/* 花拱门·新人合影场景：天空→草地渐变，花藤垂顶，向日葵夹道，新人居中 */
.arch-scene{position:relative;overflow:hidden;margin:0 0 14px;padding:0;
  border:4px solid var(--wood-dark);border-radius:6px;
  background:linear-gradient(180deg,#bfe8f5 0%,#cfeef0 46%,#8ace6c 47%,#6cb44d 100%);
  box-shadow:inset 0 0 0 3px rgba(255,255,255,.22), 0 4px 0 rgba(0,0,0,.18);}
.arch-cloud{position:absolute;image-rendering:pixelated;pointer-events:none;opacity:.8;z-index:0}
.arch-cloud.l{width:64px;top:0;left:-12px}
.arch-cloud.r{width:48px;top:6px;right:-6px}
.arch-top{position:relative;z-index:1;height:30px;background:url('../assets/elem/garland.png') repeat-x center/auto 100%;
  image-rendering:pixelated;filter:drop-shadow(0 2px 0 rgba(0,80,0,.18))}
.arch-stage{position:relative;display:flex;justify-content:center;align-items:flex-end;gap:4px;
  min-height:104px;padding:6px 60px 8px}
.arch-ch{width:48px;height:96px;image-rendering:pixelated}
.arch-cat{width:42px;height:42px;image-rendering:pixelated}
.arch-stage .px-heart{align-self:center;margin-bottom:30px}
.arch-vine{position:absolute;top:30px;height:84px;image-rendering:pixelated;opacity:.95}
.arch-vine.l{left:8px}.arch-vine.r{right:8px;transform:scaleX(-1)}
.arch-sun{position:absolute;bottom:-4px;height:66px;image-rendering:pixelated;
  filter:drop-shadow(0 2px 0 rgba(0,60,0,.2))}
.arch-sun.l{left:2px}.arch-sun.r{right:2px;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:14px 0 0;padding:14px 14px 12px;text-align:center;
  background:linear-gradient(180deg,#fff3cf,#ffe1a6);
  border:3px solid #c9952e;border-radius:8px;
  box-shadow:0 4px 0 rgba(0,0,0,.16), inset 0 0 0 2px #fffaf0}
.rsvp-title{font-size:15px;letter-spacing:2px;color:var(--wood);font-weight:bold;margin-bottom:6px}
.rsvp-desc{font-size:13px;line-height:1.8;color:#8a5a2b;margin-bottom:12px}
.rsvp-desc b{color:var(--red)}
.rsvp-btn{font-size:15px;padding:11px 26px}
.rsvp-hint{font-size:11px;color:#a3865a;margin-top:8px;letter-spacing:1px}
.rsvp-setup{font-size:12px;color:#a3572b;line-height:1.8;background:#fff8e8;border:2px dashed #c9a86a;
  border-radius:4px;padding:8px 10px}
.rsvp-setup b{color:var(--red)}
/* 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}

/* 收尾·简洁落款 */
.poster-foot{margin-top:16px;font-size:13px;letter-spacing:2px;color:#a3572b;text-align:center;
  border-top:2px dotted rgba(140,70,21,.4);padding-top:12px}
.poster-foot b{color:var(--red);letter-spacing:1px}

/* ============ 交易 / 钓鱼 ============ */
.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}
#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:"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; }
.gate-btn .gb-sub{ display:block; font-size:11px; color:var(--lux-soft); letter-spacing:1px; margin-top:6px; }
.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-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; }
.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:rgba(8,7,11,.95); padding:20px; backdrop-filter:blur(6px); }
#luxBox img{ max-width:94%; max-height:90%; border:1px solid var(--g,#d8b36a); border-radius:8px; box-shadow:0 10px 60px rgba(212,176,106,.25); }
#luxBoxClose{ position:absolute; top:18px; right:20px; width:40px; height:40px; border-radius:50%; background:rgba(255,255,255,.08); color:#f3dca0; border:1px solid #d8b36a; font-size:18px; cursor:pointer; }
@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; } }
