/* ============================================================
   TRPGツール 共通スタイル

   セッションは夜に長時間やることが多いので、暗い配色を既定にしている。

   ★配色テーマについて
     配色は全てCSS変数に集約してあり、<html data-theme="..."> を
     差し替えるだけでテーマが切り替わる。テーマの選択はブラウザごとの
     設定（localStorage）なので、同じ卓の参加者それぞれが好きな配色を
     選べる（サーバーには保存しない）。実装は assets/js/theme.js。

     既定（data-theme 未指定 or "midnight"）… 現行のダーク配色
     "amethyst"  … 紫基調のダーク（色味違い）
     "light"     … 明るいライトモード
     "soft"      … ライトより一段明るさを落とした、目に優しい配色
     "parchment" … 羊皮紙風の明るい配色

     ★明るいテーマを足す時は、必ず前景／背景の全組み合わせで
       WCAG AA (4.5:1) を実測すること。暗いテーマ用のアクセント色
       （#6d8fd6 等）をそのまま流用すると白地で 2〜3:1 まで落ちて読めない。
   ============================================================ */

:root {
    --bg:          #16171c;
    --bg-panel:    #1e2027;
    --bg-input:    #2a2d36;
    --bg-deep:     #0b0c0f;   /* パネルより暗い面（盤面ビューポート・画像の下地） */
    --border:      #34373f;
    --text:        #e4e6eb;
    --text-dim:    #9aa0ac;
    --accent:      #6d8fd6;
    --accent-dim:  #4a6294;

    --kp:      #d68b6d;   /* KP: 暖色。進行役であることが一目で分かるように */
    --skp:     #d6c46d;   /* SKP: KPに近い色 */
    --pl:      #6dd6a8;   /* PL: 寒色 */

    --critical: #7ee2a8;
    --fumble:   #e27e7e;
    --secret:   #b98ad6;

    /* ---- テーマごとに差し替わる補助色 ----
       ここを変数にしておかないと明るいテーマで文字が読めなくなる。 */
    --on-accent:     #fff;                    /* アクセント色の上に載る文字 */
    --on-badge:      #1a1a1a;                 /* バッジ（KP/SKP/PL）の上に載る文字 */
    --hairline:      rgba(255,255,255,.04);   /* 表の行区切りなど極薄の線 */
    --grid-line:     rgba(255,255,255,.08);   /* 盤面のグリッド */
    --dot-off:       #555;                    /* オフライン表示のドット */
    --danger:        #8c4a4a;
    --danger-hover:  #a85757;
    --msg-error-bg:  #4a2626;  --msg-error-fg: #ffc9c9;
    --msg-ok-bg:     #234a36;  --msg-ok-fg:    #b6f0d2;
    --bar-a:         #23252d;  --bar-b:        #1c1e25;   /* 行動順の帯のグラデーション */

    --radius: 6px;
}

/* ---- light: 明るいライトモード --------------------------------
   明るい面に載るため、コントラストが反転する変数をまとめて上書きする。
   全ての前景／背景の組み合わせで WCAG AA (4.5:1) を実測済み。 */
:root[data-theme="light"] {
    --bg:          #f4f6f9;
    --bg-panel:    #ffffff;
    --bg-input:    #ffffff;
    --bg-deep:     #e3e7ee;
    --border:      #ccd3de;
    --text:        #1b1f27;
    --text-dim:    #5a6270;
    /* 明るい地に載るリンク色。暗いテーマの #6d8fd6 のままだと白背景に対して
       2.7:1 しか無く読めないので、濃い側へ振ってある。 */
    --accent:      #2f5bb7;
    --accent-dim:  #3f6ac2;

    /* バッジは 0.72rem の太字。白文字を載せるので地色を濃くする。 */
    --kp:      #a1531f;
    --skp:     #7a6410;
    --pl:      #1f6b4d;

    --critical: #1b6b3f;
    --fumble:   #a32f2f;
    --secret:   #6b3f9c;

    --on-accent:     #fff;
    --on-badge:      #fff;
    --hairline:      rgba(0,0,0,.06);
    --grid-line:     rgba(0,0,0,.12);
    --dot-off:       #b6bdc9;
    --danger:        #a83232;
    --danger-hover:  #8d2929;
    --msg-error-bg:  #fbe0e0;  --msg-error-fg: #7c1f1f;
    --msg-ok-bg:     #dcf0e4;  --msg-ok-fg:    #1c5738;
    --bar-a:         #eef1f6;  --bar-b: #e4e9f1;
}

/* ---- soft: ライトより一段明るさを落とした、目に優しい配色 --------
   長時間のセッションで白い面を見続けると疲れるため、地を温かみのある
   グレーまで落として輝度差を抑えてある（light の地 #f4f6f9 に対して
   こちらは #dfdcd4）。文字側も真っ黒にせず #26241f。
   こちらも全組み合わせで AA を実測済み。 */
:root[data-theme="soft"] {
    --bg:          #dfdcd4;
    --bg-panel:    #eceae4;
    --bg-input:    #f5f3ee;
    --bg-deep:     #cfcbc1;
    --border:      #bab5a9;
    --text:        #26241f;
    --text-dim:    #5c584f;
    --accent:      #39548f;
    --accent-dim:  #46608f;

    --kp:      #9c4f1e;
    --skp:     #6f5c10;
    --pl:      #1e6349;

    --critical: #1c6440;
    --fumble:   #9e2f2f;
    --secret:   #653c93;

    --on-accent:     #fff;
    --on-badge:      #fff;
    --hairline:      rgba(0,0,0,.06);
    --grid-line:     rgba(0,0,0,.12);
    --dot-off:       #a9a49a;
    --danger:        #9e3030;
    --danger-hover:  #852727;
    --msg-error-bg:  #f2dada;  --msg-error-fg: #752020;
    --msg-ok-bg:     #d8e8dc;  --msg-ok-fg:    #1b5334;
    --bar-a:         #e4e1da;  --bar-b: #d8d4cc;
}

/* ---- amethyst: 紫基調のダーク（色味違い）---------------------- */
:root[data-theme="amethyst"] {
    --bg:          #1a1622;
    --bg-panel:    #241d2f;
    --bg-input:    #322843;
    --bg-deep:     #100d16;
    --border:      #423457;
    --text:        #ece6f5;
    --text-dim:    #a99cbd;
    --accent:      #a985e0;
    --accent-dim:  #6f4f9c;

    --kp:      #e0a06d;
    --skp:     #ddc879;
    --pl:      #79d9c0;
    --secret:  #e59ad6;

    --hairline:  rgba(255,255,255,.05);
    --grid-line: rgba(255,255,255,.09);
    --dot-off:   #5f5273;
    --bar-a:     #2c2339;  --bar-b: #221b2d;
}

/* ---- parchment: 羊皮紙風の明るい配色 ---------------------------
   明るい面に載るため、コントラストが反転する変数をまとめて上書きする。 */
:root[data-theme="parchment"] {
    --bg:          #f2ebdc;
    --bg-panel:    #e9dfca;
    --bg-input:    #fbf6ec;
    --bg-deep:     #ddd1b8;
    --border:      #c9ba9c;
    --text:        #2f2a20;
    --text-dim:    #6f6553;
    /* 明るい地に載るので、暗いテーマよりさらに濃くしないとリンクが読めない
       （#8a6a3f だと本文背景に対して 4.2:1 で不足していた） */
    --accent:      #7a5c33;
    --accent-dim:  #6d5231;

    /* ★バッジは 0.72rem の太字。白文字を載せるため、暗いテーマの明るい
       ロール色をそのまま使うとコントラストが 4:1 を切る。濃い側に振る。 */
    --kp:      #ad5f2f;
    --skp:     #867016;
    --pl:      #357a5c;

    --critical: #2f7d4f;
    --fumble:   #a83b3b;
    --secret:   #7d4f9c;

    --on-accent:     #fff;
    --on-badge:      #fff;   /* バッジ地色が濃くなるので白文字にする */
    --hairline:      rgba(0,0,0,.07);
    --grid-line:     rgba(0,0,0,.14);
    --dot-off:       #b3a888;
    --danger:        #a83b3b;
    --danger-hover:  #8f3030;
    --msg-error-bg:  #f6d9d9;  --msg-error-fg: #7a2020;
    --msg-ok-bg:     #d9efdf;  --msg-ok-fg:    #1f5c3a;
    --bar-a:         #e3d7bf;  --bar-b: #d8caae;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
}

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

a { color: var(--accent); }

/* ---- フォーム部品 ---------------------------------------- */

input[type=text], input[type=password], textarea, select {
    width: 100%;
    padding: .55rem .7rem;
    background: var(--bg-input);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    color: var(--text);
    font-family: inherit;
    font-size: inherit;
}
input:focus, textarea:focus, select:focus {
    outline: none;
    border-color: var(--accent);
}
textarea { resize: vertical; }

