/* 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"に対応） */
}

* { box-sizing: border-box; }

/* 画像(<img>)は全てカードの絵やアイコンなどの装飾で、個別に操作する必要がない。
   ポインタ操作を無効化し、ブラウザ/拡張が画像ホバーで出すボタン（ビジュアル検索・保存など）を抑止する。
   クリック・ドラッグ・右クリックは親要素(.card/.slot等)が受けるので、ゲームの操作は変わらない。 */
img { pointer-events: none; }

/* 背景を敷き、フローに残る唯一の要素(.field)を画面中央へ。手札(.hand-grid)は fixed でフロー外。
   盤面はモニターサイズによらず常に画面中央固定（padding等で寄せない）。
   手札は右端固定なので、両者の隙間は手札側の位置(.hand-grid の right)で調整する。 */
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;
}

/* トップ画面へ戻るリンク：画面左上に固定。盤面(.field)より前面に出す。 */
.home-link {
  position: fixed;
  left: clamp(8px, 2vw, 24px);
  top: clamp(8px, 2vh, 24px);
  z-index: 30;
  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); }

/* ── 音量調節：home-linkの真下に固定（右上だと手札にかぶるため左上のトップボタン下に置く）。
   ボタンでスライダーの表示/非表示を切り替える。 ── */
.volume-control {
  position: fixed;
  left: clamp(8px, 2vw, 24px);
  top: calc(clamp(8px, 2vh, 24px) + clamp(28px, 4vh, 40px) + 8px);
  z-index: 30;
  display: flex;
  align-items: center;
  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; }
.volume-slider {
  width: clamp(80px, 10vw, 140px);
}
.volume-slider.hidden { display: none; }

/* ── 盤面：相手セット / 相手召喚 / 自分召喚 / 自分セット の4段を縦に積む ───────────
   px 固定をやめ clamp(最小, 画面連動基準, 最大) で画面サイズ非依存にする。 */
.field {
  position: relative; /* 子のturn-icon（position:absolute）をこの箱基準で置くため */
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(10px, 2vh, 20px);
  padding: clamp(8px, 2vh, 20px) 0 clamp(40px, 10vh, 100px);
}

