:root {
  --bg: #0f0f13;
  --surface: #1a1a22;
  --surface2: #22222e;
  --border: #2e2e3e;
  --text: #e8e8f0;
  --text-muted: #888899;
  --accent: #7c6af7;
  --accent-hover: #9b8dff;
  --danger: #f76a6a;
  --success: #4caf7d;
  --warn: #f7a84a;
  --radius: 8px;
  --radius-lg: 12px;
}

/* サイトカラー切り替え（白・黒）。2026-07-15導入。
   htmlタグのdata-theme属性で全体を切り替える（JSはapp_test.js「テーマ切り替え」
   セクション参照。localStorage保存＋<head>内インラインscriptで初回描画前に
   適用するため、暗い既定テーマ→明るいテーマへの一瞬の切り替わり(FOUC)が起きない）。
   2026-07-16にデザイン判断をフォールバックし、面と文字の
   基本色だけを入れ替える最小構成に戻した（ランキング色・星評価色・タグ色・
   価格色・バッジ配色などの個別調整は撤去。以後は個別に指示を受けて決める） */
:root[data-theme="light"] {
  --bg: #ffffff;
  --surface: #ffffff;
  --surface2: #eeeef2;
  --border: #c8c8d2;
  --text: #16161d;
  --text-muted: #6b6b78;
  --accent: #7c6af7;
  --accent-hover: #9b8dff;
}

* { box-sizing: border-box; margin: 0; padding: 0; }

/* 縦スクロールバーの有無を常に固定する（動画で発覚したキメラの正体・2026-07-09）。
   599px境界のすぐ外側（600〜620px程度）では、次のフィードバックループが起きていた：
   読み込み済みの長いリストは縦スクロールバーが必要→スクロールバーが数px幅を
   消費し実質幅が599px以下に下がる→JSがモバイル判定でrouteを再実行→
   「読み込み中…」の短いプレースホルダーに差し替わりスクロールバーが不要になる→
   実質幅が599pxを超えて戻る→PC判定でまたrouteが走る→…という無限往復になり、
   ページが読み込み中と表示の間を永遠に行き来して固まって見えていた
   （「第3のスタイル」に見えたのは実際にはこの往復によるチラつき）。
   スクロールバーの分の余白を常に確保しておけば、コンテンツの高さが変わっても
   実質幅が変動しなくなり、この往復自体が起こらなくなる */
/* モバイルSafari等は、しきい値より小さい文字を可読性のため自動で拡大して
   表示することがある（text size adjust）。paddingやborder-radiusは拡大されない
   ため、その分だけ箱の形が崩れて見える（バッジが歪んで見える不具合の原因）。
   全ページでpx指定どおりの大きさで表示されるよう無効化する */
html { scrollbar-gutter: stable; overflow-y: scroll; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }

body {
  background: var(--bg);
  color: var(--text);
  font-family: 'Hiragino Sans', 'Yu Gothic', sans-serif;
  font-size: 14px;
  line-height: 1.6;
  min-height: 100vh;
}

a { color: var(--accent); text-decoration: none; }
a:hover { color: var(--accent-hover); }

/* ── ナビ ── */
header {
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  position: sticky;
  top: 0;
  z-index: 100;
}
nav {
  max-width: 1400px;
  margin: 0 auto;
  padding: 0 16px;
  height: 52px;
  display: flex;
  align-items: center;
  gap: 24px;
}
.logo {
  font-size: 16px;
  font-weight: 700;
  color: var(--text);
  white-space: nowrap;
}
.nav-links {
  display: flex;
  gap: 16px;
}
.nav-links a {
  color: var(--text-muted);
  font-size: 13px;
  white-space: nowrap;
}
.nav-links a:hover { color: var(--text); }
.nav-links-analyze {
  padding-left: 16px;
  border-left: 1px solid var(--border);
}
.nav-group-label {
  color: var(--text-muted);
  font-size: 10px;
  letter-spacing: 0.05em;
  white-space: nowrap;
}

/* ── トップページ カテゴリバー ──
   FANZAの同人トップのカテゴリバーを参考にした構成：
   外側(top-cat-bar)が画面横いっぱいに背景を伸ばし（角丸なし・header同様）、
   内側(top-cat-grid)がnavと同じmax-width:1400pxで中央寄せになる。
   タイルはバーの高さいっぱいのブロックで隙間なく並び、太字。
   ホバー時はアクセント色の塗りつぶしブロック＋白文字にする */
.top-cat-bar {
  background: var(--surface);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  margin: 0 calc(50% - 50vw) 22px;
}
.top-cat-grid {
  display: flex;
  align-items: stretch;
  height: 52px;
  max-width: 1400px;
  margin: 0 auto;
  /* 画面の絶対端まで文字を敷き詰めると、はみ出していなくても視覚的には
     「切れている」ように見える。最低限の余白を確保する */
  padding: 0 8px;
}
.top-cat-tile {
  display: flex;
  align-items: center;
  justify-content: center;
  /* flex-shrinkはブラウザ標準の「本当に収まらない時だけ縮む」仕組み。
     6個の自然な幅（padding込み）が横幅に収まっている間は一切縮まない
     （vwベースのclampのように無条件で縮む、ということが起こらない）。
     min-width:0で、収まらない時は下限なく縮められるようにし、
     text-overflow:ellipsisで、それでも文字が入らない極端な幅では
     ハードクリップではなく「…」で見せる。理論上、画面端で文字が
     不自然に切れることは起こらない */
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  padding: 0 22px;
  color: var(--text);
  font-size: 14px;
  white-space: nowrap;
}
.top-cat-tile:hover {
  background: var(--accent);
  color: #fff;
}
/* カテゴリ別トップページ（2026-07-17）で、現在表示中の
   カテゴリタブを常時ハイライトする。ホバー配色をそのまま流用 */
.top-cat-tile.active {
  background: var(--accent);
  color: #fff;
  font-weight: 700;
}
/* タグ一覧・サークル一覧タブ（2026-07-17）。カテゴリタブとの
   間に伸縮スペーサーを挟んでバー右端に寄せる（区切り線などの装飾は入れない）。
   スマホ幅では場所が足りないため非表示にし、ハンバーガーメニューに任せる */
.top-cat-spacer {
  flex: 1 1 auto;
}
@media (max-width: 599px) {
  .top-cat-tile-secondary,
  .top-cat-spacer {
    display: none;
  }
}

/* ── 使い方ページ ── */
.guide-sections {
  display: flex;
  flex-direction: column;
  gap: 20px;
  max-width: 720px;
}
.guide-section {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 20px;
}
.guide-section h2,
.guide-section h3 {
  font-size: 15px;
  font-weight: 700;
  margin-bottom: 8px;
  color: var(--text);
}
.guide-section p {
  font-size: 13px;
  color: var(--text-muted);
  line-height: 1.7;
  margin-bottom: 10px;
}
.tips-heading {
  font-size: 15px;
  font-weight: 700;
  color: var(--text);
  margin-bottom: 12px;
}
.tips-table-topscroll {
  height: 6px;
  background: var(--border);
  border-radius: 3px;
  margin-bottom: 8px;
  position: relative;
  overflow: hidden;
}
.tips-table-topscroll-thumb {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  background: var(--text-muted);
  border-radius: 3px;
}
.tips-table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.tips-table-wrap::-webkit-scrollbar { display: none; }
.tips-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}
.tips-table th,
.tips-table td {
  border: 1px solid var(--border);
  padding: 8px 12px;
  text-align: left;
}
.tips-table th {
  background: var(--surface2);
  color: var(--text-muted);
  font-weight: 500;
  white-space: nowrap;
}
.tips-table td { color: var(--text); }

/* ── パンくず ── */
.breadcrumb {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  font-size: 11px;
  font-weight: 400;
  color: var(--text-muted);
  margin-bottom: 14px;
}
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: var(--accent); }
.breadcrumb-sep { color: var(--text-muted); font-size: 14px; }
.breadcrumb-current { color: var(--text-muted); font-weight: 400; }

/* ── フッター ── */
.site-footer {
  background: var(--surface);
  border-top: 1px solid var(--border);
  margin-top: 48px;
}
/* 中身が出るまでフッターを出さない(2026-07-30)。
   空の<main>の直下にフッターが出てしまい、作品が届いた瞬間に画面外へ
   吹き飛んでいた。content-readyはapp_test.jsのroute()が描画を終えた時点で
   一度だけ付く(付いたら二度と外れないので、クライアント遷移では隠れない)。
   クラスが付かない環境(JS無効・古いブラウザ)では最初から出るので、
   壊れる方向には倒れない。
   **body.spa-shellに限定すること。** RSC版(app_test.jsを読まない)にまで
   効かせると content-ready が永久に付かず、フッターが一生出ない
   ——2026-07-30に一度やらかして実測で気づいた */
body.spa-shell:not(.content-ready) .site-footer { display: none; }
.site-footer-inner {
  max-width: 1400px;
  margin: 0 auto;
  padding: 24px 16px;
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}
.site-footer-name {
  font-size: 14px;
  font-weight: 700;
  color: var(--text);
}
.site-footer-links {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  margin-left: auto;
}
.site-footer-links a {
  color: var(--text-muted);
  font-size: 12px;
  white-space: nowrap;
}
.site-footer-links a:hover { color: var(--text); }
/* アフィリエイト開示の1行(2026-08-11)。flex-basis:100% で
   名前とリンクの行の下に単独で折り返す。
   **「デカすぎ／目立ちすぎ」の指摘で小さく薄くした**(2026-08-11・オーナー)。
   12px・--text-muted はフッターのリンクと同じ強さで、開示文が
   ナビゲーションと同格に見えていた。10px + opacity で一段落とす。
   opacity にしたのは色を1つ足さずに明暗どちらのテーマでも同じだけ
   落とせるため。**消しはしない**——景表法・ステマ規制の開示なので
   読める大きさは残す。 */
.site-footer-note {
  flex-basis: 100%;
  color: var(--text-muted);
  font-size: 10px;
  opacity: 0.65;
}

/* ── ハンバーガーメニュー(599px以下＝モバイルのみ) ──
   以前は830-850px付近で.nav-search buttonが折り返る不具合を避けるため、
   768px超のタブレット幅（〜850px）もまとめてハンバーガー化していたが、
   タブレット幅なのにハンバーガーになるのはおかしいという指摘を受け、
   モバイルのみに限定した（スマホ/タブレット境界600px・タブレット/PC境界834pxが
   主流の目安のため、2026-07-10にそれまでの768px/1024pxから変更）。折り返り対策は
   下の@media (min-width:600px) and (max-width:833px) でのナビ余白の詰めに置き換える */
.hamburger-btn {
  display: none;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 4px;
  width: 32px;
  height: 32px;
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  cursor: pointer;
  flex-shrink: 0;
}
.hamburger-btn span {
  display: block;
  width: 16px;
  height: 2px;
  background: var(--text);
}
.search-icon-btn { display: none; }
/* サイトカラー切り替えボタン（白・黒）。ハンバーガーと違い、常時（デスクトップ・
   モバイル問わず）表示する常設アイコン。ロゴのすぐ右に置く */
.theme-toggle-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  cursor: pointer;
  flex-shrink: 0;
}
.theme-toggle-btn:hover { border-color: var(--accent); color: var(--accent); }
.mobile-nav-panel {
  display: none;
  flex-direction: column;
  padding: 8px 16px 12px;
  border-top: 1px solid var(--border);
}
.mobile-nav-panel.open { display: flex; }
.mobile-nav-panel a {
  color: var(--text-muted);
  font-size: 14px;
  padding: 10px 4px;
  border-bottom: 1px solid var(--border);
}
.mobile-nav-panel a:last-child { border-bottom: none; }
.mobile-nav-panel a:hover { color: var(--text); }

@media (max-width: 599px) {
  .nav-links, .nav-links-analyze { display: none; }
  .hamburger-btn { display: flex; }
}
.nav-search {
  display: flex;
  gap: 6px;
  margin-left: auto;
}
.nav-search-input-wrap {
  position: relative;
}
.nav-search input {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  padding: 6px 12px;
  width: 220px;
  font-size: 13px;
}
.nav-search input:focus { outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--accent); }
.nav-search button {
  background: var(--accent);
  border: none;
  border-radius: var(--radius);
  color: #fff;
  cursor: pointer;
  padding: 6px 14px;
  font-size: 13px;
  white-space: nowrap;
  flex-shrink: 0;
}
.nav-search button:hover { background: var(--accent-hover); }
/* 以前はタブレット幅（600〜833px）で.nav-search buttonが折り返る不具合があり
   ナビの余白と検索欄の幅を詰めていたが、原因だったヘッダーの主要リンク
   （.nav-links/.nav-links-analyze）自体を撤去したため、この幅では
   競合する要素がなくなり詰める必要がなくなった（2026-07-11削除） */

