Files
Poker/public/assets/style.css
T
agomizi1cmandClaude Opus 5.5 3f2515a9fa Add admin-only CPU tables with per-hand reviews
A new table type, "review" (レビュー付きCPU戦), can only be created by
admins. Only the creator and CPUs sit there: friends cannot join, and the
table is hidden from non-admin lobbies. After every hand a review opens,
and the next hand waits until the creator presses "次のハンドへ".

- Preflop: shows which color of the registered hand range the hole cards
  are and whether the action followed it. With no entrant before you,
  open with the color for the number of players still to act; facing an
  entrant, estimate their range from their position, call one color
  above it and raise two above. Purple ranks just below white (SB only).
- Flop onward: equity vs ranges estimated from those colors (narrowed by
  later bets/calls) gives a rough EV per option. The score is the EV lost
  against the best option, relative to the pot. It is a guide, not GTO.
- Also: pot-odds call check, all-in equity and luck-adjusted P&L,
  VPIP/PFR/3bet/Cbet/WTSD/W$SD/AF, per-color and per-position compliance,
  habits to watch, worst-5 hands, a P&L chart and a step-by-step replay
  on the admin-only /review page.

Hand now logs every action for the review. The range data moves to
admin/range-data.js, shared by the range page and the server. Reviews are
saved under data/reviews/ (newest 50 sessions). Admin scripts and CSS are
no longer cached for a day, so updates show up immediately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:11:16 +09:00

828 lines
25 KiB
CSS

