:root{
  --night:#080711;
  --ink:#3c2a35;
  --ink-soft:#6f5762;
  --paper:#f4e7d2;
  --paper-deep:#e6d2b7;
  --gold:#c99a63;
  --rose:#b45f5f;
  --rose-deep:#8d4648;
  --mist:#b9a6bd;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{
  background:
    radial-gradient(ellipse at 50% 20%,#1b1526 0%,#0b0913 55%,#05050b 100%);
  color:var(--ink);
  font-family:"Avenir Next","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased;
  overflow:hidden;
}
button{font:inherit;color:inherit}

.app{
  position:relative;
  width:100%;
  height:100dvh;
  max-width:480px;
  margin:0 auto;
  overflow:hidden;
  background:var(--night);
}
@media (min-width:700px){
  body{display:flex;align-items:center;justify-content:center}
  .app{
    height:min(92dvh,900px);
    border-radius:30px;
    box-shadow:0 40px 120px rgba(0,0,0,.65),0 0 0 1px rgba(255,235,200,.08);
  }
}

.scene{position:absolute;inset:0;overflow:hidden}
.intro{transition:opacity .65s ease,transform .75s ease}
.intro.is-leaving{opacity:0;transform:scale(1.035);pointer-events:none}
.stage{opacity:0;transition:opacity .45s ease}
.stage.is-active{opacity:1}
.intro{
  background:
    radial-gradient(ellipse at 74% 14%,rgba(255,225,177,.16),transparent 34%),
    linear-gradient(180deg,#07060f 0%,#0d0a1a 42%,#171021 72%,#090711 100%);
}
.sky{
  position:absolute;inset:0;
  background-image:
    radial-gradient(1.4px 1.4px at 12% 18%,rgba(255,241,210,.8),transparent),
    radial-gradient(1.2px 1.2px at 34% 9%,rgba(255,241,210,.6),transparent),
    radial-gradient(1.8px 1.8px at 82% 7%,rgba(255,241,210,.8),transparent),
    radial-gradient(1px 1px at 62% 23%,rgba(255,241,210,.5),transparent),
    radial-gradient(1.2px 1.2px at 24% 36%,rgba(255,241,210,.4),transparent),
    radial-gradient(1px 1px at 91% 31%,rgba(255,241,210,.5),transparent);
  opacity:.85;
}
.moon{
  position:absolute;
  top:7.5%;right:7%;
  width:31vw;max-width:180px;aspect-ratio:1;
  border-radius:50%;
  overflow:hidden;
  background:
    radial-gradient(circle at 38% 34%,#fff7e4 0%),#f2ddb8;
  box-shadow:
    0 0 70px 26px rgba(255,224,167,.2),
    0 0 160px 80px rgba(255,200,130,.08),
    inset -14px -18px 0 rgba(196,158,108,.16);
  opacity:.96;
}
.moon-deco{
  position:absolute;inset:0;z-index:2;width:100%;height:100%;pointer-events:none;
}
.moon::after{
  content:"";
  position:absolute;inset:0;border-radius:50%;z-index:1;
  background:
    radial-gradient(circle at 32% 38%,rgba(181,143,96,.22) 0 9%,transparent 10%),
    radial-gradient(circle at 62% 28%,rgba(181,143,96,.16) 0 7%,transparent 8%),
    radial-gradient(circle at 66% 64%,rgba(181,143,96,.2) 0 13%,transparent 14%),
    radial-gradient(circle at 42% 76%,rgba(181,143,96,.14) 0 6%,transparent 7%);
}
.haze{
  position:absolute;inset:0;
  background:
    radial-gradient(ellipse at 50% 100%,rgba(255,180,110,.1),transparent 45%),
    linear-gradient(180deg,transparent 55%,rgba(5,5,11,.7) 100%);
}
#fireworks{
  position:absolute;inset:0;
  width:100%;height:100%;
  z-index:2;
  pointer-events:none;
}
.castle{
  position:absolute;
  left:50%;bottom:4%;
  width:118%;
  max-width:none;
  transform:translateX(-50%);
  z-index:3;
  filter:drop-shadow(0 -18px 40px rgba(0,0,0,.55)) drop-shadow(0 0 24px rgba(255,190,120,.06));
  user-select:none;
}
.vignette{
  position:absolute;inset:0;z-index:4;pointer-events:none;
  background:
    radial-gradient(ellipse at 50% 42%,transparent 36%,rgba(3,3,9,.5) 100%),
    linear-gradient(180deg,rgba(3,3,9,.2),transparent 22%,transparent 70%,rgba(3,3,9,.55));
}
.topbar{
  position:absolute;z-index:6;top:0;left:0;right:0;
  display:flex;justify-content:space-between;align-items:center;
  padding:calc(18px + env(safe-area-inset-top)) 22px 0;
  color:rgba(247,233,210,.72);
  font-size:9px;letter-spacing:.28em;
}
.topbar-year{letter-spacing:.2em;color:rgba(247,233,210,.45)}

.birthday-card{
  position:absolute;z-index:7;
  left:6%;right:6%;bottom:calc(4.5% + env(safe-area-inset-bottom));
  padding:18px 18px 15px;
  background:
    linear-gradient(135deg,rgba(255,255,255,.28),transparent 42%),
    repeating-linear-gradient(0deg,rgba(92,62,45,.035) 0 1px,transparent 1px 4px),
    var(--paper);
  border:1px solid rgba(112,76,55,.22);
  border-radius:5px 18px 7px 15px;
  box-shadow:
    0 24px 50px rgba(0,0,0,.35),
    0 2px 0 rgba(255,255,255,.35) inset,
    0 -2px 0 rgba(120,86,60,.12) inset;
  transform:rotate(-1.1deg);
}
.birthday-card::after{
  content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='.22'/%3E%3C/svg%3E");
  opacity:.35;mix-blend-mode:multiply;
}
.tape{
  position:absolute;top:-9px;width:58px;height:20px;
  background:rgba(226,199,160,.55);
  box-shadow:0 1px 3px rgba(70,45,30,.12);
}
.tape-left{left:18px;transform:rotate(-5deg)}
.tape-right{right:16px;transform:rotate(4deg)}
.card-kicker{
  margin:0 0 5px;font-size:8px;letter-spacing:.24em;color:#9a7467;
}
.card-top{display:flex;align-items:flex-start;gap:8px}
.card-main{flex:1;min-width:0}
.name-line{display:flex;align-items:center;gap:8px}
.birthday-card h1{
  margin:0;display:block;
  font-family:"STSong","Songti SC","SimSun",serif;
  font-weight:400;font-size:clamp(44px,11.5vw,56px);letter-spacing:.1em;color:#42303a;
  line-height:1;
}
.age{
  display:inline-flex;align-items:center;justify-content:center;
  width:36px;height:36px;border:1px solid #b99275;border-radius:50%;
  font-family:"Cormorant Garamond",Georgia,serif;
  font-size:17px;letter-spacing:0;color:#9a6b54;
  transform:rotate(7deg);
  margin-left:2px;flex:none;
}
.date-line{display:flex;align-items:baseline;gap:7px;margin-top:2px}
.date-line b{
  font-family:Georgia,"Times New Roman",serif;font-weight:400;
  font-size:23px;letter-spacing:.12em;color:#a35c5c;
}
.date-line em{font-style:normal;font-size:8px;letter-spacing:.18em;color:#9a7b71}
.card-sub{
  margin:5px 0 0;font-size:10.5px;line-height:1.65;letter-spacing:.04em;color:#765e65;
}
.card-cake{
  width:94px;height:auto;flex:none;margin:-7px -5px 0 0;
  filter:drop-shadow(0 9px 12px rgba(100,60,40,.16));
  transform:rotate(2.2deg);
}
.seal-wrap{display:flex;align-items:center;gap:11px;margin-top:8px}
.seal{
  width:62px;height:62px;border-radius:50%;flex:none;
  border:1px solid #7f3d42;
  background:
    radial-gradient(circle at 34% 28%,#d88a83 0%,#bd6565 38%,#9f4d54 72%,#7e3b44 100%);
  color:#f6dfc0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  cursor:pointer;
  box-shadow:
    0 10px 24px rgba(93,39,42,.32),
    0 0 0 4px rgba(180,95,95,.12),
    inset 0 2px 3px rgba(255,225,195,.28),
    inset 0 -4px 8px rgba(73,25,33,.28);
  transition:transform .2s ease,box-shadow .2s ease;
  -webkit-tap-highlight-color:transparent;
}
.seal svg{width:23px;height:16px;color:#f3d7b4;opacity:.9}
.seal span{font-size:10px;letter-spacing:.18em;color:#f7e2c3}
.seal:hover{transform:scale(1.045) rotate(-2deg);box-shadow:0 14px 30px rgba(93,39,42,.4),0 0 0 5px rgba(180,95,95,.14),inset 0 2px 3px rgba(255,225,195,.3),inset 0 -4px 8px rgba(73,25,33,.3)}
.seal:active{transform:scale(.97)}
.seal-label{margin:0;max-width:92px;font-size:9.5px;line-height:1.55;letter-spacing:.12em;color:#8c6b63}
.card-hint{margin:7px 0 0;font-size:8px;line-height:1.6;color:#9c8174;letter-spacing:.03em}
.corner-note{
  position:absolute;z-index:6;right:20px;bottom:calc(20px + env(safe-area-inset-bottom));
  font-family:Georgia,serif;font-size:9px;letter-spacing:.2em;color:rgba(247,233,210,.4);
  writing-mode:vertical-rl;
}

/* ---------------------------------------------------------------- */
.stage{background:#000;z-index:20;display:flex;align-items:center;justify-content:center}
.stage[hidden]{display:none}
#mv{width:100%;height:100%;object-fit:contain;background:#000}
.loading{
  position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  background:rgba(4,4,10,.92);color:rgba(247,233,210,.75);
  font-size:11px;letter-spacing:.14em;
  transition:opacity .35s ease;
}
.loading.is-hidden{opacity:0;pointer-events:none}
.spinner{
  width:26px;height:26px;border-radius:50%;
  border:1px solid rgba(255,218,168,.2);border-top-color:#ffd6a0;
  animation:spin 1s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}
.film-ui{
  position:absolute;left:0;right:0;bottom:0;z-index:6;
  padding:20px 18px calc(16px + env(safe-area-inset-bottom));
  background:linear-gradient(180deg,transparent,rgba(0,0,0,.65));
  opacity:0;transition:opacity .3s ease;
}
.film-ui.is-visible{opacity:1}
.progress{height:2px;background:rgba(255,237,208,.2);border-radius:2px;overflow:hidden}
.progress i{display:block;height:100%;width:0;background:#f2d3a5;transition:width .15s linear}
.film-actions{display:flex;justify-content:space-between;margin-top:10px}
.film-actions button{
  border:0;background:transparent;padding:4px 2px;color:rgba(247,233,210,.62);
  font-size:10px;letter-spacing:.14em;cursor:pointer;
}
.outro{
  position:absolute;inset:0;z-index:8;display:flex;align-items:center;justify-content:center;
  background:rgba(4,4,10,.78);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  padding:24px;
}
.outro[hidden]{display:none}
.outro-card{
  width:100%;max-width:340px;padding:28px 24px 22px;
  background:var(--paper);border-radius:4px 20px 6px 16px;
  box-shadow:0 30px 80px rgba(0,0,0,.55);
  transform:rotate(-.6deg);
  border:1px solid rgba(112,76,55,.22);
}
.outro-kicker{margin:0 0 10px;font-size:8px;letter-spacing:.28em;color:#9a7467}
.outro-card h2{
  margin:0;font-family:"STSong","Songti SC","SimSun",serif;font-weight:400;
  font-size:34px;line-height:1.45;color:#42303a;letter-spacing:.04em;
}
.outro-card p{margin:14px 0 0;font-size:11px;line-height:1.9;color:#735c63;letter-spacing:.04em}
.outro-actions{display:flex;gap:8px;margin-top:20px}
.outro-actions button{
  flex:1;border:1px solid #a87c6d;background:#a35c5c;color:#f9ead2;
  padding:11px 8px;border-radius:2px;font-size:11px;letter-spacing:.1em;cursor:pointer;
}
.outro-actions .ghost{background:transparent;color:#7a5b55;border-color:#c6a68e}