button {
    padding: .55rem 1.1rem;
    background: var(--accent-dim);
    border: none;
    border-radius: var(--radius);
    color: var(--on-accent);
    font-family: inherit;
    font-size: inherit;
    cursor: pointer;
}
button:hover:not(:disabled) { background: var(--accent); }
button:disabled { opacity: .5; cursor: not-allowed; }

button.sub {
    background: transparent;
    border: 1px solid var(--border);
    color: var(--text-dim);
}
button.sub:hover:not(:disabled) { background: var(--bg-input); color: var(--text); }

button.danger { background: var(--danger); }
button.danger:hover:not(:disabled) { background: var(--danger-hover); }

label {
    display: block;
    margin-bottom: .3rem;
    color: var(--text-dim);
    font-size: .85rem;
}
.field { margin-bottom: 1rem; }

/* ---- 通知 -------------------------------------------------- */

.msg {
    padding: .6rem .8rem;
    border-radius: var(--radius);
    margin-bottom: 1rem;
    font-size: .9rem;
}
.msg.error { background: var(--msg-error-bg); color: var(--msg-error-fg); }
.msg.ok    { background: var(--msg-ok-bg); color: var(--msg-ok-fg); }
.msg:empty { display: none; }

/* ============================================================
   ログイン / ダッシュボード
   ============================================================ */

.center-wrap {
    max-width: 26rem;
    margin: 0 auto;
    padding: 3rem 1.2rem;
}

.card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1.6rem;
}

.site-title {
    text-align: center;
    margin: 0 0 .3rem;
    font-size: 1.3rem;
}
.site-sub {
    text-align: center;
    margin: 0 0 1.8rem;
    color: var(--text-dim);
    font-size: .85rem;
}

.tabs {
    display: flex;
    gap: .3rem;
    margin-bottom: 1.4rem;
    border-bottom: 1px solid var(--border);
}
.tabs button {
    flex: 1;
    background: transparent;
    color: var(--text-dim);
    border-radius: 0;
    border-bottom: 2px solid transparent;
    padding: .6rem;
}
.tabs button.active {
    color: var(--text);
    border-bottom-color: var(--accent);
}
.tabs button:hover { background: transparent; color: var(--text); }

.dash-wrap {
    max-width: 60rem;
    margin: 0 auto;
    padding: 2rem 1.2rem;
}

.dash-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1.6rem;
    flex-wrap: wrap;
    gap: .6rem;
}
.dash-head h1 { margin: 0; font-size: 1.2rem; }

.grid2 {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr));
    gap: 1rem;
}

/* ---- 共通ナビゲーションバー（home/characters/rooms/profile/admin） ---- */
.top-nav {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .6rem 1.2rem;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    flex-wrap: wrap;
}
.top-nav a { text-decoration: none; }
.top-nav .nav-btn {
    padding: .4rem .8rem;
    border-radius: var(--radius);
    color: var(--text-dim);
    font-size: .85rem;
    background: transparent;
    border: 1px solid transparent;
}
.top-nav .nav-btn:hover { background: var(--bg-input); color: var(--text); }
.top-nav .nav-btn.active { color: var(--text); border-color: var(--border); background: var(--bg-input); }
.top-nav .spacer { flex: 1; }
.top-nav .nav-user {
    display: flex; align-items: center; gap: .5rem;
    font-size: .85rem; color: var(--text-dim);
}
.nav-icon {
    width: 1.8rem; height: 1.8rem; border-radius: 50%;
    object-fit: cover; background: var(--bg-input);
}

/* ---- 配色テーマの選択（ナビ・ルーム上部バー・シート見出し共通） ---- */
#theme-picker {
    width: auto;
    padding: .25rem .5rem;
    font-size: .8rem;
    color: var(--text-dim);
}
#theme-picker:hover { color: var(--text); }

/* ---- ホーム画面のカード ---- */
.home-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
    gap: 1rem;
    margin-bottom: 1.4rem;
}
.home-card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1.2rem;
    text-decoration: none;
    color: var(--text);
    display: block;
    transition: border-color .15s;
}
.home-card:hover { border-color: var(--accent); }
.home-card h3 { margin: 0 0 .3rem; font-size: 1rem; }
.home-card p { margin: 0; font-size: .8rem; color: var(--text-dim); }
.home-card.disabled { opacity: .5; pointer-events: none; }

/* ---- キャラクターライブラリのカード ---- */
.charlib-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
    gap: 1rem;
}
.charlib-card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .8rem;
}
.charlib-card.retired { filter: grayscale(1); opacity: .55; border-style: dashed; }
.charlib-card .cl-icon {
    width: 100%; height: 8rem; object-fit: cover; object-position: top center;
    border-radius: var(--radius); background: var(--bg-input); margin-bottom: .5rem;
}
.charlib-card .cl-name { font-weight: 700; margin-bottom: .3rem; }
.charlib-card .cl-rooms { font-size: .74rem; color: var(--text-dim); margin: .3rem 0; }
.charlib-card .cl-actions { display: flex; gap: .3rem; margin-top: .5rem; flex-wrap: wrap; }
.charlib-card .cl-actions button, .charlib-card .cl-actions a button { padding: .2rem .55rem; font-size: .74rem; }

.room-list { list-style: none; padding: 0; margin: 0; }
.room-list li {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: .8rem;
    padding: .7rem .2rem;
    border-bottom: 1px solid var(--border);
}
.room-list li:last-child { border-bottom: none; }
.room-name { font-weight: 600; }
.room-meta { color: var(--text-dim); font-size: .8rem; }

/* ロールを示すバッジ。色で役割が直感的に分かるようにしている */
.badge {
    display: inline-block;
    padding: .1rem .5rem;
    border-radius: 99px;
    font-size: .72rem;
    font-weight: 700;
    color: var(--on-badge);
}
.badge.kp  { background: var(--kp); }
.badge.skp { background: var(--skp); }
.badge.pl  { background: var(--pl); }

/* ============================================================
   セッション画面（3ペイン）
   ============================================================ */

