/* ============================================================
   HX Birthday · 粉色 × 高级感 × 科技感
   ============================================================ */
:root{
  --bg0:#0c0409;
  --bg1:#150912;
  --bg2:#1d0d18;
  --pink:#ff6ea9;
  --pink2:#ffb3d1;
  --pink3:#ffd9e8;
  --deep:#e0417f;
  --gold:#f2d3a0;
  --ink:#fdf0f6;
  --muted:rgba(253,240,246,.52);
  --dim:rgba(253,240,246,.34);
  --line:rgba(255,158,203,.16);
  --line2:rgba(255,158,203,.32);
  --glass:rgba(255,110,169,.055);
  --glass2:rgba(255,110,169,.1);
  --serif:'Cormorant Garamond','Noto Serif SC',serif;
  --cn:'Noto Serif SC','Songti SC','SimSun',serif;
  --mono:ui-monospace,'SF Mono','Cascadia Mono',Consolas,monospace;
  --ease:cubic-bezier(.22,.61,.36,1);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  font-family:var(--cn);
  color:var(--ink);
  background:var(--bg0);
  overflow-x:hidden;
  line-height:1.9;
  -webkit-font-smoothing:antialiased;
}
/* 背景极光 */
body::before{
  content:"";position:fixed;inset:0;z-index:-2;pointer-events:none;
  background:
    radial-gradient(52vw 40vh at 12% 8%,rgba(255,110,169,.14),transparent 60%),
    radial-gradient(46vw 44vh at 88% 22%,rgba(224,65,127,.12),transparent 62%),
    radial-gradient(60vw 50vh at 50% 100%,rgba(242,211,160,.07),transparent 65%),
    linear-gradient(180deg,var(--bg0),var(--bg1) 45%,var(--bg0));
}
/* 颗粒质感 */
body::after{
  content:"";position:fixed;inset:-50%;z-index:65;pointer-events:none;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.6'/%3E%3C/svg%3E");
  animation:grain 9s steps(6) infinite;
}
@keyframes grain{0%,100%{transform:translate(0,0)}20%{transform:translate(-3%,2%)}40%{transform:translate(2%,-3%)}60%{transform:translate(-2%,-2%)}80%{transform:translate(3%,3%)}}
::selection{background:rgba(255,110,169,.35);color:#fff}
img{display:block;max-width:100%}
button{font-family:inherit;color:inherit;background:none;border:0;cursor:pointer}
input{font-family:inherit}
a{color:inherit;text-decoration:none}
.mono{font-family:var(--mono);letter-spacing:.14em}
.dim{color:var(--dim)}

/* ============ 光标 ============ */
@media (pointer:fine){
  body,a,button,input,[role="button"]{cursor:none}
}
.cursor-dot,.cursor-ring{
  position:fixed;top:0;left:0;z-index:130;pointer-events:none;border-radius:50%;
  will-change:transform;display:none;
}
@media (pointer:fine){.cursor-dot,.cursor-ring{display:block}}
.cursor-dot{width:6px;height:6px;background:var(--pink2);box-shadow:0 0 10px 2px rgba(255,110,169,.8)}
.cursor-ring{
  width:30px;height:30px;border:1px solid rgba(255,158,203,.65);
  transition:width .25s var(--ease),height .25s var(--ease),border-color .25s,background .25s;
}
.cursor-ring.on{width:52px;height:52px;border-color:rgba(255,179,209,.9);background:rgba(255,110,169,.08)}

/* ============ 顶部进度 / 加载 ============ */
.scroll-progress{position:fixed;top:0;left:0;right:0;height:2px;z-index:90;background:rgba(255,158,203,.08)}
.scroll-progress i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--deep),var(--pink),var(--gold));box-shadow:0 0 12px rgba(255,110,169,.8)}
.loader{
  position:fixed;inset:0;z-index:200;background:var(--bg0);
  display:flex;align-items:center;justify-content:center;
  transition:opacity .8s var(--ease),visibility .8s;
}
.loader.off{opacity:0;visibility:hidden}
.loader-core{text-align:center}
.loader-heart{color:var(--pink);animation:heartbeat 1.2s var(--ease) infinite;filter:drop-shadow(0 0 18px rgba(255,110,169,.8))}
@keyframes heartbeat{0%,100%{transform:scale(1)}25%{transform:scale(1.18)}45%{transform:scale(1)}60%{transform:scale(1.12)}}
.loader-bar{width:220px;height:2px;margin:26px auto 14px;background:rgba(255,158,203,.15);border-radius:2px;overflow:hidden}
.loader-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--deep),var(--pink2));transition:width .3s}
.loader-tip{font-size:11px;color:var(--dim)}

/* ============ 烟花画布 ============ */
#fx{position:fixed;inset:0;z-index:30;pointer-events:none}

