/* Hold'em Night のデザインの土台。 Apple の考え方で組んでいる: 意味で決める色(light / dark の両方)、半透明の素材で階層を表す、 大きさごとに字間と行間を変える、押した瞬間に反応する、動きはばね(JS は fluid.js、CSS は --ease-spring)。 CSP でインラインスタイルを禁止しているので、動的な値は JS から CSSOM で入れる */ /* ---------- 色と素材 ---------- */ :root { color-scheme: light dark; /* 背景(グループ表示): 画面 → セル → セルの中 */ --bg: #f2f2f7; --bg-2: #ffffff; --bg-3: #f2f2f7; --sheet-bg: #f2f2f7; --sheet-cell: #ffffff; /* 文字(主 → 補足 → 控えめ) */ --label: #000000; --label-2: rgba(60, 60, 67, 0.6); --label-3: rgba(60, 60, 67, 0.3); --separator: rgba(60, 60, 67, 0.29); /* 塗り(濃い → 薄い) */ --fill: rgba(120, 120, 128, 0.2); --fill-2: rgba(120, 120, 128, 0.16); --fill-3: rgba(118, 118, 128, 0.12); /* アクセント(フェルトの緑)と意味のある色 */ --tint: #0b8549; --on-tint: #ffffff; --tint-soft: rgba(11, 133, 73, 0.12); --tint-glow: rgba(11, 133, 73, 0.22); --blue: #007aff; --orange: #ff9500; --on-orange: rgba(0, 0, 0, 0.86); --red: #ff3b30; --green: #248a3d; --indigo: #5856d6; --purple: #af52de; --gold: #a26f00; /* 半透明の素材。大きい面ほど厚く(不透明に)する */ --material-thin: rgba(255, 255, 255, 0.55); --material: rgba(250, 250, 252, 0.74); --material-thick: rgba(246, 246, 249, 0.86); /* ナビゲーションバー: 下に潜った中身がぼやけた模様として透けないよう、ほぼ不透明に */ --material-bar: rgba(242, 242, 247, 0.94); --material-edge: rgba(255, 255, 255, 0.7); --plate: rgba(255, 255, 255, 0.84); --scrim: rgba(0, 0, 0, 0.3); --thumb: #ffffff; --shadow-s: 0 1px 2px rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.06); --shadow-m: 0 6px 18px rgba(0, 0, 0, 0.1), 0 1px 4px rgba(0, 0, 0, 0.06); --shadow-l: 0 24px 60px rgba(0, 0, 0, 0.2), 0 6px 16px rgba(0, 0, 0, 0.08); /* プレイ画面の背景(テーブルを上から照らすライト) */ --room: radial-gradient(120% 70% at 50% 40%, #ffffff 0%, #eceef1 55%, #e1e4e8 100%); /* フェルトとチップ(どちらの外観でも同じ。テーブルという「物」の色) */ --felt-hi: #2c9e64; --felt: #1a7b4c; --felt-lo: #0d4f33; --chip: #ffd25e; --on-chip: #2b1d00; /* 文字 */ --font: -apple-system, BlinkMacSystemFont, system-ui, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Noto Sans JP", "Yu Gothic UI", "Meiryo", "Segoe UI", sans-serif; --font-num: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, system-ui, "Segoe UI", sans-serif; /* ばね(減衰比 1・応答 0.4秒 ≒ 0.5秒)と、少し弾むばね(減衰比 0.75)。linear() が使えない環境は近い曲線 */ --ease-spring: cubic-bezier(0.2, 0.8, 0.2, 1); --ease-bounce: cubic-bezier(0.34, 1.3, 0.64, 1); --ease-out-mirror: cubic-bezier(0.8, 0, 0.8, 0.2); } @supports (transition-timing-function: linear(0, 1)) { :root { --ease-spring: linear(0, 0.06 5%, 0.186 10%, 0.329 15%, 0.465 20%, 0.584 25%, 0.682 30%, 0.76 35%, 0.821 40%, 0.868 45%, 0.903 50%, 0.929 55%, 0.949 60%, 0.963 65%, 0.973 70%, 0.981 75%, 0.986 80%, 0.99 85%, 0.993 90%, 0.995 95%, 1); --ease-bounce: linear(0, 0.087 5%, 0.273 10%, 0.478 15%, 0.661 20%, 0.804 25%, 0.905 30%, 0.97 35%, 1.007 40%, 1.024 45%, 1.028 50%, 1.026 55%, 1.021 60%, 1.01 70%, 1.003 80%, 1); } } @media (prefers-color-scheme: dark) { :root { --bg: #000000; --bg-2: #1c1c1e; --bg-3: #2c2c2e; --sheet-bg: #1c1c1e; --sheet-cell: #2c2c2e; --label: #ffffff; --label-2: rgba(235, 235, 245, 0.6); --label-3: rgba(235, 235, 245, 0.3); --separator: rgba(84, 84, 88, 0.6); --fill: rgba(120, 120, 128, 0.36); --fill-2: rgba(120, 120, 128, 0.32); --fill-3: rgba(118, 118, 128, 0.24); --tint: #26b05c; --tint-soft: rgba(48, 209, 88, 0.16); --tint-glow: rgba(48, 209, 88, 0.22); --blue: #0a84ff; --orange: #ff9f0a; --red: #ff453a; --green: #30d158; --indigo: #5e5ce6; --purple: #bf5af2; --gold: #ffd25e; --material-thin: rgba(44, 44, 46, 0.5); --material: rgba(30, 30, 32, 0.7); --material-thick: rgba(24, 24, 26, 0.84); --material-bar: rgba(12, 12, 13, 0.94); --material-edge: rgba(255, 255, 255, 0.09); --plate: rgba(28, 28, 30, 0.8); --scrim: rgba(0, 0, 0, 0.5); --thumb: #636366; --shadow-s: 0 1px 2px rgba(0, 0, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.25); --shadow-m: 0 8px 22px rgba(0, 0, 0, 0.4), 0 1px 4px rgba(0, 0, 0, 0.3); --shadow-l: 0 24px 60px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.35); --room: radial-gradient(120% 70% at 50% 40%, #13241c 0%, #070c0a 58%, #000000 100%); } } /* 透明度を下げる設定: 素材をすりガラスから不透明に */ @media (prefers-reduced-transparency: reduce) { :root { --material-thin: #f2f2f7; --material: #f7f7f9; --material-thick: #f2f2f7; --material-bar: #f2f2f7; --plate: #ffffff; } } @media (prefers-reduced-transparency: reduce) and (prefers-color-scheme: dark) { :root { --material-thin: #2c2c2e; --material: #1c1c1e; --material-thick: #1c1c1e; --material-bar: #0c0c0d; --plate: #1c1c1e; } } /* コントラストを上げる設定: 補足の文字と境界をはっきり */ @media (prefers-contrast: more) { :root { --label-2: rgba(60, 60, 67, 0.85); --label-3: rgba(60, 60, 67, 0.6); --separator: rgba(60, 60, 67, 0.6); --material-edge: rgba(0, 0, 0, 0.35); } } @media (prefers-contrast: more) and (prefers-color-scheme: dark) { :root { --label-2: rgba(235, 235, 245, 0.85); --label-3: rgba(235, 235, 245, 0.6); --separator: rgba(235, 235, 245, 0.45); --material-edge: rgba(255, 255, 255, 0.45); } } /* ---------- 基本 ---------- */ *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; background: var(--bg); /* スクロールだけ許し、ピンチとダブルタップの拡大は止める(子の touch-action もこれに絞られる) */ touch-action: pan-x pan-y; } body { margin: 0; min-height: 100dvh; background: var(--bg); color: var(--label); font-family: var(--font); font-size: 1.0625rem; line-height: 1.47; letter-spacing: -0.005em; font-optical-sizing: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-tap-highlight-color: transparent; /* 外観(ライト・ダーク)の切り替えは急に明るさを変えない */ transition: background-color 0.3s ease, color 0.3s ease; } h1, h2, h3, p { margin: 0; } button, input, textarea, select { font: inherit; color: inherit; letter-spacing: inherit; } a { color: var(--tint); } :focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; } [hidden] { display: none !important; } /* アイコン(SF Symbols 風の線) */ .i { width: 22px; height: 22px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } .i-fill { fill: currentColor; stroke: none; } /* ---------- ページの骨組み ---------- */ .wrap { max-width: 600px; margin: 0 auto; padding: 0 16px calc(40px + env(safe-area-inset-bottom)); } /* ナビゲーションバー: 中身が下に潜ったら素材と境目のぼかしが出る */ .nav-bar { position: sticky; top: 0; z-index: 10; isolation: isolate; padding-top: env(safe-area-inset-top); } /* ぼかしはスクロールしたときだけ付ける。iOS Safari は透明でもぼかしの層をボタンの上に描くことがあるため */ .nav-bar::before { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--material-bar); opacity: 0; transition: opacity 0.2s ease; } .nav-bar::after { content: ""; position: absolute; left: 0; right: 0; top: 100%; height: 16px; pointer-events: none; z-index: -1; background: linear-gradient(var(--material-bar), transparent); -webkit-mask-image: linear-gradient(#000, transparent); mask-image: linear-gradient(#000, transparent); opacity: 0; transition: opacity 0.2s ease; } .nav-bar.scrolled::before, .nav-bar.scrolled::after { opacity: 1; } .nav-bar.scrolled::before { -webkit-backdrop-filter: blur(30px) saturate(150%); backdrop-filter: blur(30px) saturate(150%); } .nav-bar.scrolled::after { -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); } /* ボタンと見出しはぼかしの層より必ず手前に */ .nav-inner { position: relative; z-index: 1; max-width: 600px; height: 44px; margin: 0 auto; padding: 0 8px; display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; } .nav-title { grid-column: 2; max-width: 60vw; font-size: 1.0625rem; font-weight: 600; letter-spacing: -0.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; opacity: 0; transform: translateY(4px); transition: opacity 0.2s ease, transform 0.4s var(--ease-spring); } .nav-bar.show-title .nav-title { opacity: 1; transform: none; } .nav-back { grid-column: 1; justify-self: start; display: inline-flex; align-items: center; gap: 2px; min-height: 44px; padding: 0 8px 0 2px; color: var(--tint); font-size: 1.0625rem; text-decoration: none; border-radius: 10px; transition: opacity 0.25s; } .nav-back:active { opacity: 0.4; transition: none; } .nav-back .i { width: 26px; height: 26px; stroke-width: 2.4; } /* 大きな見出し(字が大きいほど字間を詰め、行間も詰める) */ .large-title { margin: 2px 0 20px; font-size: 2.125rem; line-height: 1.18; font-weight: 700; letter-spacing: -0.022em; } /* ---------- グループ表示のリスト ---------- */ .group { margin: 0 0 28px; } .group-header { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; padding: 0 16px 7px; font-size: 0.8125rem; line-height: 1.35; letter-spacing: 0.01em; color: var(--label-2); } .group-footer { padding: 7px 16px 0; font-size: 0.8125rem; line-height: 1.5; letter-spacing: 0.01em; color: var(--label-2); } .group-footer:empty { display: none; } .list { background: var(--bg-2); border-radius: 14px; overflow: hidden; } .cell { position: relative; display: flex; align-items: center; gap: 14px; min-height: 48px; padding: 11px 16px; margin: 0; color: inherit; text-decoration: none; background: transparent; /* 離したときはゆっくり戻す */ transition: background-color 0.35s ease; } /* 区切り線は文字の始まりから(アイコンの下には引かない) */ .cell + .cell::before, .cell + .collapsible .cell::before { content: ""; position: absolute; top: 0; right: 0; left: 16px; border-top: 0.5px solid var(--separator); } .cell:has(.cell-icon) + .cell::before { left: 60px; } .cell-link, .choice { cursor: pointer; } /* 押した瞬間に反応する */ .cell-link:active, .choice:active { background: var(--fill-3); transition: none; } .cell-title { flex: 1; min-width: 0; font-weight: 400; } .cell-sub { display: block; margin-top: 1px; font-size: 0.8125rem; line-height: 1.45; letter-spacing: 0.01em; color: var(--label-2); } .chevron { width: 14px; height: 14px; color: var(--label-3); stroke-width: 2.6; } .cell-icon { width: 30px; height: 30px; flex: none; display: grid; place-items: center; border-radius: 8px; color: #fff; background: var(--tint); } .cell-icon .i { width: 18px; height: 18px; } .tone-green { background: linear-gradient(180deg, #34c759, #1f9a45); } .tone-blue { background: linear-gradient(180deg, #3d9bff, #0a6cdf); } .tone-indigo { background: linear-gradient(180deg, #7472ff, #4a48c9); } .tone-orange { background: linear-gradient(180deg, #ffad33, #f08300); } .tone-purple { background: linear-gradient(180deg, #c86ff0, #9440c2); } /* セルの中の入力(ラベルが左、値が右) */ .field-cell { cursor: text; } .field-cell > label, .field-cell > .cell-label { flex: none; margin: 0; color: var(--label); } .field-cell input { flex: 1; min-width: 0; padding: 0; border: 0; outline: none; background: transparent; font-size: 1.0625rem; } .field-cell input::placeholder { color: var(--label-3); } .field-cell.value-right input { text-align: right; font-variant-numeric: tabular-nums; color: var(--label-2); } .field-cell.value-right input:focus { color: var(--label); } .field-cell .unit { flex: none; margin-left: -8px; color: var(--label-2); } .field-cell:has(input.invalid) { box-shadow: inset 3px 0 0 var(--red); } .field-cell input.invalid { color: var(--red); } .field-cell:has(input:disabled) { opacity: 0.4; } /* 単独の入力欄 */ .field { width: 100%; min-height: 48px; padding: 12px 14px; border: 0; border-radius: 12px; outline: none; background: var(--bg-2); color: var(--label); font-size: 1.0625rem; box-shadow: inset 0 0 0 0.5px var(--separator); transition: box-shadow 0.2s ease; } .field:focus { box-shadow: inset 0 0 0 2px var(--tint); } .field.invalid { box-shadow: inset 0 0 0 2px var(--red); } .field::placeholder { color: var(--label-3); } /* 説明・エラー */ .hint { color: var(--label-2); font-size: 0.8125rem; line-height: 1.5; letter-spacing: 0.01em; } .error-text { min-height: 20px; margin-top: 8px; padding: 0 16px; color: var(--red); font-size: 0.8125rem; line-height: 1.5; } .error-text:empty { visibility: hidden; } .group > .error-text:empty { display: none; } .link { color: var(--tint); font-weight: 600; text-decoration: none; } .label { display: block; margin: 20px 16px 8px; font-size: 0.8125rem; color: var(--label-2); } .card { background: var(--bg-2); border-radius: 14px; padding: 16px; } .row { display: flex; gap: 10px; align-items: center; } .row > * { flex: 1; min-width: 0; } .mt-8 { margin-top: 8px; } .mt-12 { margin-top: 12px; } /* ---------- ボタン ---------- */ .btn { -webkit-appearance: none; appearance: none; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 44px; padding: 10px 18px; border: 0; border-radius: 12px; background: var(--fill-2); color: var(--label); font-size: 1.0625rem; font-weight: 600; line-height: 1.2; letter-spacing: -0.01em; text-decoration: none; white-space: nowrap; cursor: pointer; user-select: none; touch-action: manipulation; /* 離したときはばねで戻る */ transition: transform 0.45s var(--ease-spring), opacity 0.25s ease, background-color 0.25s ease, color 0.25s ease; } /* 押した瞬間に縮む(指を置いたところで反応する) */ .btn:active:not(:disabled) { transform: scale(0.97); opacity: 0.78; transition: transform 0.1s ease-out, opacity 0.1s ease-out; } .btn:disabled { opacity: 0.35; cursor: default; } .btn .i { width: 1.15em; height: 1.15em; stroke-width: 2.3; } .btn-tint { background: var(--tint); color: var(--on-tint); } .btn-blue { background: var(--blue); color: #fff; } .btn-sm { min-height: 32px; padding: 5px 14px; border-radius: 999px; font-size: 0.9375rem; } .btn-lg { min-height: 52px; border-radius: 14px; } .btn-block { width: 100%; } /* すりガラスの丸いボタン(プレイ画面の上) */ .glass-btn { -webkit-appearance: none; appearance: none; position: relative; flex: none; width: 40px; height: 40px; padding: 0; display: grid; place-items: center; border: 0; border-radius: 50%; background: var(--material); color: var(--label); -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%); box-shadow: inset 0 0 0 0.5px var(--material-edge), var(--shadow-s); cursor: pointer; text-decoration: none; transition: transform 0.45s var(--ease-spring), color 0.2s; } .glass-btn:active { transform: scale(0.9); transition: transform 0.1s ease-out; } .glass-btn .i { width: 20px; height: 20px; } /* ---------- セグメント(つまみは fluid.js が滑らせる) ---------- */ .segmented { position: relative; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; padding: 2px; border-radius: 10px; background: var(--fill-3); touch-action: pan-y; user-select: none; -webkit-user-select: none; } .segmented > label, .segmented > button { position: relative; z-index: 1; margin: 0; min-width: 0; } .segmented input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } .segmented label > span, .seg-btn { -webkit-appearance: none; appearance: none; display: flex; align-items: center; justify-content: center; width: 100%; min-height: 32px; padding: 4px 6px; border: 0; border-radius: 8px; background: transparent; color: var(--label); font-size: 0.875rem; font-weight: 500; line-height: 1.2; text-align: center; cursor: pointer; } .segmented input:checked + span, .seg-btn.active { font-weight: 600; } .segmented input:focus-visible + span { outline: 2px solid var(--blue); outline-offset: 0; } .segmented-thumb { position: absolute; top: 2px; bottom: 2px; left: 0; width: 0; border-radius: 8px; background: var(--thumb); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.12), 0 3px 1px rgba(0, 0, 0, 0.04), inset 0 0 0 0.5px rgba(0, 0, 0, 0.04); will-change: transform; } /* JS が動く前の見た目 */ .segmented:not(.has-thumb) input:checked + span, .segmented:not(.has-thumb) .seg-btn.active { background: var(--thumb); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.12); } /* ---------- スイッチ(押している間はつまみが伸びる) ---------- */ .switch { position: relative; flex: none; display: inline-block; width: 51px; height: 31px; margin: 0; } .switch input { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; } .switch span { position: absolute; inset: 0; border-radius: 999px; background: var(--fill); transition: background-color 0.25s ease; } .switch span::before { content: ""; position: absolute; left: 2px; top: 2px; width: 27px; height: 27px; border-radius: 999px; background: #fff; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15), 0 3px 1px rgba(0, 0, 0, 0.06); transition: transform 0.45s var(--ease-spring), width 0.3s var(--ease-spring); } .switch input:active + span::before { width: 33px; } .switch input:checked + span { background: var(--tint); } .switch input:checked + span::before { transform: translateX(20px); } .switch input:checked:active + span::before { transform: translateX(14px); } .switch input:focus-visible + span { outline: 2px solid var(--blue); outline-offset: 2px; } /* ---------- 選択肢のリスト(チェックマーク) ---------- */ .choice input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } .choice .check { width: 20px; height: 20px; color: var(--tint); stroke-width: 2.6; opacity: 0; transform: scale(0.4); transition: opacity 0.15s ease, transform 0.5s var(--ease-bounce); } .choice input:checked ~ .check { opacity: 1; transform: none; } .choice:has(input:focus-visible) { outline: 2px solid var(--blue); outline-offset: -2px; } .choice-text { flex: 1; min-width: 0; } /* 開閉する行(高さをばねで変える) */ .collapsible { display: grid; grid-template-rows: 1fr; transition: grid-template-rows 0.5s var(--ease-spring), opacity 0.3s ease; } .collapsible > .collapse-inner { min-height: 0; overflow: hidden; } .collapsible.collapsed { grid-template-rows: 0fr; opacity: 0; } /* ---------- 状態の印 ---------- */ .status { display: inline-flex; align-items: center; gap: 5px; font-weight: 600; } .status::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .status.live { color: var(--green); } .status.waiting { color: var(--label-2); } .status.paused { color: var(--orange); } .badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; background: var(--fill-2); color: var(--label-2); font-size: 0.6875rem; font-weight: 700; letter-spacing: 0.04em; } .badge.live { background: var(--tint-soft); color: var(--tint); } .badge.paused { background: rgba(255, 149, 0, 0.16); color: var(--orange); } .empty { padding: 28px 20px; border-radius: 14px; background: var(--bg-2); color: var(--label-2); font-size: 0.9375rem; line-height: 1.6; text-align: center; } .list > .empty { border-radius: 0; } .spinner { width: 14px; height: 14px; flex: none; border: 2px solid rgba(255, 255, 255, 0.35); border-top-color: #fff; border-radius: 50%; animation: spin 0.9s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ---------- シート(fluid.js の Sheet) ---------- */ .sheet-backdrop { --sheet-progress: 1; position: fixed; inset: 0; z-index: 30; display: flex; align-items: flex-end; justify-content: center; } /* 暗さはシートの位置に合わせて変わる(下ろすほど明るくなる) */ .sheet-backdrop::before { content: ""; position: absolute; inset: 0; background: var(--scrim); opacity: var(--sheet-progress); } .sheet { --bg-2: var(--sheet-cell); position: relative; width: 100%; max-width: 600px; max-height: calc(100dvh - env(safe-area-inset-top) - 20px); display: flex; flex-direction: column; padding-bottom: env(safe-area-inset-bottom); border-radius: 24px 24px 0 0; background: var(--sheet-bg); box-shadow: 0 -12px 40px rgba(0, 0, 0, 0.18); outline: none; will-change: transform; } /* 弾んで上へ行き過ぎたときに、下に隙間が見えないよう画面の外まで伸ばす */ .sheet::after { content: ""; position: absolute; left: 0; right: 0; top: 100%; height: 120px; background: inherit; } .sheet-header { flex: none; padding: 6px 20px 10px; text-align: center; touch-action: none; cursor: grab; } .sheet.dragging .sheet-header { cursor: grabbing; } .sheet-grabber { display: block; width: 36px; height: 5px; margin: 0 auto 12px; border-radius: 3px; background: var(--label-3); } .sheet-title { font-size: 1.0625rem; font-weight: 600; letter-spacing: -0.01em; } .sheet-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 2px 20px 8px; } .sheet-footer { flex: none; display: grid; gap: 8px; padding: 10px 20px 14px; } .sheet-footer .btn-row { display: grid; grid-template-columns: 1fr 2fr; gap: 8px; } .sheet-footer .btn-row:has(> [hidden]) { grid-template-columns: 1fr; } .sheet-form { padding: 18px 20px 20px; } .sheet-form .sheet-title { font-size: 1.375rem; font-weight: 700; letter-spacing: -0.015em; } /* ---------- アラート(App.confirm): 少し大きい所から現れ、その場で消える ---------- */ .alert-backdrop { --appear: 1; position: fixed; inset: 0; z-index: 40; display: grid; place-items: center; padding: 24px; } .alert-backdrop::before { content: ""; position: absolute; inset: 0; background: rgba(0, 0, 0, 0.35); opacity: var(--appear); } .alert { position: relative; width: min(300px, 100%); overflow: hidden; border-radius: 18px; background: var(--material-thick); -webkit-backdrop-filter: blur(30px) saturate(180%); backdrop-filter: blur(30px) saturate(180%); box-shadow: var(--shadow-l), inset 0 0 0 0.5px var(--material-edge); text-align: center; } .alert-body { padding: 20px 18px 18px; } .alert-title { margin-bottom: 4px; font-size: 1.0625rem; font-weight: 600; letter-spacing: -0.01em; line-height: 1.35; } .alert-message { font-size: 0.8125rem; line-height: 1.55; letter-spacing: 0.01em; white-space: pre-line; overflow-wrap: anywhere; } .alert-buttons { display: grid; grid-template-columns: 1fr 1fr; border-top: 0.5px solid var(--separator); } .alert-btn { -webkit-appearance: none; appearance: none; min-height: 46px; padding: 10px 8px; border: 0; background: transparent; color: var(--blue); font-size: 1.0625rem; cursor: pointer; transition: background-color 0.3s ease; } .alert-btn + .alert-btn { border-left: 0.5px solid var(--separator); } .alert-btn:active { background: var(--fill-2); transition: none; } .alert-btn:focus-visible { outline-offset: -3px; } .alert-btn.default { font-weight: 600; } .alert-btn.destructive { color: var(--red); } /* 危険な操作のときは「やめる」側を太字に(うっかり進めないように) */ .alert:has(.destructive) [data-confirm="cancel"] { font-weight: 600; } /* 自動でコピーできなかったときのシート */ .copy-text { width: 100%; min-height: 240px; margin-top: 10px; padding: 12px; resize: vertical; border: 0; border-radius: 12px; background: var(--bg-2); font: 12px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace; user-select: text; -webkit-user-select: text; } /* ---------- 通知(上から降りてきて、同じ道を上へ戻る) ---------- */ .toast { position: fixed; top: calc(env(safe-area-inset-top) + 10px); left: 50%; z-index: 50; max-width: calc(100% - 32px); padding: 11px 18px; border-radius: 999px; background: var(--material-thick); color: var(--label); -webkit-backdrop-filter: blur(24px) saturate(180%); backdrop-filter: blur(24px) saturate(180%); box-shadow: var(--shadow-m), inset 0 0 0 0.5px var(--material-edge); font-size: 0.9375rem; font-weight: 600; line-height: 1.4; text-align: center; pointer-events: none; opacity: 0; transform: translate3d(-50%, calc(-100% - 24px), 0) scale(0.92); transition: transform 0.3s var(--ease-out-mirror), opacity 0.25s ease-in; } .toast.show { opacity: 1; transform: translate3d(-50%, 0, 0); transition: transform 0.55s var(--ease-spring), opacity 0.2s ease-out; } .conn-lost { position: fixed; top: calc(env(safe-area-inset-top) + 8px); left: 50%; z-index: 45; display: flex; align-items: center; gap: 8px; padding: 8px 16px 8px 12px; border-radius: 999px; background: var(--red); color: #fff; font-size: 0.8125rem; font-weight: 600; white-space: nowrap; box-shadow: var(--shadow-m); transform: translateX(-50%); animation: drop-in 0.5s var(--ease-spring) both; } @keyframes drop-in { from { opacity: 0; transform: translate(-50%, -24px) scale(0.92); } } /* ---------- アプリのマーク ---------- */ .app-mark { display: grid; place-items: center; flex: none; width: 84px; height: 84px; border-radius: 22.5%; background: linear-gradient(165deg, #34b873 0%, #138152 55%, #0b5636 100%); box-shadow: 0 12px 28px rgba(11, 86, 54, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.28), inset 0 -1px 0 rgba(0, 0, 0, 0.15); color: #fff; } .app-mark svg { width: 52%; height: 52%; fill: currentColor; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.2)); } .app-mark.small { width: 52px; height: 52px; box-shadow: 0 6px 14px rgba(11, 86, 54, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.28); } /* ---------- 鍵入力 ---------- */ .page-key { display: grid; place-items: center; } .key-screen { width: 100%; max-width: 400px; padding: calc(env(safe-area-inset-top) + 40px) 24px calc(40px + env(safe-area-inset-bottom)); text-align: center; } .key-screen .app-mark { margin: 0 auto 18px; } .brand { font-size: 2.125rem; font-weight: 700; line-height: 1.15; letter-spacing: -0.022em; } .brand-sub { margin: 6px 0 40px; color: var(--label-2); font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.26em; } .key-title { font-size: 1.25rem; font-weight: 600; letter-spacing: -0.012em; } .key-hint { margin: 6px 0 24px; color: var(--label-2); font-size: 0.9375rem; } .key-inputs { display: flex; justify-content: center; gap: 8px; } .key-inputs input { flex: 1; min-width: 0; max-width: 50px; height: 60px; padding: 0; border: 0; border-radius: 12px; outline: none; background: var(--bg-2); color: var(--label); caret-color: var(--tint); font-family: var(--font-num); font-size: 1.75rem; font-weight: 600; text-align: center; box-shadow: inset 0 0 0 0.5px var(--separator), var(--shadow-s); transition: box-shadow 0.2s ease; } .key-inputs input:focus { box-shadow: inset 0 0 0 2px var(--tint), var(--shadow-s); } .key-inputs input.filled { animation: pop 0.45s var(--ease-bounce); } .key-form .error-text { padding: 0; margin: 12px 0 8px; } @keyframes pop { from { transform: scale(0.86); } } /* ---------- ロビー ---------- */ .hero { display: flex; align-items: center; gap: 14px; margin: 10px 0 26px; } .hero .large-title { margin: 0; } .hero .brand-sub { margin: 2px 0 0; } .lobby-actions { margin: -8px 0 28px; } /* テーブルの行(管理者は左へスワイプすると削除ボタンが出る) */ .swipe-row { --reveal: 0; position: relative; overflow: hidden; } .swipe-action { -webkit-appearance: none; appearance: none; position: absolute; top: 0; right: 0; bottom: 0; width: 88px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; border: 0; background: var(--red); color: #fff; font-size: 0.8125rem; font-weight: 600; cursor: pointer; } /* 引き出すほどアイコンが大きくなる(どこへ向かっているかを途中で見せる) */ .swipe-action .i { opacity: var(--reveal); transform: scale(calc(0.5 + 0.5 * var(--reveal))); } .table-row { position: relative; display: flex; align-items: center; gap: 12px; padding: 12px 14px 12px 16px; background: var(--bg-2); touch-action: pan-y; -webkit-user-select: none; user-select: none; will-change: transform; } .swipe-row + .swipe-row .table-row::before { content: ""; position: absolute; top: 0; right: 0; left: 60px; border-top: 0.5px solid var(--separator); } .table-row-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; } .table-row .name { font-size: 1.0625rem; font-weight: 600; letter-spacing: -0.01em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .table-row-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 1px 10px; color: var(--label-2); font-size: 0.8125rem; line-height: 1.45; letter-spacing: 0.01em; font-variant-numeric: tabular-nums; } .meta-item { display: inline-flex; align-items: center; gap: 3px; } .meta-item .i { width: 13px; height: 13px; stroke-width: 2.4; } /* App Store の「入手」と同じ形の参加ボタン */ .btn-get { -webkit-appearance: none; appearance: none; flex: none; min-width: 68px; height: 30px; padding: 0 14px; border: 0; border-radius: 999px; background: var(--fill-2); color: var(--tint); font-size: 0.9375rem; font-weight: 700; cursor: pointer; transition: transform 0.45s var(--ease-spring), opacity 0.25s; } .btn-get:active { transform: scale(0.92); opacity: 0.7; transition: transform 0.1s ease-out, opacity 0.1s; } /* ---------- テーブル作成 ---------- */ .schedule { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 4px 0; } .schedule span { padding: 4px 10px; border-radius: 999px; background: var(--fill-3); color: var(--label-2); font-size: 0.75rem; font-variant-numeric: tabular-nums; } .schedule b { color: var(--label); font-weight: 600; } .icon-plain { -webkit-appearance: none; appearance: none; flex: none; display: grid; place-items: center; width: 36px; height: 36px; margin: -6px -8px -6px 0; border: 0; border-radius: 50%; background: transparent; color: var(--tint); cursor: pointer; transition: transform 0.5s var(--ease-bounce); } .icon-plain:active { transform: rotate(-25deg) scale(0.88); transition: transform 0.1s ease-out; } .segmented.numbers label > span { min-height: 34px; font-family: var(--font-num); font-size: 0.9375rem; font-variant-numeric: tabular-nums; } .submit-area { margin-top: 8px; } /* ---------- プレイ画面 ---------- */ /* スクロールさせない。iOS Safari は body の overflow: hidden だけではスクロール・バウンスが止まらないため、 body を position: fixed で画面に固定し、全体を画面の高さに収める(1本指の touchmove は table.js で止める) */ html:has(body.page-table) { overflow: hidden; overscroll-behavior: none; } body.page-table { position: fixed; inset: 0; height: 100%; min-height: 0; overflow: hidden; overscroll-behavior: none; display: flex; flex-direction: column; background: var(--room); touch-action: pan-x pan-y; /* ダブルタップ・ピンチでの拡大を防ぐ */ -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; } .page-table input { -webkit-user-select: text; user-select: text; } .table-main { flex: 1; min-height: 0; width: 100%; max-width: 520px; margin: 0 auto; padding: calc(env(safe-area-inset-top) + 10px) 16px 0; display: flex; flex-direction: column; } .table-bar { display: flex; align-items: center; gap: 8px; } .table-bar h1 { flex: 1; min-width: 0; padding-left: 4px; font-size: 1.25rem; font-weight: 700; line-height: 1.2; letter-spacing: -0.015em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } #leave { color: var(--red); } #leave .icon-back, #leave.spectator .icon-leave { display: none; } #leave.spectator { color: var(--label); } #leave.spectator .icon-back { display: block; } .host-controls { display: flex; align-items: center; gap: 8px; flex: none; } #start { min-height: 34px; padding: 6px 16px; font-size: 0.875rem; font-weight: 700; letter-spacing: 0.04em; box-shadow: var(--shadow-s); } #pause .icon-play, #pause.paused .icon-pause { display: none; } #pause.paused .icon-play { display: block; } #pause.paused { color: var(--tint); } .level-bar { display: flex; align-items: center; gap: 10px; margin-top: 10px; padding: 7px 8px 7px 8px; border-radius: 16px; background: var(--material); -webkit-backdrop-filter: blur(20px) saturate(180%); backdrop-filter: blur(20px) saturate(180%); box-shadow: inset 0 0 0 0.5px var(--material-edge), var(--shadow-s); } .level-bar .lv { flex: none; padding: 3px 9px; border-radius: 999px; background: var(--tint-soft); color: var(--tint); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.02em; } .level-bar .blinds { flex: 1; min-width: 0; font-size: 0.9375rem; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .level-bar .timer { flex: none; padding: 1px 8px; border-radius: 8px; font-family: var(--font-num); font-size: 1.0625rem; font-weight: 700; font-variant-numeric: tabular-nums; } .level-bar .timer:empty { display: none; } .level-bar .timer.warn { color: var(--orange); } .level-bar .timer.paused { color: var(--red); } .level-sub { display: flex; justify-content: space-between; gap: 8px; margin: 6px 8px 0; color: var(--label-2); font-size: 0.75rem; letter-spacing: 0.01em; font-variant-numeric: tabular-nums; } /* テーブル */ .felt-area { position: relative; flex: 1; min-height: 0; margin: 48px 0 44px; /* 上下の席が楕円の外にはみ出す分 */ } .rail { position: absolute; left: 50%; top: 50%; width: 64%; height: 74%; transform: translate(-50%, -50%); border-radius: 999px; background: linear-gradient(165deg, #43494f 0%, #1d2023 40%, #0b0c0e 100%); box-shadow: 0 34px 60px -24px rgba(0, 0, 0, 0.6), 0 12px 24px -12px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.14), inset 0 -1px 0 rgba(0, 0, 0, 0.5); } .felt { position: absolute; inset: 9px; border-radius: 999px; background: radial-gradient(115% 80% at 50% 36%, var(--felt-hi) 0%, var(--felt) 46%, var(--felt-lo) 100%); box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.35), inset 0 14px 32px rgba(0, 0, 0, 0.32), inset 0 -8px 24px rgba(255, 255, 255, 0.04); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; } /* ベッティングライン */ .felt::before { content: ""; position: absolute; inset: 8%; border-radius: inherit; border: 1px solid rgba(255, 255, 255, 0.08); pointer-events: none; } .felt > * { position: relative; } .pot-label { color: rgba(255, 255, 255, 0.55); font-size: 0.6875rem; font-weight: 700; letter-spacing: 0.16em; } .pot { color: #fff; font-family: var(--font-num); font-size: 2.25rem; font-weight: 700; line-height: 1.05; letter-spacing: -0.025em; font-variant-numeric: tabular-nums; text-shadow: 0 2px 12px rgba(0, 0, 0, 0.3); } .phase { display: inline-flex; align-items: center; gap: 6px; margin-top: 8px; padding: 5px 12px; border-radius: 999px; background: rgba(0, 0, 0, 0.24); color: rgba(255, 255, 255, 0.94); font-size: 0.6875rem; font-weight: 700; letter-spacing: 0.1em; transition: background-color 0.3s ease, color 0.3s ease; } .phase .hand-no { font-weight: 600; letter-spacing: 0; opacity: 0.6; } .phase.paused { background: var(--red); } .phase.showdown { background: var(--chip); color: var(--on-chip); } .result { max-width: 94%; margin-top: 6px; padding: 5px 10px; border-radius: 10px; background: rgba(0, 0, 0, 0.36); color: #fff; font-size: 0.6875rem; line-height: 1.5; text-align: center; animation: fade-up 0.5s var(--ease-spring) both; } .result b { color: var(--chip); } .result .rhand { opacity: 0.8; } .pot-tag { margin-right: 4px; padding: 0 5px; border-radius: 4px; background: rgba(255, 255, 255, 0.2); font-size: 0.5625rem; } @keyframes fade-up { from { opacity: 0; transform: translateY(6px); } } /* カード */ .pcard { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; flex: none; width: 30px; height: 42px; border-radius: 6px; background: linear-gradient(180deg, #ffffff, #f2f3f5); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.14), 0 3px 8px rgba(0, 0, 0, 0.22), inset 0 0 0 0.5px rgba(0, 0, 0, 0.12); font-family: var(--font); font-weight: 700; line-height: 1; user-select: none; transition: filter 0.35s ease, box-shadow 0.35s ease, transform 0.5s var(--ease-spring); backface-visibility: hidden; } .pcard b { font-size: 1rem; font-weight: 700; letter-spacing: -0.05em; } .pcard i { margin-top: 1px; font-size: 0.875rem; font-style: normal; } .suit-s { color: #1c1c1e; } .suit-h { color: #e0263a; } .suit-d { color: #1f6fe0; } .suit-c { color: #13874b; } .pcard.back { background: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0 2px, transparent 2px 5px), linear-gradient(160deg, #c03a48, #6e1220); box-shadow: inset 0 0 0 2px #fff, 0 1px 1px rgba(0, 0, 0, 0.14), 0 3px 8px rgba(0, 0, 0, 0.22); } .pcard.slot { background: rgba(0, 0, 0, 0.14); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.14); } .pcard.dim { filter: brightness(0.5) saturate(0.6); } .pcard.hl { box-shadow: 0 0 0 2px var(--chip), 0 0 16px rgba(255, 210, 94, 0.75); transform: translateY(-3px); } /* 配る: テーブルの中央(山札)から各席へ飛んでくる。--deal-x / --deal-y は table.js が席ごとに入れる */ .pcard.deal { animation: card-deal 0.6s var(--ease-spring) both; } @keyframes card-deal { from { opacity: 0; transform: translate(var(--deal-x, 0), var(--deal-y, -40px)) scale(0.5) rotate(-14deg); } 25% { opacity: 1; } } /* めくる: 場札とショーダウンで公開された手札 */ .pcard.flip-in { animation: card-flip 0.65s var(--ease-spring) both; } @keyframes card-flip { from { opacity: 0; transform: perspective(500px) translateY(-8px) rotateY(-110deg) scale(0.92); } 30% { opacity: 1; } } .board { display: flex; gap: 4px; min-height: 42px; margin-top: 8px; } /* 席 */ .seat { position: absolute; width: 92px; display: flex; flex-direction: column; align-items: center; transform: translate(-50%, -50%); /* 人が増減したら新しい位置へ滑る */ transition: left 0.6s var(--ease-spring), top 0.6s var(--ease-spring); } .seat.entering { animation: seat-in 0.55s var(--ease-spring) both; } @keyframes seat-in { from { opacity: 0; transform: translate(-50%, -50%) scale(0.6); } } .avatar { --hue: 210; position: relative; width: 54px; height: 54px; display: grid; place-items: center; border-radius: 50%; background: linear-gradient(180deg, hsl(var(--hue) 48% 64%), hsl(var(--hue) 46% 42%)); color: #fff; box-shadow: 0 6px 14px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.28); transition: transform 0.5s var(--ease-spring), box-shadow 0.35s ease, opacity 0.35s ease, filter 0.35s ease; } .avatar .face { display: grid; place-items: center; } .avatar .mono { font-size: 1.375rem; font-weight: 600; line-height: 1; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .avatar svg { width: 28px; height: 28px; fill: #fff; } /* CPU は角の丸い四角(人は丸) */ .seat.bot .avatar { border-radius: 30%; background: linear-gradient(180deg, #8a91b4, #4c5274); } .seat.me .avatar { box-shadow: 0 0 0 2.5px var(--tint), 0 6px 14px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.28); } .seat.contender .avatar { box-shadow: 0 0 0 3px var(--orange), 0 6px 14px rgba(0, 0, 0, 0.3); } .seat.turn .avatar { transform: scale(1.08); box-shadow: 0 0 0 3px var(--chip), 0 0 26px 4px rgba(255, 210, 94, 0.55), 0 6px 14px rgba(0, 0, 0, 0.3); } .seat.winner .avatar { box-shadow: 0 0 0 3px var(--chip), 0 0 30px 6px rgba(255, 210, 94, 0.6); } .seat.folded .avatar, .seat.folded .nameplate { opacity: 0.42; } .seat.away .avatar { opacity: 0.4; } .seat.offline .avatar { opacity: 0.5; filter: grayscale(1); } .nameplate { position: relative; min-width: 76px; max-width: 92px; margin-top: -8px; padding: 4px 9px 5px; border-radius: 12px; background: var(--plate); color: var(--label); -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%); box-shadow: inset 0 0 0 0.5px var(--material-edge), 0 4px 12px rgba(0, 0, 0, 0.2); text-align: center; line-height: 1.25; transition: opacity 0.35s ease; } .pname, .pstack, .pnote { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pname { font-size: 0.75rem; font-weight: 600; letter-spacing: 0.005em; } .pstack { font-family: var(--font-num); font-size: 0.8125rem; font-weight: 700; font-variant-numeric: tabular-nums; } .pnote { color: var(--gold); font-size: 0.625rem; font-weight: 700; } .pnote.offline { color: var(--label-2); } .pnote:empty { display: none; } .markers { position: absolute; inset: 0; pointer-events: none; } .chip-marker.dealer { position: absolute; top: -4px; right: -9px; z-index: 2; width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; background: #fff; color: #111; font-size: 0.6875rem; font-weight: 800; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35), inset 0 0 0 2px #fff, inset 0 0 0 3px rgba(0, 0, 0, 0.14); } .blind-marker { position: absolute; top: -4px; left: -12px; z-index: 2; padding: 2px 6px; border-radius: 999px; color: #111; font-size: 0.625rem; font-weight: 800; letter-spacing: 0.02em; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); } .blind-marker.sb { background: #8fd3ff; } .blind-marker.bb { background: var(--chip); } .hole { position: absolute; top: -20px; left: 50%; z-index: 1; display: flex; gap: 2px; transform: translateX(-50%); } .hole .pcard { width: 26px; height: 36px; border-radius: 5px; } .hole .pcard b { font-size: 0.8125rem; } .hole .pcard i { font-size: 0.6875rem; } .hole .pcard.back { box-shadow: inset 0 0 0 1.5px #fff, 0 2px 6px rgba(0, 0, 0, 0.3); } /* 手札と重ならないよう 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; } /* 直前のアクション(ぽんと出る) */ .tag-slot { position: absolute; top: -15px; left: 50%; z-index: 2; transform: translateX(-50%); } .act-tag { display: block; padding: 2px 8px; border-radius: 999px; color: #fff; font-size: 0.625rem; font-weight: 800; letter-spacing: 0.03em; white-space: nowrap; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25); animation: tag-in 0.5s var(--ease-bounce) both; } @keyframes tag-in { from { opacity: 0; transform: translateY(4px) scale(0.7); } } .tag-fold { background: #636366; color: #e5e5ea; } .tag-check { background: var(--blue); } .tag-call { background: #28a745; } .tag-bet, .tag-raise { background: var(--orange); color: var(--on-orange); } .tag-allin { background: var(--red); } .tag-away { background: #48484a; color: #d1d1d6; } /* ベット(席から中央へ押し出される) */ .bet-slot { position: absolute; inset: 0; pointer-events: none; } .bet { --from: 8px; position: absolute; left: 50%; z-index: 3; display: flex; align-items: center; gap: 5px; padding: 3px 9px 3px 4px; border-radius: 999px; background: rgba(0, 0, 0, 0.56); color: var(--chip); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); font-family: var(--font-num); font-size: 0.75rem; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; transform: translateX(-50%); animation: bet-in 0.5s var(--ease-spring) both; } .bet::before { content: ""; width: 13px; height: 13px; border-radius: 50%; background: radial-gradient(circle, var(--chip) 0 38%, transparent 40%), repeating-conic-gradient(#fff 0 22.5deg, #d79a00 22.5deg 45deg); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25); } .bet.above { bottom: calc(100% + 4px); } .bet.below { --from: -8px; top: calc(100% + 4px); } .bet.win { padding: 3px 10px; background: var(--chip); color: var(--on-chip); } .bet.win::before { display: none; } @keyframes bet-in { from { opacity: 0; transform: translateX(-50%) translateY(var(--from)) scale(0.8); } } .with-cards .bet.above { bottom: calc(100% + 20px); } .crowded.with-cards .bet.above { bottom: calc(100% + 14px); } /* 7人以上は小さめに */ .crowded .seat { width: 80px; } .crowded .avatar { width: 46px; height: 46px; } .crowded .avatar svg { width: 22px; height: 22px; } .crowded .avatar .mono { font-size: 1.125rem; } .crowded .nameplate { min-width: 70px; max-width: 80px; padding: 3px 6px 4px; } .crowded .pname { font-size: 0.6875rem; } .crowded .pstack { font-size: 0.75rem; } .crowded .hole { top: -12px; } .crowded .hole .pcard { width: 20px; height: 28px; border-radius: 4px; } .crowded .hole .pcard b { font-size: 0.6875rem; } .crowded .hole .pcard i { font-size: 0.5625rem; } .crowded.with-cards .chip-marker.dealer { top: 14px; } .crowded.with-cards .blind-marker { top: 18px; } .spectator-note { display: flex; align-items: center; justify-content: center; gap: 12px; align-self: center; margin-bottom: calc(14px + env(safe-area-inset-bottom)); padding: 6px 6px 6px 16px; border-radius: 999px; background: var(--material); color: var(--label-2); -webkit-backdrop-filter: blur(20px) saturate(180%); backdrop-filter: blur(20px) saturate(180%); box-shadow: inset 0 0 0 0.5px var(--material-edge), var(--shadow-s); font-size: 0.8125rem; } .spectator-note:not(:has(#take-seat:not([hidden]))) { padding-right: 16px; } /* 自分の操作エリア(厚い素材のシート) */ .action-bar { position: relative; z-index: 5; flex: none; } .action-bar .inner { position: relative; max-width: 520px; margin: 0 auto; padding: 14px 16px calc(12px + env(safe-area-inset-bottom)); border-radius: 28px 28px 0 0; background: var(--material-thick); -webkit-backdrop-filter: blur(30px) saturate(180%); backdrop-filter: blur(30px) saturate(180%); box-shadow: 0 -10px 34px rgba(0, 0, 0, 0.14), inset 0 0.5px 0 var(--material-edge); } /* 自分の番: シートの上の縁がほんのり光る */ .action-bar .inner::before { content: ""; position: absolute; inset: 0 0 auto; height: 56px; border-radius: inherit; background: radial-gradient(60% 100% at 50% 0%, var(--tint-glow), transparent); opacity: 0; pointer-events: none; transition: opacity 0.5s ease; } .action-bar.my-turn .inner::before { opacity: 1; } .action-bar .inner > * { position: relative; } .me-row { display: flex; align-items: center; gap: 12px; } .my-cards { display: flex; flex: none; gap: 4px; --deal-x: 0px; --deal-y: -70px; } .my-cards .pcard { width: 44px; height: 62px; border-radius: 8px; } .my-cards .pcard b { font-size: 1.5rem; } .my-cards .pcard i { font-size: 1.25rem; } .my-cards .pcard.slot { background: var(--fill-3); box-shadow: inset 0 0 0 1px var(--separator); } .me-info { flex: 1; min-width: 0; } .my-stack { font-family: var(--font-num); font-size: 1.75rem; font-weight: 700; line-height: 1.1; letter-spacing: -0.022em; font-variant-numeric: tabular-nums; } .me-sub { display: flex; gap: 8px; margin-top: 3px; overflow: hidden; color: var(--label-2); font-size: 0.75rem; letter-spacing: 0.01em; white-space: nowrap; font-variant-numeric: tabular-nums; } .me-sub .my-hand { color: var(--gold); font-weight: 700; } .me-sub .my-bet { color: var(--label); font-weight: 600; } .plus { color: var(--green); } .minus { color: var(--red); } #sit-out { flex: none; color: var(--label-2); font-size: 0.875rem; } .status-line { min-height: 18px; margin: 8px 0 10px; color: var(--label-2); font-size: 0.8125rem; line-height: 1.4; text-align: center; } .status-line.my-turn { color: var(--tint); font-weight: 700; } .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 { min-height: 54px; padding: 8px 4px; border-radius: 16px; font-size: 1.0625rem; font-variant-numeric: tabular-nums; line-height: 1.15; white-space: normal; } .act-fold { background: var(--fill); color: var(--label); } .act-call { background: var(--blue); color: #fff; } .act-raise { background: var(--orange); color: var(--on-orange); } .actions .btn:disabled { opacity: 1; background: var(--fill-3); color: var(--label-3); } /* ベット/レイズ額のシート: テーブル(ポット・相手のベット)が見えるよう背景は薄く暗くするだけ */ .bet-backdrop::before { background: rgba(0, 0, 0, 0.16); } .bet-sheet { max-width: 520px; background: var(--material-thick); -webkit-backdrop-filter: blur(30px) saturate(180%); backdrop-filter: blur(30px) saturate(180%); box-shadow: 0 -12px 40px rgba(0, 0, 0, 0.2), inset 0 0.5px 0 var(--material-edge); } .bet-sheet::after { background: var(--material-thick); } .bet-header { padding-bottom: 4px; } .bet-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; text-align: left; } .bet-context { min-width: 0; overflow: hidden; color: var(--label-2); font-size: 0.8125rem; font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; } .bet-body { padding: 4px 20px 2px; } .bet-amount-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .raise-value { display: flex; align-items: baseline; min-width: 0; font-family: var(--font-num); cursor: text; } .raise-value .cur { color: var(--label-2); font-size: 1.75rem; font-weight: 700; } .raise-amount { width: 7.5ch; min-width: 0; padding: 0; border: 0; border-radius: 0; outline: none; background: transparent; color: var(--label); font-family: var(--font-num); font-size: 2.5rem; font-weight: 700; line-height: 1.15; letter-spacing: -0.025em; font-variant-numeric: tabular-nums; -moz-appearance: textfield; appearance: textfield; } .raise-amount::-webkit-inner-spin-button, .raise-amount::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } .raise-amount:focus { box-shadow: inset 0 -2px 0 var(--orange); } .raise-meta { display: grid; flex: none; justify-items: end; gap: 1px; font-variant-numeric: tabular-nums; } .raise-meta b { font-size: 1.0625rem; font-weight: 700; } .raise-meta span { color: var(--label-2); font-size: 0.8125rem; font-weight: 600; } .raise-meta span:empty { display: none; } /* 場面ごとの候補(3bet の 3x・ベットの 50% など)。上に倍率、下にその額 */ .bet-presets { display: grid; grid-auto-columns: 1fr; grid-auto-flow: column; gap: 6px; margin-top: 12px; } .chip-btn { -webkit-appearance: none; appearance: none; display: grid; place-content: center; gap: 1px; min-width: 0; min-height: 54px; padding: 6px 2px; border: 0; border-radius: 14px; background: var(--fill-2); color: var(--label); font: inherit; cursor: pointer; transition: background-color 0.2s ease, color 0.2s ease, transform 0.45s var(--ease-spring); } .chip-btn b { font-size: 0.9375rem; font-weight: 700; letter-spacing: -0.01em; } .chip-btn span { overflow: hidden; color: var(--label-2); font-size: 0.6875rem; font-weight: 600; font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; transition: color 0.2s ease; } .chip-btn:active:not(:disabled) { transform: scale(0.93); transition: transform 0.1s ease-out; } .chip-btn.active { background: var(--orange); color: var(--on-orange); } .chip-btn.active span { color: var(--on-orange); opacity: 0.72; } .chip-btn:disabled { color: var(--label-3); cursor: default; } .chip-btn:disabled span { color: var(--label-3); } /* −/+ とスライダー */ .bet-adjust { display: flex; align-items: center; gap: 10px; margin-top: 10px; } .step-btn { -webkit-appearance: none; appearance: none; display: grid; place-items: center; flex: none; width: 40px; height: 40px; padding: 0; border: 0; border-radius: 50%; background: var(--fill-2); color: var(--label); cursor: pointer; touch-action: manipulation; -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; transition: transform 0.45s var(--ease-spring), opacity 0.2s ease; } .step-btn .i { width: 18px; height: 18px; stroke-width: 2.6; } .step-btn:active:not(:disabled) { transform: scale(0.88); transition: transform 0.1s ease-out; } .step-btn:disabled { opacity: 0.35; cursor: default; } /* 自前のスライダー: つかんだ位置のまま指に付いてくる。端を越えるとゴムのように抵抗する */ .bet-slider { position: relative; flex: 1; min-width: 0; height: 44px; outline: none; touch-action: none; cursor: pointer; } .bet-track { position: absolute; left: 0; right: 0; top: 50%; height: 6px; margin-top: -3px; overflow: hidden; border-radius: 3px; background: var(--fill); } .bet-fill { position: absolute; inset: 0; background: var(--orange); transform: scaleX(0); transform-origin: left center; will-change: transform; } .bet-thumb { position: absolute; left: 0; top: 50%; width: 28px; height: 28px; margin-top: -14px; will-change: transform; } .bet-thumb::before { content: ""; position: absolute; inset: 0; border-radius: 50%; background: #fff; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2), 0 1px 1px rgba(0, 0, 0, 0.12), inset 0 0 0 0.5px rgba(0, 0, 0, 0.06); transition: transform 0.45s var(--ease-spring); } .bet-slider.active .bet-thumb::before { transform: scale(1.18); transition: transform 0.15s ease-out; } .bet-slider:focus-visible .bet-thumb::before { box-shadow: 0 0 0 3px var(--blue), 0 3px 8px rgba(0, 0, 0, 0.2); } /* スライダーの両端: 最小とオールイン */ .bet-ends { display: flex; justify-content: space-between; gap: 8px; margin-top: 2px; } .end-btn { -webkit-appearance: none; appearance: none; min-height: 30px; padding: 4px 12px; border: 0; border-radius: 999px; background: transparent; color: var(--label-2); font: inherit; font-size: 0.8125rem; font-weight: 600; font-variant-numeric: tabular-nums; cursor: pointer; transition: background-color 0.2s ease, color 0.2s ease, transform 0.45s var(--ease-spring); } .end-btn span { color: var(--label); } .end-btn:active { transform: scale(0.93); transition: transform 0.1s ease-out; } .end-btn.active { background: var(--fill-2); color: var(--label); } .end-btn.allin.active { background: var(--orange); color: var(--on-orange); } .end-btn.allin.active span { color: inherit; } .bet-sheet .sheet-footer .btn { font-variant-numeric: tabular-nums; } /* ショーダウンの勝者選択(キャッシュオンリー) */ .award-panel { margin-bottom: 2px; } .award-pots { display: grid; gap: 8px; max-height: 36dvh; margin-bottom: 10px; overflow-y: auto; overscroll-behavior: contain; } .award-pot { padding: 10px 12px; border-radius: 14px; background: var(--fill-3); } .award-title { margin-bottom: 8px; color: var(--label-2); font-size: 0.8125rem; } .award-title b { color: var(--label); font-family: var(--font-num); font-size: 1rem; font-variant-numeric: tabular-nums; } .picks { display: flex; flex-wrap: wrap; gap: 6px; } .pick { -webkit-appearance: none; appearance: none; display: inline-flex; align-items: center; gap: 5px; min-height: 36px; padding: 6px 14px; border: 0; border-radius: 999px; background: var(--fill-2); color: var(--label); font-size: 0.9375rem; font-weight: 600; cursor: pointer; transition: background-color 0.2s ease, color 0.2s ease, transform 0.45s var(--ease-spring); } .pick:active { transform: scale(0.94); transition: transform 0.1s ease-out; } .pick .i { display: none; width: 16px; height: 16px; stroke-width: 2.8; } .pick.on { background: var(--tint); color: var(--on-tint); } .pick.on .i { display: block; animation: pop 0.45s var(--ease-bounce); } /* テーブルが見つからない・終了した */ .center-message { margin: auto; max-width: 360px; padding: 40px 24px; color: var(--label-2); text-align: center; animation: fade-up 0.5s var(--ease-spring) both; } .center-message .badge-icon { width: 64px; height: 64px; margin: 0 auto 16px; display: grid; place-items: center; border-radius: 50%; background: var(--fill-3); color: var(--label-2); } .center-message .badge-icon .i { width: 30px; height: 30px; } .center-message h2 { margin-bottom: 8px; color: var(--label); font-size: 1.375rem; font-weight: 700; letter-spacing: -0.015em; } .center-message p { margin-bottom: 24px; line-height: 1.6; } /* ---------- レビュー付きCPU戦(テーブルのシートと /review で共用) ---------- */ .rv-head { display: flex; align-items: center; gap: 12px; margin-top: 4px; } .rv-cards { display: flex; gap: 3px; } .rv-hand { font-size: 1.25rem; letter-spacing: -0.01em; } .rv-sub { margin-top: 2px; color: var(--label-2); font-size: 0.8125rem; line-height: 1.5; } .rv-sub b { color: var(--label); } .rv-section { margin: 20px 4px 8px; color: var(--label-2); font-size: 0.8125rem; font-weight: 600; letter-spacing: 0.01em; } .rv-items { padding: 0 14px; border-radius: 14px; background: var(--bg-2); } .rv-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 0; font-size: 0.9375rem; line-height: 1.5; } .rv-item + .rv-item { border-top: 0.5px solid var(--separator); } .rv-mark { flex: none; width: 24px; font-size: 1.0625rem; font-weight: 800; text-align: center; } .rv-mark.great { color: var(--green); } .rv-mark.good { color: #64b96a; } .rv-mark.warn { color: var(--orange); } .rv-mark.bad { color: var(--red); } .rv-score { color: var(--gold); font-size: 0.8125rem; font-weight: 700; } .rv-streets { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-top: 14px; } .rv-street { padding: 8px 4px; border-radius: 12px; background: var(--bg-2); text-align: center; } .rv-street span { display: block; color: var(--label-2); font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.02em; } .rv-street b { font-family: var(--font-num); font-size: 1.25rem; font-variant-numeric: tabular-nums; } .rv-foot { margin-top: 14px; color: var(--label-2); font-size: 0.8125rem; } /* 登録してあるハンドレンジの色(レンジ表のデータとしての色なのでサイトの配色とは別) */ .rv-color { display: inline-block; padding: 2px 8px; border-radius: 6px; background: var(--c); color: var(--fg); font-size: 0.8125rem; font-weight: 700; vertical-align: middle; } .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; box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.2); } .rv-color.cat-gray { --c: #929292; --fg: #222; } /* ---------- 背の低い画面(iPhone SE など)では詰める ---------- */ @media (max-height: 700px) { .table-main { padding-top: calc(env(safe-area-inset-top) + 6px); } .table-bar .glass-btn { width: 36px; height: 36px; } .table-bar h1 { font-size: 1.125rem; } .level-bar { margin-top: 6px; padding-block: 5px; } .level-sub { display: none; } .felt-area { margin: 40px 0 34px; } .felt-area.with-cards { margin-top: 52px; } .pot { font-size: 1.75rem; } .avatar { width: 46px; height: 46px; } .avatar svg { width: 22px; height: 22px; } .avatar .mono { font-size: 1.125rem; } .action-bar .inner { padding-top: 10px; } .my-stack { font-size: 1.375rem; } .status-line { margin: 6px 0 8px; } .actions .btn { min-height: 46px; border-radius: 14px; } .crowded .avatar { width: 36px; height: 36px; } .crowded .avatar svg { width: 17px; height: 17px; } .crowded .avatar .mono { font-size: 0.9375rem; } .crowded .nameplate { min-width: 64px; margin-top: -6px; padding: 2px 5px 3px; } .crowded .pname { font-size: 0.625rem; } .crowded .pstack { font-size: 0.6875rem; } .crowded .chip-marker { width: 19px; height: 19px; font-size: 0.625rem; } .board { min-height: 34px; margin-top: 4px; } .board .pcard { width: 24px; height: 34px; } .board .pcard b { font-size: 0.8125rem; } .board .pcard i { font-size: 0.6875rem; } .my-cards .pcard { width: 36px; height: 50px; } .my-cards .pcard b { font-size: 1.125rem; } .my-cards .pcard i { font-size: 0.9375rem; } .crowded .hole { top: -10px; } .crowded .hole .pcard { width: 17px; height: 24px; } .crowded .hole .pcard b { font-size: 0.625rem; } .crowded .hole .pcard i { font-size: 0.5rem; } } /* ---------- 席順の変更(ホスト) ---------- */ .glass-btn:disabled { opacity: 0.4; cursor: default; } /* 次のハンドから反映する席順があるときの印 */ .glass-dot { position: absolute; top: 5px; right: 5px; width: 9px; height: 9px; border-radius: 50%; background: var(--orange); box-shadow: 0 0 0 2px var(--material-thick); } /* 小さなテーブル(自分が一番下で時計回り) */ .seating-preview { position: relative; width: min(100%, 300px); aspect-ratio: 1.45; margin: 2px auto 6px; } .seating-felt { position: absolute; inset: 16% 14%; border-radius: 999px; background: radial-gradient(120% 120% at 50% 30%, var(--felt-hi), var(--felt) 55%, var(--felt-lo)); box-shadow: 0 0 0 5px #2a2a2c, var(--shadow-s); } .seating-dot { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 2px; width: 64px; transform: translate(-50%, -50%); transition: left 0.5s var(--ease-spring), top 0.5s var(--ease-spring); } .seating-dot .rank-avatar { width: 30px; height: 30px; font-size: 0.875rem; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); } .seating-dot .rank-avatar.bot { border-radius: 9px; } .seating-dot .rank-avatar svg { width: 17px; height: 17px; } .seating-dot.me .rank-avatar { box-shadow: 0 0 0 2px var(--sheet-bg), 0 0 0 4px var(--tint); } .seating-name { max-width: 100%; padding: 0 5px; border-radius: 6px; background: var(--material-thick); font-size: 0.6875rem; font-weight: 600; line-height: 1.5; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .seating-tools { display: flex; align-items: center; gap: 12px; margin: 4px 0 10px; } .seating-tools .hint { flex: 1; margin: 0; } .seating-tools .btn { flex: none; } .seating-list { margin: 0; padding: 0; list-style: none; overflow: visible; } .seat-row { gap: 12px; min-height: 60px; background: var(--bg-2); will-change: transform; } .seat-row:first-child { border-radius: 14px 14px 0 0; } .seat-row:last-child { border-radius: 0 0 14px 14px; } .seat-row:only-child { border-radius: 14px; } .seat-row.me { background: var(--tint-soft); } .cell.seat-row + .cell::before { left: 64px; } /* つかんでいる行は持ち上げて手前に */ .seat-row.dragging { z-index: 2; border-radius: 14px; box-shadow: var(--shadow-l); } .seat-row.dragging::before, .seat-row.dragging + .cell::before { opacity: 0; } .seat-row .cell-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; } .seat-pin { flex: none; padding: 2px 9px; border-radius: 999px; background: var(--fill-3); color: var(--label-2); font-size: 0.75rem; font-weight: 600; } .seat-handle { -webkit-appearance: none; appearance: none; flex: none; width: 44px; height: 44px; margin: -8px -10px -8px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 10px; background: transparent; color: var(--label-3); cursor: grab; touch-action: none; } .seat-row.dragging .seat-handle { color: var(--label); cursor: grabbing; } .seating-pending { padding: 10px 16px 0; } /* ---------- テーブル内のランキング ---------- */ .ranking-list { margin: 12px 0 0; padding: 0; list-style: none; } .rank-row { gap: 12px; background: var(--bg-2); will-change: transform; } .rank-row.me { background: var(--tint-soft); } .cell.rank-row:has(.rank-avatar) + .cell::before { left: 98px; } .rank-no { flex: none; width: 26px; height: 26px; display: grid; place-items: center; border-radius: 50%; font-family: var(--font-num); font-size: 0.9375rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--label-2); } .rank-no.top-1 { background: linear-gradient(180deg, #ffd96a, #e7a913); color: #4a3200; } .rank-no.top-2 { background: linear-gradient(180deg, #e9ecf0, #aeb5bf); color: #2f343b; } .rank-no.top-3 { background: linear-gradient(180deg, #f0b98a, #c47a3e); color: #3d1f06; } .rank-avatar { --hue: 210; flex: none; width: 36px; height: 36px; display: grid; place-items: center; border-radius: 50%; background: linear-gradient(180deg, hsl(var(--hue) 48% 64%), hsl(var(--hue) 46% 42%)); color: #fff; font-size: 1rem; font-weight: 600; line-height: 1; } .rank-avatar.bot { border-radius: 10px; } .rank-avatar svg { width: 20px; height: 20px; fill: #fff; } .rank-row .cell-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; } .rank-value { flex: none; font-family: var(--font-num); font-size: 1.0625rem; font-weight: 600; font-variant-numeric: tabular-nums; } .ranking-note { padding: 8px 16px 0; } /* ---------- 統計 ---------- */ :root { /* レーダーの軸の色と、自分のスタイルの印 */ --st-aggr: #e8378a; --st-passive: #1a9fd0; --st-tight: #9a45dd; --st-loose: #e08700; --st-pick: #f0896a; --st-on-pick: #2b1206; } @media (prefers-color-scheme: dark) { :root { --st-aggr: #ff4f9a; --st-passive: #3fc8f4; --st-tight: #c278ff; --st-loose: #ffab3d; } } /* 段階の色: スタイル(参加・積極性)は緑 → ピンク、成績(勝率など)は赤 → 緑 */ .tone-style-0 { --tone: #5fd38f; --tone-2: #85e0aa; } .tone-style-1 { --tone: #8fcfa3; --tone-2: #aac9b0; } .tone-style-2 { --tone: #b8b0b9; --tone-2: #c9a3b9; } .tone-style-3 { --tone: #d48db5; --tone-2: #e07fb1; } .tone-style-4 { --tone: #e5649f; --tone-2: #f04a95; } .tone-quality-0 { --tone: #ef5f73; --tone-2: #e7998f; } .tone-quality-1 { --tone: #e5a564; --tone-2: #e2c17c; } .tone-quality-2 { --tone: #a9cf74; --tone-2: #96d98c; } .tone-quality-3 { --tone: #4fcd88; --tone-2: #3cc38a; } .nav-action { -webkit-appearance: none; appearance: none; grid-column: 3; justify-self: end; width: 44px; height: 44px; display: grid; place-items: center; padding: 0; border: 0; border-radius: 10px; background: transparent; color: var(--tint); cursor: pointer; transition: opacity 0.25s; } .nav-action:active { opacity: 0.4; transition: none; } .nav-action.spinning .i { animation: spin 0.8s linear infinite; } .st-card { position: relative; padding: 14px 16px 16px; border-radius: 18px; background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--fill-3); } .st-grid { display: grid; gap: 12px; } .st-grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .st-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } #all-body > * { margin-top: 12px; } .st-tabs { margin-bottom: 4px; } .st-empty { color: var(--label-2); font-size: 0.9375rem; text-align: center; } .st-foot { margin: 20px 4px 0; } /* 見出し(アイコン・名前・?) */ .st-head { position: relative; z-index: 1; display: flex; align-items: center; gap: 6px; min-width: 0; color: var(--label-2); font-size: 0.875rem; font-weight: 500; } .st-icon { font-size: 0.9375rem; line-height: 1; filter: grayscale(1); opacity: 0.85; } .st-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .st-help { -webkit-appearance: none; appearance: none; flex: none; width: 30px; height: 30px; margin: -6px -8px -6px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--label-3); cursor: pointer; } .st-help .i { width: 19px; height: 19px; stroke-width: 1.7; } .st-help:active { background: var(--fill-3); } .st-value { position: relative; z-index: 1; margin-top: 6px; font-family: var(--font-num); font-size: 2.75rem; font-weight: 500; line-height: 1.05; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; white-space: nowrap; } .st-value small { margin-left: 2px; font-size: 1.0625rem; font-weight: 500; letter-spacing: 0; } .st-metric.compact .st-value { font-size: 1.75rem; } .st-metric.compact .st-value small { font-size: 0.9375rem; } .st-band { margin-top: 8px; font-size: 0.9375rem; font-weight: 500; } .st-metric.compact .st-band { margin-top: 6px; font-size: 0.8125rem; color: var(--label-2); } /* 段階のバー */ .st-bar { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 4px; margin-top: 12px; } .st-seg { display: block; height: 6px; border-radius: 3px; background: var(--fill-2); overflow: hidden; } .st-seg-fill { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--tone), var(--tone-2)); transform: scaleX(0); transform-origin: left center; transition: transform 0.7s var(--ease-spring); } /* 水位で見せるタイル(WTSD・W$SD・WWSF) */ .st-liquid-card { min-height: 118px; overflow: hidden; padding: 12px 12px 14px; } /* 3つ並ぶので見出しを詰める(WTSD などが省略されないように) */ .st-liquid-card .st-head { gap: 4px; font-size: 0.8125rem; } .st-liquid-card .st-icon { font-size: 0.8125rem; } .st-liquid-card .st-name { overflow: visible; text-overflow: clip; } .st-liquid-card .st-help { width: 24px; height: 24px; margin: -4px -6px -4px 0; } .st-liquid-card .st-help .i { width: 17px; height: 17px; } .st-liquid-card .st-value { font-size: 2rem; } .st-liquid-card .st-value small { font-size: 0.875rem; } .st-liquid { --level: 0%; position: absolute; left: 0; right: 0; bottom: 0; height: var(--level); background: var(--fill-2); transition: height 1s var(--ease-spring); } .st-liquid::before { content: ""; position: absolute; left: 0; bottom: 100%; width: 200%; height: 8px; background: inherit; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 8' preserveAspectRatio='none'%3E%3Cpath d='M0 4C15 0 15 0 30 4S45 8 60 4 75 0 90 4 105 8 120 4V8H0z'/%3E%3C/svg%3E") repeat-x; -webkit-mask-size: 50% 100%; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 8' preserveAspectRatio='none'%3E%3Cpath d='M0 4C15 0 15 0 30 4S45 8 60 4 75 0 90 4 105 8 120 4V8H0z'/%3E%3C/svg%3E") repeat-x; mask-size: 50% 100%; animation: st-wave 6s linear infinite; } @keyframes st-wave { to { transform: translateX(-50%); } } /* 小さなメーター(フォールド率) */ .st-minis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; margin-top: 10px; text-align: center; } .st-mini-gauge { position: relative; width: 100%; max-width: 76px; margin: 0 auto; aspect-ratio: 1; } .st-gauge { position: absolute; inset: 0; width: 100%; height: 100%; } .st-gauge path { fill: none; stroke-width: 6; stroke-linecap: round; } .st-gauge-track { stroke: var(--fill); } .st-gauge-val { stroke: var(--label); } .st-mini-gauge > span { position: absolute; inset: 0; display: grid; place-items: center; font-family: var(--font-num); font-size: 1.0625rem; font-variant-numeric: tabular-nums; } .st-mini-gauge small { font-size: 0.6875rem; } .st-mini-label { display: block; margin-top: -2px; font-size: 0.8125rem; color: var(--label-2); } /* 輪と一覧(アグレッション頻度・ハンド・収支) */ .st-split { display: grid; grid-template-columns: minmax(0, 132px) minmax(0, 1fr); gap: 16px; align-items: center; margin-top: 8px; } .st-ring-box { position: relative; aspect-ratio: 1; } .st-ring { position: absolute; inset: 0; width: 100%; height: 100%; } .st-ring path { fill: none; stroke-width: 8; stroke-linecap: round; } .st-ring-track { stroke: var(--fill-2); } .st-ring-val { stroke: var(--tone); } .st-ring-text { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; } .st-ring-text .st-value { margin: 0; font-size: 2rem; } .st-ring-text .st-value small { font-size: 0.875rem; } .st-ring-text > span { font-size: 0.8125rem; color: var(--label-2); } .st-rows { align-self: stretch; display: flex; flex-direction: column; justify-content: center; padding-left: 14px; border-left: 0.5px solid var(--separator); } .st-row { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding: 9px 0; font-size: 0.9375rem; color: var(--label-2); } .st-row + .st-row { border-top: 0.5px solid var(--separator); } .st-row b { color: var(--label); font-family: var(--font-num); font-size: 1.0625rem; font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; } .st-net { text-align: center; } .st-net b { display: block; font-family: var(--font-num); font-size: 2rem; font-weight: 500; line-height: 1.1; font-variant-numeric: tabular-nums; } .st-net span { font-size: 0.8125rem; color: var(--label-2); } /* プレイスタイルのレーダー */ .st-style { padding: 6px; cursor: pointer; transition: transform 0.45s var(--ease-spring); } .st-style:active { transform: scale(0.985); transition: transform 0.1s ease-out; } .st-radar { display: block; width: 100%; height: auto; overflow: visible; } .st-radar-ring { fill: none; stroke: var(--label-3); stroke-width: 1; stroke-dasharray: 4 4; } .st-radar-outer { fill: none; stroke: var(--label-3); stroke-width: 1.5; } .st-radar-axis { stroke: var(--label-3); stroke-width: 1; stroke-dasharray: 2 4; } .st-radar-shape { stroke: none; } .st-radar-link { stroke: var(--st-pick); stroke-width: 2; } .st-chip rect { fill: transparent; stroke: var(--separator); stroke-width: 1; } .st-chip text { fill: var(--label-2); font-size: 14px; font-weight: 500; } .st-chip.on rect { fill: var(--st-pick); stroke: none; } .st-chip.on text { fill: var(--st-on-pick); font-weight: 600; } .st-axis { font-size: 17px; font-weight: 600; } .st-axis.aggr { fill: var(--st-aggr); } .st-axis.passive { fill: var(--st-passive); } .st-axis.tight { fill: var(--st-tight); } .st-axis.loose { fill: var(--st-loose); } .st-axis-sub { fill: var(--label-2); font-size: 11.5px; } .st-empty-note { position: absolute; inset: 0; display: grid; place-items: center; color: var(--label-2); font-size: 0.9375rem; pointer-events: none; } /* 説明シート */ .st-info-icon { margin-top: 4px; font-size: 3.25rem; line-height: 1.1; text-align: center; } .st-info-title { margin: 8px 0 14px; font-size: 1.5rem; font-weight: 600; letter-spacing: -0.015em; text-align: center; } .st-info-value { margin-bottom: 16px; font-family: var(--font-num); font-size: 2.25rem; font-weight: 500; line-height: 1.1; text-align: center; font-variant-numeric: tabular-nums; } .st-info-value small { font-size: 1rem; } .st-scale { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 4px; text-align: center; } .st-scale-col { display: grid; gap: 6px; min-width: 0; } .st-scale-col .st-seg { height: 10px; border-radius: 5px; } .st-scale-label, .st-scale-range { font-size: 0.75rem; line-height: 1.2; color: var(--label-2); white-space: nowrap; } .st-scale-col.on .st-scale-label, .st-scale-col.on .st-scale-range { color: var(--label); font-weight: 600; } .st-info-desc { margin-top: 20px; color: var(--label-2); font-size: 1rem; line-height: 1.65; text-align: center; } .st-info-sample { margin: 10px 0 4px; color: var(--label-3); font-size: 0.8125rem; text-align: center; } .btn.st-share { background: var(--label); color: var(--bg-2); } /* プレイスタイルのシート(横に送る) */ .st-carousel { display: flex; gap: 12px; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; padding: 4px 9% 2px; scrollbar-width: none; } .st-carousel::-webkit-scrollbar { display: none; } .st-type { flex: 0 0 82%; scroll-snap-align: center; padding: 26px 20px 24px; border-radius: 22px; background: var(--bg-2); box-shadow: inset 0 0 0 1px var(--fill-2); text-align: center; } .st-type-emoji { font-size: 4rem; line-height: 1.1; } .st-type-name { margin-top: 10px; font-size: 1.625rem; font-weight: 600; letter-spacing: -0.015em; } .st-type-full { color: var(--label-2); } .st-type-desc { margin-top: 14px; color: var(--label-2); font-size: 0.9375rem; line-height: 1.65; } .st-type-mine { display: inline-block; margin-top: 14px; padding: 4px 12px; border-radius: 999px; background: var(--st-pick); color: var(--st-on-pick); font-size: 0.8125rem; font-weight: 600; } .st-dots { display: flex; justify-content: center; gap: 8px; padding: 14px 0 2px; } .st-dots span { width: 7px; height: 7px; border-radius: 50%; background: var(--label-3); transition: background-color 0.2s; } .st-dots span.on { background: var(--label); } /* ---------- 視差効果を減らす: 動きは短いクロスフェードに ---------- */ @media (prefers-reduced-motion: reduce) { .pcard.deal, .pcard.flip-in, .act-tag, .bet, .seat.entering, .result, .center-message, .conn-lost, .key-inputs input.filled, .pick.on .i { animation: fade-in 0.2s ease both !important; } .conn-lost { transform: translateX(-50%); } .seat { transition: none; } .seat.turn .avatar, .pcard.hl { transform: none; } .toast, .toast.show { transform: translate3d(-50%, 0, 0); transition: opacity 0.2s ease; } .collapsible { transition: opacity 0.2s ease; } .sheet-backdrop:not([hidden]) { animation: fade-in 0.2s ease both; } .nav-title { transform: none; } .st-liquid::before { animation: none; } .st-seg-fill, .st-liquid { transition: none; } } @keyframes fade-in { from { opacity: 0; } }