body.room {
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

.room-bar {
    display: flex;
    align-items: center;
    gap: .8rem;
    padding: .5rem .9rem;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    flex-wrap: wrap;
}
.room-bar h1 { margin: 0; font-size: .98rem; }
.room-bar .spacer { flex: 1; }
.room-bar select, .room-bar button { width: auto; padding: .35rem .7rem; font-size: .85rem; }

/* ============================================================
   行動順の帯
   ============================================================

   ★配置の意図
     戦闘中に最も知りたいのは「今誰の番か」。
     左ペインに置くと、盤面やチャットを見ている間に視界から外れる。
     そこで画面上部に横一列で置き、どのペインを見ていても
     常に目に入るようにしている。
     現在の手番だけを明確に強調し、他は控えめにすることで、
     一瞥で手番が分かる状態を保つ。
*/

.init-bar {
    display: flex;
    align-items: stretch;
    gap: .6rem;
    padding: .45rem .7rem;
    background: linear-gradient(180deg, var(--bar-a), var(--bar-b));
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
}
.init-bar[hidden] { display: none; }

/* ラウンド表示 */
.init-round {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: .15rem .7rem;
    background: var(--bg-input);
    border-radius: var(--radius);
    flex-shrink: 0;
    min-width: 3.6rem;
}
.init-round .lbl { font-size: .62rem; color: var(--text-dim); letter-spacing: .08em; }
.init-round .num { font-size: 1.25rem; font-weight: 700; line-height: 1.1; }

/* 並んだ行動順 */
.init-list {
    display: flex;
    gap: .35rem;
    overflow-x: auto;
    flex: 1;
    padding: .1rem;
    scrollbar-width: thin;
}

.init-item {
    display: flex;
    align-items: center;
    gap: .45rem;
    padding: .3rem .6rem;
    background: var(--bg-input);
    border: 1px solid transparent;
    border-radius: var(--radius);
    white-space: nowrap;
    flex-shrink: 0;
    opacity: .55;
    transition: opacity .2s, transform .2s, background .2s;
    position: relative;
}

/* ★現在の手番。ここだけが目立つようにする */
.init-item.active {
    opacity: 1;
    background: var(--accent-dim);
    border-color: var(--accent);
    transform: scale(1.06);
    box-shadow: 0 0 0 2px rgba(109, 143, 214, .25);
}
.init-item.active::before {
    content: '▶';
    color: var(--on-accent);
    font-size: .7rem;
}

/* 手番が済んだ相手はさらに控えめに */
.init-item.done { opacity: .3; }

.init-dex {
    font-size: .72rem;
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    background: rgba(0,0,0,.25);
    padding: .05rem .35rem;
    border-radius: 3px;
}
.init-item.active .init-dex { color: #dbe4f7; }

.init-name { font-size: .88rem; font-weight: 600; }

/* 帯にもHPを出すと、瀕死の相手が一目で分かる */
.init-hp {
    font-size: .7rem;
    font-variant-numeric: tabular-nums;
    color: var(--text-dim);
}
.init-hp.low { color: var(--fumble); font-weight: 700; }

/* 帯のHP/MP/SAN（KP/SKPのみ。サーバー側でもPLへは配信していない）。
   キャラ数が増えても横に伸びないよう、現在値だけの小さなチップにする
   （最大値は title 属性に回す）。 */
.init-stat {
    font-size: .68rem;
    font-variant-numeric: tabular-nums;
    padding: 0 .25rem;
    border-radius: 3px;
    color: var(--text-dim);
    background: var(--bg-deep);
}
.init-stat.hp  { color: var(--pl); }
.init-stat.mp  { color: var(--accent); }
.init-stat.san { color: var(--secret); }
.init-stat.low { color: var(--fumble); font-weight: 700; }

.init-del {
    background: transparent;
    border: none;
    color: var(--text-dim);
    padding: 0 .1rem;
    font-size: .8rem;
    cursor: pointer;
    line-height: 1;
}
.init-del:hover { color: var(--fumble); background: transparent; }

/* ★一時的な速度ボーナス表示・操作（特別な理由での割り込み用） */
.init-bonus { color: var(--critical); font-weight: 700; }
.init-bonus-ctrl {
    display: inline-flex;
    gap: .15rem;
    align-items: center;
}
.init-bonus-ctrl button {
    padding: 0 .3rem;
    font-size: .68rem;
    line-height: 1.4;
    width: auto;
}

.init-controls {
    display: flex;
    gap: .3rem;
    align-items: center;
    flex-shrink: 0;
}
.init-controls button { padding: .35rem .8rem; font-size: .82rem; }
.init-controls button.next { font-weight: 700; }

.init-empty {
    display: flex;
    align-items: center;
    color: var(--text-dim);
    font-size: .82rem;
    flex: 1;
}

/* 編成ダイアログ */
.init-setup {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.6);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 100;
    padding: 1rem;
}
.init-setup[hidden] { display: none; }
.init-setup-panel {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1.4rem;
    width: 100%;
    max-width: 30rem;
    max-height: 85vh;
    overflow-y: auto;
}
.init-setup-panel h3 { margin: 0 0 1rem; font-size: 1rem; }
.init-pick {
    display: flex;
    align-items: center;
    gap: .6rem;
    padding: .45rem .3rem;
    border-bottom: 1px solid var(--border);
}
.init-pick input[type=checkbox] { width: auto; }
.init-pick .nm { flex: 1; font-size: .9rem; }
.init-pick .dex { width: 4.5rem; }
.init-pick .dex input { text-align: center; padding: .25rem; font-size: .85rem; }

:root {
    --pane-left:  18rem;
    --pane-right: 30rem;
    --foot-h:     12rem;
}

.room-main {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.room-body {
    flex: 1;
    display: grid;
    grid-template-columns: var(--pane-left) 6px 1fr 6px var(--pane-right);
    min-height: 0;
}

/* ---- ペイン間のドラッグリサイザ ---------------------------- */
.resizer {
    cursor: col-resize;
    background: transparent;
    position: relative;
}
.resizer:hover, .resizer.active { background: var(--accent-dim); }
.resizer.horizontal { cursor: row-resize; }

/* ---- 下部ログビュー ----------------------------------------- */
.room-foot {
    height: var(--foot-h);
    border-top: 1px solid var(--border);
    background: var(--bg-panel);
    display: flex;
    flex-direction: column;
    min-height: 0;
    flex-shrink: 0;
}
.room-foot[hidden] { display: none; }
.room-foot-head {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .3rem .7rem;
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
}
.room-foot-head h4 { margin: 0; font-size: .82rem; color: var(--text-dim); flex-shrink: 0; }
.room-foot-filters { display: flex; gap: .25rem; flex-wrap: wrap; }
.room-foot-filters button {
    padding: .15rem .55rem;
    font-size: .74rem;
    background: transparent;
    border: 1px solid var(--border);
    color: var(--text-dim);
}
.room-foot-filters button.active { background: var(--accent-dim); color: var(--on-accent); border-color: transparent; }
.room-foot-body { flex: 1; overflow-y: auto; padding: .4rem .8rem; min-height: 0; font-size: .84rem; }
.room-foot-body .feed-row { margin-bottom: .3rem; word-break: break-word; }
.room-foot-body .feed-row .feed-tag {
    display: inline-block;
    font-size: .68rem;
    padding: 0 .35rem;
    border-radius: 3px;
    margin-right: .3rem;
    background: var(--bg-input);
    color: var(--text-dim);
}
.room-foot-toggle { margin-left: auto; }

.pane {
    display: flex;
    flex-direction: column;
    min-height: 0;
    min-width: 0;
    border-right: 1px solid var(--border);
}
.pane:last-child { border-right: none; }

.pane-head {
    padding: .5rem .8rem;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    font-size: .8rem;
    color: var(--text-dim);
    font-weight: 600;
    letter-spacing: .04em;
    flex-shrink: 0;
}
.pane-scroll {
    flex: 1;
    overflow-y: auto;
    padding: .8rem;
    min-height: 0;
}
/* 参加者一覧など、キャラクター一覧より優先度の低い区画を控えめな高さに固定する */
.pane-scroll.fixed-40 {
    flex: 0 0 auto;
    max-height: 40%;
}

/* ---- メンバー一覧 ------------------------------------------ */

.member {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .35rem 0;
    font-size: .88rem;
}
.dot {
    width: .5rem; height: .5rem;
    border-radius: 50%;
    background: var(--dot-off);
    flex-shrink: 0;
}
.dot.on { background: var(--pl); }

/* ---- キャラクターカード ------------------------------------ */

.chara {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .7rem;
    margin-bottom: .7rem;
}
.chara-name { font-weight: 700; margin-bottom: .4rem; }
.chara.secret { border-color: var(--secret); }
/* ★ロスト済みキャラクターはグレイアウトし、操作不可であることを一目で示す */
.chara.lost {
    filter: grayscale(1);
    opacity: .55;
    border-style: dashed;
}
/* 待機中（この卓ではまだ出していない）。KP/SKPにしか届かない。 */
.chara.standby { opacity: .7; border-style: dashed; }

/* ---- キャラクター一覧の区分グループ（ui/charapanel.js）--------
   ★キャラが増えると左ペインが埋まるので、PC/NPC/敵/その他/待機で
     区切って畳めるようにする。畳んだ状態はこの端末にのみ保存する
     （theme.js と同じ「その端末でどう使いたいか」の設定という整理）。 */
.chara-group { margin-bottom: .5rem; }
.chara-group-head {
    display: flex;
    align-items: center;
    gap: .35rem;
    margin: 0 0 .4rem;
    padding: .2rem .1rem;
    font-size: .74rem;
    font-weight: 700;
    color: var(--text-dim);
    letter-spacing: .04em;
    border-bottom: 1px solid var(--border);
    cursor: pointer;
    user-select: none;
}
.chara-group-head:hover { color: var(--text); }
.chara-group-caret { font-size: .65rem; width: .8rem; }
.chara-group-count {
    margin-left: auto;
    font-weight: 400;
    font-variant-numeric: tabular-nums;
}
.chara-group.collapsed .chara-group-body { display: none; }

/* ---- KP専用のキャラクター管理ウィンドウ ---------------------- */
.chara-panel-wrap { overflow: auto; flex: 1; min-height: 0; }
.chara-panel-table { border-collapse: collapse; width: 100%; font-size: .82rem; }
.chara-panel-table th,
.chara-panel-table td {
    border-bottom: 1px solid var(--border);
    padding: .3rem .45rem;
    text-align: left;
    white-space: nowrap;
}
.chara-panel-table th { color: var(--text-dim); font-size: .74rem; font-weight: 600; }
.chara-panel-table tbody tr:hover { background: var(--bg-input); }
.chara-panel-table tr.lost { opacity: .55; }
.chara-panel-table .badge { margin-left: .3rem; }

/* ---- 右クリックメニュー（ui/contextmenu.js）------------------- */
.ctx-menu {
    position: fixed;
    z-index: 900;          /* フローティングウィンドウ(500〜)より前に出す */
    min-width: 190px;
    max-width: 280px;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: 0 6px 20px rgba(0, 0, 0, .35);
    padding: .3rem;
}
.ctx-menu button {
    display: block; width: 100%; text-align: left;
    background: transparent; color: var(--text);
    padding: .4rem .6rem; font-size: .85rem; border: none;
}
.ctx-menu button:hover:not(:disabled) { background: var(--bg-input); }
.ctx-menu button:disabled { opacity: .4; cursor: default; }
.ctx-menu button.ctx-danger { color: var(--fumble); }
.ctx-menu hr { border: none; border-top: 1px solid var(--border); margin: .25rem 0; }
.ctx-menu-title {
    padding: .3rem .6rem; font-size: .78rem; color: var(--text-dim);
    border-bottom: 1px solid var(--border); margin-bottom: .25rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ---- シートのポップアップ（iframe）--------------------------- */
/* ★fw-body は既定で padding とスクロールを持つ。iframe を目一杯に
   広げたいので、この窓に限って両方を無効にする。 */
.fw-body.fw-body-flush { padding: 0; overflow: hidden; }
/* ★.fw-body は flex-direction:column なので、height:100% だけでは伸びない
   （親の高さがコンテンツ依存になる）。flex:1 + min-height:0 で埋めさせる。 */
.fw-sheet { flex: 1; min-height: 0; width: 100%; border: 0; display: block; }
/* iframe で開いたシート本体（sheet.php?embed=1）。外側の余白を詰める。 */
body.embedded .sheet-wrap { max-width: none; padding: .6rem 1rem 2rem; }

.stat {
    display: flex;
    align-items: center;
    gap: .4rem;
    margin-bottom: .3rem;
    font-size: .85rem;
}
.stat-label { width: 2.4rem; color: var(--text-dim); flex-shrink: 0; }
.stat-bar {
    flex: 1;
    height: .45rem;
    background: var(--bg-input);
    border-radius: 99px;
    overflow: hidden;
}
.stat-fill { height: 100%; transition: width .3s; }
.stat-fill.hp  { background: #d66d6d; }
.stat-fill.mp  { background: #6d9fd6; }
.stat-fill.san { background: #b98ad6; }
.stat-val { width: 4.2rem; text-align: right; font-variant-numeric: tabular-nums; flex-shrink: 0; }

.stat-btns { display: flex; gap: .2rem; }
.stat-btns button {
    padding: .05rem .4rem;
    font-size: .75rem;
    background: var(--bg-input);
    color: var(--text-dim);
}
.stat-btns button:hover { background: var(--accent-dim); color: var(--on-accent); }

/* ---- チャット ---------------------------------------------- */

.chat-tabs {
    display: flex;
    gap: 0;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
    overflow-x: auto;
}
.chat-tabs button {
    background: transparent;
    color: var(--text-dim);
    border-radius: 0;
    border-bottom: 2px solid transparent;
    padding: .45rem .8rem;
    font-size: .85rem;
    white-space: nowrap;
}
.chat-tabs button.active { color: var(--text); border-bottom-color: var(--accent); }
.chat-tabs button:hover { background: transparent; color: var(--text); }

.chat-log {
    flex: 1;
    overflow-y: auto;
    padding: .6rem .8rem;
    min-height: 0;
}

/* ---- 立ち絵つきの発言 ------------------------------------- */

.msg-row {
    margin-bottom: .55rem;
    font-size: .9rem;
    word-break: break-word;
}

/* 立ち絵がある発言は横並びにする */
.msg-row.has-portrait {
    display: grid;
    grid-template-columns: 2.6rem 1fr;
    gap: .5rem;
    align-items: start;
}
.msg-portrait {
    width: 2.6rem;
    height: 2.6rem;
    border-radius: var(--radius);
    object-fit: cover;
    background: var(--bg-input);
    /* 立ち絵は縦長が多い。顔が入る上側を優先して切り取る */
    object-position: top center;
}
.msg-name { font-weight: 700; margin-right: .4rem; }
.msg-name.pl  { color: var(--pl); }
.msg-name.pc  { color: var(--accent); }
.msg-name.kp  { color: var(--kp); }
.msg-body { white-space: pre-wrap; }

.msg-row.system { color: var(--text-dim); font-size: .82rem; font-style: italic; }

.msg-row.secret {
    border-left: 2px solid var(--secret);
    padding-left: .5rem;
    background: rgba(185, 138, 214, .07);
}
.secret-tag {
    color: var(--secret);
    font-size: .75rem;
    margin-right: .3rem;
}

.dice-result {
    display: block;
    margin-top: .15rem;
    padding: .3rem .5rem;
    background: var(--bg-input);
    border-radius: var(--radius);
    font-family: Consolas, "Courier New", monospace;
    font-size: .85rem;
}
.dice-result.critical { color: var(--critical); font-weight: 700; }
.dice-result.fumble   { color: var(--fumble);   font-weight: 700; }

.chat-input-area {
    border-top: 1px solid var(--border);
    padding: .6rem;
    background: var(--bg-panel);
    flex-shrink: 0;
}
.chat-controls {
    display: flex;
    gap: .4rem;
    margin-bottom: .4rem;
}
.chat-controls select { flex: 1; padding: .3rem .5rem; font-size: .82rem; }

.chat-send-row { display: flex; gap: .4rem; }
.chat-send-row textarea { flex: 1; height: 3.6rem; font-size: .9rem; }

.hint {
    margin-top: .35rem;
    color: var(--text-dim);
    font-size: .74rem;
}

/* ---- チャットパレット -------------------------------------- */

.palette { margin-top: .6rem; }
.palette-row { display: flex; align-items: stretch; gap: .2rem; margin-bottom: .2rem; }
.palette-item {
    display: block;
    flex: 1;
    text-align: left;
    background: var(--bg-input);
    color: var(--text);
    border: 1px solid transparent;
    padding: .3rem .5rem;
    font-size: .82rem;
    font-family: Consolas, monospace;
}
.palette-item:hover { background: var(--accent-dim); }

.pin-toggle {
    flex-shrink: 0;
    width: 1.8rem;
    background: var(--bg-input);
    color: var(--text-dim);
    border: 1px solid transparent;
    font-size: .82rem;
    cursor: pointer;
}
.pin-toggle:hover { color: var(--text); }
.pin-toggle.active { color: gold; }

/* ---- ★クイックパレット / 汎用ダイスパッド ------------------- */

.quick-palette, .dice-pad {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
}
.quick-palette:not(:empty) { margin-bottom: .4rem; }
.quick-item, .dice-pad-item {
    background: var(--accent-dim);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: .3rem;
    padding: .35rem .7rem;
    font-size: .82rem;
    font-family: Consolas, monospace;
    cursor: pointer;
}
.quick-item:hover, .dice-pad-item:hover { background: var(--accent); color: var(--on-accent); }

.dice-pad-row {
    display: flex;
    align-items: center;
    gap: .4rem;
    margin-bottom: .4rem;
}
.dice-pad-row .dice-pad { flex: 1; }
#btn-dice-pad-add {
    flex-shrink: 0;
    width: 1.9rem;
    height: 1.9rem;
    padding: 0;
    line-height: 1;
}

/* ---- ダイスビルダー ------------------------------------------ */

.dice-builder { margin-bottom: .5rem; font-size: .82rem; }
.dice-builder summary {
    cursor: pointer;
    color: var(--text-dim);
    padding: .2rem 0;
}
.dice-builder-row {
    display: flex;
    align-items: center;
    gap: .3rem;
    margin-top: .3rem;
    flex-wrap: wrap;
}
.dice-builder-row input[type=number] { width: 3.6rem; padding: .2rem; }
.dice-builder-row input[type=text] { flex: 1; min-width: 6rem; padding: .2rem .4rem; }
.dice-builder-row select { padding: .2rem; }

/* ---- 空状態 ------------------------------------------------ */

.empty {
    color: var(--text-dim);
    font-size: .85rem;
    text-align: center;
    padding: 1.5rem .5rem;
}

/* ============================================================
   ロール別の見た目
   KP は上部バーを暖色にして、今どの立場で見ているかを常に意識できるようにする
   ============================================================ */

body[data-view="kp"]  .room-bar { border-bottom: 2px solid var(--kp); }
body[data-view="skp"] .room-bar { border-bottom: 2px solid var(--skp); }
body[data-view="pl"]  .room-bar { border-bottom: 2px solid var(--pl); }

/* KPだけに見せる要素。PLビューに切り替えたときは隠す */
.kp-only { display: none; }
body[data-view="kp"] .kp-only,
body[data-view="skp"] .kp-only { display: block; }

.view-note {
    font-size: .78rem;
    color: var(--kp);
}

/* ============================================================
   キャラクターシート
   ============================================================ */

.sheet-wrap { max-width: 64rem; margin: 0 auto; padding: 2rem 1.2rem; }

.sheet-section { margin-bottom: 1.6rem; }
.sheet-section h2 {
    font-size: .95rem;
    margin: 0 0 .8rem;
    padding-bottom: .4rem;
    border-bottom: 1px solid var(--border);
}

/* ---- 能力値 ---- */
.ability-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(6.5rem, 1fr));
    gap: .6rem;
}
.ability {
    background: var(--bg-input);
    border-radius: var(--radius);
    padding: .5rem;
    text-align: center;
}
.ability label {
    margin: 0 0 .2rem;
    font-size: .72rem;
    font-weight: 700;
    color: var(--text);
}
.ability .sub { font-size: .68rem; color: var(--text-dim); }
.ability input {
    text-align: center;
    font-size: 1.15rem;
    font-weight: 700;
    padding: .3rem;
    font-variant-numeric: tabular-nums;
}

/* ---- 副次ステータス ---- */
.derived-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr));
    gap: .5rem;
}
.derived {
    background: var(--bg-input);
    border-radius: var(--radius);
    padding: .5rem .6rem;
    text-align: center;
}
.derived .k { font-size: .72rem; color: var(--text-dim); display: block; }
.derived .v { font-size: 1.1rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.derived.clickable { cursor: pointer; }
.derived.clickable:hover { background: var(--accent-dim); }

/* ---- ポイント残量 ---- */
.points-bar {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    padding: .7rem .9rem;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    position: sticky;
    top: 0;
    z-index: 10;
    margin-bottom: 1rem;
}
.point-item { font-size: .88rem; }
.point-item .label { color: var(--text-dim); margin-right: .4rem; }
.point-item .num { font-weight: 700; font-variant-numeric: tabular-nums; }
.point-item .num.over { color: var(--fumble); }
.point-item .num.ok { color: var(--critical); }

/* ---- 技能表 ---- */
.skill-cat { margin-bottom: 1.2rem; }
.skill-cat h3 {
    font-size: .82rem;
    color: var(--text-dim);
    margin: 0 0 .4rem;
}
.skill-table { width: 100%; border-collapse: collapse; }
.skill-table th {
    font-size: .7rem;
    color: var(--text-dim);
    font-weight: 600;
    padding: .2rem .3rem;
    text-align: center;
}
.skill-table th:first-child { text-align: left; }
.skill-table td {
    padding: .15rem .3rem;
    border-bottom: 1px solid var(--hairline);
}
.skill-table td.name { font-size: .85rem; }
.skill-table input {
    width: 100%;
    text-align: center;
    padding: .2rem;
    font-size: .82rem;
    font-variant-numeric: tabular-nums;
}
.skill-table td.total {
    text-align: center;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    width: 3.4rem;
}
.skill-table td.base {
    text-align: center;
    color: var(--text-dim);
    font-size: .8rem;
    width: 2.8rem;
}
.skill-roll {
    background: transparent;
    border: 1px solid var(--border);
    color: var(--text-dim);
    padding: .1rem .45rem;
    font-size: .75rem;
}
.skill-roll:hover { background: var(--accent-dim); color: var(--on-accent); }

/* 要検証の技能に印を付ける */
.verify-mark {
    color: var(--skp);
    cursor: help;
    font-size: .75rem;
    margin-left: .2rem;
}
tr.allocated td.total { color: var(--pl); }

.sheet-actions {
    position: sticky;
    bottom: 0;
    background: var(--bg);
    border-top: 1px solid var(--border);
    padding: .8rem 0;
    display: flex;
    gap: .6rem;
    justify-content: flex-end;
}

/* ---- 立ち絵の管理（シート画面）----------------------------- */

.portrait-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(7.5rem, 1fr));
    gap: .8rem;
}
.portrait-card {
    background: var(--bg-input);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    overflow: hidden;
    text-align: center;
}
.portrait-card img {
    width: 100%;
    height: 9rem;
    object-fit: contain;
    background: var(--bg-deep);
    display: block;
}
.portrait-card .pl-label {
    padding: .3rem;
    border: none;
    background: transparent;
    text-align: center;
    font-size: .82rem;
    border-radius: 0;
}
.portrait-card .pl-actions {
    display: flex;
    border-top: 1px solid var(--border);
}
.portrait-card .pl-actions button {
    flex: 1;
    border-radius: 0;
    padding: .3rem;
    font-size: .75rem;
    background: transparent;
    color: var(--text-dim);
}
.portrait-card .pl-actions button:hover { background: var(--bg-panel); color: var(--text); }