/* ── レイアウト ── */
#app {
  max-width: 1400px;
  margin: 0 auto;
  padding: 0 16px 24px;
}

/* ── セクションタイトル ── */
.section-title {
  font-size: 17px;
  font-weight: 700;
  margin-bottom: 16px;
  display: flex;
  align-items: center;
  gap: 10px;
}
.section-title a {
  font-size: 12px;
  font-weight: 400;
  color: var(--text-muted);
}
.see-more-wrap {
  text-align: center;
  margin: 16px 0 8px;
}
.see-more-link {
  display: inline-block;
  font-size: 13px;
  color: var(--text-muted);
  padding: 8px 20px;
  border: 1px solid var(--border);
  border-radius: 20px;
}
.see-more-link:hover {
  color: var(--text);
  border-color: var(--text-muted);
}

/* ── 横スクロール一覧（レール）──
   見出し帯＋横スクロールカード列の使い回しテンプレート。header/top-cat-barと
   同じフルブリード手法（margin:0 calc(50% - 50vw)）で画面横幅いっぱいにする。
   表示枚数は既存のコンパクトグリッド列数（モバイル2/タブレット3/PC834-1199は4/
   PC1200+は5）を基準に、スマホ・タブレットは+0.5枚（続きがあると分かる半端表示・
   スクロールのみ）、PCは-1枚（矢印の分の余白）にする。PCの矢印クリックは
   1枚ずつではなく画面（トラック）幅分ずつ送る */
/* レールが届くまでの場所取り(2026-07-30)。RSC版のトップで、レールを待つ間
   <main>の高さが0になり、フッターが持ち上がってから画面外へ飛んでいた。
   実測のレール高(PC 429px・スマホ 368px)に合わせる。中身は空なので
   見えるものは増えず、場所だけ空く。解決後は本物のレールに置き換わるので
   この高さは残らない */
.rail-placeholder { min-height: 429px; }
@media (max-width: 899px) {
  .rail-placeholder { min-height: 368px; }
}

.rail-section {
  margin: 0 calc(50% - 50vw) 22px;
}
.rail-header {
  background: var(--surface);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}
