/* ScrambleDeck 対戦画面スタイル。
   background の url() は「このCSSファイル(site/css/)」からの相対パスで解決されるため ../../public/ となる。
   一方、JS が img.src に入れる画像パスは「HTML(site/battle.html)」基準で ../public/ になる（js/battle.js の ASSET_BASE）。
   基準が別なので混同しないこと。 */

:root {
  --mine-color: #3aa0ff;                    /* 自分の枠線色（青） */
  --opponent-color: #e04b4b;                /* 相手の枠線色（赤） */
  --slot-bg: rgba(255, 255, 255, 0.08);     /* 空きスロットの薄い塗り */
  --slot-bg-hover: rgba(255, 255, 255, 0.30); /* ドロップ可能スロットのハイライト */
  --slot-bg-fill: #1c2b40;                  /* 召喚/セットスロット共通の単色背景（濃紺） */
  --text-dark: #3a2a1a;                     /* 枠上に置く暗色文字（コスト・名前・種族） */
  --text-light: #ffffff;                    /* 宝石上に置く白文字（ATK/HP） */
  --mana-green: #5fd06a;                    /* 緑マナの表示色（CARDSのcolor:"green"に対応） */
  --mana-white: #f2ecd8;                    /* 白マナの表示色（CARDSのcolor:"white"に対応） */
  --mana-red: #ff6b6b;                      /* 赤マナの表示色（CARDSのcolor:"red"に対応） */

  /* スロット1個分の基準サイズ。左側UI(HP/レベル/行動権・ターン数・マナ表示)や手札カードの幅・
     フォントサイズ・位置オフセットは全てこの変数からの倍率(calc)で決める。1箇所を変えれば
     連動して全て追従し、比率・位置がズレなくなる（2026-07-09、複数回のズレ不具合の対応）。
     手札(.hand-grid)と左側UI(.player-status/.turn-icon)はどちらも.fieldからposition:absoluteで
     「はみ出す」形にしたため（＝スロットとは構造上重なりようがない）、重なり回避のために
     過剰に縮める必要はない。
     幅と高さは別々に制約が違う（横5列・縦4段の盤面なので正方形ではない）ため、vminを使うと
     横に広いPC画面ではむしろ高さ側に足を引っ張られて不必要に小さくなってしまう
     （幅は余っているのに反映されない）。min(8.3vw, 20vh)として、幅・高さそれぞれの制約から
     計算したサイズのうち小さい方（＝はみ出さない方）を採用する。
     8.3vwは上限162pxにPC幅1900px前後でちょうど到達する値（それより手前の7.5vwに一時下げた際、
     上限到達に2160px前後必要になり、通常のPCウィンドウ幅では上限に届かず盤面が小さく・
     余白が増えて見える不具合が出たため戻した）。

     vwの係数の根拠（2026-07-09、タブレットで手札・左側UIが画面端で見切れる不具合の対応）：
     .fieldは画面中央に来る＝左右の余白は必ず同じ幅になる。よって「合計の必要幅が画面幅に収まるか」
     ではなく「はみ出しが大きい側（手札）が、その余白1本分に収まるか」で判定しないといけない
     （左右の余白は対称なので、手札側の要求幅がそのまま両側の必要余白になる）。
     盤面幅≈5.2S、左側UIのはみ出し≈1.0S、手札のはみ出し≈2.97S（Sは--slot-size）としたとき、
     2.97S ≦ (画面幅 - 5.2S) / 2 を解くと 画面幅 ≧ 11.14S 、つまり係数は9vw弱が限界。
     安全マージンを取って8.3vwにしてある。 */
  --slot-size: clamp(50px, min(8.3vw, 20vh), 162px);

  /* 拡大プレビュー(.card-preview)の幅。スマホの横画面では高さが400px弱しかない。
     カードの高さは 幅×(588/415) で決まるため、幅だけをmin(80vw,340px)で抑えると
     カードが縦にはみ出し、その下に置いたレベル/アクションボタンが画面外へ追い出されて
     押せなくなる（2026-07-10）。そこで「使える高さ」から幅を逆算する項を足す。
     0.7058 = 415/588（カード枠画像の縦横比）。120pxはカード下のボタン2行分(44px×2＋gap)。
     94vhは上下に少し余白を残して詰まって見えないようにするための値。 */
  --preview-max-w: min(80vw, 340px, calc((94vh - 120px) * 0.7058));
}

* { box-sizing: border-box; }

/* 画像(<img>)は全てカードの絵やアイコンなどの装飾で、個別に操作する必要がない。
   ポインタ操作を無効化し、ブラウザ/拡張が画像ホバーで出すボタン（ビジュアル検索・保存など）を抑止する。
   クリック・ドラッグ・右クリックは親要素(.card/.slot等)が受けるので、ゲームの操作は変わらない。 */
img { pointer-events: none; }

/* 背景を敷き、フローに残る唯一の要素(.battle-layout＝実質.fieldと同じ大きさ。手札は
   position:absoluteではみ出すためサイズに含まれない)を画面中央へ＝盤面が常に中央になる。 */
body {
  margin: 0;
  min-height: 100vh;
  background: url("../../public/images/others/background001.png") center / cover no-repeat;
  overflow-x: hidden;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  font-family: sans-serif;
  /* カードの長押しプレビュー(preview.jsのattachPreviewTrigger)を邪魔する、
     モバイルブラウザの既定動作を止める。iOS Safariは長押しで「コピー/調べる」の
     コールアウトを出し、各種ブラウザは文字を選択状態にしてしまう。
     このゲームに文字を選択したい場面は無いので、画面全体で無効化する。 */
  -webkit-touch-callout: none;
  user-select: none;
  -webkit-user-select: none;
}

/* ── 画面左上の操作系（トップへ戻る／UIラベル切替／音量）をまとめて縦に並べるコンテナ。
   個々にfixedしていた頃は、下の要素のtopを「上の要素の高さの合計」でcalcする必要があり、
   ボタンの中身を変えるたびに位置がずれた。ここで一括して固定し、間隔はgapに任せる。 ── */
.top-left-controls {
  position: fixed;
  left: clamp(8px, 2vw, 24px);
  top: clamp(8px, 2vh, 24px);
  /* カットイン暗幕(100)・カードプレビュー(150)より前面に置き、演出中でも音量/戻る/ラベルを操作できるようにする。 */
  z-index: 300;
  display: flex;
  flex-direction: column;
  align-items: flex-start; /* 各ボタンは中身の幅のまま。伸ばさない */
  gap: 8px;
}

/* トップ画面へ戻るリンク。盤面(.field)より前面に出す（z-indexは親が持つ）。 */
.home-link {
  padding: 6px 12px;
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.5);
  color: var(--text-light);
  text-decoration: none;
  font-size: clamp(12px, 1.4vw, 16px);
}
.home-link:hover { background: rgba(0, 0, 0, 0.75); }