/* ドロップ領域。立ち絵・マップ・ハンドアウト・シナリオ素材・アイコンで共用。
   .portrait-drop は元からある名前なので別名として残してある。 */
.file-drop, .portrait-drop {
    border: 2px dashed var(--border);
    border-radius: var(--radius);
    padding: 1.4rem 1rem;
    text-align: center;
    color: var(--text-dim);
    font-size: .85rem;
    cursor: pointer;
    transition: border-color .2s, background .2s;
}
.file-drop:hover, .file-drop.over, .file-drop:focus-visible,
.portrait-drop:hover, .portrait-drop.over, .portrait-drop:focus-visible {
    border-color: var(--accent);
    background: rgba(109,143,214,.08);
    outline: none;
}
/* 一覧の中などに置く小さめのドロップ領域 */
.file-drop.compact { padding: .7rem .8rem; font-size: .78rem; }

/* ---- 発言時の表情切替（セッション画面）--------------------- */

.face-row {
    display: flex;
    gap: .25rem;
    overflow-x: auto;
    margin-bottom: .4rem;
    padding-bottom: .2rem;
}
.face-row[hidden] { display: none; }
.face-btn {
    flex-shrink: 0;
    padding: 0;
    background: transparent;
    border: 2px solid transparent;
    border-radius: var(--radius);
    overflow: hidden;
    line-height: 0;
    cursor: pointer;
}
.face-btn img {
    width: 2.2rem;
    height: 2.2rem;
    object-fit: cover;
    object-position: top center;
    display: block;
}
.face-btn.active { border-color: var(--accent); }
.face-btn:hover { border-color: var(--accent-dim); background: transparent; }