:root {
--bg: #24493b;
--bg-deep: #1b3a2e;
--panel: #1a2620;
--panel-2: #26332c;
--input: #303a35;
--line: #3a4a42;
--text: #f2f5f3;
--muted: #9fb2a8;
--felt: #2ecc71;
--felt-dark: #23a85b;
--gold: #f6c744;
--orange: #f0a43a;
--blue: #4a90e2;
--green: #2ecc71;
--red: #ff5a5a;
--radius: 14px;
color-scheme: dark;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
min-height: 100%;
background: var(--bg);
color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", "Noto Sans JP", "Segoe UI", sans-serif;
-webkit-font-smoothing: antialiased;
-webkit-tap-highlight-color: transparent;
}
body { min-height: 100dvh; }
.wrap {
max-width: 480px;
margin: 0 auto;
padding: 24px 16px 40px;
}
h1, h2, h3 { margin: 0; }
.logo {
text-align: center;
font-weight: 900;
line-height: 0.95;
letter-spacing: -0.02em;
font-size: 48px;
margin: 28px 0 32px;
}
.logo small {
display: block;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.3em;
color: var(--gold);
margin-top: 10px;
}
.section-title {
font-size: 18px;
font-weight: 800;
margin: 28px 0 12px;
display: flex;
align-items: center;
justify-content: space-between;
}
.section-title .sub { font-size: 12px; font-weight: 600; color: var(--muted); }
label, .label {
display: block;
font-size: 14px;
color: var(--muted);
margin: 18px 0 8px;
}
input[type="text"], input[type="number"], input[type="tel"] {
width: 100%;
font: inherit;
font-size: 18px;
color: var(--text);
background: var(--input);
border: 2px solid transparent;
border-radius: 10px;
padding: 14px 16px;
outline: none;
transition: border-color 0.15s;
}
input:focus { border-color: var(--felt); }
input:disabled { opacity: 0.4; }
input.invalid { border-color: var(--red); }
.row { display: flex; gap: 10px; align-items: center; }
.row > * { flex: 1; min-width: 0; }
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font: inherit;
font-size: 17px;
font-weight: 800;
border: 0;
border-radius: 10px;
padding: 14px 18px;
color: #fff;
cursor: pointer;
text-decoration: none;
transition: transform 0.06s, filter 0.15s, opacity 0.15s;
white-space: nowrap;
}
.btn:active:not(:disabled) { transform: scale(0.97); }
.btn:disabled { opacity: 0.4; cursor: default; }
.btn-orange { background: var(--orange); }
.btn-blue { background: var(--blue); }
.btn-green { background: var(--green); }
.btn-dark { background: var(--panel-2); color: var(--text); }
.btn-ghost { background: transparent; color: var(--muted); border: 2px solid var(--line); }
.btn-block { width: 100%; }
.btn-sm { font-size: 14px; padding: 9px 14px; border-radius: 8px; }
.icon-btn {
width: 44px;
height: 44px;
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.15);
background: rgba(0, 0, 0, 0.18);
color: var(--text);
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 18px;
text-decoration: none;
flex: none;
}
.divider { height: 1px; background: var(--line); margin: 24px 0; }
.error-text { color: var(--red); font-size: 14px; min-height: 20px; margin-top: 10px; }
.hint { color: var(--muted); font-size: 12px; margin-top: 6px; }
.card {
background: var(--panel);
border-radius: var(--radius);
padding: 16px;
}
/* ---------- 鍵入力 ---------- */
.key-inputs { display: flex; gap: 6px; justify-content: center; margin: 8px 0 4px; }
.key-inputs input {
flex: 1;
min-width: 0;
max-width: 52px;
height: 60px;
padding: 0;
text-align: center;
font-size: 28px;
font-weight: 800;
}
.shake { animation: shake 0.35s; }
@keyframes shake {
20%, 60% { transform: translateX(-8px); }
40%, 80% { transform: translateX(8px); }
}
/* ---------- ロビー ---------- */
.table-list { display: flex; flex-direction: column; gap: 10px; }
.table-item {
background: var(--panel);
border-radius: var(--radius);
padding: 14px 14px 14px 16px;
display: flex;
gap: 12px;
align-items: center;
}
.table-item .info { flex: 1; min-width: 0; }
.table-item .name {
font-weight: 800;
font-size: 17px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.table-item .meta {
display: flex;
flex-wrap: wrap;
gap: 4px 12px;
font-size: 13px;
color: var(--muted);
margin-top: 6px;
}
.table-item .meta b { color: var(--text); font-weight: 700; }
.table-item .meta .gold { color: var(--gold); }
.badge {
display: inline-block;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.05em;
padding: 3px 8px;
border-radius: 999px;
background: var(--panel-2);
color: var(--muted);
vertical-align: 2px;
margin-left: 6px;
}
.badge.live { background: rgba(46, 204, 113, 0.18); color: var(--green); }
.badge.paused { background: rgba(255, 90, 90, 0.15); color: var(--red); }
.empty {
text-align: center;
color: var(--muted);
padding: 32px 16px;
border: 2px dashed var(--line);
border-radius: var(--radius);
font-size: 14px;
}
/* ---------- テーブル作成 ---------- */
.topbar { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; }
.topbar h1 { font-size: 20px; flex: 1; }
.switch-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 22px;
font-weight: 800;
font-size: 17px;
}
.switch { position: relative; width: 52px; height: 30px; flex: none; }
.switch input { opacity: 0; width: 0; height: 0; position: absolute; }
.switch span {
position: absolute;
inset: 0;
background: var(--input);
border-radius: 999px;
cursor: pointer;
transition: background 0.2s;
}
.switch span::before {
content: "";
position: absolute;
width: 24px;
height: 24px;
left: 3px;
top: 3px;
background: #ddd;
border-radius: 50%;
transition: transform 0.2s, background 0.2s;
}
.switch input:checked + span { background: var(--green); }
.switch input:checked + span::before { transform: translateX(22px); background: #fff; }
.switch input:focus-visible + span { outline: 2px solid var(--gold); }
/* 選択肢を横に並べたラジオボタン(テーブルの種類・CPU の人数) */
.segmented { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 6px; }
.segmented label { margin: 0; display: block; color: var(--text); }
.segmented label[hidden] { display: none; }
.segmented input { position: absolute; opacity: 0; width: 0; height: 0; }
.segmented span {
display: flex;
align-items: center;
justify-content: center;
text-align: center;
min-height: 52px;
padding: 6px 4px;
border-radius: 12px;
background: var(--input);
border: 2px solid transparent;
font-weight: 800;
font-size: 14px;
line-height: 1.2;
cursor: pointer;
}
.segmented input:checked + span { background: rgba(246, 199, 68, 0.15); border-color: var(--gold); color: var(--gold); }
.segmented input:focus-visible + span { outline: 2px solid var(--gold); outline-offset: 2px; }
.segmented.numbers span { min-height: 40px; font-size: 15px; }
.unit-input { position: relative; }
.unit-input input { padding-right: 56px; }
.unit-input .unit {
position: absolute;
right: 16px;
top: 50%;
transform: translateY(-50%);
color: var(--muted);
font-weight: 700;
pointer-events: none;
}
.schedule {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 10px;
}
.schedule span {
font-size: 12px;
background: var(--panel);
color: var(--muted);
padding: 4px 8px;
border-radius: 6px;
}
.schedule span b { color: var(--gold); font-weight: 700; }
/* ---------- プレイ画面 ---------- */
/* プレイ画面はスクロールさせない。
iOS Safari は body の overflow: hidden だけではスクロール・バウンスが止まらないため、
body を position: fixed で画面に固定し、全体を画面の高さに収める(1本指の touchmove は table.js で止める) */
html:has(body.table-page) { overflow: hidden; overscroll-behavior: none; }
body.table-page {
position: fixed;
inset: 0;
height: 100%;
min-height: 0;
overflow: hidden;
overscroll-behavior: none;
display: flex;
flex-direction: column;
touch-action: manipulation; /* ダブルタップでの拡大を防ぐ(ピンチ拡大は残す) */
-webkit-user-select: none;
user-select: none;
-webkit-touch-callout: none;
}
.table-page input { -webkit-user-select: text; user-select: text; }
.table-page .wrap { padding-top: 12px; padding-bottom: 0; flex: 1; min-height: 0; display: flex; flex-direction: column; width: 100%; }
.table-header { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.table-header h1 {
flex: 1;
min-width: 0;
font-size: 22px;
font-weight: 800;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.icon-btn.leave { color: var(--red); border-color: rgba(255, 90, 90, 0.35); }
/* ホスト操作(テーブル名の右) */
.host-controls { display: flex; align-items: center; gap: 8px; flex: none; }
.host-controls .btn { border-radius: 999px; padding: 9px 14px; font-size: 13px; }
.host-controls .icon-btn.paused { color: var(--green); border-color: rgba(46, 204, 113, 0.5); }
.level-bar {
background: var(--panel);
border-radius: var(--radius);
padding: 12px 16px;
display: flex;
align-items: center;
gap: 12px;
}
.level-bar .lv { color: var(--gold); font-weight: 800; }
.level-bar .blinds { font-weight: 800; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.level-bar .timer { font-variant-numeric: tabular-nums; font-weight: 800; font-size: 18px; }
.level-bar .timer.warn { color: var(--orange); }
.level-bar .timer.paused { color: var(--red); }
.level-sub { display: flex; justify-content: space-between; font-size: 12px; color: var(--muted); margin: 6px 4px 0; }
.felt-area {
position: relative;
flex: 1;
min-height: 0;
margin: 46px 0 40px; /* 上下の席が楕円の外にはみ出す分 */
}
.felt {
position: absolute;
left: 50%;
top: 50%;
width: 62%;
height: 72%;
transform: translate(-50%, -50%);
border-radius: 999px;
background: radial-gradient(ellipse at center, var(--felt) 0%, var(--felt-dark) 100%);
box-shadow: 0 0 0 14px rgba(46, 204, 113, 0.18), inset 0 0 40px rgba(0, 0, 0, 0.15);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
}
.pot-label { font-weight: 900; color: rgba(0, 0, 0, 0.3); letter-spacing: 0.1em; font-size: 14px; }
.pot {
font-size: 40px;
font-weight: 900;
color: var(--gold);
text-shadow: 0 3px 0 rgba(0, 0, 0, 0.3);
line-height: 1;
}
.phase {
margin-top: 8px;
background: rgba(0, 0, 0, 0.18);
color: #fff;
font-weight: 900;
letter-spacing: 0.08em;
font-size: 13px;
padding: 5px 14px;
border-radius: 999px;
}
.phase .hand-no { margin-left: 8px; font-size: 11px; opacity: 0.6; letter-spacing: 0; }
.seat {
position: absolute;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
width: 92px;
transition: left 0.3s, top 0.3s;
}
.avatar {
width: 58px;
height: 58px;
border-radius: 50%;
background: #3b4a5c;
border: 3px solid #8a96a3;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.avatar svg { width: 28px; height: 28px; fill: #fff; }
.seat.me .avatar { background: #d35400; border-color: var(--gold); }
.seat.bot .avatar { background: #3d4a6b; border-color: #8fa2d6; }
.seat.offline .avatar { opacity: 0.45; }
.nameplate {
margin-top: -10px;
background: rgba(10, 30, 20, 0.88);
border-radius: 10px;
padding: 4px 8px;
min-width: 80px;
max-width: 88px;
text-align: center;
position: relative;
}
.nameplate .pname {
font-size: 12px;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nameplate .pstack { font-size: 13px; font-weight: 800; color: var(--gold); }
.chip-marker {
position: absolute;
width: 24px;
height: 24px;
border-radius: 50%;
font-size: 11px;
font-weight: 900;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid #222;
}
.chip-marker.dealer { background: #fff; color: #111; top: -4px; right: -8px; z-index: 2; }
.blind-marker {
position: absolute;
top: -4px;
left: -10px;
z-index: 2;
font-size: 10px;
font-weight: 900;
padding: 2px 5px;
border-radius: 6px;
color: #111;
}
.blind-marker.sb { background: #7fd3ff; }
.blind-marker.bb { background: var(--gold); }
.offline-tag { font-size: 10px; color: var(--muted); }
.spectator-note {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
font-size: 13px;
color: var(--muted);
margin-bottom: 12px;
}
.action-bar {
flex: none;
position: relative;
z-index: 5;
max-height: 62%;
overflow-y: auto; /* サイドポットが多いときだけ中でスクロール */
overscroll-behavior: contain;
background: #161c19;
padding: 12px 16px calc(14px + env(safe-area-inset-bottom));
}
.action-bar .inner { max-width: 480px; margin: 0 auto; }
.my-stack {
font-size: 24px;
font-weight: 900;
display: flex;
align-items: center;
gap: 8px;
line-height: 1.1;
}
.my-stack .wallet { color: var(--gold); font-size: 18px; }
.actions { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.actions.raising { grid-template-columns: 1fr 2fr; }
.actions.single { grid-template-columns: 1fr; }
.actions .btn { font-size: 16px; padding: 14px 4px; white-space: normal; line-height: 1.15; min-height: 52px; }
.act-fold, .act-call, .act-raise { background: #555; color: #bbb; }
.act-fold:not(:disabled) { background: #5d646b; color: #fff; }
.act-call:not(:disabled) { background: var(--blue); color: #fff; }
.act-raise:not(:disabled) { background: var(--orange); color: #fff; }
.modal-backdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
padding: 16px;
z-index: 10;
}
.modal { background: var(--bg-deep); border-radius: var(--radius); padding: 20px; width: 100%; max-width: 380px; }
.modal h2 { font-size: 18px; margin-bottom: 4px; }
.toast {
position: fixed;
left: 50%;
bottom: 210px;
transform: translateX(-50%);
background: rgba(0, 0, 0, 0.85);
color: #fff;
padding: 10px 16px;
border-radius: 10px;
font-size: 14px;
z-index: 20;
pointer-events: none;
max-width: calc(100% - 32px);
text-align: center;
}
.center-message { text-align: center; padding: 60px 16px; color: var(--muted); }
.center-message h2 { color: var(--text); margin-bottom: 12px; }
.conn-lost {
position: fixed;
top: 0;
left: 0;
right: 0;
background: var(--red);
color: #fff;
text-align: center;
font-size: 13px;
font-weight: 700;
padding: 6px;
z-index: 30;
}
/* ---------- カード(カード機能ありのテーブル) ---------- */
.pcard {
display: inline-flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: none;
width: 28px;
height: 40px;
background: #fff;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
font-weight: 900;
line-height: 1;
user-select: none;
transition: filter 0.2s;
}
.pcard b { font-size: 15px; letter-spacing: -0.05em; }
.pcard i { font-style: normal; font-size: 13px; margin-top: 1px; }
.suit-s { color: #1a1a1a; }
.suit-h { color: #d62839; }
.suit-d { color: #1f6fd1; }
.suit-c { color: #16884a; }
.pcard.back {
background: repeating-linear-gradient(45deg, #c0392b 0 3px, #a93226 3px 6px);
border: 2px solid #fff;
}
.pcard.slot { background: rgba(0, 0, 0, 0.12); box-shadow: none; border: 1px dashed rgba(255, 255, 255, 0.3); }
.pcard.deal { animation: deal 0.35s ease-out both; }
@keyframes deal {
from { opacity: 0; transform: translateY(-10px) scale(0.8); }
}
.pcard.dim { filter: brightness(0.5); }
.pcard.hl { box-shadow: 0 0 0 2px var(--gold), 0 0 10px rgba(246, 199, 68, 0.8); }
.board { display: flex; gap: 3px; margin-top: 6px; min-height: 40px; }
.hole {
position: absolute;
top: -18px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 2px;
z-index: 1;
}
.hole .pcard { width: 25px; height: 35px; border-radius: 4px; }
.hole .pcard b { font-size: 13px; }
.hole .pcard i { font-size: 11px; }
.hole .pcard.back { border-width: 1.5px; }
/* 手札と重ならないよう D・SB/BB を横に出す */
.with-cards .chip-marker.dealer { top: 22px; right: -16px; }
.with-cards .blind-marker { top: 26px; left: -20px; }
.felt-area.with-cards { margin-top: 62px; }
.with-cards .bet.above { bottom: calc(100% + 20px); }
.crowded.with-cards .bet.above { bottom: calc(100% + 14px); }
.nameplate .phand {
font-size: 10px;
font-weight: 700;
color: var(--gold);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* ---------- 席の状態 ---------- */
.seat.folded .avatar, .seat.folded .nameplate { opacity: 0.45; }
.seat.away .avatar { opacity: 0.4; }
.seat.turn .avatar {
border-color: var(--gold);
box-shadow: 0 0 0 3px rgba(246, 199, 68, 0.35), 0 0 18px rgba(246, 199, 68, 0.7);
}
.seat.winner .nameplate { box-shadow: 0 0 0 2px var(--gold), 0 0 12px rgba(246, 199, 68, 0.6); }
.seat.contender .avatar { border-color: var(--orange); }
.act-tag {
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
font-size: 10px;
font-weight: 900;
padding: 1px 7px;
border-radius: 6px;
color: #fff;
white-space: nowrap;
z-index: 2;
}
.tag-fold { background: #555; color: #ccc; }
.tag-check { background: #3b7dd8; }
.tag-call { background: #2e9e5b; }
.tag-bet, .tag-raise { background: #e67e22; }
.tag-allin { background: var(--red); }
.tag-away { background: #444; color: #bbb; }
.bet {
position: absolute;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
gap: 4px;
background: rgba(0, 0, 0, 0.55);
color: var(--gold);
font-weight: 800;
font-size: 12px;
padding: 2px 8px 2px 4px;
border-radius: 999px;
white-space: nowrap;
z-index: 3;
}
.bet::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--gold);
border: 2px dashed #fff;
box-sizing: border-box;
}
.bet.above { bottom: calc(100% + 4px); }
.bet.below { top: calc(100% + 4px); }
.bet.win { background: var(--gold); color: #111; padding: 2px 8px; }
.bet.win::before { display: none; }
.phase.paused { background: var(--red); }
.phase.showdown { background: var(--orange); color: #111; }
.result {
margin-top: 6px;
background: rgba(0, 0, 0, 0.4);
border-radius: 8px;
padding: 4px 8px;
font-size: 11px;
line-height: 1.45;
text-align: center;
max-width: 94%;
}
.result b { color: var(--gold); }
.result .rhand { color: #fff; opacity: 0.85; }
.pot-tag { font-size: 9px; background: rgba(255, 255, 255, 0.2); padding: 0 4px; border-radius: 4px; margin-right: 4px; }
/* 7人以上 */
.crowded .seat { width: 80px; }
.crowded .avatar { width: 46px; height: 46px; }
.crowded .avatar svg { width: 22px; height: 22px; }
.crowded .nameplate { min-width: 72px; max-width: 80px; padding: 3px 6px; }
.crowded .nameplate .pname { font-size: 11px; }
.crowded .nameplate .pstack { font-size: 12px; }
.crowded .hole { top: -12px; }
.crowded .hole .pcard { width: 20px; height: 28px; }
.crowded .hole .pcard b { font-size: 11px; }
.crowded .hole .pcard i { font-size: 9px; }
.crowded.with-cards .chip-marker.dealer { top: 14px; }
.crowded.with-cards .blind-marker { top: 18px; }
/* ---------- 自分の操作エリア ---------- */
.me-row { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.me-info { flex: 1; min-width: 0; }
.my-cards { display: flex; gap: 4px; flex: none; }
.my-cards .pcard { width: 42px; height: 58px; border-radius: 6px; }
.my-cards .pcard b { font-size: 22px; }
.my-cards .pcard i { font-size: 19px; }
.me-sub .my-hand { color: var(--gold); font-weight: 800; }
.me-sub { font-size: 12px; color: var(--muted); display: flex; gap: 8px; margin-top: 3px; white-space: nowrap; }
.me-sub .my-bet { color: var(--gold); font-weight: 700; }
.me-sub .plus { color: var(--green); }
.me-sub .minus { color: var(--red); }
.status-line { text-align: center; font-size: 12px; color: var(--muted); margin-bottom: 8px; min-height: 16px; }
.status-line.my-turn { color: var(--gold); font-weight: 800; }
.raise-panel { margin-bottom: 8px; }
.award-panel { margin-bottom: 4px; }
.award-pot { background: var(--panel-2); border-radius: 10px; padding: 8px 10px; margin-bottom: 8px; }
.award-title { font-size: 12px; color: var(--muted); margin-bottom: 6px; }
.award-title b { color: var(--gold); font-size: 14px; }
.picks { display: flex; flex-wrap: wrap; gap: 6px; }
.picks .pick { background: var(--input); color: var(--text); border: 2px solid transparent; }
.picks .pick.on { background: rgba(246, 199, 68, 0.18); border-color: var(--gold); color: var(--gold); }
.presets { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
.presets .btn { padding: 8px 0; font-size: 13px; }
.presets .btn.active { background: var(--orange); color: #111; }
.raise-row { display: flex; gap: 10px; align-items: center; margin-top: 8px; }
.raise-row input[type="range"] { flex: 1; min-width: 0; accent-color: var(--orange); height: 28px; }
.raise-row input[type="number"] { width: 100px; flex: none; font-size: 16px; padding: 8px 10px; }
/* 背の低い画面(iPhone SE など)では詰める */
@media (max-height: 700px) {
.table-page .wrap { padding-top: 8px; }
.table-header .icon-btn { width: 38px; height: 38px; font-size: 16px; }
.table-header h1 { font-size: 18px; }
.table-header { margin-bottom: 8px; }
.host-controls .btn { padding: 7px 12px; }
.level-bar { padding: 8px 14px; }
.level-sub { display: none; }
.felt-area { margin: 40px 0 34px; }
.pot { font-size: 30px; }
.avatar { width: 46px; height: 46px; }
.avatar svg { width: 22px; height: 22px; }
.action-bar { padding-top: 8px; }
.my-stack { font-size: 20px; }
.me-row { margin-bottom: 2px; }
.status-line { margin-bottom: 6px; }
.actions .btn { min-height: 46px; padding: 10px 4px; }
.crowded .avatar { width: 34px; height: 34px; border-width: 2px; }
.crowded .avatar svg { width: 16px; height: 16px; }
.crowded .nameplate { margin-top: -6px; padding: 2px 5px; min-width: 64px; }
.crowded .nameplate .pname { font-size: 10px; }
.crowded .nameplate .pstack { font-size: 11px; }
.crowded .chip-marker { width: 20px; height: 20px; font-size: 10px; }
.felt-area.with-cards { margin-top: 52px; }
.board .pcard { width: 24px; height: 34px; }
.board .pcard b { font-size: 13px; }
.board .pcard i { font-size: 11px; }
.board { min-height: 34px; margin-top: 4px; }
.my-cards .pcard { width: 34px; height: 48px; }
.my-cards .pcard b { font-size: 18px; }
.my-cards .pcard i { font-size: 15px; }
.crowded .hole { top: -10px; }
.crowded .hole .pcard { width: 17px; height: 24px; }
.crowded .hole .pcard b { font-size: 10px; }
.crowded .hole .pcard i { font-size: 8px; }
}
[hidden] { display: none !important; }
/* ---------- ユーティリティ(CSP で style 属性を使わないため) ---------- */
.text-center { text-align: center; }
.mt-4 { margin-top: 4px; }
.mt-8 { margin-top: 8px; }
.mt-12 { margin-top: 12px; }
.key-title { font-size: 18px; text-align: center; }
.key-hint { text-align: center; margin: 6px 0 16px; }
.slash { flex: none !important; color: var(--muted); font-weight: 800; }
label.switch { margin: 0; display: inline-block; }
.link-gold { color: var(--gold); }
/* ---------- レビュー付きCPU戦(ハンドごとのレビュー) ---------- */
.review-modal { max-width: 440px; max-height: calc(100dvh - 32px); overflow-y: auto; overscroll-behavior: contain; }
.review-buttons { display: grid; grid-template-columns: 1fr 2fr; gap: 8px; margin-top: 16px; }
.review-buttons:has(> [hidden]) { grid-template-columns: 1fr; }
.review-link { display: block; margin-top: 12px; font-size: 13px; text-align: center; }
.rv-head { display: flex; align-items: center; gap: 12px; margin-top: 10px; }
.rv-cards { display: flex; gap: 3px; }
.rv-hand { font-size: 20px; }
.rv-sub { color: var(--muted); font-size: 12px; margin-top: 2px; }
.rv-sub b { color: var(--text); }
.rv-section { font-size: 12px; font-weight: 800; color: var(--gold); margin: 14px 0 6px; }
.rv-item { display: flex; gap: 8px; align-items: flex-start; font-size: 14px; padding: 6px 0; border-top: 1px solid var(--line); }
.rv-mark { flex: none; width: 24px; text-align: center; font-weight: 900; font-size: 16px; }
.rv-mark.great { color: var(--green); }
.rv-mark.good { color: #8fd18f; }
.rv-mark.warn { color: var(--orange); }
.rv-mark.bad { color: var(--red); }
.rv-score { color: var(--gold); font-weight: 800; font-size: 13px; }
.rv-streets { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-top: 12px; }
.rv-street { background: var(--panel); border-radius: 10px; padding: 6px 4px; text-align: center; }
.rv-street span { display: block; font-size: 11px; color: var(--muted); }
.rv-street b { font-size: 18px; }
.rv-foot { margin-top: 14px; font-size: 13px; color: var(--muted); }
/* 登録してあるハンドレンジの色(レンジ表のデータとしての色なのでサイトの配色とは別) */
.rv-color { display: inline-block; font-size: 13px; font-weight: 800; padding: 2px 8px; border-radius: 6px; vertical-align: middle; background: var(--c); color: var(--fg); }
.rv-color.cat-purple { box-shadow: inset 0 0 0 2px #9b59d0; }
.rv-color.cat-navy { --c: #20365d; --fg: #fff; box-shadow: inset 0 0 0 1px #4d6a9c; }
.rv-color.cat-red { --c: #9e342e; --fg: #fff; }
.rv-color.cat-yellow { --c: #ddb356; --fg: #14191f; }
.rv-color.cat-green { --c: #4e8051; --fg: #101910; }
.rv-color.cat-blue { --c: #6aa5c9; --fg: #14191f; }
.rv-color.cat-white { --c: #f7f7f7; --fg: #222; }
.rv-color.cat-gray, .rv-color.cat-purple { --c: #929292; --fg: #222; }