/* ── 音量調節：左上コンテナの一番下。ボタンでスライダーパネルの表示/非表示を切り替える。 ── */
.volume-control {
  display: flex;
  /* 上端揃え。centerだとボタンより背の高いパネルを開いた時に、ボタンが縦中央へ下がって位置がずれる。 */
  align-items: flex-start;
  gap: clamp(6px, 1vw, 10px);
}
.volume-btn {
  width: clamp(28px, 3.2vw, 40px);
  height: clamp(28px, 3.2vw, 40px);
  padding: clamp(4px, 0.6vw, 7px);
  border: none;
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.5);
  cursor: pointer;
}
.volume-btn:hover { background: rgba(0, 0, 0, 0.75); }
.volume-btn img { width: 100%; height: 100%; object-fit: contain; }
/* 全体/BGM/SEの3本を縦に積むパネル。ボタンの右隣に開き、盤面へは重ならない位置に収まる。 */
.volume-panel {
  display: flex;
  flex-direction: column;
  gap: clamp(2px, 0.6vh, 6px);
  padding: clamp(4px, 0.8vh, 8px) clamp(6px, 0.8vw, 10px);
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.6);
}
.volume-panel.hidden { display: none; }
.volume-row {
  display: flex;
  align-items: center;
  gap: clamp(4px, 0.6vw, 8px);
  cursor: pointer;
}
/* ラベル幅を揃えて、3本のスライダーの左端を縦に一直線にする。 */
.volume-label {
  width: 3.2em;
  color: #ffffff;
  font-size: clamp(10px, 1.1vw, 13px);
}
.volume-slider {
  width: clamp(80px, 10vw, 140px);
}

/* ── UI名称ラベルのON/OFFボタン：左上コンテナのトップボタンと音量ボタンの間。 ── */
.label-toggle-btn {
  padding: 6px 12px;
  border: none;
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.5);
  color: var(--text-light);
  font-size: clamp(11px, 1.3vw, 15px);
  cursor: pointer;
}
.label-toggle-btn:hover { background: rgba(0, 0, 0, 0.75); }

/* ── 盤面(.field)と手札(.hand-grid)の位置関係 ───────────────────────────
   手札は「盤面(.field)からposition:absoluteではみ出す」形にする。これは左側のHP/レベル/
   行動権アイコン(.player-status)・ターン数(.turn-icon)が.fieldから左にはみ出しているのと
   全く同じ考え方（2026-07-09）。
   一度は.battle-layoutをflexにして盤面と手札を横並びの1グループとして中央寄せしたが、
   その場合「盤面+手札」のグループ全体が中央に来てしまい、盤面自体が中心から左にズレて見える
   （手札の分だけ盤面が押し出される）副作用が出た。盤面は常に画面中央、というのが元々の設計
   だったため、盤面は今まで通り単独で中央寄せしたまま、手札だけをその右端に絶対配置で
   くっつける方式に変更した。はみ出す側なので.hand-gridが縮んでも重なりは起きない
   （.player-status側と同じ理由）。 */
.battle-layout {
  position: relative; /* .hand-gridの絶対配置の基準にする（＝.fieldの実際の幅を基準にできる） */
}

/* ── 盤面：相手セット / 相手召喚 / 自分召喚 / 自分セット の4段を縦に積む ───────────
   px 固定をやめ clamp(最小, 画面連動基準, 最大) で画面サイズ非依存にする。 */
.field {
  position: relative; /* 子のturn-icon（position:absolute）をこの箱基準で置くため */
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(6px, 2vmin, 20px);
  padding: clamp(4px, 2vmin, 20px) 0 clamp(20px, 8vmin, 100px);
}

.row {
  display: flex;
  justify-content: center;
  gap: clamp(3px, 1vmin, 12px);
}

/* 自分のセット行の親：中の.row（5スロット）の左下に墓地スロットを絶対配置で付けるための基準にする。
   summon-row/life-rowと同じ考え方（絶対配置の子は.rowの中央寄せ幅計算に影響しない）。 */
.set-row {
  position: relative;
  display: flex;
  justify-content: center;
}

/* 召喚スロットの行と、その左に並べるライフ表示をまとめる親要素。
   中央寄せの基準は中の .row（5スロット）だけにしたいので、
   .life-row は position:absolute で浮かせて幅の計算から外す
   （そうしないと life-row の分だけ .row が右にズレてセット行と軸が合わない）。 */
.summon-row {
  position: relative;
  display: flex;
  justify-content: center;
}

/* HP/レベル/行動権のアイコンUI：{hp,level,action}-ui001.pngを敷いた丸アイコン。
   右からHP・レベル・行動権の順に、.status-icon-group内で縦中央そろえの横一列に並べる
   （HPをDOM順で最後に置くことで前面に出す）。position:absoluteで.summon-rowの通常フローから外し、
   .rowの左外側にぴったり付ける。行動権は自分・相手どちらも内部で保持しているため、mine/opponent両方にstatus-icon-actionを含む。 */
.player-status {
  position: absolute;
  top: 50%;
  right: calc(100% + var(--slot-size) * 0.55);
  transform: translateY(-50%);
}
.player-status.mine     { top: calc(50% + var(--slot-size) * 0.52); }
.player-status.opponent { top: calc(50% - var(--slot-size) * 0.52); }
.status-icon-group {
  position: relative;
  width: calc(var(--slot-size) * 0.63);
  aspect-ratio: 1 / 1;
}
.status-icon {
  position: absolute;
  background-position: center;
  background-size: contain;
  background-repeat: no-repeat;
}
.status-icon-hp {
  top: 0;
  left: calc(var(--slot-size) * 0.30);
  width: 100%;
  height: 100%;
  background-image: url("../../public/images/UI/hp-ui001.png");
}
.status-icon-level {
  top: 15%;
  left: -43%;
  width: 70%;
  height: 70%;
  background-image: url("../../public/images/UI/level-ui001.png");
}
.status-icon-action {
  top: 15%;
  left: -118%;
  width: 70%;
  height: 70%;
  background-image: url("../../public/images/UI/action-ui001.png");
}
.status-icon-value {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: var(--text-light);
  font-weight: bold;
  font-size: calc(var(--slot-size) * 0.136);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8), 0 0 4px rgba(0, 0, 0, 0.6);
}
.status-icon-hp > .status-icon-value {
  font-size: calc(var(--slot-size) * 0.185);
}

/* ターン数表示：turn-ui001.pngを敷いた丸アイコン。position:absoluteで通常フローから外し
  （召喚/セットスロットの並びに影響させない）、.player-statusと同じx位置（.fieldの左外側）・
   .field縦中央よりやや上（＝自分/相手のHPアイコンの間、心持ち上寄り）に重ねる。 */
