/* 新年会LP スクロール演出（忘年会LPの bonenkai-fx.css から流用。ローダー・テープ・泡・ジョッキ型ボタンは新年会デザインに無いので削除済み） */

/* PCスクラブ */
@media (min-width: 769px) {
  /* サイト共通CSSの body{overflow-x:hidden} は body をスクロールコンテナ化するため、
     配下の position:sticky が一切効かなくなる（ピン留めがそのまま流れてしまう）。
     overflow-x:clip はスクロールコンテナを作らないので、横方向のクリップは維持したまま
     sticky が生きる。ここだけ差し替える */
  body.bkFxOn {
    overflow-x: clip;
  }

  body.bkFxOn .bkFxScrub {
    opacity: 1;
    transition: none !important;
  }

  body.bkFxOn .shinnenkaiMv__slider,
  body.bkFxOn .shinnenkaiMv__inner {
    will-change: transform, opacity;
  }

  body.bkFxOn .bkFxPin--points {
    height: calc(100vh + 2200px);
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
    /* 上はサイト共通ヘッダー（常時約55px）、下はページネーションドットのぶんを空ける */
    padding: 60px 0 44px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__inner {
    width: 100%;
    max-width: none;
  }

  body.bkFxOn .bkFxTrack {
    display: flex;
    gap: 34px;
    width: max-content;
    /* カード幅は画面幅に追従（低い画面では下のmax-heightタイヤが上書き） */
    padding: 0 calc((100vw - min(41vw, 740px)) / 2);
    will-change: transform;
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    box-sizing: border-box;
    flex: 0 0 min(41vw, 740px);
    width: min(41vw, 740px);
    margin-top: 70px;
    /* カードは全て同じ高さ（flexのstretch）になるため、内容の少ないカードで
       下に空白が溜まらないよう、「画像＋テキスト」のまとまりを残り空間の上下中央に置く */
    display: flex;
    flex-direction: column;
  }

  /* 余った縦空間の配り方:
     以前は space-evenly で「ラベル・画像・テキスト」の全要素間に均等配分していたが、
     それだと内容の少ないカード(POINT1・2は画像が横長で低い)ほど先頭の POINT ラベルまで
     押し下げられ、カードごとにラベルの高さが揃わなかった。
     → ラベルはカード上端に固定し(flex-start)、「画像＋テキスト(＋ボタン)」のまとまりだけを
       上下の auto マージンで残り空間の中央に置く。ラベル位置は全カードで同じになる */
  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    justify-content: flex-start;
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__boxImg {
    margin-top: auto;
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box > :last-child {
    margin-bottom: auto;
  }

  /* ビンゴカードのボタンを小さくして全カード共通の高さを下げ、
     その分カード（＝画像）を大きく表示できるようにする */
  body.bkFxOn .bkFxTrack .shinnenkaiPoints__btn {
    width: 260px;
    height: 44px;
    font-size: 14px;
    margin-top: 12px;
  }

  body.bkFxOn .bkFxDots {
    position: absolute;
    left: 50%;
    bottom: 30px;
    display: flex;
    gap: 10px;
    transform: translateX(-50%);
  }

  body.bkFxOn .bkFxDots i {
    width: 11px;
    height: 11px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .4);
    transition: background-color .25s, transform .25s;
  }

  body.bkFxOn .bkFxDots i.on {
    background: #FFF;
    transform: scale(1.35);
  }

  /* お客様の声はピン留めせず通常の縦並び。1枚ずつ下から迫り上がるだけ */
  body.bkFxOn .shinnenkaiVoice__box {
    will-change: transform, opacity;
  }

  body.bkFxOn .bkFxPin--fullset {
    height: calc(100vh + 1600px);
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
    /* サイト共通ヘッダーに隠れないよう上を空ける。左右はカードが画面端に付かないよう20px */
    padding: 60px 20px 0;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__pointsItem {
    will-change: transform, opacity;
  }

  body.bkFxOn .bkFxDone {
    /* サイズは参照LP（shinnenkai_test）の __closing に合わせる */
    margin: min(2.9vw, 55px) 0 0;
    color: #E8380D;
    font-family: inherit;
    font-size: clamp(28px, 2.6vw, 50px);
    font-weight: 900;
    text-align: center;
    opacity: 0;
    transform: translateY(10px) scale(.9);
    transition: opacity .35s, transform .45s cubic-bezier(.3, 1.5, .5, 1);
  }

  body.bkFxOn .bkFxDone.show {
    opacity: 1;
    transform: none;
  }

  body.bkFxOn .shinnenkaiGift__bnrs {
    perspective: 1100px;
  }

  body.bkFxOn .shinnenkaiGift__bnr {
    backface-visibility: hidden;
    transform-origin: 50% 100%;
    will-change: transform, opacity;
  }

  /* 法人: ポイントと同じピン留め＋横パン */
  body.bkFxOn .bkFxPin--hojin {
    height: calc(100vh + 900px);
  }

  body.bkFxOn .bkFxPin--hojin .shinnenkaiHojin {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
    /* サイト共通ヘッダーに隠れないよう上を空ける */
    padding: 60px 0 0;
  }

  body.bkFxOn .shinnenkaiHojin__pic {
    will-change: transform, opacity;
  }

  /* リード文はMV直下の通常フローのまま（ピンのスペーサーはFV下部に白い空洞を作るので廃止）。
     MV側の強パララックス（JS）で「写真の上にせり上がってくる」見え方を作る。
     影は乗り上がりの境界を強調する */
  body.bkFxOn .shinnenkaiLead {
    position: relative;
    z-index: 2;
    box-shadow: 0 -16px 36px rgba(0, 0, 0, .10);
  }

  /* 特典: ピン留めして6枚がめくれ終わるまで進ませない */
  body.bkFxOn .bkFxPin--gift {
    /* 特典6枚が立ちきった後、大入袋が弾けて落ちる間（約3秒）を見せる余白を足している */
    height: calc(100vh + 1300px);
  }

  body.bkFxOn .bkFxPin--gift .shinnenkaiGift {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
    /* サイト共通ヘッダーに隠れないよう上を空ける */
    padding: 60px 20px 0;
  }

  /* 低い画面（14インチノート等）対策：
     justify-content:center はコンテンツが100vhからあふれると上下両方に切れて
     タイトルが欠けるため、「収まる時は上下センター・あふれた時は上寄せ」になる
     上下autoマージン方式にする */
  body.bkFxOn .bkFxPin--points .shinnenkaiPoints,
  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet,
  body.bkFxOn .bkFxPin--gift .shinnenkaiGift,
  body.bkFxOn .bkFxPin--hojin .shinnenkaiHojin {
    justify-content: flex-start;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__inner,
  body.bkFxOn .bkFxPin--gift .shinnenkaiGift__inner,
  body.bkFxOn .bkFxPin--hojin .shinnenkaiHojin__inner {
    margin-top: auto;
    margin-bottom: auto;
  }

  /* フルセットは末尾の「これ、ぜんぶ入ってます。」ごと上下センターに */
  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__inner {
    margin-top: auto;
  }

  body.bkFxOn .bkFxPin--fullset .bkFxDone {
    margin-bottom: auto;
  }
}

/* フルHDノート等（高さ911〜1150px）: 幅広画面ではコンテンツが大きくなりすぎて
   100vhからはみ出す（ポイントはカードがドットに被る）ため、一段コンパクトにする */
@media (min-width: 769px) and (max-height: 1150px) {
  body.bkFxOn .bkFxTrack {
    padding: 0 calc((100vw - 650px) / 2);
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    flex-basis: 650px;
    width: 650px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__ttl {
    max-width: 560px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__ttl {
    max-width: 800px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__points {
    max-width: 1200px;
    margin-top: 40px;
  }

  body.bkFxOn .bkFxPin--fullset .bkFxDone {
    margin-top: 16px;
    font-size: clamp(24px, 1.8vw, 36px);
  }
}

/* 高さ911〜970px: カードをもう一段縮小（本文も行数が増えないよう16px固定） */
@media (min-width: 769px) and (max-height: 970px) {
  body.bkFxOn .bkFxTrack {
    padding: 0 calc((100vw - 590px) / 2);
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    flex-basis: 590px;
    width: 590px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__ttl {
    max-width: 500px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__txt {
    font-size: 16px;
  }

  /* タイトル3行化(ttl_fullset差し替え)対応: この帯域はフルセットの縮小指定が無く、
     800px幅のままだと画像高さ224pxで「これ、ぜんぶ入ってます。」が100vhから切れる。
     旧2行画像と同等の高さ(≒180px)になる幅まで縮める */
  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__ttl {
    max-width: 640px;
  }
}

/* 高さの低い画面ではコンテンツを縮小して「100vh−ヘッダー60px」に収める */
@media (min-width: 769px) and (max-height: 910px) {
  /* 画像の高さ制限は使わず、カード幅を画面の高さに連動させて100vh内に収める */
  body.bkFxOn .bkFxTrack {
    --bkCardW: min(650px, calc((100vh - 545px) * 1.6 + 96px));
    padding: 0 calc((100vw - var(--bkCardW)) / 2);
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    flex-basis: var(--bkCardW);
    width: var(--bkCardW);
    margin-top: 60px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__ttl {
    max-width: 450px;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__txt {
    font-size: 16px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__ttl {
    max-width: 540px;
  }

  /* 番号バッジはカード上端から45pxはみ出すため、リード文との間隔は55px以上を確保する。
     カード枠は参照LPと同じ幅まで広げ、写真の高さは固定して100vh内に収める */
  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__points {
    max-width: 1200px;
    margin-top: 55px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__pointsPic img {
    display: block;
    width: auto;
    max-width: 100%;
    max-height: 250px;
    margin: 0 auto;
  }

  body.bkFxOn .bkFxPin--fullset .bkFxDone {
    /* タイトル3行化(ttl_fullset差し替え)後、8pxではカードと密着して見えるため拡大 */
    margin-top: 18px;
    font-size: 20px;
  }

  /* 贈り物: 内側を広げず、圧縮＋下余白でバナー最下段が帯と重ならないようにする */
  body.bkFxOn .bkFxPin--gift .shinnenkaiGift__inner {
    max-width: 1000px;
  }

  body.bkFxOn .bkFxPin--gift .shinnenkaiGift {
    padding-bottom: 30px;
  }

  body.bkFxOn .bkFxPin--gift .shinnenkaiGift__ttl {
    max-width: 600px;
  }

  body.bkFxOn .bkFxPin--gift .shinnenkaiGift__bnrs {
    margin-top: 40px;
  }
}

@media (min-width: 769px) and (max-height: 800px) {
  /* ポイントは 910px 以下タイヤの高さ連動カード幅で収まるため、個別指定なし */

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__ttl {
    /* 3行画像(2128x596)は450px幅だとh=126pxで窮屈。旧2行時代と同等の高さに抑える */
    max-width: 400px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__points {
    max-width: 1200px;
    margin-top: 55px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__pointsPic img {
    display: block;
    width: auto;
    max-width: 100%;
    max-height: 200px;
    margin: 0 auto;
  }

  /* 贈り物の圧縮は 910px 以下タイヤ側で適用済み */
}

/* さらに低い画面ではピン留め演出そのものを無効化し、
   通常の縦積みレイアウトで表示する（どの高さでもコンテンツが切れない保険） */
@media (min-width: 769px) and (max-height: 719px) {
  body.bkFxOn .bkFxPin {
    height: auto;
  }

  body.bkFxOn .bkFxPin .shinnenkaiPoints,
  body.bkFxOn .bkFxPin .shinnenkaiFullSet,
  body.bkFxOn .bkFxPin .shinnenkaiGift,
  body.bkFxOn .bkFxPin .shinnenkaiHojin {
    position: static;
    height: auto;
    display: block;
    overflow: visible;
    padding: 70px 20px;
  }

  body.bkFxOn .bkFxPin .shinnenkaiPoints__inner {
    max-width: 1000px;
    margin: 0 auto;
  }

  body.bkFxOn .bkFxPin--points .shinnenkaiPoints__ttl {
    max-width: 608px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__ttl {
    max-width: 690px;
  }

  body.bkFxOn .bkFxPin--fullset .shinnenkaiFullSet__points {
    max-width: 1000px;
    margin-top: 70px;
  }

  body.bkFxOn .bkFxTrack {
    display: block;
    width: auto;
    padding: 0;
    margin: 0;
    transform: none !important;
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    width: auto;
    flex: none;
    margin-top: 70px;
  }

  /* 静的表示ではボタンを通常サイズに戻す（縮小はピン留め表示専用） */
  body.bkFxOn .bkFxTrack .shinnenkaiPoints__btn {
    width: 320px;
    height: 60px;
    font-size: 16px;
    margin-top: 20px;
  }

  body.bkFxOn .bkFxDots {
    display: none;
  }

  /* ピン留め無効時も「これ、ぜんぶ入ってます。」は常時表示する */
  body.bkFxOn .bkFxDone {
    opacity: 1;
    transform: none;
  }

  body.bkFxOn .bkFxPin .bkFxScrub {
    opacity: 1 !important;
    transform: none !important;
  }
}

/* PCで初期化後にSP幅へ変えた場合も既存レイアウトへ戻す */
@media (max-width: 768px) {
  body.bkFxOn .bkFxPin {
    height: auto;
  }

  body.bkFxOn .bkFxPin .shinnenkaiPoints,
  body.bkFxOn .bkFxPin .shinnenkaiFullSet,
  body.bkFxOn .bkFxPin .shinnenkaiGift,
  body.bkFxOn .bkFxPin .shinnenkaiHojin {
    position: static;
    height: auto;
    display: block;
    overflow: visible;
  }

  body.bkFxOn .bkFxTrack {
    display: block;
    width: auto;
    padding: 0;
    transform: none !important;
  }

  body.bkFxOn .bkFxTrack .shinnenkaiPoints__box {
    width: auto;
    flex: none;
  }

  body.bkFxOn .bkFxDots,
  body.bkFxOn .bkFxDone {
    display: none;
  }

  body.bkFxOn .bkFxScrub {
    opacity: 1 !important;
    transform: none !important;
  }

  body.bkFxOn .shinnenkaiMv__slider,
  body.bkFxOn .shinnenkaiMv__inner {
    opacity: 1 !important;
    transform: none !important;
  }

  body.bkFxOn .shinnenkaiSec--dot {
    background-position: center top, left top !important;
  }

  body.bkFxOn .shinnenkaiSec--stripe {
    background-position: left top, right top !important;
  }
}

/* モーション軽減時はFAQを瞬時に開閉する */
@media (prefers-reduced-motion: reduce) {
  .shinnenkai .shinnenkaiFaq__dt + .shinnenkaiFaq__dd {
    display: none;
  }

  .shinnenkai .shinnenkaiFaq__dt.active + .shinnenkaiFaq__dd {
    display: block;
  }
}

/* FAQカードの高さアニメーション */
body.bkFxBase .shinnenkaiFaq__dl {
  height: var(--bkH, auto);
  overflow: hidden;
  transition: height .5s cubic-bezier(.34, 1.56, .64, 1);
}

body.bkFxBase .shinnenkaiFaq__dd {
  display: block;
}

/* 獅子舞の「上へ」ボタン（Figma image 178：127×139）。
   右下に常に出し、最後のセクション（豆知識）の下端で止まる（位置は shinnenkai-fx.js で --stop を計算）。
   スクロールするまで非表示、少しスクロールしたら右からくるくる回って着地（.is-shown）、
   着地後は steps でカクカク踊らせ、下端に着いたら一度跳ね上がってピューっと落ち、ピタッと止まる（.is-landed） */
body.bkFxBase .shinnenkaiTop {
  position: fixed;
  right: 40px;
  bottom: 30px;
  z-index: 900;
  width: 127px;
  transform: translateY(var(--stop, 0px));
  visibility: hidden;
}

body.bkFxBase .shinnenkaiTop.is-shown {
  visibility: visible;
  animation: shinnenkaiShishimaiIn .9s both;
}

body.bkFxBase .shinnenkaiTop__img {
  display: block;
  width: 100%;
  height: auto;
  transform-origin: 50% 90%;
}

body.bkFxBase .shinnenkaiTop.is-shown .shinnenkaiTop__img {
  animation: shinnenkaiShishimai 1s steps(1) .9s infinite;
}

/* 共通のリンクhover（半透明）を打ち消す */
body.bkFxBase .shinnenkaiTop:hover {
  opacity: 1;
}

body.bkFxBase .shinnenkaiTop.is-landed .shinnenkaiTop__img {
  animation: shinnenkaiShishimaiDrop .7s both;
}

@keyframes shinnenkaiShishimaiIn {
  0% { translate: 240px -160px; rotate: 720deg; animation-timing-function: ease-in; }
  75% { translate: 0 0; rotate: 0deg; animation-timing-function: ease-out; }
  88% { translate: 0 -20px; animation-timing-function: ease-in; }
  100% { translate: 0 0; }
}

@keyframes shinnenkaiShishimaiDrop {
  0% { transform: translateY(0); animation-timing-function: ease-out; }
  30% { transform: translateY(-240px); animation-timing-function: cubic-bezier(.6, 0, 1, 1); }
  100% { transform: translateY(0); }
}

@keyframes shinnenkaiShishimai {
  0% { transform: rotate(-8deg); }
  25% { transform: translateY(-10px) rotate(6deg); }
  50% { transform: rotate(8deg); }
  75% { transform: translateY(-6px) rotate(-6deg); }
}

@media screen and (max-width: 768px) {
  body.bkFxBase .shinnenkaiTop {
    right: 8px;
    bottom: 12px;
    width: 73px;
  }
}

/* プリローダーのスクロールロック中もスクロールバーを出したままにする（scrollbar-gutter は overflow:hidden のルートに効かなかった）。
   html は縦スクロールバーを常時表示し、body を画面の高さで切ってスクロールできなくする。
   解除の瞬間にスクロールバーが現れてページ全体が15px左へずれる（カクッ）のを防ぐ */
html.nyp-lock {
  overflow-y: scroll !important;
}
html.nyp-lock body {
  overflow: hidden !important;
  height: 100vh;
}
/* サイト共通CSS（style.css の h2{border-bottom;padding-bottom}・body{font-weight:500}・p{line-height}）が
   プリローダーの中に漏れないように打ち消す（共有HTMLのデモと同じ見た目にする） */
.nyp {
  font-weight: 400;
}
.nyp .nyp__msg {
  padding: 0;
  border: 0;
  background: none;
}
.nyp .nyp__sub,
.nyp .nyp__year,
.nyp .nyp__skip,
.nyp .nyp__label,
.nyp .nyp__progress {
  line-height: normal;
}
/* プリローダー終了後に main に残るインラインの transform（拡大演出の残り）を無効化する。
   残ったままだと main の中の position:fixed（SPの絞り込み検索の固定バー・オーバーレイ）が画面ではなく main 基準になって壊れる */
.shinnenkai .shinnenkaiMain:not(.nyp-page) {
  transform: none !important;
}

/* =========================================================
   2026-10-26 ロード後の演出（MV・リードの日の出・新年会ならでは）
   ・プリローダー（初夢→雲が左右に晴れる）の直後に続く想定。body に .is-mvIn が付いたら MV のイラストが
     中央の白丸→タイトル→外側のイラストの順に入ってきて、その後はそれぞれがゆっくり動き続ける
   ・prefers-reduced-motion のときは body.bkFxBase が付かないので全部静止（最初から表示）
   ========================================================= */
@media (min-width: 0px) {
  /* ---------- 紙吹雪（JSが .shinnenkaiConfetti を作り、粒ごとに --x --w --h --dx --dur --delay --flip --rot を持たせる） ---------- */
  body.bkFxBase .shinnenkaiConfetti {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    pointer-events: none;
  }
  body.bkFxBase .shinnenkaiConfetti--left,
  body.bkFxBase .shinnenkaiConfetti--right {
    width: min(17.9vw, 344px);
  }
  body.bkFxBase .shinnenkaiConfetti--right {
    left: auto;
  }
  body.bkFxBase .shinnenkaiConfetti i {
    position: absolute;
    left: var(--x);
    top: -24px;
    width: var(--w);
    height: var(--h);
    border-radius: 2px;
    opacity: .92;
    will-change: translate, transform;
    animation: shinnenkaiConfettiFall var(--dur) linear var(--delay) infinite,
      shinnenkaiConfettiFlip var(--flip) ease-in-out var(--delay) infinite;
  }
  body.bkFxBase .shinnenkaiConfetti i.is-c0 { background: #fff; }
  body.bkFxBase .shinnenkaiConfetti i.is-c1 { background: #fed81f; }
  body.bkFxBase .shinnenkaiConfetti i.is-c2 { background: #f0542e; }
  body.bkFxBase .shinnenkaiConfetti i.is-c3 { background: #ffe8aa; }
  /* 黄色地の紙吹雪は赤・白・濃い黄色 */
  body.bkFxBase .shinnenkaiConfetti--washi i.is-c1 { background: #e5b800; }
  body.bkFxBase .shinnenkaiConfetti--washi i.is-c3 { background: #d22600; }
  @keyframes shinnenkaiConfettiFall {
    0% { translate: 0 0; rotate: 0deg; }
    100% { translate: var(--dx) var(--fall); rotate: var(--rot); }
  }
  @keyframes shinnenkaiConfettiFlip {
    0%, 100% { transform: rotateX(0) rotateY(0); }
    50% { transform: rotateX(180deg) rotateY(50deg); }
  }

  /* ---------- MV：入場（.is-mvIn が付くまでは隠す） ---------- */
  body.bkFxBase:not(.is-mvIn) .shinnenkaiMv__deco,
  body.bkFxBase:not(.is-mvIn) .shinnenkaiMv__circle,
  body.bkFxBase:not(.is-mvIn) .shinnenkaiMv__ttl,
  body.bkFxBase:not(.is-mvIn) .shinnenkaiMv__sub {
    opacity: 0;
  }
  body.bkFxBase .shinnenkaiMv__deco,
  body.bkFxBase .shinnenkaiMv__circle,
  body.bkFxBase .shinnenkaiMv__ttl {
    will-change: translate, scale, opacity;
  }
  /* 中央から外へ：白丸→タイトル→雲・波→富士→鷹→梅・松・椿・茄子→景品たち→小判 */
  body.is-mvIn .shinnenkaiMv__circle { animation: shinnenkaiMvSun 1s cubic-bezier(.2, .8, .3, 1.15) 0s both; }
  body.is-mvIn .shinnenkaiMv__ttl { animation: shinnenkaiMvPop 0.9s cubic-bezier(.34, 1.4, .64, 1) .35s both; }
  body.is-mvIn .shinnenkaiMv__sub { animation: shinnenkaiMvFadeUp .8s ease-out .85s both; }
  body.is-mvIn .shinnenkaiMv__deco--cloudGold { animation: shinnenkaiMvFromLeft 1.2s cubic-bezier(.2, .8, .2, 1) .1s both; }
  body.is-mvIn .shinnenkaiMv__deco--cloudGold2 { animation: shinnenkaiMvFromRight 1.2s cubic-bezier(.2, .8, .2, 1) .1s both, shinnenkaiMvDrift 9s ease-in-out 1.3s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--wave1 { animation: shinnenkaiMvWave 1.4s ease-out .2s both, shinnenkaiMvSpin 70s linear 1.6s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--wave2 { animation: shinnenkaiMvWave 1.4s ease-out .3s both, shinnenkaiMvSpin 90s linear 1.7s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--cloud1 { animation: shinnenkaiMvFromLeft 1.3s cubic-bezier(.2, .8, .2, 1) .45s both, shinnenkaiMvDrift 8s ease-in-out 1.75s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--cloud2 { animation: shinnenkaiMvFromRight 1.3s cubic-bezier(.2, .8, .2, 1) .5s both, shinnenkaiMvDrift 10s ease-in-out 1.8s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--cloud3 { animation: shinnenkaiMvFromLeft 1.3s cubic-bezier(.2, .8, .2, 1) .55s both, shinnenkaiMvDrift 11s ease-in-out 1.85s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--fuji { animation: shinnenkaiMvRise 1.1s cubic-bezier(.2, .8, .2, 1) .5s both; }
  body.is-mvIn .shinnenkaiMv__deco--hawk { animation: shinnenkaiMvFly 1.3s cubic-bezier(.2, .8, .2, 1) .7s both, shinnenkaiMvHover 3.6s ease-in-out 2s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--ume { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) .9s both, shinnenkaiMvBreath 5s ease-in-out 1.7s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--matsu { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1s both, shinnenkaiMvBreath 6s ease-in-out 1.8s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--tsubaki { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.05s both, shinnenkaiMvBreath 5.5s ease-in-out 1.85s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--nasu { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.1s both, shinnenkaiMvSwing 3.2s ease-in-out 1.9s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item05 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1s both, shinnenkaiMvFloat 4.2s ease-in-out 1.8s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item07 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.1s both, shinnenkaiMvFloat 4.8s ease-in-out 1.9s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--item02 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.2s both, shinnenkaiMvFloat 5.2s ease-in-out 2s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item06 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.3s both, shinnenkaiMvFloat 4.5s ease-in-out 2.1s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--item01 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.15s both, shinnenkaiMvFloat 4.6s ease-in-out 1.95s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item08 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.25s both, shinnenkaiMvFloat 5.4s ease-in-out 2.05s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--item04 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.35s both, shinnenkaiMvFloat 4s ease-in-out 2.15s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item03 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.3s both, shinnenkaiMvFloat 4.4s ease-in-out 2.1s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--item09 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.4s both, shinnenkaiMvFloat 4.9s ease-in-out 2.2s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--item10 { animation: shinnenkaiMvPop 0.8s cubic-bezier(.34, 1.56, .64, 1) 1.45s both, shinnenkaiMvFloat 4.3s ease-in-out 2.25s infinite reverse; }
  body.is-mvIn .shinnenkaiMv__deco--koban1 { animation: shinnenkaiMvCoin 1s cubic-bezier(.34, 1.56, .64, 1) 1.5s both, shinnenkaiMvWobble 3.4s ease-in-out 2.5s infinite; }
  body.is-mvIn .shinnenkaiMv__deco--koban2 { animation: shinnenkaiMvCoin 1s cubic-bezier(.34, 1.56, .64, 1) 1.6s both, shinnenkaiMvWobble 3.8s ease-in-out 2.6s infinite reverse; }

  /* プリローダーからの受け渡し（body.is-nypHand）：鷹・茄子・富士はローダーの絵がこの位置に収束して入れ替わるので、
     入場アニメを外して最初から定位置に置く。ゆらぎだけはローダー終了後（約2秒後）から */
  body.is-nypHand .shinnenkaiMv__deco--hawk,
  body.is-nypHand .shinnenkaiMv__deco--nasu,
  body.is-nypHand .shinnenkaiMv__deco--fuji {
    opacity: 1;
  }
  body.is-nypHand.is-mvIn .shinnenkaiMv__deco--fuji { animation: none; }
  body.is-nypHand.is-mvIn .shinnenkaiMv__deco--hawk { animation: shinnenkaiMvHover 3.6s ease-in-out 2.2s infinite; }
  body.is-nypHand.is-mvIn .shinnenkaiMv__deco--nasu { animation: shinnenkaiMvSwing 3.2s ease-in-out 2.2s infinite; }

  @keyframes shinnenkaiMvSun { 0% { opacity: 0; scale: .15; } 60% { opacity: 1; } 100% { opacity: 1; scale: 1; } }
  @keyframes shinnenkaiMvPop { 0% { opacity: 0; scale: .3; } 100% { opacity: 1; scale: 1; } }
  @keyframes shinnenkaiMvCoin { 0% { opacity: 0; scale: .3; rotate: -180deg; } 100% { opacity: 1; scale: 1; rotate: 0deg; } }
  @keyframes shinnenkaiMvFadeUp { 0% { opacity: 0; translate: 0 18px; } 100% { opacity: 1; translate: 0 0; } }
  @keyframes shinnenkaiMvRise { 0% { opacity: 0; translate: 0 40%; } 100% { opacity: 1; translate: 0 0; } }
  @keyframes shinnenkaiMvFromLeft { 0% { opacity: 0; translate: -40% 0; } 100% { opacity: 1; translate: 0 0; } }
  @keyframes shinnenkaiMvFromRight { 0% { opacity: 0; translate: 40% 0; } 100% { opacity: 1; translate: 0 0; } }
  @keyframes shinnenkaiMvWave { 0% { opacity: 0; scale: .6; rotate: -25deg; } 100% { opacity: 1; scale: 1; rotate: 0deg; } }
  @keyframes shinnenkaiMvFly { 0% { opacity: 0; translate: -70% -45%; rotate: -12deg; } 100% { opacity: 1; translate: 0 0; rotate: 0deg; } }
  /* 入場後の動き（translate/scale/rotate は入場と同じプロパティなので、入場が終わってから始める） */
  @keyframes shinnenkaiMvDrift { 0%, 100% { translate: 0 0; } 50% { translate: 2.5% 0; } }
  @keyframes shinnenkaiMvSpin { to { rotate: 360deg; } }
  @keyframes shinnenkaiMvHover { 0%, 100% { translate: 0 0; rotate: 0deg; } 30% { translate: 2% -6%; rotate: 3deg; } 65% { translate: -1% -2%; rotate: -2deg; } }
  @keyframes shinnenkaiMvBreath { 0%, 100% { scale: 1; } 50% { scale: 1.05; } }
  @keyframes shinnenkaiMvSwing { 0%, 100% { rotate: -5deg; } 50% { rotate: 5deg; } }
  @keyframes shinnenkaiMvFloat { 0%, 100% { translate: 0 0; } 50% { translate: 0 -5%; } }
  @keyframes shinnenkaiMvWobble { 0%, 100% { rotate: -8deg; scale: 1; } 50% { rotate: 8deg; scale: 1.06; } }

  /* ---------- リード：日の出が地平線の下からじわっと昇る＋後光 ---------- */
  body.bkFxBase .shinnenkaiFx--sunrise {
    position: relative;
    opacity: 1;
    transform: none;
    transition: none;
    /* 下だけ切って「地平線」にする。上と左右は後光のぶん広げる */
    clip-path: inset(-80% -60% 0 -60%);
  }
  body.bkFxBase .shinnenkaiFx--sunrise::before {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    z-index: -1;
    width: 220%;
    aspect-ratio: 1;
    translate: -50% -50%;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, .7) 0%, rgba(255, 246, 200, .35) 25%, rgba(254, 216, 31, 0) 48%);
    opacity: 0;
    transition: opacity 1.4s ease 2.2s;
  }
  /* 初回表示でMVと同じ画面に入っているときは、MVのイラストが出そろってから昇る */
  body.bkFxBase .shinnenkaiFx--sunrise img {
    transform: translateY(70%);
    transition: transform 1.9s cubic-bezier(.2, .7, .15, 1) 1.2s;
  }
  body.bkFxBase .shinnenkaiFx--sunrise.is-shown img {
    transform: none;
  }
  body.bkFxBase .shinnenkaiFx--sunrise.is-shown::before {
    opacity: 1;
    animation: shinnenkaiGlow 4s ease-in-out 2.4s infinite;
  }
  @keyframes shinnenkaiGlow { 0%, 100% { scale: 1; opacity: 1; } 50% { scale: 1.12; opacity: .7; } }
  /* 黄色帯の雲は左右にたなびき、青海波はゆっくり回る */
  body.bkFxBase .shinnenkaiWashi__deco--cloudR1 { animation: shinnenkaiMvDrift 9s ease-in-out infinite; }
  body.bkFxBase .shinnenkaiWashi__deco--cloudL1 { animation: shinnenkaiMvDrift 11s ease-in-out -4s infinite reverse; }
  body.bkFxBase .shinnenkaiWashi__deco--cloudR2 { animation: shinnenkaiMvDrift 10s ease-in-out -2s infinite; }
  body.bkFxBase .shinnenkaiWashi__deco--circleR { animation: shinnenkaiMvSpin 120s linear infinite; }
  body.bkFxBase .shinnenkaiWashi__deco--circleL { animation: shinnenkaiMvSpin 140s linear infinite reverse; }

  /* ---------- 新年会ならでは：カードが起き上がり、中身が順に出て、光が一度走る ---------- */
  body.bkFxBase .shinnenkaiShinnen__card {
    position: relative;
    overflow: hidden;
  }
  body.bkFxBase .shinnenkaiShinnen__card::after {
    content: "";
    position: absolute;
    top: -20%;
    left: -60%;
    width: 40%;
    height: 140%;
    background: linear-gradient(100deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, .55) 50%, rgba(255, 255, 255, 0) 100%);
    rotate: 12deg;
    pointer-events: none;
  }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown::after {
    animation: shinnenkaiShine 1.1s ease-in-out 1s 1 both;
  }
  @keyframes shinnenkaiShine { 0% { translate: 0 0; } 100% { translate: 400% 0; } }
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__cardTtl,
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__sub,
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__item,
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__btn {
    opacity: 0;
    transition: opacity .55s ease, translate .6s cubic-bezier(.2, .8, .2, 1), scale .6s cubic-bezier(.34, 1.56, .64, 1);
  }
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__cardTtl,
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__sub { translate: 0 14px; }
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__item { translate: -22px 0; }
  body.bkFxBase .shinnenkaiShinnen__card .shinnenkaiShinnen__btn { scale: .8; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__cardTtl,
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__sub,
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__item,
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__btn {
    opacity: 1;
    translate: 0 0;
    scale: 1;
  }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__cardTtl { transition-delay: .35s; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__sub { transition-delay: .45s; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__item:nth-child(1) { transition-delay: .55s; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__item:nth-child(2) { transition-delay: .67s; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__item:nth-child(3) { transition-delay: .79s; }
  body.bkFxBase .shinnenkaiShinnen__card.is-shown .shinnenkaiShinnen__btn { transition-delay: .95s; }
  /* アイコンはぽんと出たあと、ゆらゆら浮く */
  body.bkFxBase .shinnenkaiShinnen__icon.is-shown img { animation: shinnenkaiMvFloat 3.6s ease-in-out .6s infinite; }
  body.bkFxBase .shinnenkaiShinnen__card:nth-child(2) .shinnenkaiShinnen__icon.is-shown img { animation-duration: 4.2s; }
  body.bkFxBase .shinnenkaiShinnen__card:nth-child(3) .shinnenkaiShinnen__icon.is-shown img { animation-duration: 3.9s; animation-direction: reverse; }
  body.bkFxBase .shinnenkaiShinnen__card:nth-child(4) .shinnenkaiShinnen__icon.is-shown img { animation-duration: 4.5s; }
}
/* PCだけ：カード自体が手前に起き上がる（SPは横スクロールなので常時表示） */
@media (min-width: 769px) {
  body.bkFxBase .shinnenkaiShinnen__cards {
    perspective: 1100px;
  }
  body.bkFxBase .shinnenkaiShinnen__card.shinnenkaiFx {
    transform: rotateX(18deg) translateY(80px) scale(.94);
    transform-origin: 50% 100%;
    transition: opacity .7s ease, transform 1s cubic-bezier(.2, .8, .2, 1.05);
  }
  body.bkFxBase .shinnenkaiShinnen__card.shinnenkaiFx.is-shown {
    transform: none;
  }
  body.bkFxBase .shinnenkaiShinnen__cards .shinnenkaiShinnen__card:nth-child(2) { transition-delay: .13s; }
  body.bkFxBase .shinnenkaiShinnen__cards .shinnenkaiShinnen__card:nth-child(3) { transition-delay: .26s; }
  body.bkFxBase .shinnenkaiShinnen__cards .shinnenkaiShinnen__card:nth-child(4) { transition-delay: .39s; }
}

/* ---------- お年玉：特典6まで出たら、大入袋が上からバラバラ降ってきて、底で大きく跳ね返り、また元の位置に落ち着く ----------
   .is-burst はPCではピン留めの進みで、SPでは特典6枚目が見えたら shinnenkai-fx.js が付ける（戻すと消えて、もう一度再生）。
   translate は --m（回転）の外側に書いて、回転に関係なく真下に落とす。セクションは overflow:hidden なので上の外から入ってくる */
body.bkFxBase .shinnenkaiGift__bag {
  opacity: 0;
  will-change: transform;
}
body.bkFxBase .shinnenkaiGift.is-burst .shinnenkaiGift__bag {
  opacity: 1;
  animation: shinnenkaiBagRain 1.7s linear var(--d) both;
}
@keyframes shinnenkaiBagRain {
  0% { transform: translate(0, -110vh) var(--m); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  45% { transform: translate(0, 0) var(--m); animation-timing-function: cubic-bezier(0, .55, .45, 1); }
  66% { transform: translate(0, -28vh) var(--m) rotate(12deg); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  83% { transform: translate(0, 0) var(--m); animation-timing-function: cubic-bezier(0, .55, .45, 1); }
  92% { transform: translate(0, -7vh) var(--m) rotate(-4deg); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  100% { transform: translate(0, 0) var(--m); }
}
/* 偶数枚目は反対に傾いて跳ねる */
body.bkFxBase .shinnenkaiGift.is-burst .shinnenkaiGift__bag:nth-child(even) {
  animation-name: shinnenkaiBagRainB;
}
@keyframes shinnenkaiBagRainB {
  0% { transform: translate(0, -110vh) var(--m); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  45% { transform: translate(0, 0) var(--m); animation-timing-function: cubic-bezier(0, .55, .45, 1); }
  66% { transform: translate(0, -24vh) var(--m) rotate(-12deg); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  83% { transform: translate(0, 0) var(--m); animation-timing-function: cubic-bezier(0, .55, .45, 1); }
  92% { transform: translate(0, -6vh) var(--m) rotate(4deg); animation-timing-function: cubic-bezier(.45, 0, 1, .55); }
  100% { transform: translate(0, 0) var(--m); }
}