.notice-box {
    background: rgba(214, 196, 109, .1);
    border: 1px solid rgba(214, 196, 109, .35);
    border-radius: var(--radius);
    padding: .8rem 1rem;
    margin-bottom: 1.2rem;
    font-size: .84rem;
}
.notice-box strong { color: var(--skp); }

/* ---- シートの公開範囲設定 ---------------------------------- */
.visibility-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: .5rem .8rem;
    font-size: .88rem;
}

/* ============================================================
   盤面（マップ・コマ）
   ============================================================ */

.board-tabs {
    display: flex;
    gap: 0;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
    overflow-x: auto;
    align-items: center;
}
.board-tabs button.map-tab {
    background: transparent;
    color: var(--text-dim);
    border-radius: 0;
    border-bottom: 2px solid transparent;
    padding: .4rem .75rem;
    font-size: .82rem;
    white-space: nowrap;
}
.board-tabs button.map-tab.active { color: var(--text); border-bottom-color: var(--accent); }
.board-tabs button.map-tab:hover { background: transparent; color: var(--text); }
.board-tabs .board-tools {
    margin-left: auto;
    display: flex;
    gap: .3rem;
    padding: 0 .5rem;
    flex-shrink: 0;
}
.board-tabs .board-tools button { padding: .25rem .6rem; font-size: .75rem; }

.board-viewport {
    flex: 1;
    overflow: auto;
    background: var(--bg-deep);
    position: relative;
    min-height: 0;
}
.board-viewport.empty-board {
    display: flex;
    align-items: center;
    justify-content: center;
}

.board-canvas {
    position: relative;
    /* 画像サイズぶんの領域を確保する（JSで幅高さを設定） */
}
.board-canvas img.map-image {
    display: block;
    max-width: none;
    pointer-events: none;
    user-select: none;
}

.board-grid-overlay {
    position: absolute;
    inset: 0;
    pointer-events: none;
    background-image:
        linear-gradient(to right, var(--grid-line) 1px, transparent 1px),
        linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);
}

.token {
    position: absolute;
    display: flex;
    flex-direction: column;
    align-items: center;
    cursor: grab;
    /* 補間アニメーション。1秒ポーリングでもワープして見えないようにする */
    transition: left .15s linear, top .15s linear;
    touch-action: none;
}
.token.dragging {
    cursor: grabbing;
    transition: none;   /* 自分でドラッグしている間は補間しない（追従を優先） */
    z-index: 999 !important;
}
.token-img {
    border-radius: 50%;
    border: 2px solid rgba(255,255,255,.6);
    object-fit: cover;
    background: #333;
    box-shadow: 0 2px 6px rgba(0,0,0,.5);
}
.token-label {
    margin-top: .15rem;
    font-size: .68rem;
    color: var(--on-accent);
    text-shadow: 0 1px 3px #000, 0 0 3px #000;
    white-space: nowrap;
    pointer-events: none;
}
.token.no-drag { cursor: default; }
.token.hidden-token .token-img { opacity: .5; border-style: dashed; }
.token.hidden-token::after {
    content: '目隠し中';
    position: absolute;
    top: -1rem;
    font-size: .6rem;
    color: var(--kp);
    white-space: nowrap;
}

.map-empty-hint {
    color: var(--text-dim);
    text-align: center;
    padding: 2rem;
}

/* マップ・コマ管理ダイアログ（KP/SKP用） */
.board-manage {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.6);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 100;
    padding: 1rem;
}
.board-manage[hidden] { display: none; }
.board-manage-panel {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1.4rem;
    width: 100%;
    max-width: 32rem;
    max-height: 85vh;
    overflow-y: auto;
}
.board-manage-panel h3 { margin: 0 0 1rem; font-size: 1rem; }
.map-list-row {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .4rem 0;
    border-bottom: 1px solid var(--border);
    font-size: .88rem;
}
.map-list-row .nm { flex: 1; }
.token-list-row {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .3rem 0;
    border-bottom: 1px solid var(--border);
    font-size: .85rem;
}
.token-list-row .nm { flex: 1; }
.token-list-row button { padding: .15rem .5rem; font-size: .72rem; }