.turn-icon {
  position: absolute;
  top: calc(50% - var(--slot-size) * 0.22);
  right: calc(100% + var(--slot-size) * 0.45);
  transform: translateY(-50%);
  width: calc(var(--slot-size) * 0.65);
  aspect-ratio: 1 / 1;
  background: url("../../public/images/UI/turn-ui002.png") center / contain no-repeat;
}
.turn-icon-value {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: var(--text-light);
  font-weight: bold;
  font-size: calc(var(--slot-size) * 0.2);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8), 0 0 4px rgba(0, 0, 0, 0.6);
}

/* スロット共通の形。small版フレーム比率(415:413 ≒ 正方形)に合わせ、高さは aspect-ratio に任せる。
   幅は--slot-size（vmin基準、:rootで定義）をそのまま使う。 */
.slot {
  width: var(--slot-size);
  aspect-ratio: 415 / 413;
  border-width: 3px;
  border-radius: 5px;
  background: var(--slot-bg);
}
.slot.drag-over { background: var(--slot-bg-hover); }

/* 種類：実線=召喚 / 点線=セット（border-styleに加え、単色の塗りも変えて区別する） */
.slot.summon { border-style: solid;  background: var(--slot-bg-fill); }
.slot.set    { border-style: dashed; background: var(--slot-bg-fill); }

/* 持ち主：枠線の色だけを切り替える */
.mine     { border-color: var(--mine-color); }
.opponent { border-color: var(--opponent-color); }

/* 潜伏中カードの裏面。cardback-small001.png を画像としてスロット全体に敷く。 */
.card-back {
  width: 100%;
  height: 100%;
  border-radius: 3px;
  object-fit: contain;
}
/* セットスロットの裏向きカードだけ、少し下にずらして表示する（召喚スロットには影響しない）。 */
.slot.set .card-back {
  transform: translateY(2%);
}

/* ── 自分の手札：3×4グリッド。.battle-layout（＝.fieldと同じ大きさの箱）から右にはみ出す形で
   絶対配置する（.player-status/.turn-iconが.fieldから左にはみ出すのと同じ考え方）。 */
.hand-grid {
  position: absolute;
  left: 100%;
  top: 50%;
  transform: translateY(-50%);
  margin-left: calc(var(--slot-size) * 0.3);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: calc(var(--slot-size) * 0.06);
}

/* ── 手札カード（通常サイズ）───────────────────────────────────────────
   container-type により、内側の文字を cqw(=カード幅の1%) で指定でき、
   カードが伸縮しても文字が常に同じ比率で追従する（サイズ別のfont-size調整が不要）。 */
.card {
  position: relative;
  width: calc(var(--slot-size) * 0.85);
  container-type: inline-size;
  cursor: grab;                        /* ドラッグで場に出せることを示す */
  transition: transform 0.12s, filter 0.12s;
}
.card.dragging { opacity: 0.4; }       /* ドラッグ中の元カードを半透明に */
.card:hover {
  transform: scale(1.15);              /* ホバーで少し拡大し */
  z-index: 10;                         /* 隣より前面に出し */
  filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.95)); /* PNGの形に沿って光らせる */
}

/* アクション権/マナ不足で今は出せない手札カード：暗くし、掴めない見た目にする（renderHandAffordability参照）。
   ドラッグ自体はcanPlayCard側の判定で既に弾かれるが、見た目でも出せないと分かるようにする。 */
.card.unaffordable {
  filter: brightness(0.5);
}

.card .layer-base  { display: block; width: 100%; }
.card .layer-char  { position: absolute; top: 5%; left: 9%; width: 82%; }
.card .layer-frame { position: absolute; top: 0; left: 0; width: 100%; }
/* コスト表示（costframe-normal001）は枠(*-normal002)から独立した重ね画像にした。トークンには
   コストという概念が無いため、この画像自体を重ねるかどうかをJS側(cardPreviewFaceHTML)で出し分ける。 */
.card .layer-cost-frame { position: absolute; top: 0; left: 0; width: 100%; }

.card .layer-cost,
.card .layer-name,
.card .layer-atk,
.card .layer-hp,
.card .layer-type {
  position: absolute;
  transform: translate(-50%, -50%);    /* left/top で指定した点が文字の中心になる */
  font-weight: bold;
  white-space: nowrap;
}
.card .layer-cost { left: 10%;   top: 6.1%;  font-size: 8cqw;   color: var(--text-dark); }
.card .layer-name { left: 50%;   top: 60.5%; font-size: 5.4cqw; color: var(--text-dark); }
.card .layer-atk  { left: 9.5%;  top: 93.3%; font-size: 7.3cqw; color: var(--text-light); }
.card .layer-hp   { left: 90.5%; top: 93.3%; font-size: 7.3cqw; color: var(--text-light); }
.card .layer-type { left: 50%;   top: 91.5%; font-size: 4.7cqw; color: var(--text-dark); }

/* カウンターを持つカード（食物トークンなど）は、counterframe-normal001をカード右上に重ねて
   残り回数を表示する（small枠のfieldCardHTMLと同じ考え方。プレビュー限定の要素）。 */
.card .layer-counter-frame { position: absolute; top: 0; left: 0; width: 100%; }
.card .layer-counter {
  position: absolute;
  left: 90%; top: 6%;
  transform: translate(-50%, -50%);
  font-weight: bold;
  font-size: 7cqw;
  color: var(--text-light);
}

/* 能力テキスト：名前欄(60.5%)の直下からクリーチャー版の下段アイコン(91〜93%)の手前までに収める。
   layer-cost等と違い複数行になり得るため、white-space:normal・text-alignで独自にスタイルする
   （translate(-50%,-50%)の中心合わせグループには含めない＝上端をtopの基準にしたいため）。
   カードの高さ以上にはみ出さないよう max-height + overflow:hidden で見切れさせる。 */
.card .layer-ability {
  position: absolute;
  left: 50%;
  top: 68%;
  transform: translateX(-50%);
  width: 78%;
  max-height: 16%;
  overflow: hidden;
  text-align: center;
  white-space: normal;
  font-size: 4.3cqw;
  line-height: 1.2;
  color: var(--text-dark);
}

/* ── カードプレビュー：右クリックで拡大表示するオーバーレイ ──────────────────
   中身(.card-preview)は既存の.cardと同じ layer-* 構造をそのまま再利用する
   （%指定の位置とcqwのフォントサイズは相対値なので、幅を変えるだけで自動的に拡大される）。
   cutin-overlayと同じ「opacity+pointer-events」で隠す方式に揃える。 */