.rail-header-inner {
  max-width: 1400px;
  margin: 0 auto;
  padding: 12px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.rail-title { font-size: 15px; font-weight: 700; color: var(--text); }
.rail-more { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
.rail-more:hover { color: var(--text); }

/* 【構造の方針・2026-07-11】
   以前は rail-body を display:flex にして「矢印・トラック・矢印」を
   横に並べ、flexの幅の取り合いの結果としてトラックの幅と位置が
   決まる構造だった。この「flexの幅交渉 × スクロールコンテナ × %指定の子」
   という組み合わせはブラウザ間で解釈が割れる部分で、Chromiumでは
   意図通りでもSafariでは配置されるべき箇所と実際の描画位置がずれ、
   矢印の周囲にカードが見切れて残った（の
   flex内での幅指定の修正でも直らなかった）。
   現在は幅の交渉そのものを無くしている：
   - rail-body は普通のブロック。矢印の場所は padding(64px) で確保
   - rail-viewport も普通のブロック（flexアイテムではない）。
     幅は親のcontent幅から一意に決まり、overflow:hiddenでハードにクリップ
   - 矢印は position:absolute のオーバーレイで、レイアウト上の席を持たない
   これで全要素の位置がブロックレイアウトと絶対配置だけで決まり、
   エンジン差の入り込む余地がない */
.rail-body {
  position: relative;
  max-width: 1400px;
  margin: 0 auto;
}
@media (min-width: 834px) {
  .rail-body { padding: 0 64px; }
}
.rail-viewport {
  overflow: hidden;
}
.rail-track {
  --rail-visible: 2.5;
  display: flex;
  gap: 12px;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
  padding: 12px 8px;
  -webkit-overflow-scrolling: touch;
}
/* 【PC帯では左右paddingを0にする（見切れの幾何学的な根本原因）】
   1画面の幅 = padding(8×2) + カードN枚 + gap(N-1)個 に対し、
   矢印の送り量 = (カード+gap)×N。この2つの差 = padding合計16px - gap12px
   = 4px が必ず余り、初期位置では左paddingが吸収するが、1回でも送ると
   「境目に揃った停止位置ですら次のカードが4px境界の内側に入り込む」。
   これはエンジン差ではなく寸法の矛盾で、どのブラウザでも起きる。
   左右padding=0なら 送り量×N = 画面幅 + gap となり、揃った停止位置で
   次のカードは常に境界の12px外側から始まる＝原理的に見切れない
   （2026-07-11。スマホ・タブレットは矢印なし・自由スワイプなので
   端の見た目を優先してpadding 8pxを残す） */
@media (min-width: 834px) {
  .rail-track { padding: 12px 0; }
}
.rail-track::-webkit-scrollbar { display: none; }
.rail-track > .work-card {
  flex: 0 0 auto;
  /* 幅は「N枚がコンテナ内容幅にぴったり収まる」正確な等分にする。
     以前は丸め対策で1枚あたり-2pxの余裕を引いていたが、それだと
     N枚合計がコンテナより最大N×2px短くなり、その分だけ次のカードの
     左端が手前に寄って、クリップ境界の内側に数px「見切れ」として
     入り込んでしまう（＝見切れの発生源そのものだった・2026-07-11）。
     正確な等分なら、次のカードの左端は必ず 内容右端+gap(12px) から
     始まり、クリップ境界（内容右端+padding 8px）より常に外にある。
     scroll-snapは、矢印クリックのscrollTo(絶対位置指定)の着地点を
     Safariがスナップで動かしてしまい境目がずれる一因になり得るため
     使わない（送り先の計算はJS側でカード境界に揃えている） */
  width: calc((100% - (var(--rail-visible) - 1) * 12px) / var(--rail-visible));
}
@media (min-width: 600px) and (max-width: 833px) {
  .rail-track { --rail-visible: 3.5; }
}
/* PCは矢印で画面分送るため、以前は隣の存在を匂わせる「-1枚」表示にしていたが、
   撤去して通常の表示数（コンパクトグリッドの列数）をそのまま満たす
    */
@media (min-width: 834px) and (max-width: 1199px) {
  .rail-track { --rail-visible: 4; }
}
@media (min-width: 1200px) {
  .rail-track { --rail-visible: 5; }
}
/* 矢印はPC（834px〜）のみ。スマホ・タブレットはスワイプのみで送る。
   矢印は大きめ・白色にする。
   rail-bodyのpaddingで確保した左右64pxの帯に絶対配置で重ねる */
.rail-arrow {
  display: none;
  position: absolute;
  /* rail-trackの上下padding(12px)の分だけ矢印がカードより縦に長く
     なっていたため、その分を差し引いてカードの高さとぴったり揃える
      */
  top: 12px;
  bottom: 12px;
  width: 64px;
  align-items: center;
  justify-content: center;
  /* rail-arrowが乗っているrail-bodyは背景を指定していないため、
     周囲にはページ本来の背景(var(--bg))が透けている。矢印もそれに
     合わせて周囲と同化させる */
  background: var(--bg);
  border: none;
  color: #fff;
  cursor: pointer;
}
.rail-arrow-prev { left: 0; border-right: 1px solid var(--border); }
.rail-arrow-next { right: 0; border-left: 1px solid var(--border); }
/* ホバーの背景。base(var(--bg) #0f0f13)からvar(--surface2) #22222eへの
   変化はやや控えめだったため、もう少し明るいトーンにする（2026-07-11） */
/* テスト版・2026-07-12: is-edge(これ以上その方向に送れない=実質無効)の
   矢印にまでホバー背景が効いてしまい、押せそうに見えるのに実際は
   何も動かない不整合があった。is-edge時は除外する */
.rail-arrow:not(.is-edge):hover { background: #40404e; }
/* スクロールの端（それ以上その方向に送れない側）にいる矢印は薄くする
   （app.jsのinitRailTrack/updateRailEdgesが
   scrollイベントを見てis-edgeを付け外しする） */
.rail-arrow.is-edge { opacity: 0.35; }
@media (min-width: 834px) {
  .rail-arrow { display: flex; }
}
/* テスト版・2026-07-16: 矢印アイコンの色がcolor:#fff固定
   なのに対し、白テーマでは背景も同化用のvar(--bg)(白)になるため、白地に
   白のアイコンで完全に見えなくなっていた。横一覧の矢印すべて（ホーム
   ランキング・同サークルの作品・サンプル一覧など）に共通の不具合 */
:root[data-theme="light"] .rail-arrow { color: #16161d; }

/* ── 作品カード ── */
/* .works-grid はスマホ幅(isMobile)でのみJSから使われる1カラム専用クラス。
   以前は複数カラムのauto-fillだったが、599pxをまたいでリサイズする際に
   CSSのメディアクエリが即座に切り替わる一方でJS側の再描画に遅延があり、
   その間だけ複数カラムでカードが詰まって見えるバグがあったため、
   常に1カラムにして「詰まって見える」瞬間自体を無くす */
.works-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}
.work-card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 0; /* 一覧サムネイルは角丸にしない（2026-07-09） */
  overflow: hidden;
  cursor: pointer;
  transition: border-color .15s, transform .15s;
}
.card-rank-badge {
  position: absolute;
  top: 6px;
  left: 6px;
  z-index: 2;
  min-width: 22px;
  height: 22px;
  padding: 0 5px;
  border-radius: 11px;
  background: rgba(15, 15, 19, 0.8);
  color: var(--text-muted);
  font-size: 13px;
  font-weight: 700;
  text-align: center;
  line-height: 22px;
}
.card-rank-badge.gold   { color: #f7d94a; }
.card-rank-badge.silver { color: #b8b8c8; }
.card-rank-badge.bronze { color: #c87a4a; }
.work-card:hover {
  border-color: var(--accent);
}
.work-card img {
  width: 100%;
  aspect-ratio: 4/3;
  /* thumbnailがinline style="object-fit:contain"を常に付与する(作品詳細ページの
     サンプル切り替えと同じ考え方: 縦長画像も切り取らず縮小して枠に収める)。
     この既定値はinline styleの読み込み前の一瞬だけ・thumbnailを使わない
     呼び出し元向けのフォールバック */
  object-fit: contain;
  object-position: center center;
  display: block;
  border-radius: 0;
}
.work-card-body {
  padding: 8px 10px 10px;
}
/* .work-card-sites・.row-tagsは.work-cardの直接の子（.work-card-bodyの外）
   なので、bodyと同じ横余白をここで別途つける */
.work-card > .work-card-sites,
.work-card > .row-tags {
  padding: 0 10px 10px;
}
/* .row-tags（work_card_html・work_row_html共通で実際に使われているタグの
   コンテナ。似た名前の.work-row-tagsは未使用のデッドクラス）にflexが
   指定されておらず、タグ同士の間に空白文字もないHTML出力と合わさって、
   下の.tag-chipをnowrap化すると改行できず画面外へはみ出していた */
.row-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
}
.work-card-badges {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
  margin-bottom: 4px;
}
.work-card-title {
  font-size: 12px;
  line-height: 1.4;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  margin-bottom: 4px;
}
.work-card-circle {
  font-size: 11px;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-bottom: 6px;
}
.work-card-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  align-items: center;
}
.work-card-price {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-bottom: 4px;
  font-size: 12px;
}
.price-line {
  display: flex;
  align-items: center;
  gap: 4px;
}
.card-price-line {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
}
.card-site-label {
  font-size: 10px;
  color: var(--text-muted);
  flex-shrink: 0;
}
.work-card-bottom {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  color: var(--text-muted);
  flex-wrap: wrap;
}
.card-sales::before { content: '販売数：'; }
.card-date { margin-left: auto; }
.card-date::before { content: '発売日：'; }
.card-rating-count { color: var(--text-muted); font-size: 10px; }
/* 評価スコアと評価件数は折り返して離れないよう1つの塊にする */
.card-rating-group { display: inline-flex; align-items: baseline; gap: 2px; white-space: nowrap; }
.badge {
  font-size: 10px;
  padding: 1px 5px;
  border-radius: 4px;
  font-weight: 600;
}
.badge-ai    { background: #3a2a6a; color: #c9b8ff; }
.badge-dlsite { background: #07b; color: #fff; }
.badge-fanza  { background: #e05; color: #fff; }
.badge-both   { background: #2a2a1a; color: #e8d87a; }
.badge-cat    { background: transparent; color: #b0b0b8; border: 1px solid #b0b0b8; }
.badge-discount { background: transparent; color: #b0b0b8; padding: 0; }
/* ここから白テーマ限定の上書き（2026-07-16）。黒テーマは
   上の元の配色のまま変更しない。ただし灰色系のみ、黒背景では#767676が
   やや暗すぎたため黒テーマ側を明るいグレー#b0b0b8に調整
   （白テーマの#767676はそのまま） */
:root[data-theme="light"] .badge-dlsite { background: transparent; color: #2f7fe0; padding: 0; }
:root[data-theme="light"] .badge-fanza  { background: transparent; color: #dc3545; padding: 0; }
:root[data-theme="light"] .badge-cat    { background: transparent; color: #767676; border: 1px solid #767676; }
:root[data-theme="light"] .badge-discount { background: transparent; color: #767676; padding: 0; }
.price {
  font-size: 12px;
  font-weight: 700;
  color: var(--text);
}
.price-orig {
  font-size: 11px;
  color: var(--text-muted);
  text-decoration: line-through;
}
.rating {
  font-size: 11px;
  color: #f7a84a;
}
.sales {
  font-size: 11px;
  color: var(--text-muted);
}

/* ── 作品リスト（テーブル形式） ── */
.works-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
/* コンパクト表示＝横並びカードグリッド。旧サイトの密な表形式
   (.work-compact-row)は廃止し、.work-cardを流用する新デザインを採用する。
   タブレット(600〜833px)は3列固定、PC(834px〜)は4列固定、より広い
   PC(1200px〜)は5列固定にする（auto-fillだと
   834〜1199px程度の"それほど広くないPC"で計算上4列に届かず3列に落ちて
   しまっていたため、幅で段階的に固定する方式に変更。スマホは.mc-modeで
   別途2列固定） */
.works-list.compact-mode {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  row-gap: 16px;
  column-gap: 0;
}
@media (min-width: 600px) and (max-width: 833px) {
  .works-list.compact-mode { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 834px) and (max-width: 1199px) {
  .works-list.compact-mode { grid-template-columns: repeat(4, 1fr); }
}
@media (min-width: 1200px) {
  .works-list.compact-mode { grid-template-columns: repeat(5, 1fr); }
}
/* コンパクト表示は一覧性を優先するため、カード内のタグ行は表示しない
   （ホームページ・サークルページ等の.work-card使用箇所には影響しない）。
   .rail-track内のカードも同じ理由（狭い横幅に並べるカードグリッド）で
   同じ扱いにする（2026-07-11。タグ行を出したままだとチップの折り返しで
   カードの縦幅がバラバラに間延びしていた） */
.works-list.compact-mode .row-tags,
.rail-track .row-tags { display: none; }
/* コンパクト表示は左寄せ・発売日と割引終了日時は非表示・
   販売数と評価は別行 */
.works-list.compact-mode .work-card-bottom,
.rail-track .work-card-bottom {
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
}
.works-list.compact-mode .card-date,
.rail-track .card-date { display: none; }
.works-list.compact-mode .disc-end,
.rail-track .disc-end { display: none; }
/* rail-trackは元価格（取り消し線の値段）を幅を問わず出さない（2026-07-11）。割引%バッジ（badge-discount）は残す */
.rail-track .price-orig { display: none; }
/* スマホ・タブレット(833px以下)は割引%バッジも出さず現在価格のみにする
   （PC(834px〜)は割引%は今まで通り表示する） */
@media (max-width: 833px) {
  .rail-track .badge-discount { display: none; }
}

/* ── スマホ版コンパクトカード（.works-grid.mc-mode）── */
/* 「本体＋別付けの開閉パネル」という2箱構成（旧実装）は、境界線が二重に見えたり
   タイトルの扱いが複雑になったりする根本原因だったため廃止し、カード1枚
   （.mc-card）だけで完結させる。
   .mc-cardは常にposition:absoluteで、グリッドの行の高さには一切関与しない。
   代わりに.mc-slot-spacer（見えない・閉じた状態と同じ寸法のダミー）が.mc-slotの
   高さ＝グリッド行の高さを常に一定に保つ。これにより.mc-cardが伸びても縮んでも、
   あるいはtransitionの途中の一瞬であっても、グリッドの行の高さは物理的に変化
   しようがない（以前はposition自体を:activeで切り替えてtransition-delayで
   タイミング制御していたが、閉じる瞬間にpositionが早く戻りすぎて下の行が動く
   不具合があった。この構造なら発生原理そのものが無い）。
   開閉の可視の変化（タイトルの展開・追加情報の表示）はmax-heightのtransitionで
   行い、JSでの指の移動量トラッキングは行わない（過去のやり取りで
   mousemove/距離しきい値によるホバー制御は何度直しても解決しなかった経緯があり、
   宣言的なCSSだけで完結する方式を選ぶ）。開く方向にだけtransition-delayをつけて
   いるため、指が触れてすぐ動く＝スクロール中の通過では遅延が明ける前に:activeが
   解除され、開く前の状態のまま消える。閉じる方向は遅延なしで即座に戻る */
.mc-slot {
  position: relative;
}
/* 実カードと同じ寸法（画像はaspect-ratioで幅追従、テキスト欄は閉じた状態と
   同じ固定px）を持つ見えないダミー。グリッド行の高さはこれだけで決まる */
.mc-slot-spacer {
  visibility: hidden;
  pointer-events: none;
}
.mc-slot-spacer-img {
  width: 100%;
  aspect-ratio: 4/3;
}
.mc-slot-spacer-body {
  height: 60px;
}
.mc-card {
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 0;
  cursor: pointer;
  /* bottomは.mc-slotの高さには一切影響しない（.mc-slot-spacerが別に高さを
     持つため）。ここでの遅延は見た目の収縮アニメーションを滑らかにするための
     仕上げに過ぎず、たとえ効かなくてもレイアウトが動く不具合には繋がらない */
  transition: bottom 0s .15s;
}
.mc-card:active {
  /* bottomの固定を外し、中身に合わせて自由に下へ伸びられるようにする */
  bottom: auto;
  transition-delay: 0s;
  z-index: 10;
  box-shadow: 0 6px 14px rgba(0, 0, 0, .35);
}
.mc-card img {
  width: 100%;
  /* 実測でサムネイルの多くが4:3寄り（560x420等）。16:9だと上下が大きく
     切れていたので、実際の画像比に近い4:3に変更する */
  aspect-ratio: 4/3;
  /* thumbnailがinline styleで常にcontainを付与する(縦長画像を
     切り取らず縮小して収める。以前はここだけ!importantでcover固定にしていたが、
     他カードと同じ挙動に統一する) */
  object-fit: contain;
  object-position: center center;
  display: block;
  border-radius: 0;
}
.mc-card-body {
  padding: 6px 8px 8px;
}
.mc-card-badges {
  display: flex;
  gap: 4px;
  flex-wrap: nowrap;
  min-width: 0;
  margin-bottom: 3px;
}
.mc-card-badges .cat-badge,
.mc-card-badges .badge {
  flex-shrink: 0;
  white-space: nowrap;
  font-size: 8px;
}
/* -webkit-line-clampは切れた末尾に「…」を自動で付けるが、それを出したくない
   ため、line-clampではなく単純な高さクリップにする。
   「…」が付かない代わり、はみ出した3行目以降は文字ごと見えなくなる。
   :activeでmax-heightを大きく開放し、カード自身が伸びてフルタイトルを見せる
   （別要素での二重表示ではなく、同じ1つのタイトル要素がそのまま伸びる） */
.mc-card-title {
  font-size: 10px;
  line-height: 1.4;
  max-height: 2.8em;
  overflow: hidden;
  transition: max-height .15s ease;
}
.mc-card:active .mc-card-title {
  transition-delay: .15s;
  max-height: 20em;
}
.mc-card-info {
  max-height: 0;
  overflow: hidden;
  transition: max-height .15s ease;
}
.mc-card:active .mc-card-info {
  transition-delay: .15s;
  max-height: 200px;
  margin-top: 4px;
}
.mc-card-circle {
  font-size: 10px;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mc-card-sales,
.mc-card-rating {
  font-size: 10px;
  color: var(--text-muted);
  margin-top: 2px;
}
.mc-card-prices {
  margin-top: 4px;
  padding-top: 4px;
  border-top: 1px solid var(--border);
}
.mc-price-row {
  font-size: 10px;
  margin-top: 2px;
}

.work-row {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  display: grid;
  /* 4列目(評価/販売数/発売日)はwhite-space:nowrapで1行ずつ組んでいるため、
     769px付近の狭いPC/タブレット幅ではgridの残り幅次第でこの列が
     数十pxまで潰れ、折り返せないテキストがはみ出して隣の列に重なって
     見える「キメラ」状態になっていた。固定px(130px)の最低幅だと、桁の
     少ない販売数の行では余分な空白ができ、逆に桁の多い販売数だと
     130pxでは足りずはみ出す事例があった。
     min-content/max-contentはnowrapのテキストでは同じ値（折り返せない＝
     その行の実際の文字幅そのもの）になるため、行ごとに必要な幅ぴったりに
     決まり、空白もはみ出しも起きない。実測でも834px幅・7桁の販売数で
     確認済み。代わりに可変の1fr列(タイトル・タグ)側を先に縮めさせる */
  grid-template-columns: 36px 200px 1fr minmax(min-content, max-content);
  gap: 10px;
  padding: 8px 10px;
  cursor: pointer;
  align-items: start;
  transition: border-color .15s;
}
.work-row:hover { border-color: var(--accent); }
/* .row-tagsは.work-row-info（3列目）の中に置くと、右端の評価/販売数/発売日列
   (4列目)の手前までしか使えず途中で折り返っていた。.work-rowの直接の子にして
   全列(1〜4列目)にまたがせ、カードの右端まで使えるようにする（2026-07-10） */
/* .row-tagsは.work-row-info（3列目、DOM構造はそのまま）の中にあるため、
   右の評価/販売数/発売日列（4列目、minmax(130px,auto)+gap10px分）の手前で
   折り返っていた。DOMを動かす（.work-rowの直接の子にする）とタグの位置が
   ずれておかしくなったため、DOM構造には触れず、widthだけ4列目+gap分
   広げて右端まで届かせる */
/* .row-tagsは.work-row-info（3列目、DOM構造は元のまま・row-sitesの直後）の
   中に置く。.work-rowの直接の子にする（グリッドアイテムにする）と、1行目が
   既に4要素で埋まっているため自動配置で新しい2行目に追い出され、価格情報から
   離れて下に飛んで見える不具合が2回起きた。
   DOM位置は動かさず、widthだけ4列目+gap分広げて右へ伸ばす。4列目は
   minmax(min-content,max-content)で行ごとに幅が変わるため、はみ出さない
   よう安全側（6桁の販売数まで想定）の控えめな値にする。極端に桁の多い
   販売数の行では右端まで届ききらないことがあるが、はみ出すよりはみ出さない
   方を優先する */
.work-row-info > .row-tags {
  width: calc(100% + 100px);
}
.work-row > img {
  width: 200px;
  align-self: stretch;
  object-position: center top;
  background: var(--surface);
  display: block;
}
.work-row-info { min-width: 0; }
.work-row-title {
  font-size: 13px;
  font-weight: 600;
  margin-bottom: 3px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: flex;
  align-items: center;
  gap: 5px;
}
.work-row-circle {
  font-size: 11px;
  color: var(--text-muted);
  margin-bottom: 5px;
}
.circle-link {
  cursor: pointer;
}
.circle-link:hover { color: var(--accent); text-decoration: underline; }
.work-row-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
  margin-top: 5px;
}
.work-row-tags .tag-chip {
  font-size: 10px;
  padding: 1px 5px;
}
/* サイト別ブロック（価格+タグを1まとめ） */
.row-sites {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: 4px;
}
.row-site-block {
  display: flex;
  gap: 6px;
  align-items: flex-start;
}
.row-site-name {
  flex-shrink: 0;
  margin-top: 2px;
}
.row-site-detail {
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.row-site-price {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
  align-items: center;
  font-size: 12px;
}
.row-site-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 2px;
}
.row-site-tags .tag-chip {
  font-size: 10px;
  padding: 1px 4px;
}
.work-row-right {
  text-align: right;
  white-space: nowrap;
  min-width: 70px;
}

/* ── カテゴリバッジ ── */
.cat-badge {
  display: inline-block;
  font-size: 10px;
  font-weight: 600;
  padding: 1px 5px;
  border-radius: 3px;
  background: transparent !important;
  color: #b0b0b8;
  border: 1px solid #b0b0b8;
  white-space: nowrap;
  flex-shrink: 0;
}
:root[data-theme="light"] .cat-badge { color: #767676; border-color: #767676; }
.work-card-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
  margin-bottom: 5px;
  min-height: 0;
}
.work-card-tags .tag-chip {
  font-size: 10px;
  padding: 1px 4px;
}

/* ── フィルターバー ── */
.filter-bar {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 14px 16px;
  margin-bottom: 20px;
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  /* テスト版・2026-07-14: flex-endだと同じ行に並ぶfilter-groupの高さが
     揃っていない時（例:割引グループに下限セレクトを足して3行になった）に
     下端は揃うが上端がバラバラになり、DOM順（カテゴリー→サイト→割引）と
     見た目の上下順が食い違って見えていた。
     flex-startで上端を揃える */
  align-items: flex-start;
}
.filter-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.filter-group label {
  font-size: 11px;
  color: var(--text-muted);
}
.filter-group select,
.filter-group input {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text);
  padding: 5px 10px;
  font-size: 13px;
}
/*
   不具合が、Safari/Chrome両方・作品検索/タグ一覧/サークル一覧のどのページでも
   発生すると報告された。appearance:none撤去、内部セグメントのpadding:0撤去と
   段階的に疑わしいルールを外したが解決しなかったため、原因の切り分けを優先し
   type="date"専用のカスタムCSS(内部padding調整・カレンダーアイコンの
   サイズ指定・クリア/スピナーボタンの非表示)を全て撤去し、完全にブラウザ
   既定の見た目・挙動に戻す。カレンダーの矢印(スピナー)が空欄から妙な値で
   始まる問題は、既存のonkeydown(ArrowUp/Down無効化)・onwheel(preventDefault)
   側で引き続き対策済み */
.filter-group select:focus,
.filter-group input:focus { outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--accent); }
.btn {
  background: var(--accent);
  border: none;
  border-radius: var(--radius);
  color: #fff;
  cursor: pointer;
  padding: 7px 16px;
  font-size: 13px;
  align-self: flex-end;
}
.btn:hover { background: var(--accent-hover); }
.btn-ghost {
  background: var(--surface2);
  border: 1px solid var(--border);
  color: var(--text-muted);
}
.btn-ghost:hover { color: var(--text); border-color: var(--text-muted); }

/* ── 検索パネル ── */
.search-wrapper {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 20px;
}
/* テスト版・2026-07-16（最終形): summaryと.search-panelを
   別々のborder-radiusで継ぎ合わせて1つの箱に見せる作りは、ブラウザによって
   継ぎ目がずれて「検索条件だけ分かれた別要素に見える」原因になり得た。
   「検索」ボタンをapp_test.js側で<details>の外へ移動し、<details>の中身を
   summary+.search-panelだけにしたため、継ぎ目トリックを使わずに済むように
   なった。枠(border/背景/角丸)は<details>本体(.search-panel-toggle)1つに
   直接付ける＝本物の1つの箱。summary/.search-panelは中身として枠なし。
   （検索ボタンはdetailsの外なので、折りたたみが閉じていても常に押せる） */
.search-panel-toggle {
  margin-bottom: 12px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
}
/* 検索ボタンは検索条件を開いているときだけ出す(2026-08-03)。

   **CSSだけで決める。** ボタンは<details>の外にあるので(上のコメント参照)、
   開閉に追随させるには ①JSで状態を持つ ②兄弟セレクタで見る のどちらか。
   ②なら**全SPA版と全RSC版で同じ1行が効く**——別々に状態を持つと、
   片方だけ直っている形(CLAUDE.mdに5件の記録)をまた作ることになる。
   `~` は同じ親の後続の兄弟なので、.search-wrapper の直下に並んでいる限り効く。 */
.search-submit-row { display: none; text-align: center; }
.search-panel-toggle[open] ~ .search-submit-row { display: block; }
/* **このCSSを直したら、確認はハードリロードで**（2026-08-03に1時間溶かした）。
   このファイルは `Cache-Control: public, max-age=300, must-revalidate` で配られる。
   **開きっぱなしのページはCSSを取り直さない**ので、サーバー側は直っているのに
   画面は古いまま——「直っていない」と見える。実際、サーバーの応答と
   ブラウザ内の見え方が食い違い、実装を3回いじり回した（うち1回はボタンの位置を
   勝手に動かして戻した）。
   **見え方を疑う前に、配っている中身を curl で確かめること**:
     curl -s http://localhost:3002/style_test.css | grep search-submit-row
   前段プロキシ(:8443)経由なら、作り置きの .br も古くないか見る
   （`node scripts/precompress-public.mjs`。http_check.py が検出する）。 */
/* ): 5行の間隔は統一できていたが、間隔
   そのもの(17px)が不要とのことで撤去。区切り線(border-top 1px)だけで
   行同士を密着させる。paddingもflex gapも使わない */
/* ): 一番下(詳細フィルター〜箱の下端)だけ
   16pxの余白が残っていて、他の1px密着と不釣り合いに太く見えていた。
   0にして揃える */
.search-panel {
  padding: 0;
  display: flex;
  flex-direction: column;
}
/* 「検索条件」「意味検索」「一致検索」「タグ検索」「詳細フィルター」
   5つの見出し全部が使う共通クラス。矢印の回転はdetails[open] > summaryの
   組み合わせで、どのdetails/summaryペアにも同じ1ルールで効く
   （子孫セレクタを使わないので、他のsummaryを巻き込むバグも起きない）。
   テスト版・2026-07-16（重大なミスの修正): 左右の
   paddingを親の.search-panel-toggle側に移していたため、summary要素自身の
   クリック領域が左右16px分だけ狭くなり、「検索条件」の左端・右端を押しても
   開閉しなくなっていた（<details>はsummary要素の範囲内クリックでしか
   反応しない）。paddingはsummary自身が持つ必要がある。左右16pxをここに
   戻す（.search-panelにも同じ16pxを独立に持たせ、横位置を揃える） */
.search-accordion-summary {
  cursor: pointer;
  font-size: 14px;
  font-weight: 700;
  color: var(--text);
  user-select: none;
  list-style: none;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
}
.search-accordion-summary::-webkit-details-marker { display: none; }
.search-accordion-summary::marker { display: none; }
.search-accordion-summary::before { content: '\25B6\FE0E'; font-size: 12px; color: var(--text-muted); transition: transform 0.15s; }
details[open] > .search-accordion-summary::before { transform: rotate(90deg); }
/* テスト版・2026-07-16: 「marginをつけるな」との指摘。
   前回はmargin(負のmargin・margin-bottom)で帳尻を合わせていたが撤去。
   .search-panelから左右paddingを削除したので(上のルール参照)、意味検索等の
   summaryは.search-panelの外(=.search-panel-toggle)の内側幅いっぱいに
   自然に広がり、「検索条件」と同じ幅になる。左右の余白(テキストの位置)は
   summary自身のpadding:16pxだけで作る。入力欄側(.search-section-body等)は
   .search-panelのpaddingが無くなった分、自分自身に左右paddingを持たせる
   （下記） */
.search-top-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  align-items: flex-end;
}
.quick-presets {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
}
.preset-label {
  font-size: 11px;
  color: var(--text-muted);
  margin-right: 4px;
}
.preset-btn {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 20px;
  color: var(--text);
  cursor: pointer;
  font-size: 12px;
  padding: 4px 12px;
  transition: border-color var(--duration-fast), background var(--duration-fast);
}
.preset-btn:hover { border-color: var(--accent); background: var(--surface); }
.recent-searches {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
}
.recent-chip {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 20px;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 11px;
  padding: 3px 10px;
  transition: border-color var(--duration-fast), color var(--duration-fast);
  max-width: 160px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.recent-chip:hover { border-color: var(--accent); color: var(--text); }
.recent-chip-clear {
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 11px;
  padding: 3px 6px;
  opacity: 0.6;
}
.recent-chip-clear:hover { opacity: 1; color: var(--danger, #e55); }
.sort-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.sort-row .view-toggle { margin-left: auto; }
.results-controls {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin: 8px 0;
  padding: 6px 0;
}
.sort-label { font-size: 11px; color: var(--text-muted); }
.sort-btns { display: flex; gap: 4px; flex-wrap: wrap; }
.sort-btn {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 12px;
  padding: 4px 12px;
  transition: all var(--duration-fast);
}
.sort-btn.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
  font-weight: 600;
}
.sort-btn:hover:not(.active) { border-color: var(--accent); color: var(--text); }
.advanced-filters {
  border-top: 1px solid var(--border);
}
/* .advanced-filtersは「大きい枠(.search-panel-toggle等)の中の1セクション」
   として設計されており、それ自体は上線1本しか持たない。サークル一覧の
   詳細フィルターはそれを囲む外枠を持たない単体トップレベルのdetailsとして
   使っているため、閉じている時は上線すらない「棒線」にしか見えなかった。
   .search-panel-toggleと同じ「本体1つに直接
   background/border/border-radiusを付けて1つの箱に見せる」パターンを適用する */
#circle-adv-filters {
  margin-bottom: 20px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
}
/* テスト版・2026-07-16: width:100%が明示指定されている
   と、.search-panel .search-accordion-summaryのマイナスマージンで空いた分
   だけ幅が自動で広がらず（widthがautoでなくなるため）、右端が揃わなかった。
   display:flexのブロック要素はwidth未指定でも自動で幅いっぱいになるので
   このルール自体が不要だった。撤去 */
/* 詳細フィルターの中身を3ブロックに整理するサブ見出し（折りたたみ要素は増やさない） */
.filter-subgroup-heading {
  /* テスト版・2026-07-14: .filter-barはdisplay:flex+flex-wrapのため、
     幅指定が無いとこの見出しも他のfilter-groupと同じ1個の折り返し単位になり、
     折り返し位置次第で前の行の余白に食い込んで右側に浮いて見えていた
     （AI作品フィルター削除で割引グループの高さが変わり顕在化
     「きたない」）。flex-basis:100%で必ず単独の行として改行させる */
  flex-basis: 100%;
  width: 100%;
  font-size: 11px;
  font-weight: 700;
  color: var(--text-muted);
  letter-spacing: 0.03em;
  margin: 14px 0 4px;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}
.filter-subgroup-heading:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}
.active-chips-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding-top: 4px;
}
.active-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: rgba(var(--accent-rgb, 133, 93, 255), 0.15);
  border: 1px solid var(--accent);
  border-radius: 20px;
  color: var(--accent);
  cursor: pointer;
  font-size: 12px;
  padding: 3px 10px;
}
.active-chip:hover { background: rgba(var(--accent-rgb, 133, 93, 255), 0.28); }
.chip-x { opacity: 0.7; }
.chip-reset {
  background: transparent;
  border-color: var(--border);
  color: var(--text-muted);
}
.chip-reset:hover { border-color: #dc3545; color: #dc3545; background: rgba(220,53,69,0.1); }

/* 0件時 */
.zero-results {
  text-align: center;
  padding: 60px 20px;
  color: var(--text-muted);
}
.zero-results-icon { font-size: 48px; margin-bottom: 12px; }
.zero-results-msg { font-size: 16px; color: var(--text); margin-bottom: 8px; }

/* タグAND/ORトグル */
.tag-mode-btn {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 4px;
  font-size: 10px;
  font-weight: 700;
  cursor: pointer;
  background: var(--surface2);
  border: 1px solid var(--border);
  color: var(--text-muted);
  user-select: none;
  letter-spacing: 0.05em;
  transition: all var(--duration-fast);
}
.tag-mode-btn:hover { border-color: var(--accent); color: var(--text); }
.tag-mode-btn.or-mode {
  background: rgba(var(--accent-rgb, 133, 93, 255), 0.18);
  border-color: var(--accent);
  color: var(--accent);
}
.filter-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 9px;
  background: var(--accent);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  vertical-align: middle;
  margin-left: 4px;
}

/* タグ履歴ヘッダー */
.suggest-hist-header {
  font-size: 11px;
  color: var(--text-muted);
  padding: 4px 12px 2px;
  pointer-events: none;
  border-bottom: 1px solid var(--border);
}

/* ── ページネーション ── */
.pagination {
  display: flex;
  gap: 8px;
  justify-content: center;
  margin-top: 24px;
}
.pagination button {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text);
  cursor: pointer;
  padding: 6px 14px;
  font-size: 13px;
}
.pagination button.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.pagination button:hover:not(.active) { border-color: var(--accent); }

/* ── 作品詳細 ── */
.work-detail {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
  align-items: start;
  /* テスト版・2026-07-16: 下の「同サークルの作品」欄との間隔は、画像列
     (.sample-rail-body)だけに付けても情報列の方が高い作品では効かない
     （align-items:startの2カラムgridなので、片方の列のmargin-bottomは
     もう片方の列が短いときしか外側に効かない）。2カラム全体の下に
     付けるのが正しい */
  margin-bottom: 24px;
}
.work-detail-img {
  /* position:stickyを撤去（テスト版・2026-07-12）。画像列が情報列（タグ・
     DLsite/FANZAパネル）より低い作品では、情報列の残りをスクロールしている間
     ずっと画像が画面上部に張り付いたままになり、情報列が終わって
     .work-detail-relatedが始まる位置まで画像が「付いてきてしまう」ように
     見える不具合があった（実機のcomputed heightで確認: 画像列512px vs
     情報列636.7px）。画像列の方が高い作品では逆にstickyが情報列の可読性を
     助けていた可能性はあるが、高さの大小はDLsite/FANZAのタグ数等で作品ごとに
     変わり読めないため、両ケースを安全に扱えるよう撤去した */
  position: relative; /* テスト版・2026-07-12: absolute配置の.cover-arrow
    (スマホ幅用)の基準にするためrelativeにする。stickyではなくrelativeなので
    静止時のレイアウトはstaticと同じ扱いで「付いてきてしまう」不具合は再発しない */
  min-width: 0;
}
/* テスト版・2026-07-12(5回目):
   - ブレークポイントは834pxではなく599px以下=スマホ／600px以上=タブレット・PC
     に変更（実機のタブレット幅(iPad縦768px等)は600〜833pxの範囲にあり、
     834pxのままだとタブレットがスマホ扱いになって矢印(.rail-arrow)ごと
     消えていた。サイト既存の600/834pxのブレークポイント語彙のうち、
     600px側の方が「PC,タブレット幅」という指示に合っている）
   - スマホ幅では写真(FANZA実機)の通り、画像自体は狭めて左右に余白を作り
     そこに矢印(背景無しの単純なシェブロン)を置く。.work-detail-imgは
     margin:0 -16pxで親#appのpaddingを打ち消して外枠は真の全幅のまま、
     内側だけpaddingで余白を作る（box-sizing:border-boxで外枠幅は変えない） */
.cover-arrow {
  display: none;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 28px;
  height: 40px;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  z-index: 2;
}
.cover-arrow-prev { left: 0; }
.cover-arrow-next { right: 0; }
.cover-arrow:hover { color: var(--text); }
@media (max-width: 599px) {
  .cover-arrow { display: flex; }
  .sample-rail-body { display: none; }
  .work-detail-img {
    margin: 0 -16px;
    padding: 0 28px;
    box-sizing: border-box;
  }
  /* )
     の幅を圧迫し、はみ出しの原因になっていた。狭い画面だけ余白を8pxに
     減らして入力欄側に幅を回す */
  .filter-bar { padding: 0 8px; }
}
/* サムネイル一覧の矢印は600px以上（タブレット・PC）で表示する。
   トップページの横一覧(.rail-arrow)は834px以上限定の設計だが、サンプル
   画像はタブレット幅からも矢印を出したいため、.sample-rail-body内の
   .rail-arrowだけ個別に上書きする（詳細は上のコメント参照） */
.sample-rail-body .rail-arrow { display: none; z-index: 3; }
@media (min-width: 600px) {
  .sample-rail-body .rail-arrow { display: flex; }
  /* .rail-bodyのpadding:0 64px(矢印専用の帯)は本家では834px以上でしか
     付かない設計のため、タブレット幅(600〜833px)では矢印用の余白が
     確保されずサムネイルに重なっていた（
     (6回目): 「PCでは重ならないのにタブレットでは重なる」という症状から
     判明。ここで600px以上に個別に前倒しする） */
  .sample-rail-body { padding: 8px 64px; }
}
/* テスト版・2026-07-16（DLsite本家の参考画像に合わせて
   やり直し): 本家はグレーの帯１枚の上に、枠も角丸も無いシェブロンがそのまま
   乗っているだけの作り。矢印だけを独立した箱にするのをやめ、帯(.sample-rail-body)
   自体をグレー背景にして、矢印は透明背景のままそこに乗せる（位置・サイズは
   変更しない＝帯の左右64px幅いっぱいを矢印が占める） */
.sample-rail-body .rail-arrow {
  background: transparent;
  border-radius: 0;
  /* 矢印の可動域は帯の上下際まで（top/bottom:12pxの余白を
     撤去し、帯の高さいっぱいに広げる） */
  top: 0;
  bottom: 0;
}
.sample-rail-body .rail-arrow-prev { border-right: none; }
.sample-rail-body .rail-arrow-next { border-left: none; }
/* ホバーは背景ではなく矢印(アイコン)自体の色を変える */
.sample-rail-body .rail-arrow:not(.is-edge):hover { background: transparent; color: var(--accent); }
:root[data-theme="light"] .sample-rail-body .rail-arrow:not(.is-edge):hover { color: var(--accent); }
.work-detail-img > img {
  width: 100%;
  max-width: 100%;
  display: block;
  border-radius: var(--radius-lg);
}
#cover-wrap {
  width: 100%;
  max-width: 560px; /* テスト版・2026-07-12: DLsite本家は.slider_item img{max-width:560px}
    でコンテナ幅に関わらず画像サイズを一定に保っている（実機のcomputed styleで確認済み。
    詳細: 設計/DLsite作品ページ_レイアウト分析.md）。従来はコンテナ幅いっぱいに拡大していたが、
    本家に合わせて上限を設け、余った横幅はこの後の情報列に譲る形に変更 */
  max-height: 750px; /* 極端な縦長画像(比率3:4より縦に長い)だと枠が
    際限なく縦に伸び、右側の情報パネルとバランスが崩れる。高さに上限を設け、
    それを超える分は幅を縮めてobject-fit:containで全体を収める(切り取らない) */
  margin: 0 auto;
  aspect-ratio: 3 / 4; /* 表紙画像の読み込み後にJSで実際の比率へ一度だけ上書きされる暫定値
    (レイアウトジャンプ防止)。サンプル切り替え時は再計算しない（枠のサイズを
    固定し、画像側をobject-fit:containで枠に収める。DLsite本家を参考に
    2026-07-09変更——以前はサンプルを切り替えるたびに枠の比率も変わり、
    ページの表示位置がガクガク動く不具合があった） */
  overflow: hidden;
  background: var(--surface);
  position: relative;
}
.detail-cover {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: contain;
  object-position: center center;
}
/* サンプル画像は2カラムレイアウトの外・全幅セクション */
.work-samples-section {
  margin-top: 32px;
}
.work-samples-section h3 {
  font-size: 15px;
  font-weight: 700;
  margin-bottom: 12px;
  color: var(--text);
}
/* テスト版・2026-07-12(2回目): サムネイル一覧の
   矢印ボタンは、独自デザインではなくトップページの横一覧(.rail-body/
   .rail-viewport/.rail-arrow)をそのまま流用する（「横一覧と同じスタイルで
   ない」との指摘）。.rail-bodyのpadding:0 64px(834px以上)が矢印ボタン専用の
   領域を確保する設計のため、そのまま使えばサムネイルとの重なりも起きない
   （1回目の実装は矢印をサムネイルの上に直接重ねており、それが重なり・
   クリック不発の原因だった）。is-edgeは付与しない＝端で無効化されず
   常時クリック可（サンプル画像はループできるように） */
.sample-rail-body {
  margin-top: 8px;
  /* テスト版・2026-07-16(4回目): ここのmargin-bottomは2カラムgridの片方の
     列にしか効かず、情報列の方が高い作品では下の間隔が消えていた。
     間隔は.work-detail側(2カラム全体の下)に付け直したのでここでは不要 */
  /* テスト版・2026-07-16(3回目): DLsite本家の参考画像は枠なし・角丸なしの
     グレー1色の帯。border/border-radiusは撤去し、帯自体をグレー背景にする
     （黒番は暗めのグレー、白番は明るめのグレー） */
  border: none;
  border-radius: 0;
  /* #2b2b2bは見にくい→#3d3d3dへ→#333333でも悪目立ちする
     とのことでもっと暗く。ニュートラルグレーはサイトの青みがかった
     ダークパレット(--bg #0f0f13等)と色味が合わず浮いていた可能性があるため、
     サイト既存のトーンに合わせてvar(--surface2)を使う */
  background: var(--surface2);
  /* 左右64pxの矢印用の帯は上のmin-width:600pxのメディアクエリ側で確保する。
     ここで左右paddingを指定すると、こちらの方がファイル内で後にあるため
     カスケードでメディアクエリ側の"padding: 8px 64px"を上書きしてしまい、
     矢印の専用領域が消えてサムネイル画像と矢印が重なる不具合になっていた。
     ここでは上下paddingのみ指定する */
  padding-top: 8px;
  padding-bottom: 8px;
}
:root[data-theme="light"] .sample-rail-body { background: #e8e8e8; }
/* サンプル横スクロールストリップ（DLsite本家準拠：固定サイズの枠を横一列に並べ、
   選択中は見える範囲に収まるようスクロールする。厳密な中央寄せは行わない） */
.work-sample-strip {
  display: flex;
  flex-wrap: nowrap;
  overflow-x: auto;
  gap: 6px;
  scrollbar-width: none;
}
.work-sample-strip::-webkit-scrollbar {
  display: none;
}
.work-sample-empty {
  margin-top: 8px;
  padding: 8px 0;
  font-size: 12px;
  color: var(--text-muted);
  text-align: center;
}
/* サムネイル本体(img)をキーボード操作可能にするため<button>で包んだ
   (2026-07-25アクセシビリティ監査で発見: 以前はimg onclickのみで操作不可)。
   ブラウザ既定のボタン見た目を消し、以前のimg単体と同じ見た目に戻す */
.sample-thumb-btn {
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
  flex-shrink: 0;
}
.sample-thumb {
  width: 110px;
  height: 84px;
  object-fit: contain;
  background: var(--surface);
  display: block;
  border-radius: 3px;
  cursor: pointer;
  border: 3px solid transparent;
  box-sizing: border-box;
  flex-shrink: 0;
}
/* 枠が付くのは選択中のみ。ホバーには一切見た目の変化を付けない（DLsite本家準拠） */
.sample-thumb.selected {
  border-color: var(--accent);
}
/* disc-end スタイル */
.disc-end {
  font-size: 10px;
  color: var(--warn);
}
:root[data-theme="light"] .disc-end { color: #767676; }
.work-detail-info {}
.work-detail-related {
  margin-top: 32px;
}
.work-detail-related h3 {
  font-size: 15px;
  font-weight: 700;
  margin-bottom: 12px;
  color: var(--text);
}
/* DLsite / FANZA 縦積み */
.site-info-stack {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.site-block {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  /* DLsite/FANZAへのリンクとして枠(カード)自体は必要だが、内側の余白が
     文字を書ける幅を狭くしていたため、余白を切り詰める */
  padding: 8px;
}
.site-block-header {
  display: block;
  font-size: 13px;
  font-weight: 700;
  padding: 4px 0 8px;
  margin-bottom: 8px;
  border-bottom: 2px solid var(--border);
  text-decoration: none;
}
a.site-block-header:hover { opacity: 0.8; }
.site-block-dl { color: #6ab0f5; border-color: #6ab0f5; }
.site-block-fz { color: #ff5555; border-color: #ff5555; }
:root[data-theme="light"] .site-block-dl { color: #2f7fe0; border-color: #2f7fe0; }
:root[data-theme="light"] .site-block-fz { color: #dc3545; border-color: #dc3545; }
.site-block-clickable { cursor: pointer; transition: border-color 150ms, background 150ms; }
.site-block-clickable:hover { background: var(--surface-hover, rgba(255,255,255,0.04)); border-color: var(--text-muted); }
.site-table {
  border-collapse: collapse;
  width: 100%;
  font-size: 12px;
  margin-bottom: 10px;
}
.site-table th {
  color: var(--text-muted);
  font-weight: 500;
  text-align: left;
  padding: 3px 6px 3px 0;
  white-space: nowrap;
  width: 50px;
}
.site-table td {
  color: var(--text);
  padding: 3px 0;
}
.site-tags { margin-top: 6px; }
.site-tags .tag-col-label { margin-bottom: 4px; }
.work-detail-title {
  font-size: 20px;
  font-weight: 700;
  line-height: 1.4;
  margin-bottom: 8px;
}
/* テスト版・2026-07-12: タイトルをPC/タブレット幅では.work-detailより前
   (全幅・トップ)に、スマホ幅では従来通り.work-detail-info内(画像の後)に
   出し分ける。同じ.work-detail-titleを2箇所にレンダリングし、片方をCSSで
   隠す方式（パンくずはスマホ非表示・タイトルはPC/タブレットのみ
   トップ移動）。トップ配置時は画像との間にセパレータの罫線を入れる
    */
.work-detail-title-top {
  display: block;
  padding-bottom: 12px;
  margin-bottom: 20px;
  border-bottom: 3px solid var(--border);
}
.work-detail-info .work-detail-title { display: none; }
.work-detail-circle {
  font-size: 14px;
  color: var(--accent);
  margin-bottom: 16px;
}
.detail-section {
  margin-bottom: 20px;
}
.detail-section h3 {
  font-size: 13px;
  color: var(--text-muted);
  margin-bottom: 8px;
  text-transform: uppercase;
  letter-spacing: .05em;
}
.price-compare {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
}
.price-box {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 12px 16px;
  min-width: 160px;
}
.price-box-site {
  font-size: 11px;
  color: var(--text-muted);
  margin-bottom: 4px;
}
.price-box-price {
  font-size: 20px;
  font-weight: 700;
}
.price-box-discount {
  font-size: 12px;
  color: var(--warn);
  margin-top: 2px;
}
:root[data-theme="light"] .price-box-discount { color: #dc3545; }
.price-box a {
  display: inline-block;
  margin-top: 8px;
  background: var(--accent);
  color: #fff;
  padding: 5px 12px;
  border-radius: 6px;
  font-size: 12px;
}
.stats-row {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
}
.stat-item {
  background: var(--surface2);
  border-radius: var(--radius);
  padding: 10px 14px;
}
.stat-item-label {
  font-size: 11px;
  color: var(--text-muted);
  margin-bottom: 2px;
}
.stat-item-value {
  font-size: 18px;
  font-weight: 700;
}
.tags-list {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
/* テーブル(.site-table)の外に出したので、上の行との間隔を別途つける */
.site-block .tags-list {
  margin-top: 6px;
}
.tag-chip {
  background: #3d3d4a;
  border: none;
  border-radius: 4px;
  padding: 2px 6px;
  font-size: 12px;
  font-weight: 400;
  color: #d8d8e2;
  cursor: pointer;
  transition: background-color .1s, color .1s;
  /* 親がflexで詰まると、幅のないインライン要素は縮んで文字が
     チップの途中で折り返ってしまっていた。チップ自体は縮ませず、
     複数チップ間の折り返しは親のflex-wrapに任せる */
  white-space: nowrap;
  flex-shrink: 0;
}
.tag-chip:hover { background: #525264; color: #fff; }
:root[data-theme="light"] .tag-chip { background: transparent; color: #1a5fc4; font-weight: 400; }
:root[data-theme="light"] .tag-chip:hover { background: transparent; color: #12408a; text-decoration: underline; }
.tag-more {
  font-size: 11px;
  color: var(--text-muted);
  padding: 2px 6px;
  vertical-align: middle;
}

/* ── 検索結果ヘッダー＆ビュー切替 ── */
.results-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
}
.view-toggle {
  display: flex;
  gap: 4px;
}
.view-btn {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 12px;
  padding: 4px 10px;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.view-btn:hover { border-color: var(--accent); color: var(--accent); }
.view-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; }

/* ── コンパクト行 ── */
.work-compact-row {
  display: grid;
  grid-template-columns: 40px 1fr 56px 72px 80px 82px;
  align-items: center;
  gap: 10px;
  padding: 7px 12px;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
  transition: background 0.1s;
}
.work-compact-row:hover { background: var(--surface-hover, rgba(255,255,255,0.04)); }
.compact-thumb {
  width: 40px;
  height: 52px;
  object-fit: cover;
  border-radius: 3px;
  background: var(--surface);
}
.compact-thumb-empty {
  width: 40px;
  height: 52px;
  background: var(--surface);
  border-radius: 3px;
}
.compact-main { overflow: hidden; }
.compact-title {
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--text);
}
.compact-circle {
  font-size: 11px;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.compact-rating {
  font-size: 12px;
  color: #f4b942;
  text-align: center;
}
.compact-sales {
  font-size: 12px;
  color: var(--text-muted);
  text-align: right;
}
.compact-price-wrap { text-align: right; }
.compact-price-cur { font-size: 13px; font-weight: 700; color: var(--text); }
.compact-disc {
  font-size: 10px;
  background: transparent;
  color: #b0b0b8;
  padding: 0;
  margin-left: 3px;
}
:root[data-theme="light"] .compact-disc { color: #767676; }
.compact-date {
  font-size: 11px;
  color: var(--text-muted);
  text-align: right;
}
.compact-header {
  display: grid;
  grid-template-columns: 40px 1fr 56px 72px 80px 82px;
  gap: 10px;
  padding: 4px 12px;
  font-size: 10px;
  color: var(--text-muted);
  border-bottom: 1px solid var(--border);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.compact-header span:nth-child(n+3) { text-align: right; }

/* ── サークルページ ── */
.circle-header {
  margin-bottom: 24px;
}
.circle-title {
  font-size: 24px;
  font-weight: 700;
  margin-bottom: 8px;
}
/* サークル名の横に置く「詳しいデータを見る」リンク。.see-more-link(ピル/
   ボタン型、他ページのレールで共有)ではなく、ボタンに見えないプレーンな
   テキストリンクにする。折り返さず常に
   サークル名と同じ行に収める(flex-shrink:0、サークル名側をellipsisで縮める) */
.circle-title-link {
  flex-shrink: 0;
  font-size: 13px;
  color: var(--text-muted);
  white-space: nowrap;
}
.circle-title-link:hover { color: var(--text); }
.circle-stats {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
/* サークルページ単体の簡易データ(作品数・総販売数・配信期間・タグ等)。
   ピル(.stat-item)ではなく2列ペア(ラベル|値|ラベル|値)のテーブル表示にする
   （旧タグ詳細ページと同じ見せ方)。AB比較ページの
   .circle-stats/.stat-item(pill表示)はそのまま残すため、専用クラスにする */
.circle-summary-table {
  border-collapse: collapse;
  width: 100%;
  margin-bottom: 20px;
  font-size: 13px;
}
.circle-summary-table th,
.circle-summary-table td {
  border: 1px solid var(--border);
  padding: 10px 14px;
  text-align: left;
  vertical-align: top;
}
.circle-summary-table th {
  background: var(--surface2);
  font-weight: 500;
  color: var(--text-muted);
  white-space: nowrap;
  width: 1%;
}
.circle-summary-table td {
  color: var(--text);
}
.circle-summary-table .tags-list { margin: 0; }

/* ── 市場データ ── */
.market-grid {
  display: grid;
  /* auto-fillだと実カード数より列数が多く計算された場合に空列が余白を持って
     いってしまい、カードがminmaxの最小値(300px)に張り付いたまま伸びない
     （DevToolsで実測して発覚)。auto-fitは空列を
     0幅に潰すので、余白は必ず実カード側に回る。
     さらに、320px幅の端末では#appの左右padding(16px×2)を引いた実質幅が288pxしか
     なく、300pxの最低保証と矛盾してカードが右に12px食い込み、左右非対称に見える
     不具合があった（320px実測で確認)。min(300px, 100%)で
     コンテナよりは絶対にはみ出さないようにする */
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  gap: 20px;
}
.market-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 18px;
}
.market-card h3 {
  font-size: 14px;
  margin-bottom: 14px;
  color: var(--text-muted);
}
/* タグ一覧カード(DLsite/FANZAで使ってるタグ)は他のbar-rowカードと違い
   タグ数が多く縦に伸びやすいため、1カラムに収めると細長く窮屈になる。
   グリッドの全列分を使って横一列に広げ、タグを横方向に多く並べられる
   ようにする */
.market-card-wide {
  grid-column: 1 / -1;
}
.bar-row {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
  font-size: 12px;
}
.bar-label { width: 84px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; }
/* 活動継続性カードはbar-track(バー)を伴わないラベル+値の並びで、他のbar-rowと
   幅を揃える必要がない。「平均リリース間隔」が84pxに収まらず省略されていた
   ため、このカード専用に幅を広げる */
.bar-label-wide { width: 112px; }
.bar-track { flex: 1; background: var(--surface2); border-radius: 4px; height: 12px; }
.bar-fill  { background: var(--accent); border-radius: 4px; height: 12px; transition: width .3s; }
.bar-value { width: 84px; text-align: right; color: var(--text-muted); white-space: nowrap; flex-shrink: 0; }
/* 1行に2つの数字を入れるカード用（サークル「詳しいデータ」の
   「発売サイト別 構成比」）。**.bar-value は 84px 固定・nowrap・flex-shrink:0 で
   はみ出しても省略記号が出ない**ので、収まらないと数字が黙って切れる——
   実測で「476作品　中央値 7,384」が 136px 必要なのに 84px の枠に置かれ、
   画面には「476作品　中央値 7」と**途中で切れた数字**が出ていた（2026-07-31）。
   .bar-label-wide を足したときと同じ理由でこちらも枠を広げる。
   確かめ方は scripts/check-bar-overflow.mjs */
.bar-value-wide { width: 152px; }

@media (max-width: 599px) {
  /* スマホ幅では検索欄を常時表示せず、検索アイコンをタップして開閉する
     （当初はヘッダー下に常時折り返す案にしたが、
     アイコンをタップして開く方式に変更） */
  nav {
    flex-wrap: wrap;
    height: auto;
    padding-top: 10px;
    padding-bottom: 10px;
    row-gap: 10px;
  }
  .search-icon-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    background: none;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    color: var(--text);
    cursor: pointer;
    flex-shrink: 0;
    margin-left: auto;
  }
  /* ハンバーガーは右端に配置する（検索アイコンより後ろ） */
  .hamburger-btn { margin-left: 0; }
  .nav-search {
    display: none;
    flex-basis: 100%;
    order: 10;
  }
  .nav-search.open { display: flex; }
  .nav-search-input-wrap { flex: 1; }
}
/* ── トップページ 2カラム ── */
.top-two-col {
  display: grid;
  grid-template-columns: 1fr 420px;
  gap: 24px;
  align-items: start;
}
@media (max-width: 900px) {
  .top-two-col { grid-template-columns: 1fr; }
}
.top-col { min-width: 0; }
.top-col-right { min-width: 0; }
.see-more {
  font-size: 12px;
  font-weight: 400;
  color: var(--text-muted) !important;
}
.see-more:hover { color: var(--accent) !important; }

/* ── ランキング番号 ── */
.rank-num {
  font-size: 20px;
  font-weight: 700;
  color: var(--text-muted);
  text-align: center;
  flex-shrink: 0;
}
.rank-num.gold   { color: #f7d94a; }
.rank-num.silver { color: #b8b8c8; }
.rank-num.bronze { color: #c87a4a; }


/* ── タグページ ── */
/* コントロールパネルの表示設計（2026-07-17に全面整理。
   タブ→集計対象→見せ方→タグ名絞り込みの4層構造） */
.tags-mode-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 12px;
}
.tags-mode-tab {
  padding: 8px 24px;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-muted);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 8px;
  cursor: pointer;
}
.tags-mode-tab.active {
  color: #fff;
  background: var(--accent);
  border-color: var(--accent);
}
/* 詳細フィルターは同じ枠内の最下段で展開する（2026-07-17。
   区切り線・セクション見出しは使わない） */
.tags-adv-filters {
  margin-top: 2px;
}
/* 複数選択グループのチェックボックス（2026-07-17。ボタンだと
   複数選択できることが見た目から伝わらないため） */
.tags-checkboxes {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 14px;
  align-items: center;
  min-height: 30px;   /* ボタン列(check-toggle)と縦位置を揃える */
}
.tags-checkbox {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 13px;
  color: var(--text);
  cursor: pointer;
  user-select: none;
}
.tags-checkbox input[type="checkbox"] {
  accent-color: var(--accent);
  width: 15px;
  height: 15px;
  cursor: pointer;
}
.tags-adv-filters > .search-accordion-summary {
  font-size: 13px;
  font-weight: 600;
}
/* DLsite/FANZA公式のジャンル一覧と同じ「複数列のテキストリンク一覧」形式
   （ピル型ボックスの廃止・2026-07-17） */
.tag-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 2px 28px;
}
.tag-item {
  display: flex;
  align-items: baseline;
  gap: 6px;
  padding: 4px 0;
  cursor: pointer;
  min-width: 0;
}
.tag-item:hover .tag-item-name { color: var(--accent); text-decoration: underline; }
.tag-item-name {
  font-size: 13px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.tag-item-count { font-size: 11px; color: var(--text-muted); flex-shrink: 0; }
/* ソートに使っている数値の表示（2026-07-17） */
.tag-item-metric { font-size: 11px; color: var(--text-muted); opacity: .75; flex-shrink: 0; }
@media (max-width: 899px) {
  .tag-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 599px) {
  .tag-grid { grid-template-columns: repeat(2, 1fr); gap: 2px 16px; }
}
.tag-item-market {
  font-size: 11px;
  opacity: .45;
  cursor: pointer;
  transition: opacity .1s;
  margin-left: auto;
  flex-shrink: 0;
}
.tag-item-market:hover { opacity: 1; }

/* ── タグ対応表（2026-07-17） ── */
.tag-map-list {
  display: flex;
  flex-direction: column;
}
.tag-map-row {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 2.5fr 1.5fr 1.5fr;
  gap: 12px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--border);
  font-size: 13px;
}
.tag-map-row.tag-map-header {
  font-weight: 700;
  color: var(--text-muted);
  font-size: 12px;
}
.tag-map-cell-note {
  color: var(--text-muted);
  font-size: 12px;
}
@media (max-width: 599px) {
  /* スマホでは統合タグ+意味を優先表示 */
  .tag-map-row { grid-template-columns: 1fr 2fr; }
  .tag-map-row > span:nth-child(2), .tag-map-row > span:nth-child(3),
  .tag-map-row > span:nth-child(5), .tag-map-row > span:nth-child(6) { display: none; }
}

/* タグのカテゴリ表示（2026-07-17。カテゴリ間の余白は
   同日で24px→40pxに拡大） */
.tag-category-section {
  margin-bottom: 40px;
}
.tag-category-heading {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-size: 15px;
  font-weight: 700;
  border-bottom: 1px solid var(--border);
  padding-bottom: 6px;
  margin-bottom: 12px;
}
.tag-category-count {
  font-size: 12px;
  font-weight: 400;
  color: var(--text-muted);
}
/* 小分類見出し（2階層目・2026-07-17）。上余白を広くとって
   前の小分類のタグ行との区切りを明確にする（同日で14px→28px） */
.tag-subcategory-heading {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-muted);
  margin: 28px 0 6px;
}

/* ── サークル一覧 ── */
.circle-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
  transition: background var(--duration-fast);
}
.circle-row:hover { background: var(--surface2); }
.circle-row-name { font-size: 14px; font-weight: 600; }
/* 各列を固定幅にし、バッジが1個/2個/0個のどれでも「作品数」「累計販売数」の
   開始位置が行ごとにズレないようにする(以前はflex+badgeの有無で.circle-row-metaの
   全体幅が変わり、右寄せの反動で列がバラバラに見えていた) */
.circle-row-meta {
  display: grid;
  grid-template-columns: 100px 160px 140px;
  align-items: center;
  gap: 16px;
  font-size: 12px;
  color: var(--text);
}
.circle-row-stat { white-space: nowrap; }
/* DLsite/FANZAそれぞれ専用の固定幅スロットに置く。以前は無い方を単純に
   詰めていたため、DLsite非掲載の行だとFANZAバッジがDLsiteの位置まで
   ズレて見えていた */
.circle-row-badges { display: grid; grid-template-columns: 60px 60px; gap: 8px; }
.circle-row-badge-slot { display: flex; }

/* ── ローディング・エラー ── */
.loading {
  text-align: center;
  padding: 60px;
  color: var(--text-muted);
}
.error-msg {
  background: #3a1a1a;
  border: 1px solid var(--danger);
  border-radius: var(--radius);
  padding: 12px 16px;
  color: var(--danger);
  margin-bottom: 16px;
}
.total-count {
  font-size: 12px;
  color: var(--text-muted);
  margin-bottom: 12px;
}

/* ── レスポンシブ ── */
/* work-detail(サンプル画像列・情報列)の2カラム化はmin-width:1200pxから
   （テスト版・2026-07-12。DLsite本家調査に基づく変更: 従来は599px超で
   即2カラムにしていたが、画像列が情報列より高くなりやすく（情報列は
   DLsite/FANZAパネルが短いと大きな空白ができる）、DLsite本家は
   1200px相当の広い幅までは1カラム積みのままにして空白を作らない設計
   だった。599px〜1199pxの範囲を1カラムに変更し、既存の834px/1200px
   ブレークポイント語彙に揃えた。詳細: 設計/DLsite作品ページ_レイアウト分析.md */
@media (max-width: 1199px) {
  .work-detail { grid-template-columns: 1fr; }
  /* .work-detail-imgは基底ルールで既にposition:relative（sticky撤去済み）
     のため、ここでの上書きは不要（テスト版・2026-07-12: この上書きが
     残っていたせいで、スマホ幅の.cover-arrow用position:relativeが効かず
     矢印がビューポート基準の位置(x=0)にずれるバグになっていた） */
  /* テスト版・2026-07-12: タブレット幅のタイトルは14px。
     599px以下(スマホ)ではさらに下の@media(max-width:599px)ブロックが
     後勝ちで12pxに上書きする */
  .work-detail-title { font-size: 14px; }
}
@media (max-width: 599px) {
  .nav-links { display: none; }
  /* テスト版・2026-07-12: スマホ幅では作品詳細のパンくずを非表示にし、
     タイトルは.work-detail-title-top(全幅トップ)ではなく従来位置
     (.work-detail-info内、画像の後)に戻す */
  .wd-breadcrumb { display: none; }
  .work-detail-title-top { display: none; }
  .work-detail-info .work-detail-title { display: block; font-size: 12px; }
  /* テスト版・2026-07-13: DLsite/FANZAパネル(.site-block)を
     スマホ幅では画面幅いっぱいにし、角丸も無くす。#appの左右padding(16px)を
     margin:0 -16pxで打ち消す（.work-detail-imgの全幅化と同じ手法・2026-07-12） */
  .site-block {
    margin: 0 -16px;
    border-radius: 0;
  }
  /* FANZA同人の新着一覧を参考に(2026-07-09)、ホームページ・サークルページの
     モバイル向けカード一覧(.works-grid)は1カラムの大きめカードにする。
     グリッドで並べるより1件あたりの情報量(価格・評価・バッジ等)を見やすくできる */
  /* テスト版・2026-07-23: #appの左右16pxパディングがそのまま
     カード一覧の余白にもなり、特に2列のmc-mode(コンパクト表示)でカード自体が
     狭く見えていた。.site-block(作品詳細)と同じ手法でmargin:0 -16pxにより
     #appのpaddingを打ち消し、カード一覧だけ画面幅いっぱいにする。ただし
     画面端ぎりぎりまでは詰めず、8pxだけ余白を残す(paddingは少し必要) */
  .works-grid { grid-template-columns: 1fr; gap: 12px; margin: 0 -16px; padding: 0 8px; }
  /* コンパクト表示は一覧性優先のため2列グリッドにする */
  /* align-items:startが無いとgridは同じ行のカードを既定でstretchするため、
     :activeで片方のカードが開くと同じ行の隣のカードまで一緒に伸びてしまう */
  .works-grid.mc-mode { grid-template-columns: repeat(2, 1fr); column-gap: 0; row-gap: 4px; align-items: start; }

  /* サークル「詳しいデータ」ページのカード一覧(.market-grid)も同じ手法で
     全幅化する（
     左右とも#appの16pxパディングに揃えるのではなく、.works-gridと同じく
     左右とも切り詰めて画面幅いっぱいにする方が正しい) */
  .market-grid { margin: 0 -16px; padding: 0 8px; }
  /* market-cardが縦積みになるスマホ幅では、カードごとの枠線+背景が単なる
     区切り線の代わりに使われているだけで積み重なると冗長に見えるため、
     枠線ではなく上に薄いボーダーを1本引く簡易表示にする */
  .market-card {
    background: none;
    border: none;
    border-top: 1px solid var(--border);
    border-radius: 0;
    padding: 16px 0;
  }
  /* 1行に収まりきらない項目(現在価格・評価など)は、単語の途中で折り返さず
     行ごと下に送る */
  .bar-row { flex-wrap: wrap; row-gap: 2px; }

  /* .work-rowの4カラム固定(36px 200px 1fr auto)は599px以下で情報列が
     数pxまで潰れ文字が1文字ずつ折り返る不具合があったため、サムネイルを
     縮小した2カラム構成+右側情報を下段に回すレイアウトへ切り替える */
  .work-row {
    grid-template-columns: 32px 84px 1fr;
    grid-template-rows: auto auto;
    grid-template-areas:
      "rank img info"
      "right right right";
  }
  .work-row .rank-num { grid-area: rank; }
  .work-row > img { grid-area: img; width: 84px; height: 112px; object-fit: contain; }
  .work-row-info { grid-area: info; }
  .work-row-right {
    grid-area: right;
    display: flex;
    align-items: center;
    gap: 14px;
    text-align: left;
    white-space: normal;
    min-width: 0;
    margin-top: 4px;
    padding-top: 6px;
    border-top: 1px solid var(--border);
  }

  /* サークル一覧ページ：.circle-rowの1行表示(サークル名+メタ情報+サイトバッジ)は
     375px幅では窮屈で不自然な改行を起こしていたため、2行構成に変更する。
     1行目=サークル名、2行目=「作品数 n・累計販売数 n」、サイトバッジは非表示 */
  .circle-row {
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
  }
  .circle-row-meta { display: flex; gap: 0; font-size: 12px; }
  .circle-row-badges { display: none; }
  .circle-row-stat + .circle-row-stat::before { content: "・"; }

  /* .works-grid内の.work-card（ホームページ・サークルページのモバイル一覧）は、
     画像を上・情報を下に積む構成ではなく、画像を左・タイトル以下の情報を右に
     並べる横並び構成にする（参考画像の通り。
     PC・タブレット幅では元の.work-row形式を使うため、この横並びカードは
     スマホ幅(≤599px)限定） */
  .works-grid .work-card {
    display: grid;
    grid-template-columns: 152px 1fr;
    align-items: start;
  }
  .works-grid .work-card img {
    width: 152px;
    aspect-ratio: 1/1;
    height: auto;
  }
  /* カテゴリ・専売バッジが2枚重なると幅が足りず縦積みになることがあった
     (320px幅で確認)。折り返さず1行に収め、収まりきらない分は詰めて縮める */
  .works-grid .work-card-badges {
    flex-wrap: nowrap;
    min-width: 0;
  }
  .works-grid .work-card-badges .cat-badge,
  .works-grid .work-card-badges .badge {
    flex-shrink: 0;
    white-space: nowrap;
  }
  .works-grid .work-card-body {
    padding: 8px 10px 10px;
    min-width: 0;
    text-align: left;
  }
  .works-grid .work-card-title {
    font-size: 14px;
    font-weight: 700;
    -webkit-line-clamp: 2;
  }
  .works-grid .work-card-circle { font-size: 12px; text-align: left; }
  /* 販売数・評価(件数)は折り返さず、1項目ずつ縦に並べる */
  .works-grid .work-card-bottom {
    font-size: 10px;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
  }
  .works-grid .card-rating-count { font-size: 10px; }
  /* 発売日は表示しない */
  .works-grid .card-date { display: none; }
  /* 価格（.work-card-sites）はタイトル等がある右カラムの下ではなく、
     画像＋テキストの行全体の下に、カード幅いっぱいの独立した行として置く。
     「DLsite 価格 割引率」は1行にまとめ、DLsiteの行・FANZAの行を
     縦に1行ずつ並べる */
  .works-grid .work-card-sites {
    grid-column: 1 / -1;
    padding: 8px 10px 10px;
    border-top: 1px solid var(--border);
  }
  /* テスト版・2026-07-13: 価格を.price-site-label(DLsite/FANZA
     ラベル)と同じ10pxに縮小（従来は14px太字で目立ちすぎていた）。
     従来.works-gridスコープだったが、.work_card_htmlは検索の.works-grid以外に
     rail_section_html(.rail-track、同サークルの作品・関連作品・ホームページの
     レール)でも使われており、.works-grid祖先が無いカードには効いていなかった。
     スマホ幅ではwork_row_html(.row-site-price不使用の
     文脈)は出ないため、.works-grid限定をやめてこのmedia query内で無条件にする。
     さらに.row-site-price自体ではなく、実際に文字を表示している子要素の
     .price/.price-origを直接指定する必要があった。.priceには基本ルール
     (line 623)でfont-size:12pxが個別指定されており、継承(.row-site-priceの
     font-size)より子要素の明示指定が優先されるため、親だけ変えても表示上の
     文字サイズには一切効いていなかった（DevTools実況で確認） */
  .row-site-price { font-weight: 700; }
  .row-site-price .price { font-size: 10px; }
  .row-site-price .price-orig { font-size: 9px; font-weight: 400; }
  /* テスト版・2026-07-13: DLsite/FANZAラベルの左右paddingを0に
     （.price-site-labelは全幅共通ルール・.works-grid/.rail-track両方に出現するため
     .work-card内という条件を付けて詳細度を上げ、ソース順に依存せず確実に
     勝つようにする。単に.price-site-labelだけだと同じ詳細度の基本ルールが
     ファイル後方(line 2193)にあるため後勝ちで無効化されていた） */
  .work-card .price-site-label { padding: 0; }
  /* 番号バッジ・タグは表示しない */
  .works-grid .card-rank-badge { display: none; }
  .works-grid .row-tags { display: none; }
  /* 割引終了日時（「〜終了」）もモバイルカードでは表示しない。データ自体は
     PC/タブレットのコンパクト表示（検索ページの「コンパクト」トグルが正）で
     使うため保持し、モバイルカードだけCSSで隠す（発売日・タグと同じ扱い） */
  .works-grid .disc-end { display: none; }
}

/* ── タブ ── */
.tabs {
  display: flex;
  gap: 4px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--border);
  padding-bottom: 0;
}
.tab-btn {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 13px;
  padding: 8px 14px;
  margin-bottom: -1px;
}
.tab-btn.active {
  color: var(--accent);
  border-bottom-color: var(--accent);
}
.tab-custom-input {
  width: 90px;
  margin: 0 0 -1px 8px;
  padding: 6px 8px;
  font-size: 13px;
  border: 1px solid var(--border);
  border-radius: 4px;
  background: var(--surface);
  color: var(--text);
}

/* ── チェックボックス式トグルボタン ── */
.check-toggles {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
}
.check-toggle {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 20px;
  color: var(--text-muted);
  padding: 4px 11px;
  font-size: 12px;
  cursor: pointer;
  transition: all .15s;
}
.check-toggle.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}
.check-toggle:hover:not(.active) {
  border-color: var(--accent);
  color: var(--text);
}
.filter-group-wide {
  flex: 1 1 auto;
}

/* ── 価格ボックス追加スタイル ── */
.price-box-nodata {
  opacity: .55;
}
.price-box-nodata-text {
  font-size: 14px;
  color: var(--text-muted);
  margin-top: 4px;
}
.btn-buy {
  display: inline-block;
  margin-top: 8px;
  background: var(--accent);
  color: #fff !important;
  padding: 5px 12px;
  border-radius: 6px;
  font-size: 12px;
  text-decoration: none;
}
.btn-buy:hover { background: var(--accent-hover); }

/* ── デュアル価格 (リスト) ── */
.dual-price {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  align-items: center;
  font-size: 12px;
}
.row-prices {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-size: 12px;
}
.price-site-label {
  font-size: 10px;
  font-weight: 700;
  color: var(--text-muted);
  background: var(--surface2);
  border-radius: 3px;
  padding: 0 3px;
}
:root[data-theme="light"] .price-site-label { background: transparent; padding: 0; color: var(--text-muted); }
.price-sep { color: var(--border); }

/* ── タグ入力エリア（検索ページ） ── */
.tag-input-area {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 260px;
}
.tag-chips-row {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  min-height: 0;
}
.tag-input-wrap {
  position: relative;
}
.tag-input-wrap input {
  width: 220px;
  padding: 4px 8px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 4px;
  color: var(--text);
  font-size: 13px;
}
.tag-suggest-list {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 100;
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 6px;
  list-style: none;
  margin: 2px 0 0;
  padding: 4px 0;
  min-width: 220px;
  max-height: 260px;
  overflow-y: auto;
  box-shadow: 0 4px 16px rgba(0,0,0,.4);
}
.tag-suggest-list li {
  padding: 6px 12px;
  cursor: pointer;
  font-size: 13px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
}
.tag-suggest-list li:hover {
  background: var(--surface);
}
.tag-related-row {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
  align-items: center;
}
.tag-chip.active-tag {
  background: var(--surface2);
  border-color: var(--accent);
  color: var(--accent);
}
.tag-chip.exclude-tag {
  background: rgba(220, 53, 69, 0.1);
  border-color: #dc3545;
  color: #dc3545;
}
.tag-chip.exclude-tag:hover {
  border-color: #ff4455;
  color: #ff4455;
}

/* ── タグ2列（詳細ページ上部） ── */
.detail-tags-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}
.detail-tags-row.single { grid-template-columns: 1fr; }
.tag-col-label {
  font-size: 11px;
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: .05em;
  margin-bottom: 5px;
}

/* ── 新検索パネル（3セクション構成） ── */
.search-section {
  border-top: 1px solid var(--border);
}
/* テスト版・2026-07-16: width:100%指定がマイナスマージンでの
   幅自動拡張を妨げていたため撤去（詳細は.search-panel-toggle付近のコメント参照） */
.search-section-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
  /* ): .search-panelの左右paddingを撤去した分、
     ここに左右16pxを持たせて入力欄の余白を保つ（marginは使わない） */
  padding: 6px 16px 8px 16px;
}
.search-row {
  display: grid;
  grid-template-columns: 48px 1fr;
  align-items: start;
  gap: 8px;
}
.search-row-label {
  font-size: 11px;
  font-weight: 700;
  padding-top: 8px;
  color: var(--text-muted);
  white-space: nowrap;
}
.search-row-label.or  { color: #7abfff; }
.search-row-label.ex  { color: var(--danger, #e05); }
.search-row input[type="text"] {
  width: 100%;
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font-size: 13px;
  padding: 6px 10px;
}
.search-row input[type="text"]:focus { outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--accent); }
.search-category-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  border-top: 1px solid var(--border);
  padding-top: 10px;
}
.search-category-label {
  font-size: 11px;
  color: var(--text-muted);
  white-space: nowrap;
}
.search-actions {
  display: flex;
  gap: 8px;
  align-items: center;
}
/* ソートをselectに変更 */
.sort-select {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font-size: 13px;
  padding: 5px 10px;
  cursor: pointer;
}
.sort-select:focus { outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--accent); }
/* OR タグチップ */
.tag-chip.or-tag {
  background: rgba(122, 191, 255, 0.12);
  border-color: rgba(122, 191, 255, 0.4);
  color: #7abfff;
}

/* ───────────────────────────────────────────────────────────────
   RSC版で div → a になったクリック可能要素の見た目補正
   (2026-07-28)

   .work-card / .work-row / .mc-card / .circle-row は元々 div + onClick で、
   クリックするとドキュメント全体を再読み込みしていた。RSC版ではこれを
   <a href> に変えた(クロール可能な内部リンク・クライアント遷移・⌘クリックの
   ため)。ここで打ち消すのは<a>になったことによる差分だけで、見た目は div の
   ときと完全に同一になる。

   全SPA版はこのCSSを共有するが、SPA版は div のまま描画するので
   `a.〜` セレクタは一切マッチしない(影響なし)。

   注意: display は「元々指定が無い .work-card」にだけ足すこと。
   .work-row(grid)・.circle-row(flex)は自前で display を持っており、
   `a.work-row` は `.work-row` より詳細度が高いので、まとめて display:block を
   書くとレイアウトが崩れる。.mc-card は position:absolute なので
   インライン要素でも自動的にblock化され、補正は要らない。
   ─────────────────────────────────────────────────────────────── */
a.work-card,
a.work-row,
a.mc-card,
a.circle-row,
a.tag-item {
  /* グローバルの `a { color: var(--accent) }` を打ち消す。
     div のときと同じく親から色を継承させる。
     .tag-item は子の .tag-item-name が色指定を持たず親から継承するため、
     これが無いとタグ名が丸ごとアクセント色に変わる
     (.tag-item-count / .tag-item-metric は自前で --text-muted を持つので無関係)。
     .tag-chip は自前で color を持つので対象外。 */
  color: inherit;
}
a.work-card {
  /* .work-card だけ display 指定が無く、div(block)から a(inline)になると
     幅・高さ・内部のレイアウトが総崩れになる */
  display: block;
}

/* ページ送りの遷移中フィードバック (2026-07-28)

   .pagination のボタンを押してから結果が入れ替わるまで本番で約493msあり、
   その間ずっと古い結果のまま無反応だった(「押しても何も起きない」)。
   pending中は .pagination 自身を薄くして、操作を受け付けたことを示す。
   要素は1つも足していない（既存の .pagination の見え方を変えるだけ）。

   0.1sの遅延を入れてあるので、キャッシュが効いて瞬時に終わる遷移では
   一瞬も見えない。遅いときだけ出る。 */
.pagination[data-pending="true"] {
  opacity: .55;
  transition: opacity .15s .1s;
}
.pagination[data-pending="true"] button {
  cursor: default;
}

/* 発売時期を挟むバー（2026-08-01・work レーンが札を取って追加）。
   `<input type="range">` を2本重ねる作りは捨てた——2つのつまみが同じ位置に
   来ると「上に載っている方」しか掴めず、行ける向きの無い方を掴んでしまう。
   自前で作って「押した位置に近い方を掴む」に変えた（work-analysis-body.tsx）。
   全SPA版と全RSC版が同じクラスを使う。 */
.peer-range {
  position: relative;
  width: 200px;
  height: 22px;
  flex: 0 0 auto;
  cursor: pointer;
  /* 触って動かすときにページが一緒にスクロールしないように */
  touch-action: none;
}
.peer-range-track,
.peer-range-fill {
  position: absolute;
  top: 10px;
  height: 3px;
  border-radius: 2px;
}
.peer-range-track {
  left: 0;
  right: 0;
  background: var(--border);
}
.peer-range-fill {
  background: var(--accent);
}
.peer-range-tick {
  position: absolute;
  top: 7px;
  width: 1px;
  height: 9px;
  margin-left: -1px;
  background: var(--border);
}
.peer-range-thumb {
  position: absolute;
  top: 4px;
  width: 15px;
  height: 15px;
  margin-left: -7px;
  box-sizing: border-box;
  border: 2px solid var(--surface);
  border-radius: 50%;
  background: var(--accent);
  cursor: grab;
}
.peer-range-thumb:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}