/* ============================================================
   ハンドアウト
   ============================================================ */

.ho-list { display: flex; flex-direction: column; gap: .6rem; }

.ho-card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .7rem .8rem;
}
.ho-card.draft { border-style: dashed; opacity: .85; }
.ho-card.secret { border-color: var(--secret); }
.ho-card.unread { border-left: 3px solid var(--accent); }

.ho-head {
    display: flex;
    align-items: center;
    gap: .4rem;
    margin-bottom: .35rem;
}
.ho-title { font-weight: 700; font-size: .92rem; flex: 1; }
.ho-badges { display: flex; gap: .3rem; flex-shrink: 0; }

.ho-img {
    max-width: 100%;
    border-radius: var(--radius);
    margin: .4rem 0;
    display: block;
}
.ho-body {
    font-size: .86rem;
    white-space: pre-wrap;
    word-break: break-word;
    line-height: 1.6;
}
.ho-meta {
    font-size: .72rem;
    color: var(--text-dim);
    margin-top: .4rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: .3rem;
}
.ho-actions { display: flex; gap: .3rem; }
.ho-actions button { padding: .15rem .55rem; font-size: .74rem; }

.ho-editor {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.6);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 100;
    padding: 1rem;
}
.ho-editor[hidden] { display: none; }
.ho-editor-panel {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1.4rem;
    width: 100%;
    max-width: 32rem;
    max-height: 88vh;
    overflow-y: auto;
}
.ho-editor-panel h3 { margin: 0 0 1rem; font-size: 1rem; }
.ho-editor-panel textarea { min-height: 8rem; }

.ho-target-list {
    max-height: 8rem;
    overflow-y: auto;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .4rem .6rem;
}
.ho-target-list label {
    display: flex;
    align-items: center;
    gap: .4rem;
    margin: 0;
    padding: .2rem 0;
    color: var(--text);
    font-size: .85rem;
}
.ho-target-list input[type=checkbox] { width: auto; }

.read-status-list { font-size: .82rem; }
.read-status-list .row {
    display: flex;
    justify-content: space-between;
    padding: .25rem 0;
    border-bottom: 1px solid var(--border);
}
.read-status-list .read  { color: var(--pl); }
.read-status-list .unread { color: var(--text-dim); }

/* ============================================================
   狭い画面
   ============================================================ */

@media (max-width: 1100px) {
    .room-body { grid-template-columns: 1fr 6px var(--pane-right); }
    .pane.left { display: none; }
}
@media (max-width: 760px) {
    .room-body { grid-template-columns: 1fr; }
    .pane.center, .resizer { display: none; }
    .room-foot { display: none; }
}

/* ============================================================
   フローティングウィンドウ（ダイス・表情差分・装備・戦闘など）
   ============================================================ */

.float-win {
    position: fixed;
    display: flex;
    flex-direction: column;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 8px 30px rgba(0,0,0,.45);
    overflow: hidden;
    min-width: 280px;
    min-height: 200px;
}
.float-win.fw-minimized { height: auto !important; }
.float-win.fw-minimized .fw-body,
.float-win.fw-minimized .fw-footer,
.float-win.fw-minimized .fw-resize { display: none; }

.fw-titlebar {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .45rem .6rem;
    background: var(--bg-input);
    border-bottom: 1px solid var(--border);
    cursor: move;
    flex-shrink: 0;
    user-select: none;
}
.fw-title { font-size: .86rem; font-weight: 600; }
.fw-spacer { flex: 1; }
.fw-titlebar button {
    width: 1.6rem;
    height: 1.6rem;
    padding: 0;
    line-height: 1;
    background: transparent;
    color: var(--text-dim);
    border: none;
    font-size: .9rem;
}
.fw-titlebar button:hover { background: var(--border); color: var(--text); }

.fw-body {
    flex: 1;
    overflow-y: auto;
    padding: .8rem;
    min-height: 0;
    display: flex;
    flex-direction: column;
}
/* ★パネルを丸ごと切り離した場合、そのパネル自身がスクロール等の
   レイアウトを持っているので、fw-body側の余白・スクロールは無効にして
   パネルにそのまま委ねる。 */
.fw-body:has(.fw-adopted) { padding: 0; overflow: hidden; }
.fw-body .fw-adopted { flex: 1; min-height: 0; }
.fw-footer {
    display: flex;
    justify-content: flex-end;
    gap: .5rem;
    padding: .55rem .7rem;
    border-top: 1px solid var(--border);
    flex-shrink: 0;
}
.fw-footer button { padding: .4rem .9rem; font-size: .83rem; width: auto; }

.fw-resize {
    position: absolute;
    right: 0; bottom: 0;
    width: 16px; height: 16px;
    cursor: nwse-resize;
    background: linear-gradient(135deg, transparent 50%, var(--border) 50%);
}

/* ---- 簡易モーダル -------------------------------------------- */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.55);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 900;
    padding: 1rem;
}
.modal-overlay[hidden] { display: none; }
.modal-panel {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: 10px;
    width: 100%;
    max-width: 32rem;
    max-height: 88vh;
    display: flex;
    flex-direction: column;
}
.modal-head {
    display: flex;
    align-items: center;
    padding: .8rem 1rem;
    border-bottom: 1px solid var(--border);
}
.modal-head h3 { margin: 0; font-size: 1rem; flex: 1; }
.modal-head .modal-x { width: 1.8rem; height: 1.8rem; padding: 0; }
#modal-body { padding: 1rem; overflow-y: auto; }
.modal-foot {
    display: flex;
    justify-content: flex-end;
    gap: .5rem;
    padding: .7rem 1rem;
    border-top: 1px solid var(--border);
}
.modal-foot button { width: auto; }

/* ============================================================
   立ち絵レイヤー（盤面ペインの上に重ねる。コマ操作は妨げない）
   ============================================================ */

.portrait-stage {
    position: absolute;
    inset: 0;
    pointer-events: none;
    overflow: hidden;
    z-index: 5;
}
.portrait-stage[hidden] { display: none; }
.portrait-item {
    position: absolute;
    pointer-events: auto;
    cursor: grab;
    max-width: 40%;
    transition: opacity .4s ease;
    user-select: none;
}
.portrait-item.dimmed { opacity: .35; }
.portrait-item img {
    display: block;
    width: 100%;
    height: auto;
    filter: drop-shadow(0 6px 14px rgba(0,0,0,.5));
}
.portrait-item .portrait-handle {
    position: absolute;
    right: -6px; bottom: -6px;
    width: 14px; height: 14px;
    background: var(--accent-dim);
    border-radius: 50%;
    cursor: nwse-resize;
    border: 2px solid var(--bg);
}
.portrait-item .portrait-name {
    position: absolute;
    left: 0; bottom: -1.3rem;
    font-size: .7rem;
    background: rgba(0,0,0,.55);
    padding: .05rem .4rem;
    border-radius: 3px;
    white-space: nowrap;
}
.board-pane { position: relative; }

.board-scale-row {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: 0 .5rem;
}
.board-scale-row input[type=range] { width: 6rem; }

/* ============================================================
   チャット2段（通常 / プライベート）
   ============================================================ */

.pane.right { min-height: 0; }
.chat-split {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
}
.chat-split-section {
    display: flex;
    flex-direction: column;
    min-height: 0;
}
.chat-split-section.collapsed .chat-log,
.chat-split-section.collapsed .chat-input-area,
.chat-split-section.collapsed .private-target-list { display: none; }
/* 折りたたんだ側は見出しだけの高さにし、開いている側へ空間を譲る */
.chat-split-section.collapsed { flex: 0 0 auto !important; }
/* ★通常/プライベートの境界比率。resizer-chat-split がドラッグでこの変数を書き換える
   （layout.js の initChatSplitResizer）。既定は 60:40。 */
.chat-split-section.normal { flex: 1 1 var(--chat-split, 60%); }
.chat-split-section.private { flex: 1 1 calc(100% - var(--chat-split, 60%)); border-top: 2px solid var(--border); }
#resizer-chat-split { flex-shrink: 0; }
.chat-section-head {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .3rem .6rem;
    background: var(--bg-panel);
    border-bottom: 1px solid var(--border);
    flex-shrink: 0;
}
.chat-section-head h4 { margin: 0; font-size: .78rem; color: var(--text-dim); }
.chat-section-head .toggle-collapse { margin-left: auto; width: auto; padding: .1rem .5rem; font-size: .7rem; }
.private-target-bar {
    display: flex;
    align-items: center;
    gap: .3rem;
    padding: .3rem .6rem 0;
    flex-wrap: wrap;
}
.private-target-bar .hint { font-size: .72rem; }
.private-target-list {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    padding: .3rem .6rem;
    border-bottom: 1px solid var(--border);
}
/* ★宛先はチェックボックスの羅列ではなく、クリックで on/off するチップにする
   （要望: 「宛先変更は選んで、簡単に変更できるように」）。 */