.card-preview-overlay {
  position: fixed;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.72);
  z-index: 150;
  opacity: 1;
  transition: opacity 0.15s ease;
  /* --preview-max-w（:rootで定義）でほぼ収まるが、能力テキストが長いカードなど想定外に
     高くなった時の最終手段としてスクロールを許す。flexのalign-items:centerだけだと
     はみ出した時に上端が切れて戻せなくなるため、中身側のmargin:autoで中央寄せする
     （下の.card-preview-box）。 */
  overflow-y: auto;
  padding: 2vh 2vw;
}
.card-preview-overlay.hidden {
  opacity: 0;
  pointer-events: none;
}

/* 能力発動演出中：背後のカットインバナー（画面中央）とカード本体が重ならないよう、
   暗幕を消した上でカードを右寄りへずらして表示する（高さは中央のまま）。 */
.card-preview-overlay.ability-cutin-mode {
  background: transparent;
  align-items: flex-start;
  justify-content: center;
  padding-top: 6vh;
}
/* 能力発動演出中は通常のプレビューより一回り小さく表示する（通常の右クリックプレビューはcard-previewの幅のまま）。 */
.card-preview-overlay.ability-cutin-mode .card-preview {
  width: min(60vw, 220px);
}
/* 通常プレビューの .card-preview-box は margin:auto で縦中央寄せしている。そのままだと
   overlay側のalign-items:flex-startが打ち消され、カードがカットイン帯に重なる画面中央に出てしまう。
   演出中だけ上マージンを0にして、帯の上（画面上部）に固定する。 */
.card-preview-overlay.ability-cutin-mode .card-preview-box {
  margin-top: 0;
}

/* .cardの見た目(width/hover演出)は流用せず、プレビュー用に大きく・静的に上書きする。
   .cardと同じクラスも併用するHTML構造にするため、幅の指定はカスケード順で.cardの後に書いて上書きする。 */
.card-preview {
  width: var(--preview-max-w);
  cursor: default;
}
.card-preview:hover {
  transform: none;
  filter: none;
}

/* プレビューでは能力テキストを省略せず読めるようにする：手札版より広い高さを許し、
   それでも収まらない場合だけスクロールさせる。
   padding-bottomは見た目のためではなく、ブラウザのサブピクセル丸め対策：overflow-y:autoな
   height:auto要素はscrollHeightがclientHeightよりわずか(1〜2px)大きく計算されることがあり、
   これだけでテキスト量に関係なく常にスクロールバーが出てしまっていた。paddingで余白を確保し
   その丸め誤差を吸収する。 */
.card-preview .layer-ability {
  max-height: 34%;
  overflow-y: auto;
  padding-bottom: 3px;
}

/* プレビュー中身(.card-preview)とレベル切替ボタン行を縦に並べて中央寄せする。
   card-preview-box自体には元々CSSが無く、単なるブロック要素として.card-previewの幅に
   shrink-to-fitしていたが、ボタン行を追加してもレイアウトが崩れないようflexで明示する。 */
.card-preview-box {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  /* overlayがoverflow-y:autoの時、align-items:centerだけでは はみ出した中身の上端が
     切れてスクロールしても戻せなくなる。auto marginなら はみ出し分を潰さずに中央寄せできる。 */
  margin: auto;
}

/* メイン本体カードと、card.previewCompanions（このカードの効果で場に出る/変化する先のカード。
   石化→石像、戦場の二人→兵士トークン等）を横並びに表示する行。 */
.card-preview-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  gap: 16px;
}
/* 本体カード＋レベル/アクションボタンを縦積みにする列。ボタンが本体カードの真下・中央に
   来るよう、companion（横に並ぶトークン等）とは別グループにしている。 */
.card-preview-main {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}
/* companion側はnormal枠のまま、本体より一回り小さく表示する（.card-previewの上書き）。
   本体と同じ高さ制約に連動させたいので、--preview-max-wからの倍率で決める（260/340≒0.76）。 */
.card-preview-companion {
  width: calc(var(--preview-max-w) * 0.76);
}

/* レベル切替ボタン行：Lv1/2/3を横並びで表示する。画面サイズに関わらず指で押しやすいサイズを確保する。 */
.card-preview-level-buttons {
  display: flex;
  gap: 8px;
}
.card-preview-level-btn {
  min-width: 44px;
  min-height: 44px;
  padding: 6px 14px;
  border: 2px solid rgba(255, 255, 255, 0.5);
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.5);
  color: #fff;
  font-size: 15px;
  font-weight: bold;
  cursor: pointer;
}
.card-preview-level-btn:hover {
  border-color: #fff;
}
.card-preview-level-btn.active {
  background: #fff;
  color: #111;
  border-color: #fff;
}

/* 手札由来のプレビューだけに出る「マナ変換」「使用」ボタン行。押しやすさはレベルボタンと同様に確保する。 */
.card-preview-action-buttons {
  display: flex;
  gap: 8px;
}
.card-preview-action-btn {
  min-height: 44px;
  padding: 8px 18px;
  border: 2px solid rgba(255, 255, 255, 0.5);
  border-radius: 8px;
  background: rgba(0, 0, 0, 0.5);
  color: #fff;
  font-size: 15px;
  font-weight: bold;
  cursor: pointer;
}
.card-preview-action-btn:hover {
  border-color: #fff;
}
.card-preview-use-btn {
  background: #2d76a2;
  border-color: #2d76a2;
}
.card-preview-mana-btn {
  background: #6a2dd7;
  border-color: #6a2dd7;
}

/* プレビュー限定：能力テキスト中のキーワード（例：潜伏）をタップ/ホバーで解説表示できるようにする印。 */
.ability-keyword {
  text-decoration: underline dotted;
  font-weight: bold;
}

/* キーワード解説ポップアップ本体。対象キーワードの直下にposition:fixedで出す。 */
.ability-keyword-tooltip {
  position: fixed;
  max-width: min(70vw, 260px);
  background: rgba(20, 20, 20, 0.92);
  color: #fff;
  padding: 8px 10px;
  border-radius: 6px;
  font-size: 13px;
  line-height: 1.4;
  z-index: 200;
  pointer-events: none;
}
.ability-keyword-tooltip.hidden {
  display: none;
}

/* ── 先行/後攻カットイン：対戦開始時に一度だけ流れる演出 ────────────────── */
.cutin-overlay {
  position: fixed;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(10px, 2vh, 20px);
  background: rgba(0, 0, 0, 0.55);
  z-index: 100;
  opacity: 1;
  transition: opacity 0.4s ease;
}
/* アニメーション終了後、battle.js がこのクラスを付けて完全に引っ込める（盤面操作を邪魔しないように） */
.cutin-overlay.hidden {
  opacity: 0;
  pointer-events: none;
}

