@charset "UTF-8";
/* =============================================================
   中古ゲーム通販EC  共通スタイル
   方針: シンプル（メイン1色＋白＋アクセント1色）
   ブランドメインカラー = ディープインディゴ #2D2A5E
   地 = 白＋淡インディゴグレー ／ アクセント = アンバー #E0A23D
   ※ 色彩心理：青の信頼＋紫の特別感・郷愁／琥珀の価値・行動喚起
   ============================================================= */

/* -------------------------------------------------------------
   デザイントークン

   ■ 構成
     1) セマンティックトークン … 新規実装は必ずこちらを使う
     2) 互換エイリアス         … 既存CSSが参照する旧キー。新規使用は禁止

   ■ 追加のルール
     ・新しい色相・サイズ・影・角丸を「直書き」で足さない。
       必要になったら本ブロックにトークンを追加し、ルールブックも改訂する。
     ・管理画面（admin/admin-shell.css と admin/products/admin.css の2枚）は同じ色値を --main / --acc 等の
       別名で二重定義している。色を変えるときは両方直すこと（統合は将来課題）。
   ------------------------------------------------------------- */
:root {
  /* ============ 1) セマンティックトークン ============ */

  /* --- ブランド：面に使う（文字色・リンク色として散らさない） --- */
  --color-brand:        #2D2A5E;   /* ディープインディゴ：ヘッダー・フッター背景 */
  --color-brand-dark:   #211E4A;   /* ナビ背景・ホバー */

  /* --- アクセント：行動の起点にのみ。1画面1〜2要素まで --- */
  --color-accent:       #E0A23D;   /* アンバー：CTA・価格強調・アクティブタブ。※面の色。文字色には使わない */
  --color-accent-dark:  #C4842A;   /* ホバー時の面の色。※対白 3.14:1 のため文字色には使わない */
  --color-accent-on:    #2B1A00;   /* アンバー面の上に載せる文字色。対 accent 7.52:1 / accent-dark 5.14:1 */
  --color-accent-text:  #8A5A15;   /* 白地の上に載せるアンバー系の文字色。対白 5.91:1 / 対 bg-sub 5.34:1（AA合格）
                                      ※暗い地（ヘッダー・フッター）では使わない。対 brand 2.22:1 で不合格 */

  /* --- テキスト --- */
  --color-text:         #1C1B26;   /* 本文（純黒を外す） */
  --color-text-sub:     #6C6B78;   /* 補助・メタ情報 */
  /* 現在参照0件。暗い地に載せる文字色の指定手段として残す（消すと規約を守る術が無くなる） */
  --color-text-invert:  #FFFFFF;

  /* --- ブランド色の面に載せる文字（MV・フッター等）。実測値はコメントの通り --- */
  --on-brand:          #FFFFFF;              /* 対 brand 13.09:1 / brand-dark 15.56:1 */
  --on-brand-sub:      #C8C6DA;              /* 対 brand  7.82:1 …補助文でもAA合格 */
  --on-brand-hairline: rgba(255,255,255,.55);/* 罫線用。対 brand 5.07:1 */

  /* --- 背景 --- */
  --color-bg:           #FFFFFF;
  --color-bg-sub:       #F3F3F8;   /* セクション地。多用しない */

  /* --- 罫線：唯一のグレー階調 --- */
  --color-border:       #DDDCE6;

  /* --- ステータス：ブランド配色とは別レイヤー。小さく扱う --- */
  --color-state-in:     #1F7A4D;
  --color-state-low:    #B45309;
  --color-state-out:    #B5462E;

  /* --- オーバーレイ --- */
  /* 現在参照0件。画像に重ねるバッジ等で使う想定。新しい半透明黒を直書きしない */
  --color-overlay:      rgba(0,0,0,.62);

  /* --- タイポ：本文・見出し・ボタンは例外なく単一スタック --- */
  /* 2026-08-07：M PLUS Rounded 1c（Webフォント）へサイト全体を統一。
     MV見出しに使っていた書体と同じもの。判読性が高く、丸ゴシックの柔らかさが
     「中古は不安」という層に対して硬すぎない印象を作る。
     従来のシステムスタックは環境で当たる書体が変わり、Windows では Yu Gothic が当たって
     線が細く出ていた（主要ターゲットが50代のため不利）。Webフォントで環境差をなくす。
     ・読み込みは各ページの <head> の Google Fonts。ウェイトは 400/700/800 の3種だけ
       （400=--fw-normal、700=--fw-bold、800=MV見出し。それ以外は使わないので落とす）
     ・Google Fonts は unicode-range で自動サブセットするため、日本語でも実転送は数十KB
     ・font-display: swap。未読込のあいだは下のフォールバックで描画され、文字は消えない
     ・以前はこの書体の26字サブセット（assets/fonts/banner-display.woff2）をMV専用に
       同梱していたが、全体で使うようになったため削除した（2026-08-07）
     ・管理画面（admin/*.css の --font）は別系統。公開側と揃える必要はない */
  --font-base: "M PLUS Rounded 1c", "Hiragino Kaku Gothic ProN", "Hiragino Sans",
               "BIZ UDPGothic", Meiryo, "Yu Gothic", sans-serif;
  /* 旧ディスプレイフォント枠。本文と同じ書体になったので別スタックは持たない。
     MV見出しとキャンペーンバナー見出しは、書体ではなく font-weight: 800 で差をつける。
     トークン名は参照側（.hero h1 等）を触らずに済ませるため残している。 */
  --font-display-banner: var(--font-base);

  /* サイズは6段階のみ。直書き・中間値は禁止（P2で全CSSに適用済み） */
  --fs-xs:   13px;   /* バッジ・注釈・税込表記 */
  --fs-sm:   14px;   /* メタ情報・フッター */
  --fs-base: 16px;   /* 本文・カード商品名・ナビ */
  --fs-lg:   18px;   /* 価格・サブ見出し・リード文 */
  --fs-xl:   22px;   /* セクション見出し */
  --fs-2xl:  28px;   /* ページタイトル・商品名(h1) */

  /* ウェイトはトークン2つ（400 / 700）＋ MV見出しの 800 のみ。
     500 と 600 は使わない。
     2026-08-07 に書体を M PLUS Rounded 1c へ全面統一したとき、MV見出しだけは
     本文と同じ書体になるため font-weight: 800 で差をつけることにした（.hero h1）。
     読み込んでいるのは 400/700/800 の3ウェイトで、800 はトークン化していない
     （1箇所でしか使わないものをトークンにすると、他所へ広がる口実になるため）。
     以前ここに「800 は使わない」と書いてあったが .hero h1 の実装と矛盾していた。
     この記述に従って 700 に丸めると、読み込んだ 800 が空振りして合成太字になる。 */
  --fw-normal: 400;
  --fw-bold:   700;

  /* 行間 */
  --lh-body:    1.7;
  --lh-heading: 1.4;
  --lh-card:    1.5;

  /* --- 余白：4の倍数のみ。中間値の直書き禁止 --- */
  --space-1:  4px;
  --space-2:  8px;
  --space-3:  12px;
  --space-4:  16px;
  --space-5:  20px;
  --space-6:  24px;
  --space-8:  32px;
  --space-10: 40px;   /* 現在参照0件。余白スケールの一段。中間値の直書きを防ぐために残す */

  /* --- 形状：角丸は用途別に3値固定 --- */
  --radius-sm:   4px;    /* 入力欄・バッジ・サジェスト項目 */
  --radius-md:   8px;    /* ボタン・パネル */
  --radius-full: 999px;  /* フィルタチップ・タグ（ピル） */
  /* 商品カードと商品画像は 0（角丸を付けない） */

  /* --- 影は1種類のみ。使用箇所はメガメニュー／検索サジェスト／モーダルの3つ --- */
  --shadow: 0 2px 4px rgba(0,0,0,.2);

  /* --- 罫線：太さは0.8pxの1種類。例外はアクティブタブの下線2pxのみ --- */
  --border: 0.8px solid var(--color-border);

  /* --- レイアウト --- */
  --wrap: 1200px;          /* §3-1：中央寄せ固定。4列グリッドで割り切れる幅 */
  --wrap-padding: 20px;
  --header-height: 64px;

  /* --- 重なり順：z-index はここで集中管理し、直書きしない --- */
  --z-megamenu: 90;
  --z-header:   100;
  /* 検索サジェストはヘッダーより前面の独立値を持たせる。
     ≤568px では .header-top が static になり z-index が効かない＝
     ヘッダーのスタッキングコンテキストが消えるため、サジェストは
     文書ルート直下でタブバー（--z-header）と直接競合する。
     ヘッダー内の局所値（旧: 直書き 50）ではタブバーの下に潜る。 */
  --z-suggest:  150;
  --z-modal:    200;

  /* ============ 2) 互換エイリアス（新規使用は禁止） ============
     既存CSSが参照している旧キー。P2以降で順次置き換え、最終的に削除する。 */
  --c-purple:   var(--color-brand);
  --c-purple-d: var(--color-brand-dark);
  --c-yellow:   var(--color-accent);
  --c-gold-d:   var(--color-accent-dark);
  --c-gold-t:   var(--color-accent-text);
  --c-ink:      var(--color-text);
  --c-paper-2:  var(--color-bg-sub);
  --c-gray:     var(--color-text-sub);
  --c-line:     var(--color-border);
  --c-instock:  var(--color-state-in);
  --c-low:      var(--color-state-low);

  /* P2で単一スタックへ統合。見出し専用フォント（--font-display）の概念は廃止し、
     互換のため --font-base への別名としてのみ残す */
  --font-main:    var(--font-base);
  --font-display: var(--font-base);

  /* 削除済み（いずれも参照0件を確認のうえ撤去）
     --c-pink / --c-cyan / --c-lime  … 旧・多色キー（P1）
     --r-lg / --shadow-color         … 未使用（P1）
     --r-md / --r-pill               … --radius-* へ統合（P5）
     --bd                            … --border へ統合（P5）
     --shadow-hard / --shadow-hard-sm … --shadow へ統合（P5）
     --c-paper / --c-out             … 互換エイリアスだが参照0件だった（2026-08-12の監査）
                                       白は --color-bg、在庫切れは --color-state-out を直接使う */
}

* { box-sizing: border-box; }
/* ★scroll-behavior: smooth は置かない（2026-09-02 に外した）。
   これがあると、**別のページから #アンカー付きのURLを開いたときに
   その位置まで移動しない**。読み込み時のフラグメント移動が
   なめらかスクロールと競合して取り消されるため。
   実測：legal/#privacy を開いても scrollY は 0 のままだった。
   影響していた導線は、返品特約 legal/#henpin（214ページ）と
   プライバシーポリシー legal/#privacy（276ページ）。
   どちらも法定表示・個人情報の取り扱いへの導線で、着かないと意味がない。
   ★同一ページ内のリンクのクリックは smooth でも動くので、
     「押しても動かない」という形では表に出ず、気づきにくい。
   ★JS 側の window.scrollTo({behavior:"smooth"}) と
     scrollIntoView({behavior:"smooth"}) は behavior を明示しているので、
     この宣言が無くてもなめらかに動く（main.js の検索と入荷通知フォーム）。
   復活させるなら、読み込み時のフラグメント移動が効くことを実機で確かめてから。 */