.pv-chip {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    padding: .18rem .6rem;
    border-radius: 10px;
    font-size: .76rem;
    background: var(--bg-input);
    color: var(--text-dim);
    border: 1px solid transparent;
    cursor: pointer;
}
.pv-chip:hover { color: var(--text); }
.pv-chip.active {
    background: var(--accent-dim);
    color: var(--on-accent);
}
.pv-chip.role-kp.active, .pv-chip.role-skp.active { background: var(--kp); }
.pv-chip .chip-check { font-size: .7rem; }

/* ============================================================
   マップビューア（参照用画像の一覧・拡大表示）
   ============================================================ */
.mapview-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
    gap: .7rem;
}
.mapview-item {
    display: flex;
    flex-direction: column;
    gap: .3rem;
    text-align: center;
}
.mapview-item img {
    width: 100%;
    height: 6rem;
    object-fit: cover;
    border-radius: var(--radius);
    background: var(--bg-deep);
    cursor: zoom-in;
    border: 1px solid var(--border);
}
.mapview-item .mapview-name { font-size: .76rem; color: var(--text-dim); }

/* ============================================================
   シナリオ準備
   ============================================================ */

/* ---- 一覧 -------------------------------------------------- */
.scenario-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    gap: 1rem;
    margin-top: 1rem;
}
.scenario-card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: 1rem;
    display: flex;
    flex-direction: column;
    gap: .5rem;
}
.scenario-card-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: .5rem;
}
.scenario-card-head h3 { margin: 0; font-size: 1.05rem; }
.scenario-card-head h3 a { color: var(--text); text-decoration: none; }
.scenario-card-head h3 a:hover { color: var(--accent); }
.scenario-summary {
    margin: 0;
    color: var(--text-dim);
    font-size: .88rem;
    line-height: 1.5;
}
.scenario-meta {
    display: flex;
    flex-wrap: wrap;
    gap: .35rem .75rem;
    font-size: .8rem;
    color: var(--text-dim);
}
.scenario-card-foot {
    display: flex;
    gap: .5rem;
    margin-top: auto;
    padding-top: .5rem;
    align-items: center;
}
.scenario-card-foot button { width: auto; padding: .35rem .7rem; font-size: .85rem; }
.scenario-card-foot .nav-btn { text-decoration: none; }
.scenario-archive { margin-top: 2rem; }
.scenario-archive > summary { cursor: pointer; color: var(--text-dim); }

/* ---- 編集画面のレイアウト ---------------------------------- */
.sc-edit {
    display: grid;
    grid-template-columns: 1fr var(--sc-inspector, 360px);
    gap: 0;
    height: calc(100vh - 48px);
    overflow: hidden;
}
.sc-canvas-wrap {
    position: relative;
    background: var(--bg-deep);
    overflow: hidden;
}
.sc-toolbar {
    position: absolute;
    top: .6rem;
    left: .6rem;
    z-index: 5;
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
    align-items: center;
}
.sc-toolbar button { width: auto; padding: .3rem .6rem; font-size: .82rem; }
.sc-hint {
    position: absolute;
    bottom: .6rem;
    left: .6rem;
    z-index: 5;
    font-size: .78rem;
    color: var(--text-dim);
    background: color-mix(in srgb, var(--bg-panel) 85%, transparent);
    padding: .35rem .6rem;
    border-radius: var(--radius);
    pointer-events: none;
}
.sc-inspector {
    background: var(--bg-panel);
    border-left: 1px solid var(--border);
    overflow-y: auto;
    padding: .8rem;
}
.sc-inspector h3 { margin: 0 0 .6rem; font-size: .95rem; }
.sc-tabs { display: flex; flex-wrap: wrap; gap: .3rem; margin-bottom: .7rem; }
.sc-tabs button {
    width: auto; padding: .28rem .6rem; font-size: .8rem;
    background: var(--bg-input); color: var(--text-dim); border: 1px solid transparent;
}
.sc-tabs button.active { background: var(--accent); color: var(--on-accent); }
.sc-pane[hidden] { display: none; }
.sc-list { display: flex; flex-direction: column; gap: .45rem; }
.sc-item {
    background: var(--bg-input);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .5rem .6rem;
    font-size: .85rem;
}
.sc-item-head { display: flex; justify-content: space-between; gap: .5rem; align-items: center; }
.sc-item-head strong { font-weight: 600; }
.sc-item .sub, .sc-item .danger { width: auto; padding: .18rem .45rem; font-size: .75rem; }
.sc-item-meta { color: var(--text-dim); font-size: .78rem; margin-top: .2rem; }
.sc-asset-thumb {
    width: 100%; max-height: 90px; object-fit: cover;
    border-radius: 4px; margin-top: .35rem; background: var(--bg-deep);
}
.sc-cap {
    height: 6px; border-radius: 3px; background: var(--bg-input);
    overflow: hidden; margin: .3rem 0;
}
.sc-cap > span { display: block; height: 100%; background: var(--accent); }

/* ---- 図 ---------------------------------------------------- */
.fc-svg {
    width: 100%;
    height: 100%;
    display: block;
    cursor: grab;
    touch-action: none;             /* ドラッグ中にスクロールへ持っていかれないように */
    user-select: none;
}
.fc-svg:active { cursor: grabbing; }

.fc-node { cursor: pointer; }
.fc-node-box {
    fill: var(--bg-panel);
    stroke: var(--border);
    stroke-width: 1.5;
}
.fc-node.is-selected .fc-node-box { stroke: var(--accent); stroke-width: 2.5; }
/* 進行中の現在地。選択より強く目立たせる */
.fc-node.is-current .fc-node-box {
    stroke: var(--kp);
    stroke-width: 3;
    filter: drop-shadow(0 0 6px var(--kp));
}
.fc-node-stripe { pointer-events: none; }
.fc-node-title {
    fill: var(--text); font-size: 14px; font-weight: 600;
    pointer-events: none; font-family: inherit;
}
.fc-node-kind, .fc-node-marks, .fc-node-manual {
    fill: var(--text-dim); font-size: 11px; pointer-events: none; font-family: inherit;
}
.fc-handle {
    fill: var(--bg-input);
    stroke: var(--accent);
    stroke-width: 1.5;
    cursor: crosshair;
    opacity: .5;
}
.fc-node:hover .fc-handle, .fc-node.is-selected .fc-handle { opacity: 1; }

.fc-link { fill: none; stroke: var(--border); stroke-width: 2; }
.fc-link-back { stroke: var(--text-dim); stroke-dasharray: 5 4; }
.fc-link-pending { stroke: var(--accent); stroke-dasharray: 4 4; }
.fc-link-label { fill: var(--text-dim); font-size: 11px; font-family: inherit; pointer-events: none; }
.fc-arrow { fill: var(--border); }
.fc-arrow-back { fill: var(--text-dim); }

/* ---- 右クリックメニュー ------------------------------------ */
.fc-menu {
    position: fixed;
    z-index: 200;
    min-width: 200px;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: 0 6px 20px rgba(0, 0, 0, .35);
    padding: .3rem;
}
.fc-menu button {
    display: block; width: 100%; text-align: left;
    background: transparent; color: var(--text);
    padding: .4rem .6rem; font-size: .85rem; border: none;
}
.fc-menu button:hover { background: var(--bg-input); }
.fc-menu hr { border: none; border-top: 1px solid var(--border); margin: .25rem 0; }
.fc-menu .fc-menu-title {
    padding: .3rem .6rem; font-size: .78rem; color: var(--text-dim);
    border-bottom: 1px solid var(--border); margin-bottom: .25rem;
}

/* ---- セッション中の進行パネル ------------------------------ */
.sc-run {
    display: grid;
    grid-template-columns: 1fr 300px;
    height: 100%;
}
.sc-run-canvas { background: var(--bg-deep); overflow: hidden; }
.sc-run-side {
    border-left: 1px solid var(--border);
    padding: .6rem;
    overflow-y: auto;
}
.sc-run-side button { width: auto; padding: .25rem .55rem; font-size: .78rem; }
.sc-note {
    white-space: pre-wrap;
    word-break: break-word;
    font-size: .85rem;
    line-height: 1.7;
    margin: 0;
    padding: .6rem;
    background: var(--bg-input);
    border-radius: var(--radius);
    color: var(--text);
    font-family: inherit;
}

/* ---- BGM --------------------------------------------------- */
.audio-bar {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-size: .78rem;
    color: var(--text-dim);
}
.audio-bar button { width: auto; padding: .22rem .5rem; font-size: .78rem; }
.audio-bar .audio-volume { width: 80px; }