/* 斜め（skewX）でスピード感を出しつつ、上下に金の縁取りを付けることで
   「格式のある宣告」らしい見た目にする。上下の余白と文字サイズは
   帯の高さに収まるよう控えめに調整している。
   横スライド自体（-120%→0%→120%とopacityの変化）は変えない。 */
.cutin-banner {
  width: 100%;
  font-weight: bold;
  color: #ffffff;
  text-shadow: 0 2px 12px rgba(0, 0, 0, 0.85);
  padding: clamp(12px, 3vh, 24px) 0;
  text-align: center;
  white-space: nowrap;
  border-top: 3px solid #ffd700;
  border-bottom: 3px solid #ffd700;
  background: linear-gradient(100deg, rgba(20, 20, 20, 0) 0%, rgba(0, 0, 0, 0.85) 20%, rgba(0, 0, 0, 0.85) 80%, rgba(20, 20, 20, 0) 100%);
  transform: translateX(-120%) skewX(-8deg);
  animation: cutin-slide 1.4s ease forwards;
}
/* メイン行（例：ゲーム開始）。カットインの主役なので大きく */
.cutin-main { font-size: clamp(1.5rem, 6.5vw, 2.75rem); letter-spacing: 0.08em; }
/* サブ行（例：あなたは先行です）。メインより一回り小さく添える */
.cutin-sub { font-size: clamp(14px, 2.05vw, 20px); letter-spacing: 0.05em; margin-top: 0.2em; }

/* 自分に関するカットイン＝青、相手に関するカットイン＝赤。
   色は --mine-color / --opponent-color（盤面の枠線と同じ色）に合わせている。
   文字色は白のまま、金のボーダーも上書きしない（相手側のみ赤に変える）。 */
.cutin-banner.cutin-mine {
  color: #ffffff;
  background: linear-gradient(100deg, rgba(20, 40, 90, 0) 0%, rgba(20, 60, 140, 0.94) 20%, rgba(40, 110, 220, 0.94) 80%, rgba(20, 40, 90, 0) 100%);
}
.cutin-banner.cutin-opponent {
  color: #ffffff;
  background: linear-gradient(100deg, rgba(90, 20, 30, 0) 0%, rgba(140, 30, 40, 0.94) 20%, rgba(220, 60, 70, 0.94) 80%, rgba(90, 20, 30, 0) 100%);
}
@keyframes cutin-slide {
  0%   { transform: translateX(-120%) skewX(-8deg); opacity: 0; }
  15%  { transform: translateX(0%)    skewX(-8deg); opacity: 1; }
  75%  { transform: translateX(0%)    skewX(-8deg); opacity: 1; }
  100% { transform: translateX(120%)  skewX(-8deg); opacity: 0; }
}

/* クリックで消すまで表示し続けたいカットイン（能力発動演出）用：スライドインで止まり、
   時間経過では自動的にスライドアウトしない。 */
.cutin-banner.cutin-hold {
  animation: cutin-slide-in 0.35s ease forwards;
}
@keyframes cutin-slide-in {
  0%   { transform: translateX(-120%) skewX(-8deg); opacity: 0; }
  100% { transform: translateX(0%)    skewX(-8deg); opacity: 1; }
}

/* 相手の行動（カード使用／能力発動／バトルフェイズ突入）に割り込むための応答ボタン。
   OK＝そのまま進める、カードを発動＝自分の伏せカードで割り込む。 */
.cutin-response-buttons {
  display: flex;
  gap: clamp(10px, 2vw, 20px);
}
.cutin-response-buttons.hidden { display: none; }
.cutin-response-buttons button {
  padding: 0.6em 1.6em;
  font-size: clamp(14px, 1.6vw, 18px);
  font-weight: bold;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  background: #ffffff;
  color: #222;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
}
.cutin-response-buttons button:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

/* 「盤面を確認」中だけ出る復帰ボタン。カットイン(opacity0で無効化)より前面に、画面下中央へ固定。 */
.cutin-return-btn {
  position: fixed;
  left: 50%;
  bottom: clamp(16px, 5vh, 48px);
  transform: translateX(-50%);
  z-index: 200;
  padding: 0.7em 1.8em;
  font-size: clamp(14px, 1.8vw, 18px);
  font-weight: bold;
  border: 2px solid var(--opponent-color);
  border-radius: 8px;
  cursor: pointer;
  background: rgba(0, 0, 0, 0.8);
  color: var(--text-light);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.6);
}
.cutin-return-btn:hover { background: rgba(0, 0, 0, 0.95); }
.cutin-return-btn.hidden { display: none; }

/* スロット選択中だけ出す取り消しボタン。位置は「カットインに戻る」と同じ画面下中央。
   選択を促す黄色い枠(.slot.selectable)と対になるので、枠と同じ色で縁取る。 */
.selection-cancel-btn {
  position: fixed;
  left: 50%;
  bottom: clamp(16px, 5vh, 48px);
  transform: translateX(-50%);
  z-index: 200;
  padding: 0.7em 1.8em;
  font-size: clamp(14px, 1.8vw, 18px);
  font-weight: bold;
  border: 2px solid #ffd700;
  border-radius: 8px;
  cursor: pointer;
  background: rgba(0, 0, 0, 0.8);
  color: var(--text-light);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.6);
}
.selection-cancel-btn:hover { background: rgba(0, 0, 0, 0.95); }
.selection-cancel-btn.hidden { display: none; }

/* 能力発動演出(相手側)でカード画像そのものにクリックを奪わせない：
   応答ボタン・セットスロットへのクリックを通過させるための指定。 */
.card-preview-overlay.no-pointer-events {
  pointer-events: none;
}
/* 相手の能力発動演出中でも、カード本体だけは右クリックを拾えるようにする（応答ボタンへの透過はそのまま）。 */
.card-preview-overlay.no-pointer-events .card-preview {
  pointer-events: auto;
}

/* 「カードを発動」応答中、発動できる伏せスロットだけを光らせて選択を促す。 */
.slot.selectable {
  outline: 3px solid #ffd700;
  outline-offset: 2px;
  cursor: pointer;
}

/* 食物トークンの回復対象選択中、「自分の体力」も選択肢として光らせる（.slotではないため別定義）。
   枠は回復対象そのものであるHPアイコンに描く。.player-status全体に描くと、HPアイコンだけ
   status-icon-hpで右へずらして重ねている分、枠がHPより左にずれてしまうため。 */
.player-status.selectable { cursor: pointer; }
.player-status.selectable .status-icon-hp {
  outline: 3px solid #ffd700;
  outline-offset: 2px;
}

/* ── 潜伏カードの「表向きで即発動／裏向きで潜伏」選択ダイアログ ───────────────
   cutin-overlay / card-preview-overlay と同じ「opacity+pointer-events」で隠す方式に揃える。 */