/* ============ 右侧圆点导航 ============ */
.dot-nav{
  position:fixed;right:22px;top:50%;transform:translateY(-50%);z-index:80;
  display:flex;flex-direction:column;gap:14px;
}
.dot-nav a{position:relative;width:8px;height:8px;border-radius:50%;background:rgba(255,158,203,.25);display:block;transition:all .3s var(--ease)}
.dot-nav a:hover,.dot-nav a.on{background:var(--pink);box-shadow:0 0 10px rgba(255,110,169,.9);transform:scale(1.35)}
.dot-nav a i{
  position:absolute;right:18px;top:50%;transform:translateY(-50%);white-space:nowrap;
  font:10px/1 var(--mono);letter-spacing:.2em;color:var(--pink2);font-style:normal;
  opacity:0;transition:opacity .25s;background:rgba(21,9,18,.9);border:1px solid var(--line);
  padding:5px 9px;border-radius:20px;
}
.dot-nav a:hover i{opacity:1}
@media (max-width:820px){.dot-nav{display:none}}

/* ============ 音乐按钮 ============ */
.music-btn{
  position:fixed;left:22px;bottom:22px;z-index:85;width:46px;height:46px;border-radius:50%;
  background:rgba(21,9,18,.75);border:1px solid var(--line2);color:var(--pink2);
  display:flex;align-items:center;justify-content:center;gap:3px;
  backdrop-filter:blur(8px);transition:all .3s;
}
.music-btn:hover{box-shadow:0 0 18px rgba(255,110,169,.5);transform:translateY(-2px)}
.music-btn.playing{color:var(--pink);border-color:var(--pink);box-shadow:0 0 16px rgba(255,110,169,.55)}
.music-waves{display:none;align-items:flex-end;gap:2px;height:14px}
.music-btn.playing .music-waves{display:flex}
.music-btn.playing svg{display:none}
.music-waves i{width:3px;background:currentColor;border-radius:2px;animation:wv .9s ease-in-out infinite}
.music-waves i:nth-child(1){height:6px}
.music-waves i:nth-child(2){height:12px;animation-delay:.2s}
.music-waves i:nth-child(3){height:8px;animation-delay:.4s}
@keyframes wv{0%,100%{transform:scaleY(.5)}50%{transform:scaleY(1)}}

/* ============ 通用 section ============ */
main{position:relative;z-index:10}
section{position:relative;padding:130px 24px}
.sec-head{max-width:720px;margin:0 auto 64px;text-align:center}
.eyebrow{font-size:11px;color:var(--pink);letter-spacing:.42em;margin-bottom:16px}
.sec-head h2{font-size:clamp(30px,4.4vw,44px);font-weight:500;letter-spacing:.12em}
.sec-head h2::after{
  content:"";display:block;width:64px;height:1px;margin:20px auto 0;
  background:linear-gradient(90deg,transparent,var(--pink),transparent);
}
.sec-desc{margin-top:18px;color:var(--muted);font-size:15px;font-weight:300}

/* 渐入 */
.reveal{opacity:0;transform:translateY(30px);filter:blur(6px);transition:opacity 1s var(--ease) var(--d,0s),transform 1s var(--ease) var(--d,0s),filter 1s var(--ease) var(--d,0s)}
.reveal.in{opacity:1;transform:none;filter:none}

/* 按钮 */
.btn{
  position:relative;display:inline-flex;align-items:center;gap:8px;
  padding:13px 30px;border-radius:40px;font-size:14px;letter-spacing:.16em;
  border:1px solid var(--line2);color:var(--pink2);background:var(--glass);
  transition:all .35s var(--ease);overflow:hidden;
}
.btn:hover{transform:translateY(-2px);border-color:var(--pink);box-shadow:0 8px 28px rgba(255,110,169,.28)}
.btn-solid{
  background:linear-gradient(120deg,var(--deep),var(--pink));color:#fff;border:0;
  box-shadow:0 6px 24px rgba(255,110,169,.35);
}
.btn-solid::after{
  content:"";position:absolute;top:0;left:-80%;width:50%;height:100%;
  background:linear-gradient(105deg,transparent,rgba(255,255,255,.45),transparent);
  transform:skewX(-20deg);transition:left .6s var(--ease);
}
.btn-solid:hover::after{left:130%}
.btn-sm{padding:9px 20px;font-size:12px}
.btn-lg{padding:16px 44px;font-size:15px}
.btn:disabled{opacity:.45;pointer-events:none}