body {
  margin: 0;
  font-family: var(--font-base);
  color: var(--color-text);
  background: var(--color-bg);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; height: auto; display: block; }
a { color: var(--c-purple-d); text-underline-offset: 2px; }
/* 白地の上のホバー色。暗い地（.gnav a / .footer-grid a）は各自で上書き済み */
a:hover { color: var(--c-gold-t); }
.wrap { max-width: var(--wrap); margin-inline: auto; padding-inline: 20px; }
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* §6：フォーカスリングは全インタラクティブ要素に必須。
   個別ルールで outline: none を単独指定しないこと */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  /* 二重リング。内側の濃色で地色に依存せず 3:1 を確保し（対白 13.09:1）、
     外周のアンバーでブランド地（ヘッダー・フッター）でも視認できるようにする。
     アンバー単色では白地で 2.23:1 しかなく WCAG 2.4.11 を満たさない */
  outline: 2px solid var(--color-brand);
  outline-offset: 2px;
  box-shadow: 0 0 0 4px var(--color-accent);
}
.skip-link { position: absolute; left: -999px; top: 0; z-index: var(--z-modal); background: var(--c-ink); color: #fff; padding: 10px 16px; border-radius: 0 0 var(--radius-sm) 0; }
/* 暗い地なので、上の a:hover（--c-gold-t）に負けると 2.88:1 に落ちる。白のまま固定する */
.skip-link:hover, .skip-link:focus { color: #fff; }
.skip-link:focus { left: 0; }

/* =========================== ヘッダー =========================== */
/* §3-2：2段構造。行1（ロゴ・検索・カート）のみ sticky 64px、
   行2（カテゴリタブ）はスクロールで流し、縦の情報量を稼ぐ。
   .site-header は megamenu の absolute 基準にするため relative を維持する。 */
/* 行1は fixed で固定する。
   position: sticky だと粘着範囲が親（.site-header＝約108px）に限られ、
   ヘッダーごと画面外に出た時点で追従が止まってしまうため。
   固定した分の高さは .site-header の padding-top で確保する。 */
.site-header { position: relative; background: var(--color-brand); padding-top: var(--header-height); }
.header-top {
  position: fixed; top: 0; left: 0; right: 0; z-index: var(--z-header);
  background: var(--color-brand);
}
/* ロゴ内部の間隔（22px）より外側の間隔を広く取る。
   逆転すると、ロゴタイプがマークではなく検索窓の一部に見える */
.header-bar {
  display: flex; align-items: center; gap: var(--space-8);
  height: var(--header-height); padding: 0 var(--wrap-padding);
  max-width: var(--wrap); margin-inline: auto;
}
/* ロゴ ＝ シンボルマークのみ（A案）。サイト名は img の alt で持つ。
   ソースは Illustrator でトレースした その他/ロゴ原本/シンボルマーク_イラレトレース.png。
   インクが単色 RGB(255,192,19) の一枚ベタなので、白地を
     a = (255 - P) / (255 - C)
   で厳密に戻せる。以前のAI生成版のような色ズレ・発光は発生しない（実測でも色は保持）。
   ・上下左右に6%の余白を持たせて書き出しているため、枠に接して切れて見えることはない
   ・原寸144pxは表示47pxの約3.1倍。高DPIでも劣化しない
   ・SVGが用意でき次第、同じ位置を差し替えれば済む（HTML側の変更は不要） */
/* 内側の間隔（マークとロゴタイプの間）＝ 13px ＝ マーク高の0.28倍。
   ロゴ外側の最小余白（アイソレーション）とは別物なので同値にしない。
   外側は .header-bar の gap（--space-8 ＝ 32px）が担う。
   2026-08-07 に 22px（0.55倍）から変更。0.5倍前後あるとマークと文字が
   ひとつのロゴではなく別々の物体に見えるため、内側だけ詰めた。 */
.logo { display: inline-flex; align-items: center; gap: 13px; flex: none; text-decoration: none; }
/* マーク47px。ヘッダー高64pxに対して上下8.5pxずつ余る（詰めすぎない上限がこのあたり） */
.logo-mark { height: 47px; width: 47px; display: block; }
/* ロゴタイプはキャップハイト16px＝マーク高の0.34倍。
   viewBox は 1115.4×100（キャップ高100基準）なので、高さ16pxで幅は178pxになる。
   大きくすると文字がマークと拮抗してシンボルの存在感が落ちる */
/* 光学調整：キャップハイトの箱を中央に置くと、マークの重心よりわずかに高く見える。
   2px下げて視覚的なベースラインを揃える（値を変えるときは47px表示で確認すること） */
.logo-type { height: 16px; width: auto; display: block; transform: translateY(2px); }
.logo:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 4px; border-radius: var(--radius-sm); }

/* 568px未満の指定はこのファイル末尾の「568px未満」ブロックに集約している。
   ここに書くと、後方の無スコープ宣言（.header-actions 等）に上書きされて効かない。 */

/* 検索窓はヘッダーの主役。画面幅の約1/3を占めさせる（§3-2） */
.header-search { flex: 1 1 33%; position: relative; max-width: 460px; }
.header-search input { width: 100%; padding: 11px 16px; font-size: var(--fs-base); border: 0; border-radius: var(--radius-sm); background: #fff; }
/* フォーカスリングの個別指定は置かない。
   §6 の共通ルール :where(...):focus-visible は :where() で特異度 0 のため (0,1,0) しかなく、
   .header-search input:focus-visible（0,2,1）を書くと共通の二重リングが丸ごと負けて
   この検索窓だけ単色リングになる（実際にそうなっていた）。
   共通ルールに任せると、アンバー（内側 0〜2px）がヘッダー地 #2D2A5E に対して 5.86:1 で視認でき、
   幅も 2px→4px に増える。568px以下でもヘッダー地は --color-brand のままなので条件は変わらない。 */
.search-suggest { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: var(--z-suggest); background: #fff; border: var(--border); border-radius: var(--radius-md); box-shadow: var(--shadow); list-style: none; margin: 0; padding: 6px; display: none; }
.search-suggest.open { display: block; }
/* 縦paddingを --space-3 にして当たり判定を 51.2px にする（44px 要件） */
.search-suggest li a,
.search-suggest li button { display: block; width: 100%; text-align: left; font: inherit; background: none; border: 0; cursor: pointer; padding: var(--space-3) 12px; border-radius: var(--radius-sm); text-decoration: none; color: var(--c-ink); }
/* .is-active はキーボード（↓↑）で選択中の候補に main.js が付ける。
   <a> を tabindex="-1" にして移動をキー操作に一本化したため、
   :focus ではなくこのクラスが唯一の「今どれを選んでいるか」の手がかりになる。
   マウスホバーでも同じクラスが付くので、見た目は1系統に統一する。 */
/* 候補の <a> は tabindex="-1" のため :focus には到達しない。
   選択状態は .is-active（キーボード・マウスとも）に一本化している */
.search-suggest li a:hover,
.search-suggest li button:hover,
.search-suggest li.is-active a,
.search-suggest li.is-active button { background: var(--c-paper-2); color: var(--c-ink); }
/* 地色の差（#fff と bg-sub）は 1.11:1 しかなく、それ自体は手がかりにならない。
   選択中は左端の帯が唯一の指標になるので、面の色ではなく文字色トークンを使って
   地に対して 5.34:1 を確保する（--color-accent-dark だと 2.84:1 で 1.4.11 未達） */
.search-suggest li.is-active a,
.search-suggest li.is-active button { box-shadow: inset 3px 0 0 var(--color-accent-text); }

.header-actions { display: flex; gap: 8px; align-items: center; }
/* 縦 padding 8px では 14px×1.7+16+2 = 41.8px でタップ領域 44px に届かない。
   font-size は据え置き、縦 padding を 12px（--space-3）にして 49.8px を確保する。
   横は 12px のまま。ヘッダー行1は固定 64px なのではみ出さない */
/* ピル型の2種。検討時の参考画像は白地に「インディゴのベタ」と「インディゴの線」の2変種だが、
   ヘッダーの地がインディゴなのでベタ／線の関係は保ったまま明暗を反転している。
   ラベルは画像化しない。カート個数は data-cart-count が書き換えるため画像では成立しない。
   アイコンは mask-image。色は currentColor を拾うのでホバーで文字と一緒に変わる。 */
.icon-btn {
  border: 1px solid transparent; background: transparent;
  border-radius: var(--radius-full);
  padding: 9px 18px;
  font-weight: var(--fw-bold); font-size: var(--fs-sm);
  text-decoration: none; color: #fff; white-space: nowrap; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
  /* 2つのボタンの幅を揃える。ラベルの字数（お気に入り＝5字／カート（0）＝6字）が違うため、
     下限を決めて中央寄せにしないと横幅がずれて対にならない。
     150px は「カート（99）」まで折り返さずに収まる幅 */
  min-width: 150px;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.icon-btn::before {
  content: ""; flex: none; width: 20px; height: 20px;
  background: currentColor;
  -webkit-mask: var(--icon) center / contain no-repeat;
          mask: var(--icon) center / contain no-repeat;
}
/* 線の変種：白のアウトライン */
.icon-btn.fav { border-color: rgba(255,255,255,.75); }
.icon-btn.fav:hover { background: rgba(255,255,255,.12); border-color: #fff; }
/* ベタの変種：白ベタ＋インディゴ文字。ヘッダー内で最も押させたい導線 */
.icon-btn.cart { background: #fff; border-color: #fff; color: var(--color-brand); }
.icon-btn.cart:hover { background: var(--color-bg-sub); border-color: var(--color-bg-sub); color: var(--color-brand); }

.icon-btn.fav  { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20.4 4.2 12.6a4.8 4.8 0 0 1 0-6.8 4.8 4.8 0 0 1 6.8 0l1 1 1-1a4.8 4.8 0 0 1 6.8 0 4.8 4.8 0 0 1 0 6.8Z'/%3E%3C/svg%3E"); }
.icon-btn.cart { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.6 3.6h2.3l2.2 9.9h9.6l2-7.2H5.6'/%3E%3Ccircle cx='9.4' cy='19' r='1.5'/%3E%3Ccircle cx='16.6' cy='19' r='1.5'/%3E%3C/svg%3E"); }

@media (max-width: 568px) {

  .icon-btn { padding: 9px 12px; }
}
/* モバイルのタブバーも同じカートアイコンを使う。
   他の4項目は記号文字（⌂ ≡ ⌕ ☺）だが、カートだけ絵文字だと色と字幅が浮くため揃える */
.tabbar-ico.ico-cart {
  display: inline-block; width: 22px; height: 22px;
  background: currentColor;
  -webkit-mask: var(--icon) center / contain no-repeat;
          mask: var(--icon) center / contain no-repeat;
  --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.6 3.6h2.3l2.2 9.9h9.6l2-7.2H5.6'/%3E%3Ccircle cx='9.4' cy='19' r='1.5'/%3E%3Ccircle cx='16.6' cy='19' r='1.5'/%3E%3C/svg%3E");
}

/* グローバルナビ（サブバー・やや明るいネイビー） */
.gnav { background: var(--c-purple-d); }
.gnav-inner { max-width: var(--wrap); margin-inline: auto; padding: 0 20px; display: flex; flex-wrap: wrap; gap: 0; }
.gnav a { color: #EDEFF2; text-decoration: none; font-weight: var(--fw-bold); font-size: var(--fs-sm); padding: 11px 15px; display: inline-block; border-bottom: 2px solid transparent; }
.gnav a:hover, .gnav a[aria-current="page"] { border-bottom-color: var(--c-yellow); color: #fff; }

/* すべてのカテゴリ ボタン */
.megabtn { appearance: none; cursor: pointer; font-family: var(--font-main); color: #fff; background: var(--c-purple-d); border: none; font-weight: var(--fw-bold); font-size: var(--fs-sm); padding: 11px 16px; display: inline-flex; align-items: center; gap: 8px; border-right: 1px solid rgba(255,255,255,.18); }
.megabtn:hover { background: rgba(255,255,255,.10); }
.megabtn[aria-expanded="true"] { background: var(--c-yellow); color: #2B1A00; }
.megabtn-ico { font-size: var(--fs-lg); line-height: 1; }

/* メガメニュー パネル */
.megamenu { position: absolute; left: 0; right: 0; z-index: var(--z-megamenu); background: #fff;  box-shadow: var(--shadow); }
.megamenu[hidden] { display: none; }
.megamenu-inner { display: grid; grid-template-columns: repeat(4, 1fr); gap: 26px; padding: 26px 20px 30px; }
.mega-col h2, .mega-col h3 { font-size: var(--fs-base); margin: 0 0 10px; padding-bottom: 6px; border-bottom: var(--border); color: var(--c-purple); font-weight: var(--fw-bold); }
.mega-col h2 a, .mega-col h3 a { color: inherit; text-decoration: none; }
.mega-col h2 a:hover, .mega-col h3 a:hover { color: var(--c-gold-t); }
.mega-col ul { list-style: none; margin: 0; padding: 0; }
/* 行間 7px は当たり判定に含まれないため、li の margin は 0 にして
   その分を a の縦 padding へ振り替える。これで隣接リンクの間に
   「押しても何も起きない隙間」が無くなり、リンク自体が 44px を満たす */
.mega-col li { margin-bottom: 0; }
/* inline-block（高さ23.8px）では 44px に届かない。block ＋ 縦 padding 12px で
   47.8px を確保し、列幅いっぱいを当たり判定にする。
   見た目のピッチは 30.8px → 47.8px に広がる（メガメニュー内のみ） */
.mega-col li a { color: var(--c-ink); text-decoration: none; font-size: var(--fs-sm); display: block; padding: var(--space-3) 0; }
.mega-col li a:hover { color: var(--c-gold-t); text-decoration: underline; }
.mega-cta { margin-top: 16px; }
.mega-cta .btn { width: 100%; }

/* =========================== 共通パーツ =========================== */
.section { padding: 40px 0; }
.section-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }
.section-title { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-xl); margin: 0; line-height: var(--lh-heading); position: relative; padding-left: 0; }
.section-title::before { content: none; }
.section-title .hl { background: transparent; padding: 0; color: var(--c-ink);  }
.more-link { font-weight: var(--fw-bold); text-decoration: none; color: var(--c-purple-d); border: none; border-radius: 0; padding: 0; background: transparent; white-space: nowrap; }
.more-link:hover { color: var(--c-gold-t); text-decoration: underline; }

/* バッジ */
.badge { display: inline-block; font-size: var(--fs-xs); font-weight: var(--fw-bold); border: var(--border); border-radius: var(--radius-sm); padding: 2px 9px; background: #fff; color: var(--c-ink); }
/* .warranty というクラス名は旧「動作保証」の名残。**表示文言は「動作確認済」**で、
   保証を掲げてはいない（絶対ルール11）。クラス名につられて文言を戻さないこと。 */
.badge.warranty { background: var(--c-paper-2); border-color: var(--c-line); color: var(--c-instock); }
.badge.used { background: var(--c-paper-2); border-color: var(--c-line); color: var(--c-purple-d); }
.badge.premium { background: var(--c-purple); color: var(--c-yellow); border-color: var(--c-purple); }
/* .badge.sale は 2026-08-27 に削除した。トップから deals/ へのバナーに付けていたが、
   比較対照価格が無いまま「SALE」と表示していた（景表法5条2号 有利誤認）。
   値引きを表示するなら、先に値下げ前価格と期間の根拠を持つこと。 */

/* ボタン */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-weight: var(--fw-bold); text-decoration: none; cursor: pointer; border: var(--border); border-radius: var(--radius-md); padding: 11px 24px; background: #fff; color: var(--c-ink);  transition: background .15s ease, border-color .15s ease; font-size: var(--fs-base); }
.btn:hover { background: var(--c-paper-2); color: var(--c-ink); }
.btn-primary { background: var(--c-yellow); color: #2B1A00; border-color: var(--c-gold-d); }
.btn-primary:hover { background: var(--c-gold-d); color: var(--color-accent-on); }
.btn-accent { background: var(--c-yellow); color: #2B1A00; border-color: var(--c-gold-d); }
.btn-accent:hover { background: var(--c-gold-d); color: var(--color-accent-on); }
.btn-ghost { background: #fff; }
.btn-ghost:hover { background: var(--c-paper-2); }
.btn-lg { padding: 14px 30px; font-size: var(--fs-lg); }

/* =========================== ヒーロー（白基調・シンプル） =========================== */

/* --- MV（メインビジュアル）：バナー形式の帯 ---
   全幅ではなくコンテンツ幅に収まり、角丸を持つ箱として扱う。

   ■ 色はブランドのインディゴを使う（キャンペーン緑ではない）
     §4-0-2の限定解除は「期間限定・共同ブランドのキャンペーン」に対するもの。
     MVは常設のブランドコンテンツなので条件に当てはまらない。

   ■ コピーはすべてHTMLテキスト。h1はトップページ最大のSEO資産で、
     画像に焼き込むとクローラーから見出し構造が失われる。          */
.hero {
  max-width: var(--wrap);
  /* 上下同値。旧 .scope が下に挟まっていた頃は下マージン0で成立していたが、
     .scope 撤去（2026-08-07）で MV が直接 .trust-band に接し、上下が非対称になった */
  margin: var(--space-5) auto;
  padding-inline: var(--wrap-padding);
}
.hero-inner {
  position: relative; overflow: hidden;
  padding: var(--space-8) var(--space-6);
  border-radius: var(--radius-md);
  color: var(--on-brand);
  /* 地は色のみ。装飾（円・ドット）は置かない。
     §1-1「装飾目的の色面を持たない」に照らし、帯の中でも figure を足さない方針 */
  background: linear-gradient(100deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
}
.hero-eyebrow {
  display: inline-block; margin-bottom: var(--space-3);
  font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: .08em;
  color: var(--on-brand);
  /* 背後のドットを透かさないよう不透明の地色を敷く（§4-0-2） */
  background: var(--color-brand-dark);
  border: 1px solid var(--on-brand-hairline); border-radius: var(--radius-full);
  padding: 3px var(--space-3);
}
.hero h1 {
  font-family: var(--font-display-banner);
  font-weight: 800;                         /* 本文と同書体。太さだけで見出しの格を出す */
  line-height: var(--lh-heading);
  font-size: clamp(26px, 3.6vw, 44px);      /* 帯の中のみ §2-2 の例外（§4-0） */
  margin: 0 0 var(--space-3); color: var(--on-brand);
}
/* 中核メッセージの強調。アクセント色は使わず下線で示す（§1-4） */
.hero h1 .pop {
  background: transparent; padding: 0; display: inline; color: inherit;
  text-decoration: underline; text-decoration-thickness: 3px; text-underline-offset: 8px;
}
.hero p { font-size: var(--fs-sm); margin: 0 0 var(--space-6); max-width: 54ch; color: var(--on-brand-sub); }
.hero-cta { display: flex; gap: var(--space-3); flex-wrap: wrap; }
/* 2つのボタンの幅を揃える。ラベルの字数（商品を探す＝5字／会員登録（無料）＝8字）が違い、
   放置すると 152px と 206px でずれる。長いほうに合わせて 206px で固定し、中央寄せにする。
   568px未満は縦積みになるので、幅いっぱいに伸ばして端を揃える */
.hero-cta .btn { min-width: 206px; }
@media (max-width: 568px) {
  .hero-cta { flex-direction: column; align-items: stretch; }
  .hero-cta .btn { min-width: 0; width: 100%; }
}
/* ★現在どのページでも使っていない（実測0件）。
   トップの帯にバッジを並べるための組み。復活させるなら、
   書く内容が絶対ルール6（断定・最上級の禁止）と
   絶対ルール14（裏付けのない告知の禁止）に触れないかを先に確かめること。 */
.hero-badges { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-5); }
/* 帯の上に載るため、バッジは白地ではなく白文字＋白罫線に反転させる */
.hero-badges .badge {
  background: transparent; color: var(--on-brand);
  border: 0.8px solid var(--on-brand-hairline); border-radius: var(--radius-full);
}
/* 帯の中の .btn-ghost だけを白文字に反転させる。
   ※ .hero でスコープしないと、同名の既定（:284 の白地版）を後方から上書きし、
      商品ページ等の白地の上で 白文字×白背景（1.00:1）＝不可視になる */
.hero .btn-ghost { background: transparent; color: var(--on-brand); border-color: var(--on-brand-hairline); }
.hero .btn-ghost:hover { background: rgba(255,255,255,.10); color: var(--on-brand); }

@media (max-width: 568px) {
  .hero-inner { padding: var(--space-6) var(--space-5); }
}

/* 旧 .scope（取扱の3本柱／取扱価格の下限）は 2026-08-07 にHTMLから撤去。
   参照0件を確認のうえCSSも削除した。 */

/* =========================== カテゴリアイコン ===========================
   §4-0と同じ「装飾はCSS・コンテンツは画像/テキスト」の分離を守る。
     ・円と地色はCSS（画像に焼き込まない → 地色変更がトークン1箇所で済む）
     ・ラベルはHTMLテキスト（画像内の文字はクローラーに読まれない）
     ・画像は背景透過の切り抜きのみ。占有率62%で全点統一済み           */
.cat-icons {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--space-6) var(--space-4);
}
.cat-icon { display: block; text-decoration: none; color: var(--color-text); text-align: center; }
.cat-icon-media {
  display: grid; place-items: center;
  aspect-ratio: 1 / 1;
  background: var(--color-bg-sub);
  border-radius: var(--radius-full);   /* 円はCSSで作る */
  overflow: hidden;
}
.cat-icon-media img {
  width: 100%; height: 100%;
  object-fit: contain;                 /* 商品カードと同じ。トリミングしない */
}
.cat-icon-label {
  display: block; margin-top: var(--space-2);
  font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1.35;
}
.cat-icon:hover .cat-icon-media { opacity: .85; }   /* hoverは影ではなく透明度（§5-1） */
.cat-icon:hover .cat-icon-label { text-decoration: underline; }
.cat-icon:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 3px; box-shadow: 0 0 0 5px var(--color-accent); border-radius: var(--radius-sm); }

@media (max-width: 960px) { .cat-icons { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 568px) {
  .cat-icons { grid-template-columns: repeat(3, 1fr); gap: var(--space-5) var(--space-3); }
  .cat-icon-label { font-size: var(--fs-xs); }
}

/* =========================== カテゴリチップ =========================== */
.chip-row { display: flex; gap: 10px; flex-wrap: wrap; }
.chip { text-decoration: none; color: var(--c-purple-d); font-weight: var(--fw-bold); border: var(--border); border-radius: var(--radius-full); padding: 8px 16px; background: #fff; }
.chip:hover { border-color: var(--c-yellow); color: var(--c-gold-t); background: #fff; }

/* =========================== 商品グリッド =========================== */
/* 商品カード
   ─ 枠・影・角丸・背景を持たず、画像そのものをカードとして扱う
   ─ 情報は 画像／価格／商品名2行 の3要素のみ（状態・在庫・入荷通知は置かない。CLAUDE.md 絶対ルール18）
   ※ .card は管理画面（admin/）でもパネルとして使用しているため、
      商品カードのルールは必ず article.card にスコープすること      */

.grid { display: grid; gap: 24px 16px; grid-template-columns: repeat(auto-fill, minmax(222px, 1fr)); }

/* --- カード本体：枠なし --- */
/* ★画面外のカードは描画をブラウザに省かせる（2026-08-31）。
   /products/ は208枚を1ページに展開しており、実測でページ高さは
   デスクトップ 30,284px・375px幅 94,860px（スマホ画面の約117画面ぶん）。
   初期表示で画面に入るのは3枚だけで、残り205枚は見えないのに描画していた。
   content-visibility: auto は、画面に近づくまで中身の描画を飛ばす。
   ★contain-intrinsic-size は「まだ描画していないときの想定の大きさ」。
     実測の中央値（デスクトップ381px／375px幅415px）に合わせて 400px を置く。
     auto を付けると一度描画した実寸を記憶するので、2回目以降は正確になる。
     ずれるとスクロールバーの長さが動くだけで、表示中の内容はずれない。
   ★絞り込み（main.js）は hidden 属性＝display:none で消すので、この指定と衝突しない。 */
article.card {
  content-visibility: auto;
  contain-intrinsic-size: auto 400px;
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow: visible;
  display: flex; flex-direction: column;
  transition: opacity .15s ease;
}
/* ★display を指定したので、ブラウザ既定の [hidden]{display:none} が**効かなくなる**。
   絞り込み（main.js）は card.hidden = true で隠すため、これが無いと
   件数表示だけ変わってカードが消えない＝絞り込みが動いていない状態になる。
   同じ理由で .megamenu[hidden] も上で明示している。 */
article.card[hidden] { display: none; }
article.card:hover { }
article.card a.card-link { text-decoration: none; color: inherit; display: flex; flex-direction: column; height: 100%; }
/* 商品ページがまだ無いカードは <a href="#"> ではなく <div class="card-link is-pending"> にする。
   押しても何も起きないリンクを置かない（押せそうで押せない状態を作らない）ため。
   見た目は同じだが、リンクではないのでホバー効果もカーソル変化も出ない。 */
article.card .card-link.is-pending { color: inherit; display: flex; flex-direction: column; height: 100%; cursor: default; }
.badge.pending { background: var(--c-paper-2); border-color: var(--c-line); color: var(--color-text-sub); font-weight: var(--fw-normal); }

/* --- サムネイル：1:1 正方形・contain（箱や付属品をトリミングしない） --- */
article.card .card-thumb {
  position: relative;
  aspect-ratio: 1 / 1;
  display: block;
  padding: 0;
  border: 0;
  border-radius: 0;
  overflow: hidden;
  background: var(--color-bg-sub);
}
article.card .card-thumb img {
  width: 100%; height: 100%;
  object-fit: contain;      /* cover 禁止：状態・付属品の情報が欠落するため */
  display: block;
}
/* ホバー効果は「リンクであるカード」だけに出す。
   a.card-link にスコープしないと、リンクでない .is-pending なカードまで
   反応して「押せる」と誤解させる */
article.card a.card-link:hover .card-thumb { opacity: .85; }   /* hover は影ではなく透明度で表現 */

/* 希少性バッジのみ画像上にオーバーレイ（保証/中古バッジは廃止） */
article.card .card-flag {
  position: absolute; left: 0; top: 0;
  font-size: var(--fs-xs); font-weight: var(--fw-bold); line-height: 1;
  padding: 5px 8px;
  background: var(--color-brand); color: var(--color-accent);
}

/* --- 本文：左右パディング0で画像と左端を揃える --- */
article.card .card-body { padding: 8px 0 0; display: flex; flex-direction: column; gap: 4px; flex: 1; }
article.card .card-meta { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; justify-content: flex-start; margin-top: 0; }
article.card .price { font-family: inherit; font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--color-text); }
article.card .price small { font-size: var(--fs-xs); font-weight: var(--fw-normal); color: var(--color-text-sub); }
article.card .card-name {
  font-weight: var(--fw-normal); font-size: var(--fs-base); line-height: var(--lh-card); margin: 0; color: var(--color-text);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
article.card a.card-link:hover .card-name { color: var(--color-text); text-decoration: underline; }

/* ★状態ランク（.grade）のCSSは 2026-09-15 に削除した。
   絶対ルール18 で一覧カードから「状態」の表示を外したため（表示は商品ページだけ）。
   CSSが残っていると「カードに状態を出してよい」と誤解させる。
   カードの状態は項目51 が止める。戻すなら絶対ルール18 を先に改訂すること。 */

/* --- 価格・在庫（カード外でも使用するため .card スコープ外に残す） --- */
.price { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--color-text); }
.price small { font-size: var(--fs-xs); font-weight: var(--fw-normal); color: var(--color-text-sub); }
.stock { font-size: var(--fs-xs); font-weight: var(--fw-bold); }
.stock.in { color: var(--color-state-in); }   /* 使うのは商品ページの在庫欄。カードには出さない（絶対ルール18） */
.stock.low { color: var(--color-state-low); }
.stock.out { color: var(--color-state-out); }
/* ★一覧カードの在庫なしバッジ（article.card .stock.out）のCSSは 2026-09-15 に削除した。
   絶対ルール18 で**カードから在庫のバッジごと外した**ため。
   カードが見せてよいのは画像・価格・商品名まで。在庫の事実は商品ページの中で示す
   （在庫サマリとコンディション別の在庫欄）。一覧の在庫は check.sh 項目36 が
   リンク先の商品ページで数える。カードにバッジを戻すと項目51 が止める。 */
/* ★レビュー・評価用のCSS（.rating / .review / .rating-summary ほか）は
   2026-08-31 に削除した。絶対ルール6 は「実際に取得していないレビュー・評価を
   書かない」と定めており（景表法・ステマ規制・Google の構造化データポリシー）、
   当店はレビューを1件も持っていない（HTML・JS での使用は実測0件だった）。
   ★CSSが残っていると「レビュー欄を作ってよい」と誤解させる。
     規約を守る手段ではなく、破る手段になるので置かない。
     レビューを実際に集める運用を始めるときに、あらためて作ること。 */
article.card .card-cat { display: none; }

/* 商品詳細ページのメイン画像・サムネ（.main-img / .thumbs）は今回のP3対象外。
   カード側の t-* は廃止したが、詳細ページ用に地色定義のみ残す */
.main-img.t-sw, .main-img.t-ps, .main-img.t-retro, .main-img.t-gb, .main-img.t-soft { background: var(--color-bg-sub); color: var(--color-text); }
.main-img.t-premium { background: var(--color-brand); color: var(--color-accent); }

/* =========================== パンくず =========================== */
/* リンクに縦 padding 12px を持たせた分（+24px）、帯自身の padding を 14px → 4px に
   詰めて、パンくず全体の高さを従来（51.8px）とほぼ同じ 55.8px に保つ */
.breadcrumb { padding: var(--space-1) 0; font-size: var(--fs-sm); }
/* align-items は既定の stretch のままだと、リンクを含む li（47.8px）に合わせて
   テキストのみの li（「トップ」や現在地）まで引き伸ばされ、文字が上端に取り残される。
   baseline 揃えにして、リンクと素のテキストの行を一致させる */
.breadcrumb ol { list-style: none; display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; margin: 0; padding: 0; }
.breadcrumb li::after { content: "›"; margin-left: 6px; color: var(--c-gray); }
.breadcrumb li:last-child::after { content: ""; }
/* 23.8px しかなくタップ領域 44px 未達。inline のままでは縦 padding が行送りに
   反映されず上下の要素と重なるため、inline-block にして 47.8px を確保する */
/* 横paddingが0だと「種別」「RPG」等の短いリンクが 23〜28px 幅にしかならず、
   高さだけ44pxを満たしても当たり判定が細長い棒になる。左右にも余白を取る */
.breadcrumb a { color: var(--c-purple-d); text-decoration: none; font-weight: var(--fw-normal); display: inline-block; padding: var(--space-3) var(--space-2); }

/* =========================== 本文 / 記事 =========================== */
.page-head { padding: 28px 0 8px; }
.page-head h1 { font-family: var(--font-display); font-weight: var(--fw-bold); line-height: var(--lh-heading); font-size: clamp(22px, 4vw, 28px); margin: 0 0 10px; color: var(--c-purple); }
.page-head .lead { font-size: var(--fs-base); max-width: 72ch; color: #3a3f47; }

.prose { max-width: 760px; }
.prose h2 { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-xl); margin: 38px 0 14px; padding: 0 0 6px 0; background: transparent; border: none; border-bottom: var(--border); display: block; }
.prose h3 { font-weight: var(--fw-bold); font-size: var(--fs-lg); margin: 26px 0 10px;  padding-left: 12px; }
.prose p { margin: 0 0 16px; }
.prose ul, .prose ol { margin: 0 0 18px; padding-left: 1.4em; }
.prose li { margin-bottom: 6px; }
.prose a { font-weight: var(--fw-bold); }

/* 情報ボックス */
.callout { border: var(--border); border-left: var(--border); border-radius: var(--radius-md); padding: 16px 20px; background: var(--c-paper-2); margin: 22px 0; }
.callout.tip { background: var(--c-paper-2); border-left-color: var(--c-instock); }
.callout.warn { background: var(--c-paper-2); border-left-color: var(--c-low); }
.callout strong { display: block; font-size: var(--fs-base); margin-bottom: 5px; }

/* テーブル */
.table-wrap { overflow-x: auto; margin: 20px 0; }
table.data { width: 100%; border-collapse: collapse; background: #fff; border: var(--border); border-radius: var(--radius-md); overflow: hidden; }
table.data th, table.data td { padding: 11px 14px; text-align: left; border-bottom: var(--border); }
table.data thead th { background: var(--c-purple); color: #fff; font-weight: var(--fw-bold); }
table.data tbody tr:nth-child(even) { background: var(--c-paper-2); }
table.data tr:last-child td { border-bottom: none; }

/* =========================== 商品詳細 =========================== */
.product-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 36px; align-items: start; padding-top: 20px; }
/* 商品詳細のメイン画像（2026-09-02）。
   ★以前はここが <img> ではなく、商品名の文字を並べた <div> だった。
     画像ファイル自体は最初から存在し、一覧カードと JSON-LD では使っていたのに、
     詳細ページだけが表示していなかった。一覧では絵が出て、押して開いた先で
     消えるので壊れて見える。中古の購買判断は写真が主なので、詳細で出す。
   ★地色（.main-img.t-*）は透過部分のために残している。 */
.gallery .main-img { display: block; width: 100%; height: auto; aspect-ratio: 1/1; object-fit: contain; border: var(--border); border-radius: var(--radius-md); background: var(--c-paper-2); }
/* .thumbs は現在参照0件。実写を複数枚載せられるようになったら戻す。
   ★戻すまでマークアップを置かないこと。中身の無いサムネを並べると
     「写真1・写真2」という押せない箱になる（絶対ルール14）。実際そうなっていた。
.thumbs { display: flex; gap: 10px; margin-top: 12px; }
.thumbs span { width: 70px; height: 70px; border: var(--border); border-radius: var(--radius-sm); display: grid; place-items: center; font-size: var(--fs-xs); font-weight: var(--fw-normal); cursor: pointer; color: var(--c-gray); background: var(--c-paper-2); }
*/
.product-info h1 { font-family: var(--font-display); font-weight: var(--fw-bold); font-size: clamp(22px, 4vw, 28px); margin: 8px 0 12px; line-height: var(--lh-heading); color: var(--c-purple); }

/* コンディション別在庫 */
.offers { display: flex; flex-direction: column; gap: 12px; margin: 16px 0; }
/* --- 商品ページの販売価格（1商品1価格）------------------------------------
   2026-08-12：コンディション別の価格を廃止し、商品ごとに一律の販売価格へ変更した。
   価格は商品情報エリアで1回だけ出す。.offer 側には価格を置かない
   （2箇所に出すと、片方だけ直したときに可視テキストとJSON-LDがずれる＝絶対ルール5違反）。 */
.product-price { display: grid; gap: 4px; margin: 14px 0 4px; }
.product-price .price { font-size: var(--fs-2xl); }
.price-note { font-size: var(--fs-sm); color: var(--color-text-sub); margin: 0; }
/* 在庫の要約（2026-08-31）。**価格のすぐ下＝最初の画面**に置く。
   それまで在庫はコンディション別の一覧の中にしかなく、
   4つのコンディションを1つずつ読まないと「買えるのか」が分からなかった。
   数字は下の .offer の合計と必ず一致させる（可視どうしの食い違いを作らない）。 */
.stock-summary { font-size: var(--fs-sm); margin: 2px 0 0; line-height: 1.7; }
/* ★--fs-md というトークンは存在しない（2026-08-31 のレビューで発覚）。
   未定義の var() は宣言ごと無効になるため、親の 14px のままだった。
   在庫の有無は購入判断の起点なので、1段階大きくして視線を止める。 */
.stock-summary b { font-size: var(--fs-base); }
.stock-summary.in  b { color: var(--color-state-in); }
.stock-summary.out b { color: var(--color-state-out); }
/* 入荷通知（CV）の主導線（2026-08-31）。在庫0のページで、価格のすぐ下に置く。
   それまでボタンは在庫コンディションの中にしかなく、
   価格→注記→サマリ→見出し→状態→説明文と辿らないと着けなかった。
   開店時は全商品が在庫0なので、ここがサイトで最も押されるボタンになる。 */
.stock-cta { margin: 10px 0 0; }
.stock-cta .btn { width: 100%; max-width: 420px; }
/* ★ほしいものリストは商品ページに1つだけ（絶対ルール19）。在庫の有無で消えないよう
   .stock-cta とは別の行に置く（.stock-cta は在庫のあるページには出ない）。 */
.wish-cta { margin: 8px 0 0; }
.wish-cta .btn { width: 100%; max-width: 420px; }
/* ★モバイルでは、これでもまだ最初の画面に入っていなかった（2026-09-08）。
   上のコメントは「価格のすぐ下＝最初の画面」と書いているが、375x812 での実測は
   ボタンの上端 1,052px。画面の外である。内訳は
   ヘッダー112 + パンくず56 + 正方形の画像335 + 余白36 + バッジ・見出し 約150
   + 商品説明136 + 価格ブロックの内側194。**画像と説明文だけで471px**使っていた。
   開店時は全商品が在庫0で、この登録がCV（絶対ルール16）。着地して最初に見える面に
   「いくらで、買えるのか、どうすればいいか」が無いのは、そのまま離脱になる。

   さらに、画面の下56pxは固定のタブバーが覆っている（下の .tabbar と
   body の padding-bottom）ので、**実際に使えるのは 812 - 56 = 756px**。
   ボタンは「上端が見えている」だけでは押せない。下端で判定すること。

   直し方は3つで、いずれもHTMLは触らない（絶対ルール1）。
     ① 画像の上限を 200px にする（正方形なので、そのまま縦の短縮になる）
     ② 商品説明を価格ブロックの下へ回す（何かは h1 が言っている。
        価格と在庫のほうが先に要る）
     ③ 価格の注記（.price-note）をボタンの下へ回す
        （「先着順」は .stock-summary がボタンの前に述べているので、
          注記を下げても先着順の告知はボタンより前に残る＝絶対ルール16 を満たす）
   実測（3ds-albw ＝ h1 が3行の最長ケース）：ボタン下端 1,112px → 741px。
   h1 の高さは全204ページで最大92px（3行）であることを実測済みなので、
   これがワーストケース。**残り15px** が下端とタブバーの間隔。

   ★対象を :has(.stock-cta) で在庫0のページに限る。
     - 在庫のあるページは主導線が .offers の購入ボタンで、ここではない。
       画像を小さくする理由が無い。
     - 在庫0のページのバッジは「中古」1つだけ（絶対ルール16 が
       .badge.warranty を禁じ、項目28 が機械で見ている）。
       1つしか無いと確定しているから、grid にしてもバッジが縦に割れない。
       在庫のあるページは「中古」＋「動作確認済」の2つが横に並ぶので、
       同じことをすると2段になる。**この違いが :has で分ける理由。**
     - :has() を解さない古い環境では、この宣言ごと無視されて現状の見た目に戻る。
       壊れる方向には倒れない。 */
@media (max-width: 568px) {
  .product-layout:has(.stock-cta) { gap: 16px; }
  .product-layout:has(.stock-cta) .gallery { max-width: 200px; }
  /* 並べ替えのためだけに grid にする。1カラムなので見た目は block と同じ。
     ★grid にすると隣接マージンの相殺が止まる分だけ縦に伸びる。上の実測値は
       それを含んだ後の値なので、ここだけ見て「効いていない」と判断しないこと。 */
  .product-info:has(.stock-cta) { display: grid; }
  .product-info:has(.stock-cta) > * { order: 2; }
  .product-info:has(.stock-cta) > .badge,
  .product-info:has(.stock-cta) > h1,
  .product-info:has(.stock-cta) > .product-price { order: 1; }
  /* .badge は inline-block だが、grid の子になると幅いっぱいに伸びる。
     ここだけ内容幅に戻す（他の子は伸びたままでよい）。 */
  .product-info:has(.stock-cta) > .badge { justify-self: start; }
  .product-price:has(.stock-cta) > * { order: 1; }
  .product-price:has(.stock-cta) > .price-note { order: 2; }
}
/* 返品特約の一文（絶対ルール11）。商品ページの callout の下に置く小さな注記。
   .price-note と見た目は同じだが、価格の補足とは役割が違うので別名にしている。 */
.legal-note { font-size: var(--fs-sm); color: var(--color-text-sub); margin: 10px 0 0; }

/* 入荷通知ボタンの手前に置く一文（2026-08-28／2026-08-31 に予約から改称）。
   在庫切れのコンディションでは「押すと何が起きるのか」が分からないまま
   コミットを求める形になっていたため、支払いが発生しないことをその場で示す。
   ★条件の正本は update/stock-alert/ と update/legal/。ここは結論の一文＋リンクだけにする。 */
.notify-note { font-size: var(--fs-sm); color: var(--color-text-sub); margin: 0 0 10px; line-height: 1.7; }
.notify-note a { font-weight: var(--fw-bold); }
/* 一覧の絞り込み結果の件数。main.js が生成して role="status" を付ける。
   絞り込みが効いているときだけ出す（既定は hidden）。 */
.facet-status { font-size: var(--fs-sm); color: var(--color-text-sub); margin: 0 0 12px; }

.offer { border: var(--border); border-radius: var(--radius-md); padding: 16px; background: #fff; display: grid; gap: 6px; }
.offer.best { background: #fff; border-color: var(--c-yellow); border-width: 2px; }
.offer-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.cond { font-weight: var(--fw-bold); font-size: var(--fs-base); border: var(--border); border-radius: var(--radius-sm); padding: 2px 12px; background: var(--c-paper-2); color: var(--c-ink); }
/* コンディションの段階（2026-08-27に4段階→6段階）。クラスは序数で持つ。
   1 新品、未使用 ／ 2 未使用に近い ／ 3 目立った傷や汚れなし
   4 やや傷や汚れあり ／ 5 傷や汚れあり ／ 6 全体的に状態が悪い
   ★語彙の正本は check.sh 項目35 の CONDS_ALLOWED。ここには対応表だけを書き、
     語そのものを増やさない（同じ表を2箇所に持つと必ず片方が腐る）。
   ★6色に塗り分けない（配色の方針：アクセントは1色だけ）。
     実務で要る区別は「注記が要る段（5・6）かどうか」の1本だけなので、そこだけ枠を強める。
   ★以前あった .cond.good は --border と --c-line が同値のため **完全な no-op** だった
     （110箇所のHTMLに書かれていて見た目は変わっていなかった）。
     .cond.fair は文字色を --c-gray に落としていたが、地に対して約4.5:1 と
     他段（約15:1）より薄く、最も注意が要る段が最も読みにくいという逆転だった。両方やめた。 */
.cond--1, .cond--2, .cond--3, .cond--4 { background: var(--c-paper-2); border-color: var(--c-line); color: var(--c-ink); }
.cond--5, .cond--6 { background: var(--c-paper-2); border-color: var(--color-text); border-width: 2px; color: var(--c-ink); }
.offer-meta { font-size: var(--fs-sm); color: #3a3f47; }
/* コンディション名が長くなったため（最長「目立った傷や汚れなし」）、
   幅375pxでは .cond と .stock が1行に収まらない。flex-wrap に任せると
   折り返し位置が中途半端になるので、明示的に2段へ切り替える。 */
@media (max-width: 568px) {
  .offer-top { flex-direction: column; align-items: flex-start; gap: 6px; }
}
.offer-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 6px; }
/* 売切表示：親に opacity をかけると子孫の実効コントラストが 1.82:1 まで落ち、
   「買えない在庫」を読み取れなくなる。地色と文字色で表現する */
.offer.soldout { background: var(--c-paper-2); }
.offer.soldout .cond { background: #fff; border-color: var(--color-text-sub); color: var(--color-text); }

/* ── 在庫コンディションの切り替え（2026-09-04 追加） ──────────────────
   コンディションごとに .offer を縦に並べていた。段階が4つあると縦に長く、
   スマートフォンでは「どのコンディションに在庫があるか」を見るだけで
   何度もスクロールすることになっていた。畳んでタブで切り替える。

   ★畳んでも俯瞰は失わない。タブの並びそのものが一覧になっていて、
     全コンディションと在庫の有無・点数が**同時に見える**。
     上の .stock-summary（合計と内訳）と合わせて二重に俯瞰できる。
   ★タブに価格を出さない。価格は商品に1つで、可視側は .product-price の
     1箇所だけ（絶対ルール3）。ここに出した瞬間に2箇所になる。
     コンディションで価格が変わらないことは .price-note が述べている。
   ★色だけで在庫の有無を伝えない。「在庫3点」「在庫なし」という
     文字そのものをタブに載せる（色は補助）。
   ★JSが無い環境では .is-tabbed が付かず、従来どおり全部が縦に並ぶ。
     機能が減るだけで、読めなくなる情報は無い。 */
.cond-tabs-label { font-size: var(--fs-sm); color: var(--color-text-sub); margin: 14px 0 6px; }
.cond-tabs-label b { font-size: var(--fs-base); color: var(--color-text); }
/* タイルは等幅で並べる。flex-wrap だと最後の1枚だけ横に伸びて不揃いになる */
.cond-tabs { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; margin: 0 0 12px; }
.cond-tab {
  flex: 1 1 148px; min-width: 132px; text-align: left; font: inherit; cursor: pointer;
  background: #fff; border: 2px solid var(--color-border); border-radius: var(--radius-md);
  padding: 9px 12px; display: grid; gap: 2px;
}
.cond-tab-name  { font-weight: var(--fw-bold); font-size: var(--fs-sm); line-height: 1.35; }
.cond-tab-stock { font-size: var(--fs-xs); font-weight: var(--fw-bold); }
.cond-tab.is-in  .cond-tab-stock { color: var(--color-state-in); }
.cond-tab.is-out .cond-tab-stock { color: var(--color-state-out); }
/* 在庫なしも押せる（状態と入荷通知の導線を見せるため）。地色で区別する */
.cond-tab.is-out { background: var(--c-paper-2); }
.cond-tab:hover { border-color: var(--color-text-sub); }
/* 選択中。枠線の太さは変えない（変えると押すたびに幅がずれる） */
.cond-tab[aria-selected="true"],
.cond-tab[aria-selected="true"]:hover { border-color: var(--c-yellow); background: var(--c-paper-2); }
.cond-tab:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 2px; }
.offers.is-tabbed { margin-top: 0; }
.offers.is-tabbed .offer[hidden] { display: none; }
/* タブに出している名前と在庫を、開いたパネルでもう一度出さない。
   同じ語が2行続くと、畳んだ意味が薄れる。
   ★情報は失わない：名前と在庫はタブに出ており、パネルは
     aria-labelledby でそのタブを参照しているので読み上げでも辿れる。 */
.offers.is-tabbed .offer-top { display: none; }
.spec-table th { width: 34%; background: var(--c-paper-2); }


/* FAQ アコーディオン */
.faq-item { border: var(--border); border-radius: var(--radius-md); margin-bottom: 10px; background: #fff; overflow: hidden; }
.faq-item summary { cursor: pointer; padding: 15px 18px; font-weight: var(--fw-bold); list-style: none; display: flex; justify-content: space-between; gap: 12px; }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after { content: "＋"; font-weight: var(--fw-bold); color: var(--c-gold-t); }
.faq-item[open] summary::after { content: "－"; }
.faq-item summary:hover { background: var(--c-paper-2); }
.faq-item .faq-body { padding: 0 18px 15px; }

/* =========================== 一覧ページ =========================== */
.listing { display: grid; grid-template-columns: 240px 1fr; gap: 30px; align-items: start; padding-top: 8px; }
/* sticky で固定される以上、ビューポートより高いと下端（在庫・評価の絞り込み）に
   永久に到達できない。カテゴリツリーを内包するため実際に約2000pxある。
   自身をスクロール可能にして、高さに関係なく全項目へ到達できるようにする */
.facets { border: var(--border); border-radius: var(--radius-md); padding: 18px; background: #fff; position: sticky; top: 120px; max-height: calc(100vh - 140px); overflow-y: auto; }
.facets h2 { font-size: var(--fs-base); margin: 0 0 12px; }
.facet-group { margin-bottom: 16px; }
.facet-group h2, .facet-group h3 { font-size: var(--fs-sm); margin: 0 0 8px; color: var(--c-gray); }
/* 23.8px ＋ 隙間 5px。label はチェックボックスの当たり判定そのものなので、
   margin（押しても反応しない隙間）を 0 にして縦 padding 12px へ振り替え、47.8px にする。
   絞り込みパネルは項目数ぶん縦に伸びるが、960px 未満では position:static なので
   スクロールが詰まることはない */
.facet-group label { display: flex; gap: 8px; align-items: center; font-size: var(--fs-sm); margin-bottom: 0; padding: var(--space-3) 0; cursor: pointer; }
.facet-group input { accent-color: var(--c-yellow); }
.listing-head { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; margin-bottom: 18px; padding-bottom: 12px; border-bottom: var(--border); }
.listing-head .count { font-weight: var(--fw-bold); }
.sort select { border: var(--border); border-radius: var(--radius-sm); padding: 8px 14px; font-weight: var(--fw-normal); background: #fff; }
/* ★現在どのページでも使っていない（実測0件）。それでも残している理由：
   /products/ は208件を1ページに展開しており（198KB・タグ2,847）、
   将来ページ分割するときにこの見た目が要る。
   min-width の44pxは、指で押せる大きさ（WCAG 2.5.8）を確保するためのもので、
   作り直すと同じ検討をやり直すことになる。**消すなら理由ごと消すこと。** */
.pagination { display: flex; gap: 8px; justify-content: center; margin-top: 32px; }
/* 高さは 16px×1.7＋padding16＋border1.6 ＝ 44.8px で足りているが、
   1桁ページ（「1」「2」）では幅が約39pxしかない。min-width で 44px を確保し、
   2桁以上のときだけ padding ぶん広がるようにする（text-align は中央寄せ） */
.pagination a, .pagination span { border: var(--border); border-radius: var(--radius-sm); padding: 8px 14px; min-width: 44px; text-align: center; text-decoration: none; font-weight: var(--fw-bold); color: var(--c-purple-d); background: #fff; }
.pagination .current { background: var(--c-yellow); color: #2B1A00; border-color: var(--c-gold-d); }

/* =========================== バナー / 特集（白カードに統一） =========================== */
.banner-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px,1fr)); gap: 16px; }
.banner { border: var(--border);  border-radius: var(--radius-md); padding: 22px; color: var(--c-ink); background: #fff; text-decoration: none; display: block; transition: box-shadow .15s ease; }
.banner:hover { }
/* 未実装のバナー。<a> ではなく <div class="banner ... is-pending"> にする。
   ★cursor だけで区別しない（2026-08-28）。スマホには cursor が存在しないので、
     主要ターゲットの利用環境では動作するバナーと**見分けがつかなかった**。
     押しても何も起きない状態は絶対ルール14。使えないことを見えるようにする。 */
.banner.is-pending { cursor: default; position: relative; opacity: .72; filter: saturate(.55); }
.banner.is-pending .pending-tag {
  display: inline-block; font-size: var(--fs-xs); font-weight: var(--fw-bold);
  background: #fff; color: var(--c-ink); border: var(--border); border-radius: var(--radius-sm);
  padding: 1px 10px; margin-bottom: 8px;
}
.banner h2, .banner h3 { margin: 0 0 8px; font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--c-purple); }
.banner p { color: #3a3f47; margin: 0; font-size: var(--fs-sm); }
.banner.b1, .banner.b2, .banner.b3, .banner.b4 { background: #fff; }
.banner.b1 h2, .banner.b2 h2, .banner.b3 h2, .banner.b4 h2, .banner.b1 h3, .banner.b2 h3, .banner.b3 h3, .banner.b4 h3 { color: var(--c-purple); }

/* 安心訴求の帯（ライトグレー地） */
.trust-band { background: var(--c-paper-2); color: var(--c-ink); border-top: var(--border); border-bottom: var(--border); }
.trust-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap: 20px; padding: 36px 0; }
.trust-item { text-align: center; }
.trust-item .ico { font-size: var(--fs-2xl); }
.trust-item h2, .trust-item h3 { color: var(--c-purple); margin: 8px 0 6px; font-weight: var(--fw-bold); }
.trust-item p { font-size: var(--fs-sm); margin: 0; color: #3a3f47; }

/* =========================== フッター =========================== */
.site-footer { background: var(--c-purple); color: #D9DCE1; margin-top: 56px;  }
.footer-grid { display: grid; grid-template-columns: 1.4fr repeat(3, 1fr); gap: 28px; padding: 46px 0 30px; }
.footer-grid h2 { color: #fff; font-size: var(--fs-base); margin: 0 0 12px; font-weight: var(--fw-bold); }
.footer-grid ul { list-style: none; margin: 0; padding: 0; }
/* li の margin（8px）は当たり判定に含まれないので 0 にし、
   その分を a の縦 padding へ振り替える */
.footer-grid li { margin-bottom: 0; }
.footer-grid a { color: #C3C8D0; text-decoration: none; font-size: var(--fs-sm); }
/* 44px の当たり判定は「li の中のリンク」だけに付ける。
   .footer-grid a に直接 display:block を足すと、特異度 0,1,1 が .logo（0,1,0）に勝ち、
   .footer-brand のロゴ（a要素・inline-flex）まで block 化してマークとロゴタイプが縦に割れる。
   縦 padding 12px で 23.8px → 47.8px。見た目のピッチは 31.8px → 47.8px */
.footer-grid li a { display: block; padding: var(--space-3) 0; }
.footer-grid a:hover { color: var(--c-yellow); text-decoration: underline; }
.footer-brand .logo { color: #fff; }

.footer-brand p { font-size: var(--fs-sm); color: #9DA3AD; max-width: 36ch; }
.footer-bottom { border-top: 1px solid rgba(255,255,255,.14); padding: 18px 0; font-size: var(--fs-xs); color: #929AA6; text-align: center; }

/* =========================== カテゴリ・ナビ（サイドバー ツリー） =========================== */
.catnav { margin-bottom: 20px; border: var(--border); border-radius: var(--radius-md); overflow: hidden; }
.catnav-title { font-size: var(--fs-base); margin: 0; padding: 11px 14px; background: var(--c-purple); color: #fff; font-weight: var(--fw-bold); }
.catnav-big { border-top: var(--border); }
.catnav-big > summary { cursor: pointer; list-style: none; padding: 10px 14px; font-weight: var(--fw-bold); font-size: var(--fs-sm); color: var(--c-purple); display: flex; justify-content: space-between; align-items: center; background: #fff; }
.catnav-big > summary::-webkit-details-marker { display: none; }
.catnav-big > summary::after { content: "＋"; color: var(--c-gold-t); font-weight: var(--fw-bold); }
.catnav-big[open] > summary::after { content: "－"; }
.catnav-big > summary:hover { background: var(--c-paper-2); }
.catnav-mid { padding: 4px 14px 10px; }
.catnav-midname { display: block; font-size: var(--fs-xs); color: var(--c-gray); font-weight: var(--fw-bold); margin: 6px 0 4px; }
.catnav-mid ul { list-style: none; margin: 0; padding: 0; }
.catnav-mid li { margin: 0; }
/* 縦 padding 5px では 33.8px。12px（--space-3）へ広げて 47.8px を確保する。
   横 8px は据え置き（hover 時の地色の見え方を変えないため） */
.catnav-mid li a { display: block; padding: var(--space-3) var(--space-2); border-radius: var(--radius-sm); text-decoration: none; color: var(--c-ink); font-size: var(--fs-sm); }
.catnav-mid li a:hover { background: var(--c-paper-2); color: var(--c-gold-t); }
/* 現在地の値は page に統一（.gnav / .tabbar-item と同じトークン）。
   true は汎用フォールバックで、ナビゲーションのリンクには page が正しい */
.catnav-mid li a[aria-current="page"] { background: var(--c-purple); color: #fff; font-weight: var(--fw-bold); }

/* =========================== トップ：目的から探す =========================== */
/* 旧 .dir-* （カテゴリツリーの再掲）はHTMLから撤去済み。参照0件を確認のうえ削除した。
   現行は「予算・不安・価値」の判断軸で選ばせる構成：
   上段 = 不安解消の帯（.purpose-lead）／下段 = 3つの判断軸（.purpose-grid） */

/* --- 上段：はじめて中古を買う人の不安に先回りする帯 --- */
/* 地色を敷いて下段のリンク集と役割を分ける。地色は --color-bg-sub の1階調のみ（§2） */
.purpose-lead {
  background: var(--color-bg-sub);
  border-radius: var(--radius-md);   /* パネル＝8px（§5-2） */
  padding: var(--space-6);
  margin-bottom: var(--space-8);     /* 下段グリッドとの間に1段大きい間隔を取る */
}
/* 見出しとリード文は横並び。ベースライン揃えで文字サイズ差があっても行が沈まない */
.purpose-lead-head {
  display: flex; align-items: baseline; gap: var(--space-4); flex-wrap: wrap;
  margin-bottom: var(--space-5);
}
.purpose-lead-head h3 { margin: 0; font-size: var(--fs-lg); font-weight: var(--fw-bold); color: var(--color-brand); }
.purpose-lead-head p  { margin: 0; font-size: var(--fs-sm); color: var(--color-text-sub); }

/* --- 質問カード4枚 --- */
.purpose-q {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-3);
}
/* 白面＋罫線で地色から浮かせる。height:100% で質問文の長短にかかわらず高さを揃える */
.purpose-q a {
  display: block; height: 100%;
  background: var(--color-bg);
  border: var(--border); border-radius: var(--radius-md);
  padding: var(--space-4);
  font-size: var(--fs-sm); color: var(--color-text); text-decoration: none;
  line-height: var(--lh-card);
}
/* ホバーは罫線色のみ変える。影は §5-1 の3箇所（メガメニュー／サジェスト／モーダル）限定 */
.purpose-q a:hover { border-color: var(--color-brand); }
/* 質問文（1行目）をブランド色・太字にして、補足文との主従を付ける */
.purpose-q-t { display: block; font-weight: var(--fw-bold); color: var(--color-brand); margin-bottom: var(--space-1); }

/* --- 下段：3つの判断軸（予算 / 価値 / もう一度遊ぶ） --- */
/* 列間より行間を広く取り、折り返し時に列同士が繋がって見えないようにする */
.purpose-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-8) var(--space-6); }
.purpose-col h3 { margin: 0 0 var(--space-3); font-size: var(--fs-base); font-weight: var(--fw-bold); color: var(--color-brand); }
.purpose-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-2); }
.purpose-col li a { font-size: var(--fs-sm); color: var(--color-text); text-decoration: none; }
/* ホバーは下線のみ。色を変えないのは、リンクが密に並ぶ一覧でちらつかせないため */
.purpose-col li a:hover { text-decoration: underline; }

/* 960px未満：カード4列／3列は1枚あたりが狭くなりすぎるため、ともに2列へ */
@media (max-width: 960px) {
  .purpose-q { grid-template-columns: repeat(2, 1fr); }
  .purpose-grid { grid-template-columns: repeat(2, 1fr); }
}
/* 568px未満：単一カラム。帯の内側余白も1段落とす */
@media (max-width: 568px) {
  .purpose-q { grid-template-columns: 1fr; }
  .purpose-grid { grid-template-columns: 1fr; }
  .purpose-lead { padding: var(--space-5); }
}

/* =========================== カート / 購入手続き =========================== */
.qty { display: inline-flex; align-items: center; border: var(--border); border-radius: var(--radius-sm); overflow: hidden; }
/* 32×32 だとタップ領域が 44×44 に満たない（WCAG 2.5.8）。
   font-size は変えず、当たり判定だけを min-width/min-height で 44px まで広げる
   （* { box-sizing: border-box } のため固定 width への padding では箱が広がらない）。
   数量ステッパーの見た目は 32px → 44px の正方形になる */
.qty button { border: none; background: var(--c-paper-2); min-width: 44px; min-height: 44px; font-size: var(--fs-lg); font-weight: var(--fw-bold); cursor: pointer; color: var(--c-purple); }
.qty button:hover { background: var(--c-yellow); }
.qty span { min-width: 34px; text-align: center; font-weight: var(--fw-bold); }
.cart-summary { max-width: 380px; margin-left: auto; border: var(--border); border-radius: var(--radius-md); padding: 18px; background: #fff;  }
.cart-line { display: flex; justify-content: space-between; padding: 6px 0; }
.cart-line.total { border-top: var(--border); margin-top: 6px; padding-top: 12px; font-size: var(--fs-lg); }
.cart-line.total b { color: var(--c-purple); font-family: var(--font-display); }
.cart-note { font-size: var(--fs-xs); color: var(--c-gray); margin: 4px 0 8px; }

.co-steps { display: flex; gap: 6px; margin-bottom: 24px; flex-wrap: wrap; }
.co-step { flex: 1; min-width: 90px; text-align: center; font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--c-gray); border-bottom: var(--border); padding-bottom: 8px; }
.co-step .d { display: inline-flex; width: 26px; height: 26px; border-radius: var(--radius-full); background: var(--c-paper-2); align-items: center; justify-content: center; margin-right: 4px; }
.co-step.active { color: var(--c-purple); border-bottom-color: var(--c-yellow); }
.co-step.active .d { background: var(--c-purple); color: #fff; }
.co-step.done .d { background: var(--c-instock); color: #fff; }
.co-form { display: grid; gap: 14px; max-width: 520px; margin: 16px 0; }
.co-form label { display: flex; flex-direction: column; gap: 5px; font-weight: var(--fw-bold); font-size: var(--fs-sm); }
.co-form input { border: var(--border); border-radius: var(--radius-sm); padding: 11px 13px; font-size: var(--fs-base); font-family: var(--font-main); }
.co-form input:focus { outline: 2px solid var(--color-brand); outline-offset: 2px; box-shadow: 0 0 0 4px var(--color-accent); border-color: var(--c-gold-d); }
.co-opts { display: grid; gap: 10px; max-width: 520px; margin: 16px 0; }
.co-opt { border: var(--border); border-radius: var(--radius-md); padding: 14px 16px; cursor: pointer; font-weight: var(--fw-bold); }
.co-opt:hover { border-color: var(--c-yellow); }
.co-nav { display: flex; justify-content: space-between; margin-top: 18px; }
.co-done { text-align: center; padding: 30px 0; }
.co-check { width: 64px; height: 64px; border-radius: var(--radius-full); background: var(--c-instock); color: #fff; font-size: var(--fs-2xl); display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; }

/* =========================== 下部タブバー =========================== */
/* §3-4：960px未満でグローバルナビの代わりに使う。
   項目はメルカリ（ホーム/お知らせ/出品/マイページ）ではなく、
   B2C中古ECの導線に合わせて 検索・カート を含む5項目に再設計している。 */
.tabbar { display: none; }

@media (max-width: 960px) {
  .tabbar {
    display: grid; grid-template-columns: repeat(5, 1fr);
    position: fixed; left: 0; right: 0; bottom: 0; z-index: var(--z-header);
    height: calc(56px + env(safe-area-inset-bottom, 0px));
    padding-bottom: env(safe-area-inset-bottom, 0px);
    background: var(--color-bg);
    border-top: var(--border);
  }
  .tabbar-item {
    appearance: none; background: none; border: 0; cursor: pointer;
    font-family: var(--font-base); font-size: 11px; font-weight: var(--fw-normal);
    line-height: 1.2; color: var(--color-text-sub); text-decoration: none;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 3px; min-height: 44px; padding: 6px 2px; text-align: center;
  }
  .tabbar-ico { font-size: var(--fs-lg); line-height: 1; }
  /* アクティブ項目のみアクセント色（§3-4） */
  /* 現在地を色だけで示すと、非アクティブとの相互コントラストが 1.13:1 しかなく
     色覚特性のある人には区別できない（WCAG 1.4.1）。太字を併用して形状でも示す */
  .tabbar-item[aria-current="page"], .tabbar-item[aria-expanded="true"] { color: var(--color-accent-text); font-weight: var(--fw-bold); }
  .tabbar-item:focus-visible { outline: 2px solid var(--color-brand); outline-offset: -2px; box-shadow: inset 0 0 0 6px var(--color-accent); }
  /* タブバーに隠れないよう本文末尾に余白を確保 */
  body { padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)); }
}

/* =========================== レスポンシブ =========================== */
/* §3-3：ブレークポイントは 568 / 960 / 1440 の3点に固定。
   旧 900 / 720 / 560 はここへ統合済み。新しい値を増やさないこと。 */

/* --- 960px未満：グローバルナビを下部タブバーへ切り替え --- */
@media (max-width: 960px) {
  .hero-inner { grid-template-columns: 1fr; }
  .product-layout { grid-template-columns: 1fr; }
  /* 1カラムになると、正方形のメイン画像が幅いっぱい（768px幅で713px）に育ち、
     価格と入荷通知のボタンをその分だけ下へ押し下げる。
     開店時は在庫0で、入荷通知の登録がCV（絶対ルール16）。最初の画面に
     判断材料が出ないのは損なので、この範囲だけ画像の幅に上限を置く。
     ★モバイル（375px）では画像が320pxで上限より小さいため影響しない。
     ★画像の実寸は444pxなので、上限を444より大きくしても粗くなるだけ。 */
  .gallery { max-width: 420px; }
  .listing { grid-template-columns: 1fr; }
  /* ★モバイルでは position だけでなく**箱そのもの**を解く（2026-09-08）。
     以前はここで position しか戻しておらず、サイドバー用の
     `max-height: calc(100vh - 140px); overflow-y: auto`（上の .facets）が残っていた。
     その結果 672px の箱に 1,812px を詰めた入れ子スクロールになり、
     ・画面中央のスワイプでページではなくカテゴリリストが動く
     ・「在庫ありのみ」が箱の内側にあり、ページを送っても永久に現れない
     という状態だった。上の行のコメントは「960px 未満では position:static なので
     スクロールが詰まることはない」と書いていたが、**事実と違っていた。**

     display:contents で箱を消し、中身を .listing の flex 直下に並べ替える。
     並び順は「絞り込み → 商品 → カテゴリで探す」。
     カテゴリナビは着地した人の目的ではなく、見終わった人の次の一手なので後ろでよい。
     実測（genre/rpg・375×812）：最初の商品 1,086→834px、絞り込み 2,049→698px。 */
  .facets { display: contents; }
  .listing { display: flex; flex-direction: column; }
  .facets > h2,
  .facets > .facet-group { order: 1; }
  .listing > :not(.facets) { order: 2; }
  .facets > .catnav { order: 3; }

  /* 絞り込みは縦に積むと長い（7項目で約700px）。チップ状に詰めて、
     商品が初回表示の近くへ来るようにする。押せる面積は保つ。 */
  .facets > h2 { margin: 8px 0 4px; }
  .facets > .facet-group { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin: 0 0 6px; }
  .facets > .facet-group > h3 { width: 100%; margin: 2px 0 0; font-size: var(--fs-xs); }
  /* ★押せる高さは44px以上を保つ（主要ターゲットが50代・モバイル中心のため、
     詰めることを優先して指で押しにくくしない）。チップ状にしても面積は削らない。 */
  .facets > .facet-group label { display: inline-flex; align-items: center; gap: 6px; min-height: 44px;
    border: var(--border); border-radius: var(--radius-full); padding: 4px 14px; font-size: var(--fs-sm); margin: 0; }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .megamenu-inner { grid-template-columns: 1fr 1fr; gap: var(--space-5); }
  /* 行2のカテゴリタブは非表示。カテゴリ導線はタブバーの「カテゴリ」が担う */
  .gnav { display: none; }
  /* カートとお気に入りもヘッダーから外す。以前この指定は 568px 以下だけに置いていたが、
     569〜960px には .tabbar（＝代わりの導線）が既に出ているのに .header-actions も
     残るという中途半端な状態になっていて、ヘッダー行1が破綻していた。

     ヘッダー行1で幅が可変なのは .header-search（flex: 1 1 33%）だけで、
     他は実質固定：左右padding 40px ＋ gap 32px×2 ＋ ロゴ 238px
     ＋ .header-actions 319px（.icon-btn は min-width 150px だが
     「カート（0）」の内容幅が 161px あるため実測はこちら）＝ 合計 673px。
     つまり 673px を下回ると、検索窓を 0 まで潰しても足りず右へあふれる。
     しかも .header-top は position: fixed なので文書の scrollWidth は
     viewport のままで、横スクロールでも追いつけない＝カートボタンに到達できない。
     実測：viewport 569px でカートボタンの右端が 673px（104px はみ出し）、
           検索窓の実幅 32px。768px でも検索窓は 92px しかなかった
           （「画面幅の約1/3」という §3-2 の設計意図に対して 12%）。

     960px を境にしたのは、ここが .tabbar の出る既存のブレークポイントだからで、
     §3-3 の 568 / 960 / 1440 に新しい値を足していない。
     カートは .tabbar の「カート」、お気に入りは同じく「マイページ」が引き継ぐ。 */
  .header-actions { display: none; }
  /* メガメニューはタブバーから開くため、ヘッダー直下ではなく画面下から重ねる */
  .megamenu { position: fixed; top: var(--header-height); left: 0; right: 0;
              bottom: calc(56px + env(safe-area-inset-bottom, 0px));
              overflow-y: auto; z-index: var(--z-megamenu);
              border-bottom: 0; box-shadow: none; }
}

/* --- 568px未満：検索窓を独立行に落とす --- */
@media (max-width: 568px) {
  /* 検索窓が2行目に落ちるぶんヘッダー行1が高くなるため、
     固定ヘッダーではなく通常フローに戻して高さのズレを避ける */
  .site-header { padding-top: 0; }
  .header-top { position: static; }
  /* ヘッダーが固定でなくなるため、カテゴリシートは画面全体を覆う。
     タブバー（z-index 100）はメガメニュー（90）より前面に残るので、
     「カテゴリ」をもう一度押せば閉じられる */
  .megamenu { top: 0; }
  /* 1段目＝ロゴ、2段目＝検索窓の2段。行間・上下余白とも12pxに揃える */
  .header-bar { flex-wrap: wrap; height: auto; padding-block: var(--space-3); gap: var(--space-3); align-content: center; }
  .header-search { order: 3; flex-basis: 100%; max-width: none; }
  /* ロゴタイプは消さない。屋号が画面に出ないのは通販として成立しない
     （alt は読み上げとクローラにしか届かない）。マーク36px・キャップ高12px＝幅134px */
  .logo { gap: 9px; }
  .logo-mark { height: 36px; width: 36px; }
  .logo-type { height: 12px; transform: translateY(1px); }
  /* .header-actions の非表示指定は上の 960px ブロックへ移した（569〜960px でも
     同じ理由で外す必要があったため）。ここに重ねて書くと、片方だけ直したときに
     どちらが効いているのか分からなくなるので置かない。 */
  .megamenu-inner { grid-template-columns: 1fr; gap: var(--space-4); }
  .footer-grid { grid-template-columns: 1fr; }
}

/* --- 1440px以上：最大幅で頭打ちにし、それ以上は余白 --- */
@media (min-width: 1440px) {
  .wrap, .header-bar, .gnav-inner, .megamenu-inner { max-width: var(--wrap); }
}

@media (prefers-reduced-motion: reduce) {
  /* アニメーションも止める。宣言は既存のこの1行に足すだけで、
     優先度を強制するセレクタ自体は増やさない（CLAUDE.md の増やさない規約に準拠） */
  * { transition: none !important; animation: none !important; scroll-behavior: auto; }
  /* ★html { scroll-behavior: smooth } は 2026-09-02 に削除したので、
     ここで打ち消す必要はもう無い。既定（auto）のまま。
     smooth を復活させるときは、この打ち消しも一緒に戻すこと。 */
}

/* ======================================================================
   ユーティリティ（2026-08-27 にインライン style から移した）
   ----------------------------------------------------------------------
   移す前は `style="…"` が update/ 全体に 2,209箇所あり、
   **異なる値は19種類しかなかった**。同じ宣言を貼り重ねていただけで、
   記事幅（max-width:860px）を変えるには439箇所を触る必要があった。
   CLAUDE.md の「公開ページの変更は style.css の1ファイルのみ」は、
   こういう散らばりを防ぐための規約なので、値ごとにクラスへまとめた。

   ★このブロックはファイル末尾に置くこと。
     .section / .wrap / .prose の基本ルールと 1440px のメディアクエリを
     後ろから上書きする必要がある（インライン style が持っていた強さの代わり）。
   ★新しい見た目を足すときは、まずここに既にあるかを見る。
     クラスを増やすほど、同じ意味の別名が生まれて食い違う。
   ====================================================================== */
.section--flush   { padding-top: 0; }
.section--tight   { padding-top: 16px; }
.section--tighter { padding-top: 8px; }
.wrap--narrow     { max-width: 860px; }
.prose--full      { max-width: none; }
.mt-sm            { margin-top: 14px; }
.mt-lg            { margin-top: 36px; }
.mb-xs            { margin-bottom: 8px; }
/* 記事内の小見出し（h2 だが .section-title より小さく使う） */
.h-sub            { font-size: 1.1rem; margin: 18px 0 8px; }
/* 補足の一行（更新日など）。--fs-sm は 14px で .85rem と一致しないため実寸で書く */
.text-note        { font-size: .85rem; color: var(--c-gray); }
/* フォームの入力欄。legal / login / stock-alert の3ページで同じ見た目を使う */
.field-input      { width: 100%; padding: 10px; border: 3px solid var(--c-ink); border-radius: 12px; }
/* ── 入荷通知フォームの商品選択（2026-09-07 追加） ──────────────
   商品名を打たせると、書き方の違いで別商品として登録され、入荷しても
   通知が届かない。打つのをやめて、候補から選んで slug を確定させる。
   候補の見た目はヘッダー検索と同じ .search-suggest を使い回す
   （新しい見た目を増やさない）。 */
.sa-pick { display: grid; gap: 12px; }
/* 候補リストは position:absolute なので、親に基準を作る */
.sa-suggest-wrap { position: relative; }
.sa-suggest-wrap .search-suggest { max-height: 280px; overflow-y: auto; }
/* 確定した商品。選べていることを文字で示す（色だけに頼らない） */
.sa-picked { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--color-state-in); }
.sa-picked a { font-weight: var(--fw-normal); }
/* 読み取り専用の欄は「押しても打てない」ことが分かる地色にする */
#sa-item[readonly] { background: var(--c-paper-2); }
/* 選び直しの導線（2026-09-08）。商品が確定しているあいだだけ main.js が出す。
   .sa-pick は grid なので、指定しないと幅いっぱいに伸びて主導線（送信ボタン）と
   同じ強さに見える。内容幅に留め、字も細くして「戻り道」であることを示す。
   押せる面積は 44px を保つ。 */
.sa-change { justify-self: start; min-height: 44px; padding: 8px 16px;
             font-size: var(--fs-sm); font-weight: var(--fw-normal); }
/* ★hidden 属性を効かせるために display を明示する（2026-09-08）。
   ブラウザ既定の [hidden]{display:none} は**要素セレクタ相当の弱さ**しかないので、
   .btn{display:inline-flex} のようなクラス指定に負ける。
   つまり el.hidden = true にしても消えない。実測で、確定前のフォームが
   このボタンの分だけ 56px 伸びていた（296px → 352px）。 */
.sa-change[hidden] { display: none; }
/* 送信できたあとの「別の商品も登録する」（2026-09-09）。
   フォームは grid なので、指定しないと幅いっぱいに伸びて
   完了直後の画面で主導線のように見える。内容幅に留める。
   ★.sa-change と同じく [hidden] を明示する。.btn{display:inline-flex} が
     ブラウザ既定の [hidden]{display:none} に勝つため、書かないと消えない。 */
.form-again { justify-self: start; min-height: 44px; padding: 8px 16px;
              font-size: var(--fs-sm); font-weight: var(--fw-normal); margin-top: 4px; }
.form-again[hidden] { display: none; }

/* フォームの送信結果（2026-08-28）。main.js が role="status" を付けて生成する。
   API契約 0章に従い、message はサーバーが返した日本語をそのまま出す。 */
.form-status { margin: 12px 0 0; font-weight: var(--fw-bold); line-height: 1.7; }
.form-status.ok { color: var(--c-instock); }
.form-status.ng { color: var(--color-text); }
.field-error { display: block; margin-top: 4px; font-size: var(--fs-sm); color: var(--color-text); font-weight: var(--fw-bold); }

@media (max-width: 568px) {
  /* パンくずを1行に収め、はみ出す分は横スクロールにする（2026-08-28）。
     375px幅で計測したところ、商品名が長いページではパンくずが3〜4行に折り返して
     **139px**（ヘッダーより高い）を占め、h1 が760px地点＝画面高812pxのほぼ外だった。
     価格は1017px、入荷通知ボタンは1400px で、判断材料が2画面下にある状態。
     ★JSON-LD の BreadcrumbList には触らないので、検索エンジンから見える階層は変わらない。
     ★項目を省略もしない（読み上げ・回遊の手がかりを減らさない）。折り返しをやめるだけ。 */
  .breadcrumb ol {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .breadcrumb ol::-webkit-scrollbar { display: none; }
  .breadcrumb li { white-space: nowrap; }
  /* 最後の項目（現在地）は長くなりがちなので、ここだけ縮められるようにする */
  .breadcrumb li:last-child { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
}