.row {
  display: flex;
  justify-content: center;
  gap: clamp(6px, 1.2vw, 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を敷いた丸アイコン。
   レベル・行動権は.status-icon-groupの左上/左下隅に固定し、HPだけを右にずらして重なりを緩和する
   （HPをDOM順で最後に置くことで前面に出す）。position:absoluteで.summon-rowの通常フローから外し、
   .rowの左外側にぴったり付ける。行動権は自分・相手どちらも内部で保持しているため、mine/opponent両方にstatus-icon-actionを含む。 */
.player-status {
  position: absolute;
  top: 50%;
  right: calc(100% + clamp(30px, 4vw, 60px));
  transform: translateY(-50%);
}
.player-status.mine     { top: calc(50% + 85px); }
.player-status.opponent { top: calc(50% - 85px); }
.status-icon-group {
  position: relative;
  width: clamp(68px, 8vw, 102px);
  aspect-ratio: 1 / 1;
}
.status-icon {
  position: absolute;
  background-position: center;
  background-size: contain;
  background-repeat: no-repeat;
}
.status-icon-hp {
  top: 0;
  left: clamp(14px, 1.8vw, 22px);
  width: 100%;
  height: 100%;
  background-image: url("../../public/images/UI/hp-ui001.png");
}
.status-icon-level {
  top: -30%;
  left: -55%;
  width: 70%;
  height: 70%;
  background-image: url("../../public/images/UI/level-ui001.png");
}
.status-icon-action {
  bottom: -30%;
  left: -55%;
  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: clamp(16px, 2vw, 22px);
  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: clamp(22px, 2.8vw, 30px);
}

/* ターン数表示：turn-ui001.pngを敷いた丸アイコン。position:absoluteで通常フローから外し
  （召喚/セットスロットの並びに影響させない）、.player-statusと同じx位置（.fieldの左外側）・
   .field縦中央よりやや上（＝自分/相手のHPアイコンの間、心持ち上寄り）に重ねる。 */
.turn-icon {
  position: absolute;
  top: calc(50% - 40px);
  right: calc(100% + clamp(30px, 4vw, 60px));
  transform: translateY(-50%);
  width: clamp(56px, 6.5vw, 84px);
  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: clamp(18px, 2.2vw, 26px);
  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 {
  width: clamp(96px, 12vw, 162px);
  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 グリッドで固定表示 ───────────────────────── */
.hand-grid {
  position: fixed;
  right: clamp(8px, 2vw, 24px);
  top: 50%;
  transform: translateY(-50%);        /* 自身の高さ半分だけ戻して上下中央 */
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(4px, 1vw, 10px);
}

/* ── 手札カード（通常サイズ）───────────────────────────────────────────
   container-type により、内側の文字を cqw(=カード幅の1%) で指定でき、
   カードが伸縮しても文字が常に同じ比率で追従する（サイズ別のfont-size調整が不要）。 */
.card {
  position: relative;
  width: clamp(96px, 10.5vw, 148px);
  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 で見切れさせる（gakushu方式を踏襲）。 */
.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;
}
.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の見た目(width/hover演出)は流用せず、プレビュー用に大きく・静的に上書きする。
   .cardと同じクラスも併用するHTML構造にするため、幅の指定はカスケード順で.cardの後に書いて上書きする。 */
.card-preview {
  width: min(80vw, 340px);
  cursor: default;
}
.card-preview:hover {
  transform: none;
  filter: none;
}

/* プレビューでは能力テキストを省略せず読めるようにする：手札版より広い高さを許し、
   それでも収まらない場合だけスクロールさせる（gakushuのmb-cardview__abilityと同じ考え方）。
   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;
}

/* メイン本体カードと、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の上書き）。 */
.card-preview-companion {
  width: min(60vw, 260px);
}

/* レベル切替ボタン行：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; }

/* 能力発動演出(相手側)でカード画像そのものにクリックを奪わせない：
   応答ボタン・セットスロットへのクリックを通過させるための指定。 */
.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ではないため別定義）。 */
.player-status.selectable {
  outline: 3px solid #ffd700;
  outline-offset: 2px;
  cursor: pointer;
}

/* ── 潜伏カードの「表向きで即発動／裏向きで潜伏」選択ダイアログ ───────────────
   cutin-overlay / card-preview-overlay と同じ「opacity+pointer-events」で隠す方式に揃える。 */
.set-choice-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 {
  opacity: 0;
  pointer-events: none;
}
.set-choice-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 {
  margin: 0;
  color: #fff;
  font-weight: bold;
  font-size: clamp(14px, 1.8vw, 20px);
  text-align: center;
}
.set-choice-buttons {
  display: flex;
  gap: clamp(10px, 2vw, 20px);
}
.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: clamp(20px, 4vh, 40px);
  display: flex;
  align-items: center;
  gap: clamp(10px, 1.5vw, 18px);
}
/* 自分/相手のマナは、それぞれのHP/レベル/行動権アイコン群(.player-status)に対し
   自分=真下・相手=真上に置く（上下対称）。base(.mana-symbols)のtop:100%/right:0/margin-topを
   打ち消し、群へ中央寄せで配置する。群の列幅(約100px)に3色が収まるよう、シンボルは一回り小さくする。 */
.player-status .mana-symbols {
  right: auto;
  left: 50%;
  transform: translateX(-50%);
  gap: clamp(4px, 0.8vw, 8px);
}
.player-status.opponent .mana-symbols { /* 相手：群の上 */
  top: auto;
  bottom: 100%;
  margin: 0 0 clamp(30px, 6vh, 60px);
}
.player-status.mine .mana-symbols {     /* 自分：群の下 */
  top: 100%;
  bottom: auto;
  margin: clamp(30px, 6vh, 60px) 0 0;
}
.player-status .mana-symbol {
  width: clamp(40px, 5vw, 60px);
}
.player-status .mana-symbol-value {
  font-size: clamp(14px, 1.8vw, 19px);
  top: 47%; /* シンボル画像のくぼみに合わせ、中央より少しだけ上へ */
}
.mana-symbol {
  position: relative;
  width: clamp(56px, 6.5vw, 84px);
  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: clamp(16px, 2vw, 22px);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8), 0 0 4px rgba(0, 0, 0, 0.6);
}

/* 墓地スロット＋カード回収ボタンのラッパー：自分のセット行(.set-row)の左下に絶対配置で付ける。 */
.graveyard-actions {
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: clamp(20px, 4vh, 40px);
  display: flex;
  align-items: center;
  gap: clamp(10px, 1.5vw, 18px);
}
/* 墓地スロット：graveyard001.png（ドクロアイコン）を敷き、枠線・単色塗りは他スロットと違い無しにする。 */
.slot.graveyard {
  position: relative;
  width: clamp(48px, 5.5vw, 72px);
  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: clamp(48px, 5.5vw, 72px);
  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: clamp(48px, 5.5vw, 72px);
  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: clamp(48px, 5.5vw, 72px);
  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の固定幅min(80vw,340px)を、より詳細度の高いこのセレクタで上書きする）。
   プレビューは右クリックで開くため、カーソルは既定のまま（クリック可能に見せない）。 */
.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; }
}

/* ── モバイル横画面：画面が低い(=スマホを横に持った状態)場合、盤面・手札・各UIを大幅に縮小して
   横幅に収める。手札(.hand-grid)が盤面スロットに重なる不具合の対応（2026-07-09、ユーザー報告）。
   高さ基準のmax-heightをブレークポイントにする（幅は横画面なら広いため）。 */
@media (max-height: 500px) {
  .home-link {
    padding: 3px 8px;
    font-size: 11px;
  }
  .volume-control { top: 32px; }
  .volume-btn { width: 22px; height: 22px; padding: 3px; }
  .volume-slider { width: 60px; }

  .field {
    gap: clamp(2px, 1vh, 6px);
    padding: clamp(2px, 1vh, 4px) 0 clamp(16px, 5vh, 28px);
  }
  .row { gap: clamp(2px, 0.8vw, 4px); }

  .slot { width: clamp(34px, 7vh, 50px); }

  .player-status { right: calc(100% + clamp(8px, 2vw, 14px)); }
  .player-status.mine     { top: calc(50% + clamp(20px, 6vh, 30px)); }
  .player-status.opponent { top: calc(50% - clamp(20px, 6vh, 30px)); }
  .status-icon-group { width: clamp(30px, 6vh, 44px); }
  .status-icon-value { font-size: clamp(8px, 1.6vh, 11px); }
  .status-icon-hp > .status-icon-value { font-size: clamp(10px, 2vh, 13px); }

  .turn-icon {
    top: calc(50% - clamp(10px, 3vh, 16px));
    right: calc(100% + clamp(8px, 2vw, 14px));
    width: clamp(24px, 5vh, 34px);
  }
  .turn-icon-value { font-size: clamp(9px, 1.8vh, 12px); }

  .hand-grid {
    right: clamp(2px, 1vw, 6px);
    gap: clamp(2px, 0.6vw, 4px);
  }
  .hand-grid .card { width: clamp(30px, 6vh, 44px); }

  .mana-symbol { width: clamp(24px, 4.5vh, 34px); }
  .mana-symbol-value { font-size: clamp(8px, 1.5vh, 11px); }
  .player-status .mana-symbols { gap: clamp(2px, 0.6vh, 4px); }
  .player-status.opponent .mana-symbols { margin: 0 0 clamp(14px, 4vh, 22px); }
  .player-status.mine .mana-symbols { margin: clamp(14px, 4vh, 22px) 0 0; }

  .graveyard-actions {
    margin-top: clamp(6px, 2vh, 12px);
    gap: clamp(4px, 1vw, 8px);
  }
  .slot.graveyard,
  .slot.recycle,
  .slot.levelup,
  .slot.gainmana { width: clamp(22px, 4.5vh, 32px); }
}

/* タップで手札から選択中のカード（モバイルのタップ→タップ配置用）。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); }
}
