/* ============================================================================
 * interaction-safety.css — 入力衛生と安全を保証する横断ポリシー
 * v2.9 (Minimal-Contract / Apple流の厳格さ + 実運用のしなやかさ)
 * ----------------------------------------------------------------------------
 * 目的:
 *  - iOS/Safari の「ワンタップ不発」「hover粘着」「visited残留」を構造的に回避。
 *  - タッチ端末では :hover 視覚を中和し、1タップで確実に click へ到達。
 *
 * 運用ルール:
 *  - このファイルは **全ページで最後に読み込む**（@layerは使わない／カスケードで勝つ）。
 *  - 見た目の演出（押下の“沈み/バネ感”等）は各コンポーネントCSSに委譲。
 *  - **幾何/時間（transform/transition/animation/ease/speed）は決して記述しない**（憲法）。
 *
 * 境界:
 *  - 可視ゲートは Core×Render 契約（aria-hidden のみ）。display は切らない。
 *  - 本ファイルは「リンク/操作の安全性」と「媒体差の受け皿（site-* 変数）」のみを担う。
 *  - FAB(.cve-fab) と 役割リンク([data-overlay-link]) の演出には不干渉。
 *  - ★方針: :active（押下中）には **一切触れない**（OS/ブラウザ既定の押下色を尊重）。
 *  - ★SPの :hover 中和では **color を変更しない**（中間フラッシュ根絶）。
 * ============================================================================ */


/* ----------------------------------------------------------------------------
   1) タッチ環境の衛生（単一メディアブロック）
   - hover粘着の中和、タップ応答性向上、長押しメニュー抑止などを集約。
   - :where/:is で語彙を宣言的に整理。常に .cve-fab は除外。
---------------------------------------------------------------------------- */
@media (hover: none), (pointer: coarse) {

  /* UAヒントと基本衛生（青ハイライト/長押しメニューの抑止）
     ※ 視覚破壊を伴わないため [data-overlay-link] も対象に含めてよい */
  :where(a, button, [role="button"], [data-overlay-link]):not(.cve-fab) {
    -webkit-tap-highlight-color: transparent;
    -webkit-touch-callout: none;
    user-select: none;
    touch-action: manipulation;
    cursor: pointer;
  }

  /* :hover 視覚の中和（装飾/効果のみ。★colorには触れない）
     - “押下中は中和しない”ため :hover:not(:active)
     - 役割リンク([data-overlay-link])は除外。幾何/時間には不干渉。 */
  :is(a, button, [role="button"]):hover:not(:active):not(.cve-fab):not([data-overlay-link]) {
    background: transparent;
    box-shadow: none;
    filter: none;
    opacity: 1; /* inherit 依存を避けて静置 */
    /* color: 触れない（既定を尊重） */
  }
}


/* ----------------------------------------------------------------------------
   2) アクセシビリティ（フォーカス可視は :focus-visible 主軸）
   - !important 不使用。kbd強制可視は互換アダプタ（任意）。
   - サイト任意の色を --site-focus-outline-color で差し替え可。
---------------------------------------------------------------------------- */
:focus { outline: none; }

:root {
  --site-focus-outline-color: #4aa7ff;
}

:is(a, button, [role="button"]):focus-visible {
  outline: 2px solid var(--site-focus-outline-color, #4aa7ff);
  outline-offset: 2px;
}

html.kbd-nav :focus {
  outline: 2px solid var(--site-focus-outline-color, #4aa7ff);
  outline-offset: 2px;
}

@media (forced-colors: active) {
  :is(a, button, [role="button"]):focus-visible { outline-color: Highlight; }
}


/* ----------------------------------------------------------------------------
   3) 無効/ビジー状態の横断ガード（操作不可＋視覚の手掛かり）
   - FABは除外：FABの可否はPresenter/ARIAで決定（“見えるのに触れない”禁止）。
   - 視覚は最小限。演出は各コンポーネント側へ。
---------------------------------------------------------------------------- */
:where([aria-disabled="true"], .is-disabled, [disabled], [data-busy]):not(.cve-fab) {
  pointer-events: none;
  opacity: .5;
  cursor: not-allowed;
}


/* ----------------------------------------------------------------------------
   4) アプリ状態フラグ（JSと連携）
   - Overlay開放中の背景スクロール抑止。器(inert)と併用で二重化しない範囲の保険。
---------------------------------------------------------------------------- */
:is(html, body).is-overlay-locked {
  overflow: hidden;
  touch-action: none;
  overscroll-behavior: contain; /* iOS/Safari の慣性貫通も抑止 */
  /* -webkit-overflow-scrolling: auto; ← 必要時のみ解放 */
}


/* ----------------------------------------------------------------------------
   5) 一時的な全域テキスト選択/コールアウト抑止（GTAが付与/解除）
   - 末尾読み込みで勝つため !important 不要。display/幾何は触らない。
   - 入力欄は常に除外して可用性を担保（cmd-f/cmd-gの検索編集にも影響なし）。
---------------------------------------------------------------------------- */
html.no-select,
html.no-select *:not(input):not(textarea):not([contenteditable="true"]) {
  -webkit-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}


/* ----------------------------------------------------------------------------
   6) 媒体差“受け皿”トークン（値のみ／演出は各コンポーネント）
   - PC既定はSSOT(core.tokens.css)。SP差分は site-* 変数で供給。
   - 幾何/時間はここでは持たない（各コンポーネント側の合成式が採用）。
---------------------------------------------------------------------------- */
@media (hover: none) {
  :root {
    /* 例: FABの押下体感をSPで微校正（値だけ供給／採用はFAB側の合成式） */
    --site-fab-press-translate: 3px; /* 既定2px→SPで+1pxの沈み量 */
    --site-fab-press-scale: 0.97;    /* 既定0.98→SPでわずかに強め */
    /* 例）PageTop特例が必要なら：--site-fab-press-translate-role-pagetop: 4px; */
  }
}


/* 開発メモ（再発防止ガード）
   - transform / transition / animation-* は **記述禁止**（演出はSkin/コンポーネント）。
   - hover中和対象から ① .cve-fab と ② [data-overlay-link] は常に除外（合成transform/押下演出に不干渉）。
   - ★:active には一切触れない（OS/ブラウザの押下色を尊重）。
   - ★ SPの :hover 中和では color を変更しない（黒化フラッシュ根絶）。
   - ★ 粘着対策は :hover:not(:active) で行う（押下中は中和しない）。
   - 変更時は SP 実機で：
     * 通常リンク：タップ中のみタップ色 → 離すと即復帰（hover粘着なし・黒化なし）
     * Overlayリンク：押下で沈む＋press色/影 → 離すと即復帰（固着なし）
*/