/* ---- 簡易作成ポップアップ（ui/quickchara.js）------------------- */
.qc-abilities {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: .35rem .6rem;
}
.qc-ability {
    display: flex;
    align-items: center;
    gap: .35rem;
}
.qc-ability label {
    flex: 0 0 2.6rem;
    margin: 0;
    font-size: .78rem;
    font-weight: 700;
    color: var(--text-dim);
}
.qc-ability input {
    flex: 1 1 auto;
    min-width: 0;
    padding: .25rem .35rem;
    font-size: .85rem;
}
.qc-ability button {
    flex: 0 0 auto;
    width: auto;
    padding: .2rem .45rem;
    font-size: .72rem;
}

/* ---- ダイスパネルの主要技能ボタン（ui/dice.js）------------------ */
.quick-skill-row {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem;
    margin-bottom: .35rem;
}
.quick-skill {
    width: auto;
    padding: .2rem .45rem;
    font-size: .74rem;
    background: var(--bg-input);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: .3rem;
}
.quick-skill:hover { border-color: var(--accent); }
.quick-skill b {
    font-size: .72rem;
    color: var(--accent);
    font-variant-numeric: tabular-nums;
}
.quick-skill.ability b { color: var(--pl); }

#dw-quick-editor { margin-top: .5rem; }
.quick-edit-grid {
    max-height: 15rem;
    overflow-y: auto;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: .4rem .6rem;
}
.quick-edit-cat h5 {
    margin: .5rem 0 .2rem;
    font-size: .74rem;
    color: var(--text-dim);
}
.quick-edit-cat label {
    display: flex;
    align-items: center;
    gap: .35rem;
    margin: 0;
    font-size: .78rem;
    font-weight: 400;
}
.quick-edit-cat input[type="checkbox"] { width: auto; }

/* ---- どこでも予測変換（ui/autocomplete.js）--------------------- */
.ac-list {
    position: absolute;
    z-index: 9000;
    max-height: 16rem;
    overflow-y: auto;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: 0 6px 20px rgba(0,0,0,.35);
    font-size: .82rem;
}
.ac-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .8rem;
    padding: .28rem .6rem;
    cursor: pointer;
    white-space: nowrap;
}
.ac-item:hover, .ac-item.active {
    background: var(--accent);
    color: var(--on-accent);
}
.ac-item.active .ac-hint, .ac-item:hover .ac-hint { color: var(--on-accent); opacity: .85; }
.ac-hint {
    color: var(--text-dim);
    font-size: .74rem;
    font-variant-numeric: tabular-nums;
}
.dict-row {
    display: flex;
    gap: .35rem;
    margin-bottom: .3rem;
}
.dict-row .dict-label  { flex: 0 0 8rem; }
.dict-row .dict-insert { flex: 1 1 auto; min-width: 0; }

/* 双方向の分岐（Shift+ドラッグで作った矢印なしの線）。
   「どちらからでも行き来できる」ことを、矢じりを消したうえで
   破線にして一方向の線と区別する。 */
.fc-link.fc-link-bi {
    stroke-dasharray: 7 4;
    opacity: .85;
}

/* ---- 対抗ロールの呼びかけ（room.php）--------------------------
   自分のキャラが対抗を仕掛けられている間だけ出る帯。
   行動順の帯と同じく画面上部に置き、どのペインを見ていても
   「振る番が来ている」ことが視界に入るようにする。 */
.opposed-bar {
    display: flex;
    flex-direction: column;
    gap: .3rem;
    padding: .45rem .8rem;
    background: linear-gradient(var(--bar-a), var(--bar-b));
    border-bottom: 1px solid var(--secret);
}
.opposed-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .8rem;
    font-size: .84rem;
}
.opposed-item button {
    width: auto;
    padding: .2rem .8rem;
    font-size: .8rem;
    background: var(--secret);
    color: var(--on-accent);
}
.opposed-item button:disabled { opacity: .5; }

/* 未解放のマップ（KP/SKPにだけ見える）。用意してあることは分かるが、
   まだPLには出していないことが一目で分かるように薄く出す。 */
.mapview-item.unrevealed { opacity: .55; }
.mapview-item.unrevealed img { filter: grayscale(.6); }

/* ---- 選択肢ノードの条件（進行パネル）-------------------------- */
.cond-icon {
    display: inline-block;
    width: 1.3rem;
    text-align: center;
    font-weight: 700;
}
.cond-met    { color: var(--critical); }
.cond-unmet  { color: var(--fumble); }
.cond-manual { color: var(--text-dim); }
.cond-roll   { color: var(--accent); }

/* 選択肢ノードは場面より一回り小さく描く（flowchart.js） */
.fc-node.is-choice .fc-node-title { font-size: .78rem; }
.fc-node.is-choice .fc-node-kind  { font-size: .66rem; }

/* ============================================================
   ルールブック／魔法図鑑／神話生物図鑑（lib/Rulebook.php が変換した
   Markdown本文の見た目）。room.php のポップアップ（ui/rulebook.js）と
   trpg/rulebook.php（別タブの単独ページ）の両方から使う共通クラス。
   ============================================================ */
.rb-content { line-height: 1.7; }
.rb-content h1 { font-size: 1.3rem; margin: 0 0 1rem; }
.rb-content h2 { font-size: 1.08rem; margin: 1.5rem 0 .6rem; border-bottom: 1px solid var(--border); padding-bottom: .3rem; }
.rb-content h2:first-child { margin-top: 0; }
.rb-content h3 { font-size: .98rem; margin: 1.1rem 0 .4rem; }
.rb-content h4 { font-size: .9rem; margin: .9rem 0 .3rem; color: var(--text-dim); }
.rb-content p, .rb-content ul, .rb-content ol { margin: .5rem 0; }
.rb-content ul, .rb-content ol { padding-left: 1.4rem; }
.rb-content li { margin: .25rem 0; }
.rb-content code { background: var(--bg-deep); padding: .05rem .35rem; border-radius: 4px; font-size: .9em; }
.rb-content pre { background: var(--bg-deep); padding: .7rem .9rem; border-radius: var(--radius); overflow-x: auto; }
.rb-content pre code { background: none; padding: 0; }
.rb-content blockquote {
    margin: .8rem 0; padding: .5rem .9rem; border-left: 3px solid var(--accent-dim);
    color: var(--text-dim); background: var(--bg-input); border-radius: 0 var(--radius) var(--radius) 0;
}
.rb-content blockquote p { margin: .2rem 0; }
.rb-content hr { border: none; border-top: 1px solid var(--border); margin: 1.4rem 0; }
.rb-table-wrap { overflow-x: auto; margin: .8rem 0; }
.rb-content table { border-collapse: collapse; width: 100%; font-size: .86rem; }
.rb-content th, .rb-content td { border: 1px solid var(--border); padding: .4rem .55rem; text-align: left; vertical-align: top; }
.rb-content th { background: var(--bg-input); white-space: nowrap; }

/* ---- ポップアップパネル（ui/rulebook.js）の3カラムレイアウト ---- */
.rb-panel { display: flex; flex: 1 1 auto; min-height: 0; margin: -.8rem; }
.rb-panel-nav {
    width: 12.5rem; flex: 0 0 auto; overflow-y: auto;
    border-right: 1px solid var(--border); padding: .7rem .5rem; background: var(--bg-input);
}
.rb-nav-group h4 {
    font-size: .74rem; color: var(--text-dim); margin: .9rem 0 .25rem;
    text-transform: uppercase; letter-spacing: .04em;
}
.rb-nav-group:first-child h4 { margin-top: 0; }
.rb-panel-nav ul { list-style: none; margin: 0; padding: 0; }
.rb-panel-nav li a {
    display: block; padding: .3rem .45rem; border-radius: 6px;
    color: var(--text); text-decoration: none; font-size: .84rem;
}
.rb-panel-nav li a:hover { background: var(--bg-panel); }
.rb-panel-nav li a.active { background: var(--accent-dim); color: var(--on-accent); font-weight: 600; }
.rb-panel-main { flex: 1 1 auto; min-width: 0; overflow-y: auto; padding: 1rem 1.4rem; }
.rb-panel-toc {
    width: 12rem; flex: 0 0 auto; overflow-y: auto;
    border-left: 1px solid var(--border); padding: .7rem .6rem; background: var(--bg-input);
}
.rb-panel-toc h4 {
    font-size: .74rem; color: var(--text-dim); margin: 0 0 .4rem;
    text-transform: uppercase; letter-spacing: .04em;
}
.rb-panel-toc ul { list-style: none; margin: 0; padding: 0; }
.rb-panel-toc li a {
    display: block; padding: .22rem 0; color: var(--text-dim); text-decoration: none;
    font-size: .78rem; line-height: 1.4;
}
.rb-panel-toc li a:hover { color: var(--text); }
.rb-panel-toc li.rb-toc-h3 a { padding-left: .8rem; font-size: .74rem; }