/* ============ 01 HERO ============ */
.hero{min-height:100svh;display:flex;align-items:center;justify-content:center;text-align:center;padding:90px 24px 60px}
.hero-grid-bg{
  position:absolute;inset:0;pointer-events:none;opacity:.5;
  background:
    linear-gradient(rgba(255,158,203,.05) 1px,transparent 1px),
    linear-gradient(90deg,rgba(255,158,203,.05) 1px,transparent 1px);
  background-size:56px 56px;
  -webkit-mask-image:radial-gradient(58% 62% at 50% 42%,#000 30%,transparent 100%);
          mask-image:radial-gradient(58% 62% at 50% 42%,#000 30%,transparent 100%);
}
.hero-inner{position:relative;z-index:2;max-width:960px}
.hero-title{margin:10px 0 26px}
.ht-en{
  display:block;font-family:var(--serif);font-weight:500;
  font-size:clamp(52px,9.5vw,124px);line-height:1.02;letter-spacing:.04em;
  background:linear-gradient(100deg,var(--pink3) 8%,var(--pink) 38%,var(--gold) 62%,var(--pink2) 88%);
  background-size:220% 100%;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  animation:sheen 7s var(--ease) infinite;
  text-shadow:0 0 60px rgba(255,110,169,.18);
}
.ht-en em{font-style:italic}
@keyframes sheen{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.ht-cn{display:block;margin-top:18px;font-size:clamp(17px,2.4vw,24px);font-weight:300;letter-spacing:.5em;color:var(--pink2)}
.ht-cn b{font-weight:700;color:var(--gold);text-shadow:0 0 24px rgba(242,211,160,.5)}
.hero-sub{color:var(--muted);font-size:15px;font-weight:300;line-height:2.1}
/* 倒计时 */
.countdown{display:flex;justify-content:center;align-items:center;gap:10px;margin:44px 0 12px}
.cd-cell{
  min-width:86px;padding:16px 10px 12px;border-radius:14px;position:relative;
  background:var(--glass);border:1px solid var(--line);backdrop-filter:blur(6px);
}
.cd-cell::before{
  content:"";position:absolute;inset:0;border-radius:14px;padding:1px;pointer-events:none;
  background:linear-gradient(140deg,rgba(255,158,203,.4),transparent 40%,transparent 60%,rgba(242,211,160,.3));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
}
.cd-cell b{display:block;font-family:var(--serif);font-weight:600;font-size:clamp(30px,4.6vw,46px);line-height:1.15;font-variant-numeric:tabular-nums}
.cd-cell span{display:block;font-size:9px;color:var(--dim);letter-spacing:.3em;margin-top:4px}
.cd-sep{font-family:var(--serif);font-size:30px;color:var(--pink);opacity:.7;animation:blink 1s steps(2) infinite}
@keyframes blink{50%{opacity:.25}}
.cd-note{font-size:11px;margin-bottom:40px}
.cd-note.today{color:var(--gold);letter-spacing:.2em}
.hero-cta{display:flex;gap:16px;justify-content:center;flex-wrap:wrap;margin-bottom:20px}
.hero-hint{font-size:10px}
.scroll-hint{position:absolute;bottom:26px;left:50%;transform:translateX(-50%);width:1px;height:52px;overflow:hidden}
.scroll-hint i{position:absolute;left:0;top:-40%;width:100%;height:40%;background:linear-gradient(180deg,transparent,var(--pink));animation:drop 1.8s var(--ease) infinite}
@keyframes drop{to{top:110%}}

/* ============ 02 祝福墙 ============ */
.wall{overflow:hidden;padding:110px 0}
.marquee-stack{display:flex;flex-direction:column;gap:22px;transform:rotate(-1.2deg)}
.mq-row{display:flex;gap:16px;width:max-content;animation:mq 46s linear infinite}
.mq-row.rev{animation-direction:reverse;animation-duration:58s}
.marquee-stack:hover .mq-row{animation-play-state:paused}
@keyframes mq{to{transform:translateX(-50%)}}
.mq-chip{
  padding:13px 26px;border-radius:40px;white-space:nowrap;font-size:14px;font-weight:300;
  color:var(--pink2);background:var(--glass);border:1px solid var(--line);
  box-shadow:inset 0 0 20px rgba(255,110,169,.05);
}
.mq-chip b{color:var(--gold);font-weight:500}
.mq-chip:nth-child(4n){color:var(--gold)}

/* ============ 03 星环相册 ============ */
.ring-sec{padding-bottom:90px;overflow:hidden}
.ring-stage{position:relative;height:520px;margin:0 auto;max-width:1200px;touch-action:pan-y;user-select:none;-webkit-user-select:none}
.ring-tilt{
  position:absolute;inset:0;transform-style:preserve-3d;
  transform:rotateX(1.5deg);transition:transform .6s var(--ease);
}
.ring{position:absolute;left:50%;top:50%;transform-style:preserve-3d;width:0;height:0}
.ring-panel{
  position:absolute;left:-72px;top:-105px;width:144px;height:210px;
  border-radius:12px;overflow:hidden;backface-visibility:hidden;
  border:1px solid rgba(255,179,209,.22);background:var(--bg2);
  box-shadow:0 18px 40px rgba(0,0,0,.55),0 0 0 1px rgba(12,4,9,.4) inset;
  transition:box-shadow .3s;
}
.ring-panel img{width:100%;height:100%;object-fit:cover;pointer-events:none;user-select:none;-webkit-user-drag:none}
.ring-panel::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(200deg,rgba(255,110,169,.12),transparent 42%,rgba(12,4,9,.42));
  mix-blend-mode:soft-light;pointer-events:none;
}
.ring-panel.hi{box-shadow:0 18px 44px rgba(0,0,0,.55),0 0 26px rgba(255,110,169,.55);border-color:var(--pink)}
.ring-floor{
  position:absolute;left:50%;bottom:-30px;width:820px;height:220px;transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%,rgba(255,110,169,.22),transparent 70%);
  filter:blur(8px);pointer-events:none;
}
.ring-vignette{
  position:absolute;inset:-10%;pointer-events:none;
  background:radial-gradient(48% 52% at 50% 50%,transparent 58%,var(--bg0) 96%);
}
.ring-tools{display:flex;gap:14px;align-items:center;justify-content:center;margin-top:34px;flex-wrap:wrap}
.ring-tools .mono{font-size:11px}

/* ============ 04 信 ============ */
.letter-wrap{max-width:640px;margin:0 auto}
.envelope{position:relative;max-width:440px;margin:0 auto;perspective:1200px}
.env-back{
  position:relative;height:270px;border-radius:14px;
  background:linear-gradient(160deg,#2a1220,#1a0a14);border:1px solid var(--line2);
  box-shadow:0 30px 60px rgba(0,0,0,.5);
}
.env-letter{
  position:absolute;left:26px;right:26px;top:16px;z-index:2;
  max-height:0;opacity:0;overflow:hidden;
  transition:max-height 1.4s var(--ease),opacity .7s var(--ease),transform 1.4s var(--ease);
  transform:translateY(30px);
}
.envelope.open .env-letter{max-height:1500px;opacity:1;transform:translateY(-46%)}
.letter-paper{
  background:linear-gradient(175deg,#fff7fa,#ffe9f2);
  color:#5b2340;border-radius:10px;padding:38px 34px;font-size:14.5px;line-height:2.15;
  box-shadow:0 24px 60px rgba(0,0,0,.45),0 0 0 1px rgba(224,65,127,.15);
}
.letter-paper p{margin-bottom:14px;text-align:justify}
.letter-paper p:nth-of-type(2){text-indent:2em}
.letter-mark{font-size:10px;letter-spacing:.3em;color:#c76a94;margin-bottom:18px}
.letter-sign{text-align:right;color:#a13a67}
.env-front{
  position:absolute;inset:0;z-index:3;pointer-events:none;border-radius:14px;
  background:
    linear-gradient(to bottom right,transparent 49.6%,rgba(255,158,203,.25) 50%,transparent 55%),
    linear-gradient(to bottom left,transparent 49.6%,rgba(255,158,203,.25) 50%,transparent 55%),
    linear-gradient(160deg,#33141f,#200b16);
  clip-path:polygon(0 0,100% 0,100% 62%,50% 100%,0 62%);
  border:1px solid var(--line2);box-shadow:0 14px 34px rgba(0,0,0,.4);
}
.env-flap{
  position:absolute;top:0;left:0;right:0;height:62%;z-index:4;
  background:linear-gradient(170deg,#3d1826,#26101b);
  clip-path:polygon(0 0,100% 0,50% 100%);
  border-radius:14px 14px 0 0;
  transform-origin:top;transition:transform .9s var(--ease);
  box-shadow:0 6px 18px rgba(0,0,0,.35);
}
.envelope.open .env-flap{transform:rotateX(178deg);z-index:1}
.envelope.open .env-front{z-index:1}
.env-seal{
  position:absolute;left:50%;bottom:24%;transform:translateX(-50%);z-index:6;
  width:58px;height:58px;border-radius:50%;
  background:radial-gradient(circle at 32% 30%,#ff9ec4,#d92e74 68%,#a8154f);
  display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;
  box-shadow:0 8px 22px rgba(217,46,116,.55),inset 0 -3px 8px rgba(0,0,0,.3);
  transition:all .4s var(--ease);font-size:10px;
}
.env-seal:hover{transform:translateX(-50%) scale(1.08) rotate(6deg)}
.envelope.open .env-seal{opacity:0;pointer-events:none;transform:translateX(-50%) scale(.6)}
.envelope:focus-visible{outline:2px solid var(--pink);outline-offset:6px;border-radius:14px}
.letter-hint{text-align:center;margin-top:22px;font-size:10px;transition:opacity .5s}
.envelope.open ~ .letter-hint,.letter-wrap.opened .letter-hint{opacity:0}

/* ============ 05 时光漂流 ============ */
.timeline{position:relative;max-width:920px;margin:0 auto;padding:10px 0}
.timeline::before{
  content:"";position:absolute;left:50%;top:0;bottom:0;width:1px;
  background:linear-gradient(180deg,transparent,rgba(255,158,203,.4) 12%,rgba(255,158,203,.4) 88%,transparent);
}
.tl-item{position:relative;width:50%;padding:0 54px 72px 0;opacity:0;transform:translateX(-34px);transition:all 1s var(--ease)}
.tl-item:nth-child(even){margin-left:50%;padding:0 0 72px 54px;transform:translateX(34px)}
.tl-item.in{opacity:1;transform:none}
.tl-item::before{
  content:"";position:absolute;top:14px;right:-7px;width:13px;height:13px;border-radius:50%;
  background:var(--bg0);border:2px solid var(--pink);box-shadow:0 0 14px rgba(255,110,169,.8);
}
.tl-item:nth-child(even)::before{right:auto;left:-6px}
.tl-card{
  border-radius:16px;overflow:hidden;background:var(--glass);border:1px solid var(--line);
  backdrop-filter:blur(6px);transition:all .45s var(--ease);
}
.tl-card:hover{transform:translateY(-6px);box-shadow:0 22px 44px rgba(0,0,0,.45),0 0 24px rgba(255,110,169,.15);border-color:var(--line2)}
.tl-card img{width:100%;height:220px;object-fit:cover;transition:transform .8s var(--ease)}
.tl-card:hover img{transform:scale(1.05)}
.tl-body{padding:20px 22px 24px}
.tl-ch{font-family:var(--mono);font-size:10px;letter-spacing:.32em;color:var(--gold)}
.tl-body h3{font-size:18px;font-weight:500;letter-spacing:.14em;margin:8px 0 6px}
.tl-body p{font-size:13.5px;color:var(--muted);font-weight:300}
@media (max-width:760px){
  .timeline::before{left:8px}
  .tl-item,.tl-item:nth-child(even){width:100%;margin:0;padding:0 0 52px 34px;transform:translateX(30px)}
  .tl-item::before,.tl-item:nth-child(even)::before{left:1px;right:auto}
}

/* ============ 06 蛋糕 ============ */
.cake-stage{text-align:center}
.cake{position:relative;width:300px;height:300px;margin:0 auto 30px}
.cake-glow{
  position:absolute;left:50%;bottom:6px;width:340px;height:90px;transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%,rgba(255,110,169,.28),transparent 70%);filter:blur(10px);
}
.cake-plate{
  position:absolute;left:50%;bottom:0;transform:translateX(-50%);
  width:280px;height:34px;border-radius:50%;
  background:radial-gradient(circle at 50% 30%,#ffeef5,#caa3b8 60%,#8d5f77);
  box-shadow:0 16px 30px rgba(0,0,0,.5);
}
.cake-layer{position:absolute;left:50%;transform:translateX(-50%);border-radius:16px 16px 10px 10px}
.cake-layer.l1{bottom:24px;width:240px;height:92px;background:linear-gradient(180deg,#ff9ec4,#e75f95 55%,#c33d72)}
.cake-layer.l2{bottom:110px;width:190px;height:78px;background:linear-gradient(180deg,#ffc2da,#f272a6 55%,#d34a80)}
.cake-top{
  position:absolute;bottom:184px;left:50%;transform:translateX(-50%);
  width:140px;height:26px;border-radius:50%;
  background:radial-gradient(circle at 50% 20%,#ffe3ef,#f7a8c6 70%);
}
.drip{
  position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:
    radial-gradient(14px 20px at 12% 0,#fff0f6 46%,transparent 52%),
    radial-gradient(18px 26px at 30% 0,#fff0f6 44%,transparent 52%),
    radial-gradient(12px 18px at 47% 0,#fff0f6 47%,transparent 53%),
    radial-gradient(20px 30px at 66% 0,#fff0f6 45%,transparent 52%),
    radial-gradient(13px 22px at 84% 0,#fff0f6 46%,transparent 53%);
}
.candles{position:absolute;bottom:200px;left:50%;transform:translateX(-50%);display:flex;gap:22px}
.candle{position:relative;width:9px;height:44px;border-radius:4px 4px 2px 2px;
  background:repeating-linear-gradient(140deg,#fff 0 5px,var(--pink) 5px 10px)}
.candle::before{
  content:"";position:absolute;top:-15px;left:50%;transform:translateX(-50%);
  width:10px;height:16px;border-radius:50% 50% 42% 42%;
  background:radial-gradient(circle at 50% 68%,#fff7d6 12%,#ffd166 45%,#ff8b3d 78%,transparent);
  filter:blur(.4px);transform-origin:50% 100%;
  animation:flicker .38s ease-in-out infinite alternate;
  box-shadow:0 0 18px 6px rgba(255,196,110,.55),0 0 42px 14px rgba(255,110,169,.3);
  transition:opacity .5s,transform .5s;
}
.candle.out::before{opacity:0;transform:translateX(-50%) scale(.2)}
.candle.out::after{
  content:"";position:absolute;top:-26px;left:50%;width:3px;height:22px;border-radius:3px;
  background:linear-gradient(180deg,transparent,rgba(255,255,255,.5));
  animation:smoke 1.6s ease-out forwards;
}
@keyframes flicker{from{transform:translateX(-50%) scaleY(1) rotate(-2deg)}to{transform:translateX(-50%) scaleY(1.14) rotate(3deg)}}
@keyframes smoke{from{opacity:.8;transform:translate(-50%,0)}to{opacity:0;transform:translate(-50%,-30px) scaleX(2.4)}}
.cake-tools{display:flex;gap:14px;justify-content:center;align-items:center;flex-wrap:wrap}
.cake-msg{margin-top:22px;font-size:12px;color:var(--gold);letter-spacing:.24em;min-height:20px}

/* ============ 07 许愿灯 ============ */
.lantern-sec{overflow:hidden}
.lantern-form{display:flex;gap:12px;justify-content:center;max-width:560px;margin:0 auto 8px;flex-wrap:wrap}
#wishInput{
  flex:1;min-width:220px;padding:13px 22px;border-radius:40px;color:var(--ink);font-size:14px;
  background:var(--glass);border:1px solid var(--line2);outline:none;transition:all .3s;
}
#wishInput::placeholder{color:var(--dim)}
#wishInput:focus{border-color:var(--pink);box-shadow:0 0 0 3px rgba(255,110,169,.15)}
.lantern-river{position:relative;height:380px;max-width:900px;margin:0 auto;overflow:hidden;
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 18%,#000 88%,transparent);
          mask-image:linear-gradient(180deg,transparent,#000 18%,#000 88%,transparent)}
.lantern{
  position:absolute;bottom:-90px;width:44px;height:60px;will-change:transform;
  animation:rise linear forwards;
}
@keyframes rise{to{transform:translateY(-560px)}}
.lantern .lb-body{
  width:100%;height:52px;border-radius:44% 44% 40% 40%;
  background:radial-gradient(circle at 50% 30%,rgba(255,196,150,.95),rgba(255,120,90,.75));
  box-shadow:0 0 24px 6px rgba(255,150,110,.4);position:relative;
  animation:sway 3.4s ease-in-out infinite alternate;
}
.lantern .lb-body::before{content:"";position:absolute;top:-6px;left:50%;transform:translateX(-50%);
  width:16px;height:8px;border-radius:4px;background:rgba(120,60,40,.9)}
.lantern .lb-body::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);
  width:2px;height:14px;background:linear-gradient(180deg,rgba(255,170,110,.9),transparent)}
.lantern .lb-text{
  position:absolute;top:20px;left:50%;transform:translateX(-50%);z-index:2;
  font-size:10px;color:#5c1a0a;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis;
}
@keyframes sway{from{margin-left:-8px;rotate:-4deg}to{margin-left:8px;rotate:4deg}}
.lantern-count{text-align:center;font-size:10px}

/* ============ 08 今日签 ============ */
.fortune-stage{text-align:center;position:relative}
.fortune-tube{
  width:110px;height:150px;margin:0 auto 40px;border-radius:14px 14px 30px 30px;position:relative;
  background:linear-gradient(160deg,#33141f,#1c0b13);border:1px solid var(--line2);
  box-shadow:0 18px 40px rgba(0,0,0,.45),inset 0 -10px 24px rgba(0,0,0,.4);
  display:flex;align-items:flex-start;justify-content:center;gap:7px;padding-top:-4px;
}
.fortune-tube i{width:7px;height:90px;border-radius:0 0 4px 4px;margin-top:-16px;
  background:linear-gradient(180deg,#d9b08c,#b8845c);transform-origin:bottom;transition:transform .5s var(--ease)}
.fortune-tube i:nth-child(2){height:110px;background:linear-gradient(180deg,#e8c6a3,#c69468)}
.fortune-tube i:nth-child(3){height:82px}
.fortune-stage.shaking .fortune-tube{animation:tubeShake .5s ease-in-out 2}
.fortune-stage.shaking .fortune-tube i:nth-child(2){transform:translateY(6px) rotate(5deg)}
@keyframes tubeShake{0%,100%{transform:rotate(0)}25%{transform:rotate(-6deg)}75%{transform:rotate(6deg)}}
.fortune-slip{
  max-width:380px;margin:0 auto 34px;padding:34px 30px;border-radius:14px;position:relative;
  background:linear-gradient(175deg,#fff7fa,#ffe4ee);color:#5b2340;
  box-shadow:0 24px 50px rgba(0,0,0,.45);
  animation:slipOut .9s var(--ease);
}
@keyframes slipOut{0%{opacity:0;transform:translateY(46px) rotate(3deg) scale(.92)}100%{opacity:1;transform:none}}
.slip-tag{font-size:11px;letter-spacing:.5em;color:#c7316d;margin-bottom:12px}
.slip-text{font-size:19px;font-weight:500;letter-spacing:.1em;line-height:2}
.slip-sub{font-size:11px;margin-top:14px;color:#a15b78}

/* ============ 09 刮刮卡 ============ */
.scratch-stage{text-align:center}
.scratch-card{
  position:relative;width:min(560px,92vw);aspect-ratio:2/1;margin:0 auto 22px;border-radius:18px;
  overflow:hidden;border:1px solid var(--line2);
  background:linear-gradient(140deg,#2a1220,#180a12);
  box-shadow:0 26px 60px rgba(0,0,0,.5);
}
.scratch-prize{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  font-size:clamp(18px,3vw,26px);font-weight:500;letter-spacing:.14em;text-align:center;padding:0 30px;
  background:linear-gradient(100deg,var(--pink3),var(--gold),var(--pink2));
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.scratch-prize small{font-family:var(--mono);font-size:10px;letter-spacing:.4em;-webkit-text-fill-color:var(--dim)}
#scratchCanvas{position:absolute;inset:0;width:100%;height:100%;touch-action:none}
.scratch-tools{display:flex;gap:16px;align-items:center;justify-content:center;flex-wrap:wrap}
.scratch-tools .mono{font-size:10px}

/* ============ 10 全部回忆 ============ */
.gallery{padding-bottom:60px}
.gallery-filter{display:flex;gap:12px;justify-content:center;margin-top:26px}
.chip{
  padding:8px 22px;border-radius:30px;font-size:12px;letter-spacing:.18em;color:var(--muted);
  border:1px solid var(--line);background:var(--glass);transition:all .3s;
}
.chip:hover{color:var(--pink2)}
.chip-on{color:#fff;background:linear-gradient(120deg,var(--deep),var(--pink));border-color:transparent;box-shadow:0 4px 18px rgba(255,110,169,.3)}
.masonry{columns:4 240px;column-gap:16px;max-width:1240px;margin:0 auto;padding:0 10px}
.ms-item{
  position:relative;margin-bottom:16px;border-radius:14px;overflow:hidden;
  border:1px solid var(--line);break-inside:avoid;background:var(--bg2);
  transition:all .4s var(--ease);
}
.ms-item:hover{transform:translateY(-5px);box-shadow:0 18px 40px rgba(0,0,0,.5),0 0 22px rgba(255,110,169,.18);border-color:var(--line2)}
.ms-item img{width:100%;transition:transform .8s var(--ease),opacity .5s}
.ms-item:hover img{transform:scale(1.06)}
.ms-item.hide{display:none}
.ms-heart{
  position:absolute;top:10px;right:10px;width:32px;height:32px;border-radius:50%;z-index:2;
  background:rgba(12,4,9,.55);backdrop-filter:blur(6px);color:#fff;font-size:14px;line-height:1;
  opacity:0;transition:all .3s;display:flex;align-items:center;justify-content:center;
}
.ms-item:hover .ms-heart,.ms-heart.faved{opacity:1}
.ms-heart.faved{color:var(--pink);box-shadow:0 0 14px rgba(255,110,169,.6)}
.ms-idx{position:absolute;left:12px;bottom:10px;font-family:var(--mono);font-size:10px;color:rgba(255,255,255,.75);
  background:rgba(12,4,9,.45);padding:3px 8px;border-radius:10px;letter-spacing:.1em}
.gallery-end{text-align:center;font-size:10px;margin:50px 0 0}

/* ============ 11 烟花秀 ============ */
.show-stage{text-align:center;min-height:180px}
#showStatus{margin-top:20px;font-size:11px}

/* ============ footer ============ */
.footer{text-align:center;padding:110px 24px 70px;position:relative;z-index:10}
.f-line{font-size:16px;letter-spacing:.24em;font-weight:300}
.f-line span{color:var(--gold)}
.f-sub{font-size:10px;margin-top:14px}
.heart{color:var(--pink);display:inline-block;animation:heartbeat 1.4s var(--ease) infinite}
.f-egg{font-size:10px;margin-top:26px;opacity:.6}

/* ============ 灯箱 ============ */
.lightbox{
  position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;
  background:rgba(8,2,6,.9);backdrop-filter:blur(14px);
  opacity:0;transition:opacity .35s;
}
.lightbox.vis{opacity:1}
.lightbox[hidden]{display:none}
.lb-figure{max-width:min(1100px,88vw);text-align:center;transform:scale(.96);transition:transform .35s var(--ease)}
.lightbox.vis .lb-figure{transform:none}
#lbImg{max-width:100%;max-height:78vh;margin:0 auto;border-radius:12px;transition:opacity .35s;
  box-shadow:0 30px 90px rgba(0,0,0,.7),0 0 40px rgba(255,110,169,.14);
  border:1px solid rgba(255,158,203,.2)}
.lb-cap{margin-top:16px;font-size:11px;color:var(--muted);display:flex;align-items:center;justify-content:center;gap:16px}
.lb-cap button{font-size:18px;color:var(--muted);transition:all .25s}
.lb-cap button.faved{color:var(--pink);text-shadow:0 0 12px rgba(255,110,169,.8)}
.lb-close,.lb-prev,.lb-next{
  position:absolute;z-index:2;width:52px;height:52px;border-radius:50%;
  background:rgba(21,9,18,.6);border:1px solid var(--line2);color:var(--pink2);font-size:20px;
  display:flex;align-items:center;justify-content:center;transition:all .3s;backdrop-filter:blur(6px);
}
.lb-close:hover,.lb-prev:hover,.lb-next:hover{background:var(--pink);color:#fff;box-shadow:0 0 20px rgba(255,110,169,.6)}
.lb-close{top:26px;right:26px}
.lb-prev{left:26px;top:50%;transform:translateY(-50%)}
.lb-next{right:26px;top:50%;transform:translateY(-50%)}
@media (max-width:640px){.lb-prev{left:8px}.lb-next{right:8px}.lb-close{top:12px;right:12px}}

/* ============ toast ============ */
.toast{
  position:fixed;left:50%;bottom:44px;transform:translate(-50%,20px);z-index:110;
  padding:12px 26px;border-radius:40px;font-size:12px;color:var(--pink2);
  background:rgba(21,9,18,.9);border:1px solid var(--line2);backdrop-filter:blur(10px);
  opacity:0;transition:all .4s var(--ease);pointer-events:none;letter-spacing:.12em;
}
.toast.vis{opacity:1;transform:translate(-50%,0)}
.toast[hidden]{display:none}

/* ============ 心雨彩蛋 ============ */
.rain-heart{
  position:fixed;top:-40px;z-index:95;pointer-events:none;color:var(--pink);
  animation:heartFall linear forwards;filter:drop-shadow(0 0 8px rgba(255,110,169,.7));
}
@keyframes heartFall{
  0%{transform:translateY(-6vh) rotate(0) scale(1);opacity:1}
  100%{transform:translateY(108vh) rotate(340deg) scale(.7);opacity:.2}
}

/* ============ 动效降级 ============ */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.15s !important}
  html{scroll-behavior:auto}
  .reveal{opacity:1;transform:none;filter:none}
}
@media (max-width:640px){
  section{padding:88px 18px}
  .hero{padding:80px 16px 50px}
  .countdown{gap:6px;flex-wrap:wrap}
  .cd-cell{min-width:60px;padding:11px 5px 9px}
  .cd-sep{font-size:22px}
  .ring-stage{height:400px}
  .masonry{columns:2 150px;column-gap:10px;padding:0 4px}
  .ms-item{margin-bottom:10px}
  .btn-lg{padding:14px 30px;font-size:14px}
  .letter-paper{padding:26px 20px;font-size:13.5px}
  .cake{width:min(300px,86vw);height:min(300px,86vw)}
  .fortune-slip{padding:26px 20px}
  .wall{padding:80px 0}
  .footer{padding:80px 18px 50px}
}
@media (max-width:420px){
  section{padding:72px 14px}
  .cd-cell{min-width:52px;padding:9px 3px 7px}
  .cd-cell b{font-size:26px}
  .cd-sep{font-size:18px;margin:0 -2px}
  .ht-cn{letter-spacing:.3em}
  .letter-paper{padding:22px 16px;font-size:13px;line-height:2}
  .envelope{max-width:100%}
  .env-letter{left:14px;right:14px}
  .timeline::before{left:6px}
  .tl-item,.tl-item:nth-child(even){padding-left:26px;padding-bottom:42px}
  .tl-item::before,.tl-item:nth-child(even)::before{left:0}
  .tl-body{padding:14px 14px 18px}
  .cake-layer.l1{width:min(240px,78vw)}
  .cake-layer.l2{width:min(190px,62vw)}
  .candles{gap:16px}
  .ring-stage{height:360px}
  .chip{padding:7px 16px;font-size:11px}
}
