  :root{
    --bg0:#03010f; --bg1:#0a0a2e; --bg2:#1a0b2e;
    --gold:#ffd9a0; --pink:#ff4d8d; --ice:#7ec8ff; --cgold:#e8c89a;
    --serif:'STKaiti','KaiTi','Noto Serif SC',serif;
    --sans:-apple-system,'PingFang SC','Microsoft YaHei',sans-serif;
  }
  *{margin:0;padding:0;box-sizing:border-box;}
  html,body{overflow:hidden;height:100%;background:var(--bg0);
    -webkit-user-select:none;user-select:none;-webkit-touch-callout:none;
    touch-action:none;overscroll-behavior:none;}
  canvas{position:fixed;inset:0;display:block;}
  #bg{z-index:1}#mid{z-index:2}#fg{z-index:3}
  #stage{position:fixed;inset:0;z-index:1;}

  /* 追光压暗层（第五幕） */
  #dim{position:fixed;inset:0;z-index:5;pointer-events:none;opacity:0;transition:opacity 1.2s ease;
    background:radial-gradient(ellipse 70% 55% at 50% 48%, rgba(0,0,0,0) 0%, rgba(0,0,0,.05) 40%, rgba(0,0,0,.45) 100%);}
  #dim.on{opacity:1;}

  /* UI 层 */
  #ui{position:fixed;inset:0;z-index:10;pointer-events:none;color:#fff;font-family:var(--sans);}
  #ui .hot{pointer-events:auto;}

  /* 第一幕 */
  #introHint{position:fixed;left:0;right:0;top:34%;text-align:center;
    font-family:var(--serif);font-size:clamp(1rem,4.4vw,1.4rem);letter-spacing:.3em;
    color:rgba(255,240,220,.0);opacity:0;transition:opacity 2s ease;
    text-shadow:0 0 12px rgba(255,77,141,.5),0 0 24px rgba(255,217,160,.5);}
  #introHint.show{opacity:.85;color:rgba(255,240,220,.95);}
  #unlockBtn{position:fixed;left:50%;top:58%;transform:translateX(-50%);
    padding:.9em 2.2em;min-height:48px;border-radius:999px;cursor:pointer;
    font-family:var(--sans);font-size:clamp(.95rem,4vw,1.1rem);letter-spacing:.2em;
    color:#ffe9c9;background:rgba(255,217,160,.08);border:1px solid rgba(255,217,160,.55);
    opacity:0;transition:opacity 1.5s ease;
    animation:breatheGlow 2.4s ease-in-out infinite;}
  #unlockBtn.show{opacity:1;}
  #unlockBtn:active{transform:translateX(-50%) scale(.96);}
  @keyframes breatheGlow{
    0%,100%{box-shadow:0 0 8px rgba(255,217,160,.45),inset 0 0 6px rgba(255,217,160,.15);}
    50%{box-shadow:0 0 20px rgba(255,217,160,.85),inset 0 0 12px rgba(255,217,160,.3);}
  }

  /* 信纸（第四幕） */
  #paper{position:fixed;left:50%;top:46%;transform:translateX(-50%) translateY(16px);
    width:min(88vw,420px);border-radius:16px;padding:1.4em 1.5em;
    background:rgba(13,8,32,.55);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
    border:1px solid rgba(232,200,154,.22);
    box-shadow:0 8px 40px rgba(0,0,0,.5),0 0 24px rgba(255,77,141,.12);
    max-height:52vh;overflow-y:auto;
    opacity:0;transition:opacity 1s ease,transform 1s ease;}
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    #paper{background:rgba(13,8,32,.8);}
  }
  #paper.show{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto;}
  #paperTitle{font-family:var(--serif);font-size:clamp(1rem,4.2vw,1.2rem);
    letter-spacing:.25em;color:var(--cgold);margin-bottom:.6em;
    text-shadow:0 0 10px rgba(232,200,154,.45);}
  #letterBox p{font-family:var(--serif);font-size:clamp(.95rem,4vw,1.15rem);
    line-height:2.2;letter-spacing:.15em;color:#f6ecdf;margin:0;}
  #letterBox span{opacity:0;display:inline-block;transform:translateY(4px);
    transition:opacity .4s ease,transform .4s ease;}
  #letterBox span.on{opacity:1;transform:translateY(0);}

  /* 第五幕 · 抉择 */
  #questionWrap{position:fixed;left:0;right:0;top:50%;text-align:center;opacity:0;visibility:hidden;
    transition:opacity .8s ease,visibility .8s ease;pointer-events:none;}
  #questionWrap.show{opacity:1;visibility:visible;}
  #questionText{font-family:var(--serif);font-size:clamp(1.4rem,6vw,3rem);
    letter-spacing:1em;transition:letter-spacing 1.6s cubic-bezier(.22,1,.36,1);
    color:#fff2e2;padding-left:1em; /* 抵消 letter-spacing 末位空隙 */
    text-shadow:0 0 12px rgba(255,77,141,.75),0 0 24px rgba(255,217,160,.6),0 0 4px rgba(255,255,255,.9);}
  #questionWrap.show #questionText{letter-spacing:.1em;padding-left:.1em;}
  #btnRow{margin-top:2.2em;display:flex;justify-content:center;gap:1.4em;align-items:center;}
  #yesBtn{padding:.95em 2.4em;min-height:52px;border:none;border-radius:999px;cursor:pointer;
    font-family:var(--sans);font-size:clamp(1.05rem,4.5vw,1.3rem);letter-spacing:.12em;font-weight:700;
    color:#3a0a1e;background:linear-gradient(135deg,#ff4d8d,#ffd9a0);
    box-shadow:0 0 24px rgba(255,77,141,.65),0 4px 16px rgba(0,0,0,.4);
    transition:transform .3s cubic-bezier(.34,1.56,.64,1);}
  #noBtn{padding:.7em 1.5em;min-height:44px;border-radius:999px;cursor:pointer;
    font-family:var(--sans);font-size:clamp(.85rem,3.6vw,1rem);letter-spacing:.1em;
    color:rgba(255,255,255,.65);background:transparent;border:1px solid rgba(255,255,255,.35);
    transition:transform .18s cubic-bezier(.34,1.56,.64,1),opacity .25s ease;}
  #taunt{position:fixed;z-index:11;font-family:var(--sans);
    font-size:clamp(.85rem,3.6vw,1rem);color:var(--cgold);letter-spacing:.08em;
    text-shadow:0 0 10px rgba(232,200,154,.6);opacity:0;pointer-events:none;white-space:nowrap;}
  #taunt.show{animation:tauntFade 1.5s ease forwards;}
  @keyframes tauntFade{0%{opacity:0;transform:translateY(6px)}18%{opacity:1;transform:translateY(0)}
    75%{opacity:1}100%{opacity:0;transform:translateY(-6px)}}

  /* 第六幕 · 终章（避开上方星座区域） */
  #endingWrap{position:fixed;left:0;right:0;top:58%;text-align:center;opacity:0;
    transition:opacity 1.2s ease;pointer-events:none;}
  #endingWrap.show{opacity:1;}
  /* 大字：金→粉→金流光。渐变裁剪放在每个 .edChar 自身（Blink 下 background-clip:text
     元素若有带 transform 的子孙会裁剪失效导致文字消失，故不放在 #endingText 上） */
  #endingText{font-family:var(--serif);font-size:clamp(1.6rem,7vw,3.4rem);letter-spacing:.3em;
    padding-left:.3em;font-weight:700;
    filter:drop-shadow(0 0 14px rgba(255,182,150,.55));}
  @keyframes endShine{from{background-position:0% 50%;}to{background-position:200% 50%;}}
  /* 逐字弹入：scale 1.4→1 + fade，每字 stagger 120ms（延迟由 JS 内联，仅作用于 charPop） */
  .edChar{display:inline-block;opacity:0;
    background:linear-gradient(120deg,#ffd9a0,#ff8fb3,#ffd9a0);
    background-size:200% 100%;
    -webkit-background-clip:text;background-clip:text;color:transparent;}
  #endingWrap.show .edChar{animation:charPop .6s cubic-bezier(.34,1.56,.64,1) both,endShine 7s linear infinite;}
  @keyframes charPop{from{opacity:0;transform:scale(1.4);}to{opacity:1;transform:scale(1);}}
  body.reduced #endingWrap.show .edChar{animation:endShine 7s linear infinite;opacity:1;transform:none;} /* REDUCED：直接完整显示，保留流光 */
  #dateLine{margin-top:1.2em;font-family:var(--serif);font-size:clamp(.85rem,3.6vw,1.05rem);
    letter-spacing:.3em;color:var(--cgold);
    text-shadow:0 1px 3px rgba(0,0,0,.7),0 0 10px rgba(232,200,154,.5);} /* 深色描边兜底：孔明灯穿行时仍可读 */
  /* 窄屏：压缩落款字号字距，保住时间线「两条一行」不折行 */
  @media (max-width:380px){ #dateLine{font-size:.8rem;letter-spacing:.12em;} }
  /* 矮屏：终章整体略上移，避免与「再看一遍」按钮压字 */
  @media (max-height:620px){ #endingWrap{top:54%;} #dateLine{margin-top:.8em;} }

  /* 内联 SVG 图标：em 尺寸随文字排版，vertical-align 对齐基线 */
  .btnIcon{width:1em;height:1em;vertical-align:-.12em;margin-left:.25em;overflow:visible;}
  #replayBtn .btnIcon{width:.9em;height:.9em;vertical-align:-.08em;}

  /* 花瓣（SVG 矢量，尺寸由 span 的 font-size 控制） */
  .petal{position:fixed;top:-6vh;z-index:9;pointer-events:none;animation:petalFall linear infinite;}
  .petal svg{display:block;width:1em;height:1em;overflow:visible;}
  @keyframes petalFall{
    0%{transform:translate(0,-8vh) rotate(0deg);opacity:0;}
    8%{opacity:.9;}
    25%{transform:translate(4vw,24vh) rotate(100deg);}
    50%{transform:translate(-3vw,52vh) rotate(200deg);}
    75%{transform:translate(3vw,78vh) rotate(290deg);opacity:.85;}
    100%{transform:translate(-1vw,110vh) rotate(380deg);opacity:0;}
  }

  /* 开场彩蛋副标题（特殊日期才出现） */
  #introSub{position:fixed;left:0;right:0;top:41%;text-align:center;
    font-family:var(--serif);font-size:clamp(.8rem,3.4vw,1rem);letter-spacing:.2em;
    color:rgba(255,217,160,.9);opacity:0;transition:opacity 2s ease;
    text-shadow:0 0 10px rgba(255,217,160,.5);}
  #introSub.show{opacity:.9;}

  /* 终章时间轴逐行点亮 */
  #dateLine div{opacity:0;transform:translateY(6px);transition:opacity .8s ease,transform .8s ease;}
  #dateLine div.lit{opacity:1;transform:translateY(0);}
  .timerLine{font-variant-numeric:tabular-nums;} /* 等宽数字，逐秒跳动不抖行 */

  /* 许愿孔明灯 */
  #lanternLayer{position:fixed;inset:0;z-index:6;pointer-events:none;overflow:hidden;}
  .lantern{position:fixed;bottom:-18vh;pointer-events:none;will-change:transform,opacity;
    animation:lanternUp 14s linear forwards;}
  @keyframes lanternUp{
    0%{transform:translate(0,0);opacity:0;}
    6%{opacity:1;}
    25%{transform:translate(2vw,-32vh);}
    50%{transform:translate(-2vw,-62vh);}
    75%{transform:translate(1.5vw,-90vh);opacity:1;}
    100%{transform:translate(0,-118vh);opacity:0;}
  }
  .lamp{width:34px;height:44px;margin:0 auto;position:relative;cursor:pointer;pointer-events:auto;
    border-radius:45% 45% 38% 38%/52% 52% 44% 44%;
    background:linear-gradient(180deg,#ffdf9e 0%,#ffb45e 55%,#ff8a3c 100%);
    box-shadow:0 0 18px rgba(255,180,90,.55),0 6px 14px rgba(255,140,60,.3);}
  .lamp::after{content:'';position:absolute;left:20%;right:20%;bottom:-3px;height:6px;border-radius:50%;
    background:rgba(255,240,200,.85);filter:blur(2px);} /* 底部微光 */
  .flame{position:absolute;left:50%;bottom:6px;width:8px;height:12px;transform:translateX(-50%);
    border-radius:50% 50% 50% 50%/60% 60% 40% 40%;
    background:radial-gradient(circle at 50% 40%,#fff6d8,#ffc24d 65%,rgba(255,150,50,0));
    animation:flick .28s ease-in-out infinite alternate;} /* 烛光摇曳 */
  @keyframes flick{from{opacity:.65;transform:translateX(-50%) scale(.9);}to{opacity:1;transform:translateX(-50%) scale(1.12);}}
  .lanternText{margin-top:8px;text-align:center;font-family:var(--serif);
    font-size:12px;letter-spacing:.15em;color:#ffe9c9;white-space:nowrap;
    text-shadow:0 0 8px rgba(0,0,0,.85),0 0 12px rgba(255,180,100,.5);}

  /* 「再看一遍」幽灵按钮（终章尾声） */
  #replayBtn{position:fixed;left:50%;bottom:calc(max(18px,env(safe-area-inset-bottom)) + 10px);
    transform:translateX(-50%);display:none;padding:.5em 1.4em;min-height:40px;border-radius:999px;cursor:pointer;
    font-family:var(--sans);font-size:clamp(.8rem,3.2vw,.95rem);letter-spacing:.15em;
    color:rgba(255,233,201,.7);background:rgba(255,217,160,.05);border:1px solid rgba(255,217,160,.3);
    opacity:0;transition:opacity 1.5s ease;}
  #replayBtn.show{opacity:1;}
  #replayBtn:active{transform:translateX(-50%) scale(.96);}

  /* 静音开关（内联 SVG：音符+月牙复合图标，两态过渡 0.3s） */
  #muteBtn{position:fixed;z-index:12;top:max(14px,env(safe-area-inset-top));right:max(14px,env(safe-area-inset-right));
    width:42px;height:42px;border-radius:50%;cursor:pointer;border:1px solid rgba(255,217,160,.3);
    background:rgba(13,8,32,.4);display:flex;align-items:center;justify-content:center;
    transition:opacity .3s ease;}
  #muteBtn svg{width:30px;height:30px;display:block;overflow:visible;}
  #muteBtn .mbIcon,#muteBtn .mbHaloC{opacity:.96;transition:opacity .3s ease;}
  #muteBtn.muted .mbIcon{opacity:.35;}
  #muteBtn.muted .mbHaloC{opacity:.2;}
  /* 播放中：2~3 圈细腻音波涟漪缓慢扩散淡出（纯 CSS，REDUCED 不动）
     仅 BGM 真实启动后（audio.js startBGM 给按钮加 .playing）才扩散，解锁前/audioOn:false 时不误示"正在出声" */
  #muteBtn .mbRing{fill:none;stroke:rgba(255,217,160,.8);stroke-width:1;opacity:0;
    transform-box:fill-box;transform-origin:center;}
  #muteBtn.playing .mbRing{animation:mbRipple 3.6s linear infinite;}
  #muteBtn.playing .mbRing.r2{animation-delay:1.2s;}
  #muteBtn.playing .mbRing.r3{animation-delay:2.4s;}
  @keyframes mbRipple{0%{transform:scale(.7);opacity:0}14%{opacity:.5}100%{transform:scale(2);opacity:0}}
  #muteBtn.muted .mbRing{animation:none;opacity:0;transition:opacity .3s ease;}
  /* 静音：一道优雅斜杠淡入 */
  #muteBtn .mbSlash{stroke:rgba(255,244,228,.8);stroke-width:3;stroke-linecap:round;
    opacity:0;transition:opacity .3s ease;}
  #muteBtn.muted .mbSlash{opacity:1;}
  @media (prefers-reduced-motion:reduce){ #muteBtn .mbRing{animation:none;opacity:0;} }
  body.reduced #muteBtn .mbRing{animation:none;opacity:0;}

  /* 转场白闪 */
  #flash{position:fixed;inset:0;z-index:15;pointer-events:none;opacity:0;
    background:radial-gradient(circle at 50% 48%,#fff 0%,rgba(255,255,255,.75) 45%,rgba(255,255,255,.4) 100%);}

  /* 胶片颗粒 + 暗角 */
  #grain{position:fixed;inset:0;z-index:20;pointer-events:none;}

  /* 星爆震屏 */
  .shake{animation:shakeAnim .3s linear;}
  @keyframes shakeAnim{
    0%{transform:translate(0,0)}15%{transform:translate(5px,-4px)}30%{transform:translate(-6px,3px)}
    45%{transform:translate(4px,5px)}60%{transform:translate(-4px,-5px)}
    75%{transform:translate(5px,2px)}90%{transform:translate(-2px,3px)}100%{transform:translate(0,0)}
  }

  /* 时光轴之旅（新幕）：路径光点画在 mid 画布，站台文字在此层 */
  #timelineWrap{position:fixed;inset:0;z-index:8;pointer-events:none;opacity:0;transition:opacity 1s ease;}
  #timelineWrap.show{opacity:1;}
  .tlStation{position:fixed;text-align:center;transform:translate(-50%,10px);
    opacity:0;transition:opacity .9s ease,transform .9s ease;
    font-family:var(--serif);color:#fff;}
  .tlStation.lit{opacity:1;transform:translate(-50%,0);}
  .tlStation.side{text-align:left;transform:translate(10px,-50%);} /* 移动端竖排：文字在光点右侧 */
  .tlStation.side.lit{transform:translate(0,-50%);}
  .tlDate{font-size:clamp(.7rem,2.8vw,.85rem);letter-spacing:.15em;color:rgba(255,233,201,.75);}
  .tlTitle{font-size:clamp(1.05rem,4.4vw,1.35rem);letter-spacing:.3em;color:var(--cgold);
    margin:.15em 0 .1em;text-shadow:0 0 12px rgba(232,200,154,.6);}
  .tlSub{font-size:clamp(.75rem,3vw,.9rem);letter-spacing:.12em;color:rgba(246,236,223,.8);
    text-shadow:0 1px 3px rgba(0,0,0,.6);}

  /* 「爱你的理由」理由星（终章互动）：DOM 星点 + 复用单卡片 */
  #reasonLayer{position:fixed;inset:0;z-index:9;pointer-events:none;}
  .rStar{position:fixed;width:44px;height:44px;margin:-22px 0 0 -22px;  /* 点击热区 ≥40px */
    pointer-events:auto;cursor:pointer;background:transparent;border:none;padding:0;}
  .rStar i{position:absolute;left:50%;top:50%;width:18px;height:18px;margin:-9px 0 0 -9px;
    border-radius:50%;display:block;
    background:radial-gradient(circle,#fff6e6 0%,#ffd9a0 42%,rgba(255,143,179,.55) 72%,rgba(255,143,179,0) 100%);
    animation:rStarBreath 2.8s ease-in-out infinite;}    /* 缓慢闪烁呼吸 */
  .rStar::before{content:'';position:absolute;left:50%;top:50%;width:28px;height:28px;margin:-14px 0 0 -14px;
    border-radius:50%;border:1px solid rgba(255,217,160,.9);opacity:.35;} /* 常显细金环："可点"签名，与背景星区分 */
  .rStar.read::before{opacity:.12;}
  .rStar.read i{opacity:.28;animation:none;}             /* 已读变暗 */
  @keyframes rStarBreath{0%,100%{transform:scale(.85);opacity:.65}50%{transform:scale(1.18);opacity:1}}
  .rStar::after{content:'';position:absolute;left:50%;top:50%;width:14px;height:14px;margin:-7px 0 0 -7px;
    border-radius:50%;border:1px solid rgba(255,217,160,.9);opacity:0;transform:scale(.5);}
  .rStar.bloom::after{animation:rBloom .8s ease-out forwards;} /* 点击小光环绽放 */
  @keyframes rBloom{0%{opacity:.9;transform:scale(.5)}100%{opacity:0;transform:scale(3.2)}}
  #reasonCard{position:fixed;z-index:11;max-width:240px;padding:.7em 1em;border-radius:12px;pointer-events:none;
    font-family:var(--serif);font-size:clamp(.85rem,3.4vw,1rem);line-height:1.7;letter-spacing:.1em;color:#fff2e2;
    background:rgba(20,12,36,.55);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
    border:1px solid rgba(255,217,160,.55);
    box-shadow:0 4px 18px rgba(0,0,0,.4),0 0 14px rgba(255,217,160,.18);
    opacity:0;transform:translateY(6px);transition:opacity .5s ease,transform .5s ease;}
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    #reasonCard{background:rgba(20,12,36,.85);}
  }
  #reasonCard.show{opacity:1;transform:translateY(0);}
  body.reduced .rStar i{animation:none;opacity:.9;}      /* REDUCED：星星静态 */
  body.reduced .rStar.bloom::after{animation:none;}
  body.reduced #reasonCard{transition:none;transform:none;}
  @media (prefers-reduced-motion:reduce){
    .rStar i{animation:none;opacity:.9;}
    .rStar.bloom::after{animation:none;}
    #reasonCard{transition:none;transform:none;}
  }

  /* 「我们的故事」进度条（TIMELINE 幕第四站后浮现，随时光轴一起淡出） */
  #storyProg{position:fixed;left:50%;transform:translateX(-50%);width:52vw;max-width:640px;
    opacity:0;transition:opacity .8s ease;pointer-events:none;font-family:var(--serif);}
  #storyProg.show{opacity:1;}
  #storyProg .spTrack{position:relative;height:4px;border-radius:2px;
    background:rgba(232,200,154,.18);box-shadow:0 0 8px rgba(232,200,154,.15);}
  #storyProg .spFill{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:2px;
    background:linear-gradient(90deg,rgba(255,217,160,.25),#ffd9a0);
    transition:width 2s cubic-bezier(.22,1,.36,1);}      /* 光带随光点同步生长 */
  #storyProg .spDot{position:absolute;top:50%;left:0;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;
    background:radial-gradient(circle,#fff6e6,#ffd9a0 60%,rgba(255,217,160,0));
    box-shadow:0 0 10px rgba(255,217,160,.85),0 0 22px rgba(255,217,160,.4);
    transition:left 2s cubic-bezier(.22,1,.36,1);}       /* 光点 2s 缓动滑到当前进度 */
  #storyProg .spLabels{display:flex;justify-content:space-between;margin-top:.5em;
    font-size:clamp(.7rem,2.8vw,.85rem);letter-spacing:.15em;color:rgba(255,233,201,.75);}
  #storyProg .spText{margin-top:.6em;text-align:center;font-size:clamp(.8rem,3.2vw,.95rem);
    letter-spacing:.12em;color:var(--cgold);text-shadow:0 0 10px rgba(232,200,154,.5);
    opacity:0;transition:opacity .8s ease;}
  #storyProg .spText.show{opacity:1;}
  @media (max-width:768px){ #storyProg{width:78vw;} }
  body.reduced #storyProg .spFill,body.reduced #storyProg .spDot{transition:none;} /* REDUCED：光点直接出现在终位 */
  @media (prefers-reduced-motion:reduce){ #storyProg .spFill,#storyProg .spDot{transition:none;} }

  /* 长按彩蛋提示（终章 6s 后没人长按过才出现一次；#taunt 同款气质，0.52H 避开理由星区与落款） */
  #chargeHint{position:fixed;left:0;right:0;top:52%;text-align:center;z-index:11;pointer-events:none;
    font-family:var(--sans);font-size:clamp(.85rem,3.6vw,1rem);color:var(--cgold);letter-spacing:.08em;
    text-shadow:0 0 10px rgba(232,200,154,.6);opacity:0;}
  #chargeHint.show{animation:chargeHintFade 4.5s ease forwards;}
  @keyframes chargeHintFade{0%{opacity:0;transform:translateY(6px)}12%{opacity:.9;transform:translateY(0)}
    78%{opacity:.9}100%{opacity:0;transform:translateY(-6px)}}
  body.reduced #chargeHint{transition:opacity 1s ease;}
  body.reduced #chargeHint.show{animation:none;opacity:.9;} /* REDUCED：纯 opacity 淡入，JS 兜底移除 */
  @media (prefers-reduced-motion:reduce){
    #chargeHint{transition:opacity 1s ease;}
    #chargeHint.show{animation:none;opacity:.9;}
  }

  /* 署名花体飞白曲线（终章落款下方，SVG 描边动画在 JS 内联触发） */
  .sigFlourish{display:block;margin:.15em auto 0;overflow:visible;}
  .sigFlourish .sfCurve{fill:none;stroke-width:2;stroke-linecap:round;}
  .sigFlourish .sfStar{opacity:0;transform-box:fill-box;transform-origin:center;}
  .sigFlourish .sfStar.on{animation:sfStarFlash .9s ease-out forwards;} /* 末端小星芒闪一下 */
  @keyframes sfStarFlash{0%{opacity:0;transform:scale(.4)}30%{opacity:1;transform:scale(1.2)}100%{opacity:.85;transform:scale(1)}}
  body.reduced .sigFlourish .sfStar.on{animation:none;opacity:.85;}
  @media (prefers-reduced-motion:reduce){ .sigFlourish .sfStar.on{animation:none;opacity:.85;} }

  /* 减少动态偏好：布局微调 */
  body.reduced #questionWrap{top:auto;bottom:max(6vh,env(safe-area-inset-bottom));}
  body.reduced #paper{top:34%;max-height:34vh;overflow-y:auto;}