.set-choice-overlay,
.set-activate-overlay {
  position: fixed;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.72);
  z-index: 160;
  opacity: 1;
  transition: opacity 0.15s ease;
}
.set-choice-overlay.hidden,
.set-activate-overlay.hidden {
  opacity: 0;
  pointer-events: none;
}
.set-choice-box,
.set-activate-box {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(10px, 2vh, 20px);
  padding: clamp(16px, 3vh, 28px) clamp(20px, 4vw, 36px);
  background: rgba(20, 20, 20, 0.92);
  border: 2px solid #ffd700;
  border-radius: 10px;
}
.set-choice-message,
.set-activate-message {
  margin: 0;
  color: #fff;
  font-weight: bold;
  font-size: clamp(14px, 1.8vw, 20px);
  text-align: center;
}
/* 発動確認に差し込むカード。プレビュー(画面中央の拡大表示)と同じHTML(.card-preview)を使い回す。
   .card-preview の幅は var(--preview-max-w) で決まるので、ここで一回り小さい値に上書きして
   メッセージとボタンがダイアログに収まるようにする（0.7058 = カード枠画像の縦横比 415/588。
   170pxはカード下のメッセージ＋ボタン1行分）。 */
.set-activate-card {
  --preview-max-w: min(70vw, 260px, calc((90vh - 170px) * 0.7058));
}
.set-activate-buttons {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(10px, 2vw, 20px);
}
.set-activate-buttons button {
  padding: 0.6em 1.6em;
  font-size: clamp(14px, 1.6vw, 18px);
  font-weight: bold;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  background: #ffffff;
  color: #222;
}
/* 「裏向きに戻す」は引き返す側なので控えめに見せる。 */
#setActivateNoBtn {
  background: rgba(255, 255, 255, 0.18);
  color: var(--text-light);
  border: 1px solid rgba(255, 255, 255, 0.5);
}
.set-choice-buttons {
  display: flex;
  flex-wrap: wrap;          /* ボタンが3つあるので、狭い画面では折り返して溢れさせない */
  justify-content: center;
  gap: clamp(10px, 2vw, 20px);
}
/* キャンセルは「選ばない」選択肢なので、2つの本命ボタンより控えめに見せる。 */
#setChoiceCancelBtn {
  background: rgba(255, 255, 255, 0.18);
  color: var(--text-light);
  border: 1px solid rgba(255, 255, 255, 0.5);
}
.set-choice-buttons button {
  padding: 0.6em 1.6em;
  font-size: clamp(14px, 1.6vw, 18px);
  font-weight: bold;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  background: #ffffff;
  color: #222;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
}

/* マナシンボル表示：{color}-mana-ui001.pngを敷いた丸アイコンを横に並べ、中央に数値を重ねる。
   位置はセットスロット行(.set-row)の右下あたりに仮置き（graveyard-actionsと左右対称の考え方）。
   DOM自体（項目の数・data-mana-color）はbattle.jsがCARDSの色一覧から動的に組み立てる。 */
.mana-symbols {
  position: absolute;
  top: 100%;
  right: 0;
  margin-top: calc(var(--slot-size) * 0.25);
  display: flex;
  align-items: center;
  gap: calc(var(--slot-size) * 0.1);
}
/* 自分/相手のマナは、それぞれのHP/レベル/行動権アイコン群(.player-status)に対し
   自分=真下・相手=真上に置く（上下対称）。base(.mana-symbols)のtop:100%/right:0/margin-topを
   打ち消し、群へ中央寄せで配置する。群の列幅(約100px)に3色が収まるよう、シンボルは一回り小さくする。 */
.player-status .mana-symbols {
  right: auto;
  left: 50%;
  transform: translateX(-65%);
  gap: calc(var(--slot-size) * 0.05);
}
.player-status.opponent .mana-symbols { /* 相手：群の上 */
  top: auto;
  bottom: 100%;
  margin: 0 0 calc(var(--slot-size) * 0.22);
}
.player-status.mine .mana-symbols {     /* 自分：群の下 */
  top: 100%;
  bottom: auto;
  margin: calc(var(--slot-size) * 0.22) 0 0;
}
.player-status .mana-symbol {
  width: calc(var(--slot-size) * 0.5);
}
.player-status .mana-symbol-value {
  font-size: calc(var(--slot-size) * 0.16);
  top: 47%; /* シンボル画像のくぼみに合わせ、中央より少しだけ上へ */
}
.mana-symbol {
  position: relative;
  width: calc(var(--slot-size) * 0.52);
  aspect-ratio: 1 / 1;
  background-position: center;
  background-size: contain;
  background-repeat: no-repeat;
}
.mana-symbol-green { background-image: url("../../public/images/UI/green-mana-ui001.png"); }
.mana-symbol-white { background-image: url("../../public/images/UI/white-mana-ui001.png"); }
.mana-symbol-blue  { background-image: url("../../public/images/UI/blue-mana-ui001.png"); }
.mana-symbol-red   { background-image: url("../../public/images/UI/red-mana-ui001.png"); }
.mana-symbol-black { background-image: url("../../public/images/UI/black-mana-ui001.png"); }
.mana-symbol-value {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: var(--text-light);
  font-weight: bold;
  font-size: calc(var(--slot-size) * 0.136);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8), 0 0 4px rgba(0, 0, 0, 0.6);
}

/* 墓地スロット＋カード回収ボタンのラッパー：自分のセット行(.set-row)の左下に絶対配置で付ける。
   gapは.ui-label-action-slotのleft計算（0.44+0.14刻み）と対になっているので、変えるなら両方直す。 */
.graveyard-actions {
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: calc(var(--slot-size) * 0.25);
  display: flex;
  align-items: center;
  gap: calc(var(--slot-size) * 0.14);
}
/* 墓地スロット：graveyard001.png（ドクロアイコン）を敷き、枠線・単色塗りは他スロットと違い無しにする。 */
.slot.graveyard {
  position: relative;
  width: calc(var(--slot-size) * 0.44);
  border: none;
  background: url("../../public/images/UI/graveyard001.png") center / contain no-repeat;
  cursor: pointer;
}
.slot.graveyard:hover { filter: brightness(1.4); }
/* カード回収ボタン：recycle001.pngを敷き、墓地アイコンの右隣に少し間を開けて並べる（旧名: 墓地全回収）。 */
.slot.recycle {
  width: calc(var(--slot-size) * 0.44);
  padding: 0;
  border: none;
  background: url("../../public/images/UI/recycle001.png") center / contain no-repeat;
  cursor: pointer;
}
.slot.recycle:hover:not(:disabled) { filter: brightness(1.4); }
.slot.recycle:disabled { opacity: 0.4; filter: grayscale(1); }
/* レベルアップボタン：levelup001.pngを敷き、カード回収の右隣に並べる。 */
.slot.levelup {
  width: calc(var(--slot-size) * 0.44);
  padding: 0;
  border: none;
  background: url("../../public/images/UI/levelup001.png") center / contain no-repeat;
  cursor: pointer;
}
.slot.levelup:hover:not(:disabled) { filter: brightness(1.4); }
.slot.levelup:disabled { opacity: 0.4; filter: grayscale(1); }
/* レベルアップ可能（かつ押せる）ときだけ光らせる */
.slot.levelup.ready {
  filter: drop-shadow(0 0 8px rgba(255, 207, 77, 0.9));
}
/* マナ生成ボタン：gain-mana001.pngを敷き、レベルアップの右隣に並べる。 */
.slot.gainmana {
  width: calc(var(--slot-size) * 0.44);
  padding: 0;
  border: none;
  background: url("../../public/images/UI/gain-mana001.png") center / contain no-repeat;
  cursor: pointer;
}
.slot.gainmana:hover:not(:disabled) { filter: brightness(1.4); }
.slot.gainmana:disabled { opacity: 0.4; filter: grayscale(1); }
/* 墓地の枚数バッジ：右上に載せる小さな丸ラベル。0枚の時は空文字にしてbattle.js側で非表示相当にする。 */
.slot.graveyard .slot-count {
  position: absolute;
  top: -6px;
  right: -6px;
  min-width: 18px;
  padding: 0 4px;
  border-radius: 9px;
  background: #ffd700;
  color: #222;
  font-size: 11px;
  font-weight: bold;
  text-align: center;
  line-height: 18px;
}

/* ── 墓地一覧オーバーレイ：墓地スロットのクリックで開く。card-preview-overlay(150)より低いz-indexにして、
   一覧を開いた状態でさらにカードを右クリック/クリックした個別プレビューが常に前面に来るようにする。 ── */
.graveyard-list-overlay {
  position: fixed;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.72);
  z-index: 140;
  opacity: 1;
  transition: opacity 0.15s ease;
}
.graveyard-list-overlay.hidden {
  opacity: 0;
  pointer-events: none;
}
.graveyard-list-box {
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: min(90vw, 820px);
  max-height: 85vh;
  padding: clamp(14px, 2vh, 22px);
  background: rgba(20, 20, 20, 0.92);
  border: 2px solid #ffd700;
  border-radius: 10px;
}
.graveyard-list-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.graveyard-list-title {
  color: #fff;
  font-weight: bold;
  font-size: clamp(15px, 2vw, 20px);
}
.graveyard-list-header button {
  background: none;
  border: none;
  color: #fff;
  font-size: 20px;
  font-weight: bold;
  cursor: pointer;
  line-height: 1;
}
.graveyard-list-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 10px;
  overflow-y: auto;
}
.graveyard-list-empty {
  color: var(--text-light);
  opacity: 0.7;
  font-size: 14px;
}
/* cardPreviewFaceHTMLで組み立てたnormal枠カードをグリッドの列幅にフィットさせる
   （.card-previewの幅指定 var(--preview-max-w) を、より詳細度の高いこのセレクタで上書きする）。
   プレビューは右クリック/長押しで開くため、カーソルは既定のまま（クリック可能に見せない）。 */
.graveyard-list-item .card {
  width: 100%;
  cursor: default;
}

/* ── 場に出た縮小カード（small枠・ATK/HPのみ）──────────────────────────
   スロットいっぱいに敷き、こちらも container-type で文字をカード幅に追従させる。 */
.field-card {
  position: relative;
  width: 100%;
  container-type: inline-size;
}
.field-card .layer-base  { display: block; width: 100%; }
.field-card .layer-char  { position: absolute; top: 8%; left: 9%; width: 82.6%; }
.field-card .layer-frame { position: absolute; top: 0; left: 0; width: 100%; }
.field-card .layer-atk,
.field-card .layer-hp {
  position: absolute;
  transform: translate(-50%, -50%);
  font-weight: bold;
  font-size: 8cqw;
  color: var(--text-light);
}
.field-card .layer-atk { left: 9.3%;  top: 90.5%; }
.field-card .layer-hp  { left: 90.5%; top: 90.5%; }

/* カウンターを持つカード（食物トークンなど）全般で使う。counterframe-small001を右上に重ね、
   その宝石部分の中心に残り回数の数字を乗せる（ATK/HP表示の有無に関わらず種類問わず使えるようにする）。 */
.field-card .layer-counter-frame { position: absolute; top: 0; left: 0; width: 100%; }
.field-card .layer-counter {
  position: absolute;
  left: 90%; top: 9%;
  transform: translate(-50%, -50%);
  font-weight: bold;
  font-size: 8cqw;
  color: var(--text-light);
}

/* 無敵付与中：効果が続いている間だけ発光させる（renderField()の再描画でクラスが外れると自然に消える）。 */
.field-card.invincible {
  animation: field-card-invincible-glow 1.4s ease-in-out infinite;
}
@keyframes field-card-invincible-glow {
  0%, 100% { filter: drop-shadow(0 0 4px #ffe066) drop-shadow(0 0 2px #ffe066); }
  50%      { filter: drop-shadow(0 0 14px #ffe066) drop-shadow(0 0 8px #fff6cc); }
}

/* ── バトルフェイズ演出 ─────────────────────────────────────────────
   攻撃：対面へ前進(lunge-*クラス付与)→ヒット時点でJS側がダメージ適用→クラスを外して0.18sで元位置へ戻る。
   自分側は上（相手陣地）へ、相手側は下（自分陣地）へ前進させ、向き合っている感じを出す。 */
.field-card { transition: transform 0.18s ease-out; }
/* lunge中は隣の段(自分召喚行など)へはみ出すため、後続DOMの下敷きにならないよう前面へ */
.field-card.lunge-mine,
.field-card.lunge-opponent { z-index: 20; }
.field-card.lunge-mine     { transform: translateY(-22%) scale(1.08); }
.field-card.lunge-opponent { transform: translateY(22%)  scale(1.08); }

/* 配置：召喚/セット直後に一瞬弾んで出現するポップイン。field-card / card-back どちらにも使う。 */
.field-card-summon-in,
.card-back.field-card-summon-in {
  animation: field-card-summon-in 0.3s cubic-bezier(0.2, 1.4, 0.4, 1);
}
@keyframes field-card-summon-in {
  0%   { transform: scale(0.3); opacity: 0; }
  70%  { transform: scale(1.12); opacity: 1; }
  100% { transform: scale(1); }
}
/* セットスロットの裏向きカードは静的に translateY(2%) がかかっているため、ポップイン中も
   その分をkeyframe側に含めて維持する（含めないとアニメーション中だけズレが打ち消され、
   終わった瞬間にtranslateYが効いてカクッと動いて見える）。 */
.slot.set .card-back.field-card-summon-in {
  animation-name: field-card-summon-in-set;
}
@keyframes field-card-summon-in-set {
  0%   { transform: translateY(2%) scale(0.3); opacity: 0; }
  70%  { transform: translateY(2%) scale(1.12); opacity: 1; }
  100% { transform: translateY(2%) scale(1); }
}

/* 撃破：ヒット直後に一瞬強く光ってから縮み砕けるように消える。演出が終わったらrenderField()がDOMごと消す。 */
.field-card.field-card-destroy {
  animation: field-card-destroy 0.4s ease-in forwards;
}
@keyframes field-card-destroy {
  0%   { transform: scale(1);    opacity: 1; filter: brightness(1); }
  25%  { transform: scale(1.15); opacity: 1; filter: brightness(2.4); }
  100% { transform: scale(0.15) rotate(20deg); opacity: 0; filter: brightness(2.4); }
}

/* ── モバイル対応：縦画面では回転案内のみ表示し、盤面は横画面(landscape)専用にする ──────────
   スマホは横に持った時だけプレイ可能とする方針（[[responsive-layout-goal]]の対象は横画面のみ）。 */
.rotate-prompt { display: none; }
@media (orientation: portrait) {
  .rotate-prompt {
    display: flex;
    position: fixed;
    inset: 0;
    z-index: 1000;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 12px;
    padding: 24px;
    background: #111;
    color: #fff;
    text-align: center;
    font-size: clamp(16px, 5vw, 22px);
    font-weight: bold;
  }
  /* 回転案内以外の全要素（盤面・手札・オーバーレイ類）を隠す。 */
  body > *:not(.rotate-prompt) { display: none !important; }
}

/* ── 狭い/低い画面向けの追加調整（2026-07-09）。
   スロット・左側UI・手札・墓地ボタン等のサイズと位置は全て--slot-size(vmin基準)からのcalcで
   決まっており、この変数自体が画面の幅・高さに応じて自動で縮む。よってそれらを個別に
   ここで上書きする必要はない（以前は個別に上書きしており、base側とズレて比率が壊れる不具合の
   原因になっていた）。ここではhome-link/volume-controlなど--slot-sizeに紐づいていない
   固定UIだけを追加調整する。 */
@media (max-width: 800px), (max-height: 500px) {
  .home-link {
    padding: 3px 8px;
    font-size: 11px;
  }
  /* 位置は .top-left-controls のgapで自動的に詰まるため、ここではサイズだけ縮める。 */
  .top-left-controls { gap: 5px; }
  .volume-btn { width: 22px; height: 22px; padding: 3px; }
  .volume-slider { width: 60px; }
  .volume-label { font-size: 9px; }
  .label-toggle-btn { padding: 3px 8px; font-size: 10px; }
}

/* ── UI名称ラベル（初見向けヒント）─────────────────────────────────────
   経過ターン/HP/レベル/行動権/マナ/墓地/カード回収/レベルアップ/マナ生成の各UIの上端に、
   何のUIかを示す名前を重ねる。position:absoluteでフローから外してあるため、
   ラベルを消しても盤面のレイアウトは一切動かない。
   ラベルの表示/非表示は uilabels.js が body.ui-labels-off の付け外しで切り替える。
   文字サイズ・余白は他UIと同じく--slot-size基準にして画面サイズ非依存にする。 */
.ui-label {
  position: absolute;
  left: 50%;
  bottom: 100%;
  transform: translateX(-50%);
  margin-bottom: calc(var(--slot-size) * 0.03);
  padding: 0 0.35em;
  border-radius: 4px;
  background: rgba(0, 0, 0, 0.55);
  color: var(--text-light);
  font-size: calc(var(--slot-size) * 0.085);
  line-height: 1.5;
  white-space: nowrap;
  pointer-events: none; /* クリック/長押しを下のUIへ素通しさせる */
  z-index: 5;
}
body.ui-labels-off .ui-label { display: none; }

/* マナのラベルだけは、マナ列(.mana-symbols)がrender.jsのinnerHTMLで作り直されるため中に置けない。
   .player-status直下に置き、マナ列の座標（群の下、margin 0.22slot）に合わせてその上端へ寄せる。
   左位置はマナ列の中心（left:50% + translateX(-65%) で幅1.6slot分ずれる）に合わせる。
   ラベルは自分側(.mine)にしか無いため、相手側の指定は用意しない。 */
.player-status.mine .ui-label-mana {
  top: 100%;
  bottom: auto;
  left: calc(50% - var(--slot-size) * 0.24);
  margin: calc(var(--slot-size) * 0.07) 0 0;
}

/* 墓地/カード回収/レベルアップ/マナ生成のラベル：ボタンのdisabled時のopacityを浴びないよう
   ボタンの外(.graveyard-actions直下)に置いてあるので、並び順(data-slot)から各ボタンの中心を計算して重ねる。
   中心 = data-slot * (アイテム幅0.44 + gap0.14) + 0.44/2 （すべて--slot-size倍） */
.graveyard-actions .ui-label-action-slot {
  bottom: 100%;
  margin-bottom: calc(var(--slot-size) * 0.03);
}
.ui-label-action-slot[data-slot="0"] { left: calc(var(--slot-size) * 0.22); }
.ui-label-action-slot[data-slot="1"] { left: calc(var(--slot-size) * 0.80); }
.ui-label-action-slot[data-slot="2"] { left: calc(var(--slot-size) * 1.38); }
.ui-label-action-slot[data-slot="3"] { left: calc(var(--slot-size) * 1.96); }

/* タップで手札から選択中のカード（モバイルのタップ→タップ配置用）。slot.selectableと同じ金縁で
   「これから置ける」ことを示す。 */
.card.selected {
  outline: 3px solid #ffd700;
  outline-offset: 2px;
}

/* 直接ヒーローへのダメージ：HPアイコンの数値をシェイク＋赤フラッシュ（status-icon-value の中心軸translate(-50%,-50%)は維持する）。 */
.status-icon-value.life-hit {
  animation: life-hit-shake 0.4s ease-in-out;
}
@keyframes life-hit-shake {
  0%   { transform: translate(-50%, -50%);       color: var(--text-light); }
  20%  { transform: translate(calc(-50% - 6%), -50%); color: #ff5050; }
  40%  { transform: translate(calc(-50% + 6%), -50%); color: #ff5050; }
  60%  { transform: translate(calc(-50% - 4%), -50%); color: #ff5050; }
  80%  { transform: translate(calc(-50% + 4%), -50%); color: #ff5050; }
  100% { transform: translate(-50%, -50%);       color: var(--text-light); }
}
