/* Thành phần giao diện. Mọi giá trị lấy từ biến trong tokens.css.
   JS chỉ bật/tắt các class có sẵn ở đây — không ghép tên class. */

/* ---------- Tiện ích ---------- */

.is-hidden {
  display: none !important;
}

/* ---------- Màu bộ thẻ ---------- */

.deck--ban-be {
  --deck-color: var(--deck-ban-be);
}

.deck--gia-dinh {
  --deck-color: var(--deck-gia-dinh);
}

.deck--cap-doi {
  --deck-color: var(--deck-cap-doi);
}

.deck--tiec-khuya {
  --deck-color: var(--deck-tiec-khuya);
}

/* Bộ dev (_mau) và bộ lạ: màu trung tính, nhìn là biết không phải bộ thật. */
/* Nền --surface-raised tối nên đảo mực sang chữ trắng (14.90:1); giữ --card-ink
   thì chỉ còn 1.21:1. Vệt sau tên đổi sang --border vì vệt trắng sau chữ trắng không đọc được. */
.deck--mau {
  --deck-color: var(--surface-raised);
  --card-ink: var(--text);
  --highlight: var(--border);
}

.deck--mau .deck-tile__title {
  color: var(--text);
}

/* Thẻ module quốc gia, mọi nước. Trả mực và vệt tên về mặc định: thẻ quốc gia trộn vào
   bộ _mau (mực trắng) phải là chữ tối trên nền xanh nhạt, không phải chữ trắng. */
.deck--quoc-gia {
  --deck-color: var(--deck-quoc-gia);
  --card-ink: var(--ink-dark);
  --highlight: var(--highlight-light);
}

/* ---------- Nút ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-width: var(--tap-min);
  min-height: var(--tap-min);
  padding: var(--space-3) var(--space-5);
  border: 2px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: var(--text-md);
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  transition: transform var(--duration-fast) var(--ease-out),
    background-color var(--duration-fast) var(--ease-out);
}

.btn:active {
  transform: scale(0.97);
}

.btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.btn--primary {
  border-color: var(--deck-color);
  background: var(--deck-color);
  color: var(--card-ink);
}

.btn--ghost {
  border-color: transparent;
  background: transparent;
  color: var(--text-muted);
}

.btn--block {
  display: flex;
  width: 100%;
}

/* ---------- Mặt thẻ chơi — SPEC.md mục 13.5 ---------- */

/* Khung chứa thẻ: tỉ lệ 5:7, vừa màn hình điện thoại dọc. */
.card-stack {
  position: relative;
  isolation: isolate;
  width: min(100%, calc((100dvh - 300px) * 5 / 7), 420px);
  min-width: min(100%, 260px);
  margin: 0 auto;
}

/* Hai mép thẻ ló ra sau (lệch 4px / 8px, xoay 1.5° / 3°), màu bộ tối dần.
   .card-stack--1: chỉ còn một mép; --0: hết thẻ, không mép nào. */
.card-stack::before,
.card-stack::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: var(--radius-lg);
  box-shadow: var(--card-shadow);
}

.card-stack::before {
  background: linear-gradient(var(--stack-shade-1), var(--stack-shade-1)), var(--deck-color);
  transform: translate(4px, 4px) rotate(1.5deg);
}

.card-stack::after {
  z-index: -2;
  background: linear-gradient(var(--stack-shade-2), var(--stack-shade-2)), var(--deck-color);
  transform: translate(8px, 8px) rotate(3deg);
}

.card-stack--1::after,
.card-stack--0::before,
.card-stack--0::after {
  display: none;
}

/* Lật: mặt trước và mặt sau quay cùng nhau quanh trục dọc. */
.card-flipper {
  position: relative;
  transform-style: preserve-3d;
}

/* Rút thẻ — SPEC.md mục 13.3: trượt lên từ chồng bài, lật rotateY, nảy nhẹ khi dừng
   (scale 1.04 → 1), ~380ms. Chạm "Thẻ tiếp" giữa chừng → finishAll (motion.js) nhảy tới cuối. */
.card-flipper--flipping {
  animation: card-flip var(--duration-draw) var(--ease-out);
}

@keyframes card-flip {
  from {
    transform: translateY(24px) rotateY(180deg) scale(0.96);
  }
  70% {
    transform: translateY(0) rotateY(0) scale(1.04);
  }
  to {
    transform: none;
  }
}

@keyframes card-fade {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

/* Mặt trước */
.card {
  position: relative;
  display: flex;
  flex-direction: column;
  aspect-ratio: 5 / 7;
  padding: 14px;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: linear-gradient(135deg, var(--card-gloss), transparent 45%), var(--deck-color);
  box-shadow: var(--card-shadow);
  color: var(--card-ink);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

/* Hoạ tiết mờ sau chữ (≤ 8%) và nhiễu hạt giấy (≤ 4%). */
.card__art,
.card__grain {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.card__art {
  opacity: 0.08;
}

.card__grain {
  opacity: 0.04;
}

.card__art svg,
.card__grain svg,
.card-back__art {
  display: block;
  width: 100%;
  height: 100%;
}

/* Viền trong cách mép 14px, dày 3px, mực 16%, bo 16px. Chữa chỗ cho góc trên/dưới. */
.card__inner {
  position: relative;
  display: flex;
  flex: 1;
  flex-direction: column;
  justify-content: center;
  gap: var(--space-4);
  padding: 40px var(--space-4);
  border: 3px solid var(--card-line);
  border-radius: var(--radius-md);
  text-align: center;
}

/* Góc: icon 16px + mã 2 chữ · ớt. Hai góc dưới xoay 180° như lá bài. */
.card__corner {
  position: absolute;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: var(--space-1);
  font-family: var(--font-ui);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.12em;
  line-height: 1;
}

.card__corner--tl {
  top: 26px;
  left: 27px;
}

.card__corner--tr {
  top: 26px;
  right: 27px;
}

.card__corner--bl {
  bottom: 26px;
  left: 27px;
  transform: rotate(180deg);
}

.card__corner--br {
  right: 27px;
  bottom: 26px;
  transform: rotate(180deg);
}

.card__corner-icon,
.card__corner-chili {
  display: inline-flex;
}

.card-icon {
  width: 16px;
  height: 16px;
}

.chili {
  width: 14px;
  height: 14px;
}

.card__label {
  font-family: var(--font-ui);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  opacity: 0.72;
}

/* Chữ thẻ: Baloo 2 700. Cỡ chọn bằng core cardTextSize: mặc định 36px, md 32px,
   sm 28px (tối thiểu --text-card-min). */
.card__text {
  font-family: var(--font-card);
  font-size: var(--text-card);
  font-weight: 700;
  line-height: 1.25;
  overflow-wrap: anywhere;
  white-space: pre-line;
}

.card__text--md {
  font-size: var(--text-card-md);
}

.card__text--sm {
  font-size: var(--text-card-min);
}

/* Tên người: Baloo 2 800 trên vệt bút dạ quang từ 50% đến 90% chiều cao dòng. */
.name-mark {
  padding: 0 0.12em;
  border-radius: 0.12em;
  background: linear-gradient(to bottom, transparent 50%, var(--highlight) 50%, var(--highlight) 90%, transparent 90%);
  font-weight: 800;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

/* Hình phạt: nhãn bo tròn nền mực, chữ màu bộ. */
.penalty-chip {
  padding: 0.02em 0.45em;
  border-radius: var(--radius-pill);
  background: var(--card-ink);
  color: var(--deck-color);
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

/* Dòng phụ (người lái xe…): chữ nhỏ hơn, dưới chữ thẻ. */
.card-extra {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin: 0;
  padding: var(--space-3) 0 0;
  border-top: 2px solid var(--card-line);
  list-style: none;
  font-family: var(--font-ui);
  font-size: var(--text-lg);
  font-weight: 600;
  line-height: 1.5;
}

/* --- Thật hay thách: chia chéo, nửa dưới phủ mực --split-shade --- */
.card--split::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--card-ink);
  opacity: var(--split-shade);
  clip-path: polygon(0 60%, 100% 40%, 100% 100%, 0 100%);
  pointer-events: none;
}

.card--split .card__inner {
  justify-content: space-between;
}

.card__half {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.card__half--truth {
  align-items: flex-start;
  text-align: left;
}

.card__half--dare {
  align-items: flex-end;
  text-align: right;
}

/* --- Đối kháng: huy hiệu "VS" 74px giữa hai tên --- */
.card__vs-name {
  font-family: var(--font-card);
  font-size: var(--text-card);
  font-weight: 800;
  line-height: 1.1;
  overflow-wrap: anywhere;
}

.card__vs {
  display: grid;
  place-items: center;
  width: 74px;
  height: 74px;
  margin: 0 auto;
  border-radius: 50%;
  background: var(--card-ink);
  color: var(--deck-color);
  font-family: var(--font-card);
  font-size: 28px;
  font-weight: 800;
  transform: rotate(-8deg);
}

.card--vs .card__text {
  font-size: var(--text-lg);
  font-family: var(--font-ui);
  font-weight: 600;
}

/* --- Luật: con dấu "LUẬT" viền 4px màu --stamp, xoay −10° --- */
.card__stamp {
  align-self: center;
  padding: var(--space-1) var(--space-4);
  border: 4px solid var(--stamp);
  border-radius: var(--radius-sm);
  color: var(--stamp);
  font-family: var(--font-card);
  font-size: 28px;
  font-weight: 800;
  letter-spacing: 0.12em;
  line-height: 1.1;
  text-transform: uppercase;
  transform: rotate(-10deg);
}

/* --- Đố vui: đáp án là nút bo 12px. Cả bàn nói đáp án rồi bấm ô đã nói (SPEC 7.7).
   Trạng thái từ core quizChoiceStates:
   is-picked-right: nền xanh + dấu tích · is-answer: viền xanh dày + dấu tích
   is-picked-wrong: giữ đậm, viền dày, nền mực nhạt · is-faded: mờ --- */

/* Câu hỏi dài + 4 ô đáp án cao 48px không vừa khung 5:7. Bỏ overflow: hidden để
   aspect-ratio thành chiều cao TỐI THIỂU: thẻ cao thêm theo nội dung thay vì cắt chữ.
   Hoạ tiết và nhiễu hạt đều inset 0 nên vẫn nằm trong thẻ; thẻ đố vui không có ánh kim. */
.card--quiz {
  overflow: visible;
}

.card__choices {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
  text-align: left;
}

.card__choice {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  width: 100%;
  min-height: var(--tap-min);
  padding: var(--space-2) var(--space-3);
  border: 2px solid var(--card-ink);
  border-radius: 12px;
  background: transparent;
  color: inherit;
  font-family: var(--font-card);
  font-size: var(--text-lg);
  font-weight: 700;
  line-height: 1.25;
  text-align: left;
  transition: opacity 150ms ease-out, background-color 150ms ease-out;
}

.card__choice:active:not(:disabled) {
  background: var(--card-line);
}

.card__choice:disabled {
  opacity: 1;
  cursor: default;
}

.card__choice.is-picked-right {
  border-color: var(--quiz-correct);
  background: var(--quiz-correct);
  color: var(--quiz-correct-ink);
}

.card__choice.is-answer {
  border-color: var(--quiz-correct);
  box-shadow: inset 0 0 0 2px var(--quiz-correct);
  color: var(--quiz-correct);
}

.card__choice.is-picked-wrong {
  box-shadow: inset 0 0 0 2px var(--card-ink);
  background: var(--card-line);
}

.card__choice.is-faded {
  opacity: 0.4;
}

.card__choice .card-icon {
  width: 20px;
  height: 20px;
}

/* --- Thẻ hệ thống (nhắc nước lọc): nền trung tính, không màu bộ --- */
.card--system {
  background: linear-gradient(135deg, var(--card-gloss), transparent 45%), var(--surface);
  color: var(--text);
}

.card--system .card__inner {
  border-color: var(--border);
}

/* --- Cay 3: viền ánh kim 2px + dải sáng chéo lướt MỘT lần khi lật --- */
.card--foil {
  box-shadow: inset 0 0 0 2px var(--foil), var(--card-shadow);
}

.card--shine::after {
  content: "";
  position: absolute;
  inset: -20% -60%;
  background: linear-gradient(115deg, transparent 42%, var(--foil-shine) 50%, transparent 58%);
  transform: translateX(-70%);
  animation: foil-sweep 900ms var(--ease-out) 1 forwards;
  pointer-events: none;
}

@keyframes foil-sweep {
  to {
    transform: translateX(70%);
  }
}

/* --- Mặt sau: hoạ tiết lặp của bộ + huy hiệu "Nori" xoay −6° --- */
.card-back {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: linear-gradient(135deg, var(--card-gloss), transparent 45%), var(--deck-color);
  box-shadow: var(--card-shadow);
  color: var(--card-ink);
  transform: rotateY(180deg);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

.card-back__art {
  position: absolute;
  inset: 0;
  opacity: 0.18;
}

.card-back__badge {
  position: relative;
  padding: var(--space-2) var(--space-5);
  border-radius: var(--radius-pill);
  background: var(--card-ink);
  color: var(--deck-color);
  font-family: var(--font-card);
  font-size: 34px;
  font-weight: 800;
  transform: rotate(-6deg);
}

/* Tiệc khuya: bộ duy nhất mặt sau tối, hoạ tiết và huy hiệu xanh bạc hà. */
.card-back--tiec-khuya {
  background: var(--card-ink);
  color: var(--deck-tiec-khuya);
}

.card-back--tiec-khuya .card-back__art {
  opacity: 0.3;
}

/* Huy hiệu "Nori": khối xanh bạc hà đặc, chữ màu mực (10.24:1) — đúng bản mẫu. */
.card-back--tiec-khuya .card-back__badge {
  background: var(--deck-tiec-khuya);
  color: var(--card-ink);
}

/* Giảm chuyển động: mờ dần ≤ 150ms thay cho lật (SPEC.md mục 7.3, 13.3), không mặt sau,
   không dải sáng (vẫn giữ viền ánh kim). Ghi đè rule rút animation còn 0.01ms trong
   base.css (selector * yếu hơn class). */
@media (prefers-reduced-motion: reduce) {
  .card-flipper--flipping {
    animation-name: card-fade;
    animation-duration: var(--duration-fast) !important;
  }

  .card-back {
    display: none;
  }

  .card--shine::after {
    display: none;
  }
}

/* ---------- Dòng lượt trên mặt thẻ — SPEC.md mục 7.3 ---------- */

.turn-line {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: center;
  gap: 0 var(--space-2);
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-align: center;
}

.turn-line__name {
  color: var(--text);
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 800;
}

.turn-line__next {
  font-size: var(--text-sm);
  opacity: 0.6;
}

/* ---------- Ô chọn bộ thẻ ở trang chủ ---------- */

.deck-tile {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-2);
  width: 100%;
  min-height: var(--tap-min);
  padding: var(--space-5);
  border: 2px solid var(--deck-color);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  text-align: left;
}

.deck-tile__title {
  color: var(--deck-color);
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 700;
  line-height: 1.2;
}

.deck-tile__desc {
  color: var(--text-muted);
  font-size: var(--text-sm);
}

.deck-tile__icon {
  color: var(--deck-color);
}

.deck-tile__icon .icon {
  width: 32px;
  height: 32px;
}

.deck-tile__meta {
  margin-top: auto;
  color: var(--text-muted);
  font-size: var(--text-sm);
  font-weight: 600;
}

/* Bộ chưa có thẻ ở ngôn ngữ đang chọn: mờ, không bấm được. */
.deck-tile:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

.deck-tile__badge {
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text);
}

/* Khung xám khi đang tải (ô bộ thẻ, dòng lựa chọn). */
.skeleton {
  border-color: var(--border);
  background: var(--surface-raised);
  animation: skeleton-pulse 1.2s ease-in-out infinite alternate;
}

@keyframes skeleton-pulse {
  from {
    opacity: 0.5;
  }
  to {
    opacity: 1;
  }
}

/* Lưới 2×2 trên điện thoại. */
.deck-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-3);
}

.deck-grid .deck-tile {
  min-height: 176px;
  font-family: var(--font-ui);
}

/* ---------- Chip tên người chơi ---------- */

.chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  min-height: var(--tap-min);
  padding: var(--space-2) var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text);
  font-size: var(--text-md);
  font-weight: 500;
}

/* ---------- Bottom sheet ---------- */

.backdrop {
  position: fixed;
  inset: 0;
  z-index: 10;
  background: var(--backdrop);
}

.sheet {
  position: fixed;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 11;
  max-height: 85vh;
  max-height: 85dvh;
  overflow-y: auto;
  padding: var(--space-5) var(--space-4) calc(var(--space-5) + env(safe-area-inset-bottom));
  border-top: 1px solid var(--border);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  background: var(--surface);
  color: var(--text);
}

/* ---------- Icon ---------- */

.icon {
  flex-shrink: 0;
  width: 24px;
  height: 24px;
}

/* ---------- Khung màn hình ---------- */

.screen {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
  min-height: 100vh;
  min-height: 100dvh;
  max-width: 560px;
  margin: 0 auto;
  padding: calc(var(--space-6) + env(safe-area-inset-top)) var(--space-4)
    calc(var(--space-5) + env(safe-area-inset-bottom));
}

.screen__header {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

/* ---------- Trang chủ ---------- */

.home__title {
  font-size: var(--text-card);
}

.home__tagline {
  color: var(--text-muted);
  font-size: var(--text-lg);
}

.load-error {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-6) var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
  text-align: center;
}

.load-error__text {
  color: var(--danger);
  font-weight: 600;
}

.home__footer {
  margin-top: auto;
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-align: center;
}

/* ---------- Nhãn nhỏ ---------- */

.badge {
  flex-shrink: 0;
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text-muted);
  font-size: var(--text-sm);
  font-weight: 600;
  line-height: 1.2;
}

/* ---------- Danh sách chọn một (ngôn ngữ, quốc gia) ---------- */

.choice-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.choice {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  width: 100%;
  min-height: 56px;
  padding: var(--space-3) var(--space-5);
  border: 2px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  font-size: var(--text-lg);
  font-weight: 600;
  text-align: left;
}

.choice.is-selected {
  border-color: var(--text);
  background: var(--surface-raised);
}

/* Chấm tròn bên phải: rỗng khi chưa chọn, đặc khi chọn. */
.choice__mark {
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  border: 2px solid var(--text-muted);
  border-radius: 50%;
}

.choice.is-selected .choice__mark {
  border-color: var(--text);
  background: var(--text);
  box-shadow: inset 0 0 0 3px var(--surface-raised);
}

.choice__label {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
}

/* ---------- Màn lần mở đầu ---------- */

.onboarding__hint {
  color: var(--text-muted);
  font-size: var(--text-md);
}

.onboarding__actions {
  display: flex;
  gap: var(--space-3);
  margin-top: auto;
}

.onboarding__actions .btn--primary {
  flex: 1;
}

/* ---------- Nút chỉ có icon (luôn có aria-label) ---------- */

.icon-btn {
  display: inline-flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: var(--tap-min);
  height: var(--tap-min);
  padding: 0;
  border: 0;
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text-muted);
}

.icon-btn:active {
  background: var(--surface-raised);
}

.icon-btn:disabled {
  opacity: 0.3;
  cursor: not-allowed;
}

/* ---------- Ô nhập ---------- */

.input {
  flex: 1;
  min-width: 0;
  min-height: var(--tap-min);
  padding: var(--space-3) var(--space-4);
  border: 2px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text);
  font-size: var(--text-md);
}

.input::placeholder {
  color: var(--text-muted);
}

.input[aria-invalid="true"] {
  border-color: var(--danger);
}

.field-error {
  min-height: 1.5em;
  margin-top: calc(-1 * var(--space-3));
  color: var(--danger);
  font-size: var(--text-sm);
}

/* ---------- Công tắc có chữ (aria-pressed) ---------- */

.toggle {
  display: inline-flex;
  flex-shrink: 0;
  align-items: center;
  gap: var(--space-1);
  min-height: var(--tap-min);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text-muted);
  font-size: var(--text-sm);
  font-weight: 600;
}

.toggle .icon {
  width: 20px;
  height: 20px;
}

.toggle.is-on {
  border-color: var(--deck-color);
  background: var(--deck-color);
  color: var(--card-ink);
}

/* ---------- Màn người chơi ---------- */

.players__back {
  margin-left: calc(-1 * var(--space-3));
}

.players__deck,
.players__hint,
.players__count {
  color: var(--text-muted);
  font-size: var(--text-sm);
}

.add-form {
  display: flex;
  gap: var(--space-2);
}

.player-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: 0;
  list-style: none;
}

/* Hai hàng: [tay cầm | tên | xoá] · [↑ ↓ "Lái xe về"] — mọi vùng chạm ≥ 48px kể cả ở 375px. */
.player-row {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 0 var(--space-1);
  padding: var(--space-1) var(--space-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
}

.player-row__name {
  min-width: 0;
  padding: 0 var(--space-1);
  font-size: var(--text-lg);
  font-weight: 600;
  overflow-wrap: anywhere;
}

.player-row__controls {
  display: flex;
  grid-column: 1 / -1;
  align-items: center;
  gap: var(--space-1);
}

.player-row__controls .toggle {
  margin-left: auto;
}

/* Tay cầm kéo thả: touch-action none để kéo không cuộn trang. */
.player-row__grip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--tap-min);
  height: var(--tap-min);
  color: var(--text-muted);
  cursor: grab;
  touch-action: none;
}

.player-row.is-dragging {
  border-color: var(--deck-color);
  background: var(--surface-raised);
  box-shadow: var(--card-shadow);
}

.player-row.is-dragging .player-row__grip {
  cursor: grabbing;
}

.players__seat-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
}

.players__footer {
  position: sticky;
  bottom: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin-top: auto;
  padding: var(--space-3) 0 env(safe-area-inset-bottom);
  background: var(--bg);
  text-align: center;
}

/* ---------- Màn xác nhận tuổi ---------- */

.age-gate {
  display: flex;
  flex: 1;
  flex-direction: column;
  justify-content: center;
  gap: var(--space-4);
  text-align: center;
}

.age-gate__question {
  font-size: var(--text-card);
}

.age-gate__note {
  color: var(--text-muted);
}

/* Hai nút cùng cỡ — "Chọn bộ khác" không được nhỏ hơn nút xác nhận. */
.age-gate__actions {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

/* ---------- Màn cài đặt ván ---------- */

.settings__summary,
.settings__hint {
  color: var(--text-muted);
  font-size: var(--text-sm);
}

.settings__group {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

.settings__legend {
  padding: 0;
  margin-bottom: var(--space-3);
  font-family: var(--font-card);
  font-size: var(--text-lg);
  font-weight: 700;
}

.settings__switches {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

/* Lựa chọn có icon + dòng gợi ý (chế độ hình phạt). */
.choice--rich {
  align-items: flex-start;
  justify-content: flex-start;
  font-size: var(--text-md);
}

.choice__icon {
  color: var(--deck-color);
}

.choice__text {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
}

.choice__title {
  font-size: var(--text-lg);
  font-weight: 600;
}

.choice__hint {
  color: var(--text-muted);
  font-size: var(--text-sm);
  font-weight: 400;
}

.choice--rich .choice__mark {
  margin-top: var(--space-1);
}

/* Nút chọn một trong vài mức (độ cay). */
.segmented {
  display: flex;
  gap: var(--space-2);
}

.segment {
  flex: 1;
  min-width: 0;
  min-height: var(--tap-min);
  padding: var(--space-2) var(--space-3);
  border: 2px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface);
  color: var(--text);
  font-size: var(--text-md);
  font-weight: 600;
}

.segment.is-selected {
  border-color: var(--deck-color);
  background: var(--deck-color);
  color: var(--card-ink);
}

/* Chip bật/tắt (loại thẻ). */
.chip-list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}

.chip--toggle {
  border-width: 2px;
  background: transparent;
  color: var(--text-muted);
}

.chip--toggle.is-on {
  border-color: var(--deck-color);
  background: var(--surface-raised);
  color: var(--text);
}

/* Dòng công tắc (role="switch"). */
.switch-row {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  width: 100%;
  min-height: 56px;
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
  color: var(--text);
  text-align: left;
}

.switch-row__text {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
}

.switch-row__label {
  font-size: var(--text-md);
  font-weight: 600;
}

.switch-row__hint {
  color: var(--text-muted);
  font-size: var(--text-sm);
}

.switch {
  position: relative;
  flex-shrink: 0;
  width: 48px;
  height: 28px;
  border-radius: var(--radius-pill);
  background: var(--border);
  transition: background-color var(--duration-fast) var(--ease-out);
}

.switch::after {
  content: "";
  position: absolute;
  top: 4px;
  left: 4px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--text);
  transition: transform var(--duration-fast) var(--ease-out);
}

.switch.is-on {
  background: var(--deck-color);
}

.switch.is-on::after {
  transform: translateX(20px);
  background: var(--card-ink);
}

/* Hộp hỏi xác nhận ở đáy màn hình. */
.sheet--confirm {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
  max-width: 560px;
  margin: 0 auto;
}

/* ---------- Màn chơi ---------- */

/* pan-y: trình duyệt vẫn cuộn dọc, còn vuốt ngang thành pointer event cho view. */
.play {
  gap: var(--space-4);
  touch-action: pan-y;
  user-select: none;
  -webkit-user-select: none;
}

.play__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  opacity: 0.8;
}

.play__exit {
  padding-left: var(--space-2);
}

.play__counter {
  color: var(--text-muted);
  font-size: var(--text-md);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

.play__card {
  position: relative; /* gốc toạ độ cho pháo giấy khi xem đáp án đố vui */
  display: flex;
  flex-direction: column;
  perspective: 1200px;
}

/* Nút "Chạm để sang thẻ tiếp" — vùng chạm lớn ở đáy; nửa dưới màn hình cũng sang thẻ
   tiếp qua pointer event của view. */
.play__next {
  flex: 1;
  min-width: 0;
  min-height: 25vh;
  padding: var(--space-4);
  border: 0;
  border-radius: var(--radius-lg);
  background: transparent;
  color: var(--text-muted);
  font-size: var(--text-md);
  font-weight: 600;
}

.play__next:active {
  background: var(--surface);
}

/* Hàng dưới thẻ: "Đổi phạt" góc trái, vùng "Chạm để sang thẻ tiếp" chiếm phần còn lại. */
.play__actions {
  display: flex;
  flex: 1;
  align-items: flex-end;
  gap: var(--space-2);
}

.play__swap {
  flex-shrink: 0;
  margin-bottom: var(--space-3);
}

.play__notice {
  min-height: 1.5em;
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-align: center;
}

/* Thanh luật đang chạy: mỗi luật một chip, cuộn ngang nếu nhiều. */
.rules-bar {
  display: flex;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  overflow-x: auto;
  list-style: none;
}

.rule-chip {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: var(--space-2);
  max-width: 85%;
  min-height: 40px;
  padding: var(--space-1) var(--space-2) var(--space-1) var(--space-4);
  border: 2px solid var(--deck-color);
  border-radius: var(--radius-pill);
  background: var(--surface);
  font-size: var(--text-sm);
  font-weight: 600;
}

.rule-chip__text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.rule-chip__count {
  flex-shrink: 0;
  padding: 2px var(--space-2);
  border-radius: var(--radius-pill);
  background: var(--deck-color);
  color: var(--card-ink);
}

/* Đồng hồ tròn trên mặt thẻ. */
.timer-wrap {
  display: flex;
  justify-content: center;
}

.timer {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-1);
  min-width: 88px;
  height: 88px;
  padding: 0 var(--space-4);
  border: 3px solid var(--card-ink);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--card-ink);
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.timer.is-running {
  background: var(--card-ink);
  color: var(--deck-color);
}

.timer.is-done {
  border-color: var(--danger);
  background: var(--danger);
  color: var(--card-ink);
}

/* Chỉ cho trình đọc màn hình. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* Menu ⋮ trong bottom sheet. */
.sheet__title {
  margin-bottom: var(--space-4);
}

.menu-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.menu-item {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  width: 100%;
  min-height: 56px;
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface-raised);
  color: var(--text);
  font-size: var(--text-md);
  font-weight: 600;
  text-align: left;
}

.menu-item__icon {
  color: var(--text-muted);
}

/* ---------- Bảng mẫu thẻ — CHỈ DÀNH CHO DEV (#/dev/cards) ---------- */

.dev-cards {
  max-width: none;
}

.dev-cards__scroll {
  overflow-x: auto;
  padding-bottom: var(--space-4);
}

/* Khung chiếm đúng kích thước bảng SAU khi thu nhỏ (JS đặt width/height). */
.dev-cards__sizer {
  position: relative;
}

.dev-cards__grid {
  display: grid;
  grid-template-columns: 160px repeat(var(--dev-cols), var(--dev-cell));
  gap: var(--dev-gap);
  width: max-content;
  transform: scale(var(--dev-scale));
  transform-origin: top left;
}

.dev-cards__label {
  align-self: center;
  color: var(--text-muted);
  font-size: var(--text-lg);
  font-weight: 600;
}

.dev-cards__label--col {
  align-self: end;
  font-family: var(--font-ui);
  font-size: var(--text-md);
  letter-spacing: 0.08em;
}

.dev-cards__cell .card-stack {
  width: var(--dev-cell);
  min-width: 0;
}

.dev-cards__missing {
  color: var(--danger);
}

/* Mặt sau hiện phẳng để soát (bình thường chỉ thấy trong lúc lật). */
.card-back--flat {
  position: relative;
  width: var(--dev-cell, 300px);
  aspect-ratio: 5 / 7;
  transform: none;
}

/* Giả lập prefers-reduced-motion bằng công tắc trên trang dev — cùng quy tắc với
   @media (prefers-reduced-motion: reduce) ở khối mặt thẻ. */
.reduce-motion .card-flipper--flipping {
  animation-name: card-fade;
  animation-duration: var(--duration-fast);
}

.reduce-motion .card-flipper .card-back {
  display: none;
}

.reduce-motion .card--shine::after {
  display: none;
}

/* Link "Bảng mẫu thẻ" ở trang chủ — chỉ hiện ở máy dev. */
.home__dev-link {
  align-self: center;
  color: var(--text-muted);
  font-size: var(--text-sm);
}

/* ---------- Màn kết thúc ---------- */

.end__header {
  align-items: center;
  text-align: center;
}

.end__title {
  font-size: var(--text-card);
}

/* Tên bộ thẻ mang màu bộ. */
.end__deck {
  color: var(--deck-color);
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 700;
}

.end__stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(96px, 1fr));
  gap: var(--space-3);
}

.end__stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-1);
  padding: var(--space-4) var(--space-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
  text-align: center;
}

.end__stat-value {
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 700;
  line-height: 1.2;
}

.end__stat-label {
  color: var(--text-muted);
  font-size: var(--text-sm);
}

/* Chỗ cho pháo giấy ở P2.9 — phủ màn hình, không chặn chạm. */
.end__confetti {
  position: fixed;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* ---------- Bánh răng trang chủ → Cài đặt app ---------- */

.home__header {
  position: relative;
  padding-right: var(--tap-min);
}

.home__settings {
  position: absolute;
  top: calc(-1 * var(--space-2));
  right: calc(-1 * var(--space-2));
}

/* ---------- Đố vui: xem đáp án — SPEC.md mục 7.7 ---------- */

/* Nút trên mặt thẻ: nền mực, chữ màu bộ — cùng tông với nhãn hình phạt. */
.card__reveal {
  align-self: center;
  min-height: var(--tap-min);
  padding: var(--space-2) var(--space-5);
  border: 0;
  border-radius: var(--radius-pill);
  background: var(--card-ink);
  color: var(--deck-color);
  font-family: var(--font-ui);
  font-size: var(--text-md);
  font-weight: 700;
}

.card__choice-check {
  display: inline-flex;
  flex-shrink: 0;
}

/* Khung kết quả: thay chỗ câu hỏi trên mặt thẻ sau khi lộ đáp án (SPEC 7.7).
   Nền mực, chữ màu bộ — cùng tông nút "Xem đáp án". Thẻ đố vui cao thêm theo nội dung
   (.card--quiz) nên khung không bao giờ bị cắt. */
.quiz-pop {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-4);
  border-radius: var(--radius-md);
  background: var(--card-ink);
  box-shadow: var(--card-shadow);
  color: var(--deck-color);
  font-family: var(--font-ui);
  text-align: left;
}

.quiz-pop__title {
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 800;
  line-height: 1.2;
}

.quiz-pop.is-right .quiz-pop__title {
  color: var(--quiz-right-text);
}

.quiz-pop.is-wrong .quiz-pop__title {
  color: var(--danger);
}

.quiz-pop__answer {
  font-family: var(--font-card);
  font-size: var(--text-lg);
  font-weight: 700;
  line-height: 1.25;
}

.quiz-pop__fact {
  font-size: var(--text-sm);
  font-weight: 500;
  line-height: 1.5;
  opacity: 0.85;
}

/* "{tên}: {phạt}" — tên vàng nổi, nhãn phạt đảo màu cho nổi trên nền mực. */
.quiz-pop__penalty {
  font-size: var(--text-lg);
  font-weight: 600;
  line-height: 1.5;
}

.quiz-pop .name-mark {
  padding: 0;
  background: none;
  color: var(--focus);
}

.quiz-pop .penalty-chip {
  background: var(--deck-color);
  color: var(--card-ink);
}

/* "Xem lại câu hỏi" / "Xem kết quả" — nút chữ, vùng chạm 48px. */
.quiz-pop__toggle {
  align-self: flex-start;
  min-height: var(--tap-min);
  padding: 0 var(--space-2);
  border: 0;
  background: transparent;
  color: inherit;
  font-family: var(--font-ui);
  font-size: var(--text-sm);
  font-weight: 600;
  text-decoration: underline;
}

.quiz-pop__toggle--back {
  align-self: center;
}

/* ---------- Ô "Khám phá {quốc gia}" ở trang chủ ---------- */

/* Rộng cả hàng dưới lưới 2×2; hoạ tiết dấu mộc hộ chiếu mờ phía sau chữ. */
.deck-tile--wide {
  position: relative;
  grid-column: 1 / -1;
  overflow: hidden;
}

.deck-grid .deck-tile--wide {
  min-height: 120px;
}

.deck-tile__art {
  position: absolute;
  inset: 0;
  color: var(--deck-color);
  opacity: 0.5;
  pointer-events: none;
}

.deck-tile--wide > :not(.deck-tile__art) {
  position: relative;
}

/* ---------- Nút loa "Đọc to" trên mặt thẻ ---------- */

.card__speak {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  align-self: center;
  width: var(--tap-min);
  height: var(--tap-min);
  padding: 0;
  border: 2px solid var(--card-line);
  border-radius: var(--radius-pill);
  background: transparent;
  color: inherit;
}

/* ---------- Chế độ "Đặt giữa bàn" — SPEC.md mục 7.3 ---------- */

/* Ba hàng: nửa trên (xoay 180°) · giữa · nửa dưới. Máy nằm giữa bàn, hai phía đều đọc xuôi. */
.play--table {
  display: grid;
  grid-template-rows: minmax(0, 1fr) auto minmax(0, 1fr);
  /* Một cột không vượt bề ngang màn hình: thanh luật dài cuộn ngang thay vì kéo rộng cả màn. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-2);
  height: 100vh;
  height: 100dvh;
  padding-top: calc(var(--space-2) + env(safe-area-inset-top));
  padding-bottom: calc(var(--space-2) + env(safe-area-inset-bottom));
}

.play__half {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-height: 0;
  overflow-y: auto;
}

/* Nửa trên: xoay 180°; nút "Thẻ tiếp" đứng sau thẻ trong DOM nên nằm ở mép trên màn hình. */
.play__half--top {
  transform: rotate(180deg);
}

.play__middle {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.play__middle .play__swap {
  align-self: center;
  margin: 0;
}

.play__timer:empty {
  display: none;
}

/* Nửa màn hình: thẻ rộng hết, cao theo nội dung (không giữ tỉ lệ 5:7). */
.play--table .card-stack {
  width: 100%;
  min-width: 0;
}

.play--table .card {
  aspect-ratio: auto;
}

.play--table .card__inner {
  gap: var(--space-2);
  padding: 36px var(--space-3) 28px;
}

/* Chữ thẻ tối thiểu 22px ở chế độ này — chọn bằng core cardTextSize(…, 'table'). */
.play--table .card__text {
  font-size: var(--text-table);
}

.play--table .card__text--md {
  font-size: var(--text-table-md);
}

.play--table .card__text--sm {
  font-size: var(--text-table-min);
}

.play--table .play__next {
  flex: 0 0 auto;
  min-height: var(--tap-min);
  border: 1px dashed var(--border);
}

/* Cài đặt app: máy chưa có giọng đọc cho ngôn ngữ đang chọn. */
.voice-missing {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface-raised);
}

.voice-missing__title {
  font-size: var(--text-sm);
  font-weight: 600;
}

/* ---------- Sơ đồ bàn tròn — SPEC.md mục 7.2, 7.3 ---------- */

/* Ghế đặt quanh tâm: xoay theo --angle (0 = trên, theo chiều kim đồng hồ), đẩy ra bán kính,
   xoay ngược để chữ đứng thẳng. Bán kính theo bề rộng sơ đồ (container query units). */
.table-map {
  --seat-r: 38cqw;
  position: relative;
  width: 100%;
  max-width: 380px;
  aspect-ratio: 1;
  margin: 0 auto;
  container-type: inline-size;
}

.table-map__table {
  position: absolute;
  inset: 22%;
  border: 2px solid var(--border);
  border-radius: 50%;
  background: var(--surface);
}

.table-map__seat {
  position: absolute;
  top: 50%;
  left: 50%;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  max-width: 34cqw;
  min-height: 36px;
  padding: var(--space-1) var(--space-2);
  border: 2px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text);
  font-size: var(--text-sm);
  font-weight: 600;
  transform: translate(-50%, -50%) rotate(var(--angle)) translateY(calc(-1 * var(--seat-r))) rotate(calc(-1 * var(--angle)));
}

/* Trên 12 người: vòng trong, chữ nhỏ hơn. */
.table-map__seat--inner {
  --seat-r: 25cqw;
  font-size: 12px;
}

.table-map__name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.table-map__mark .icon {
  width: 14px;
  height: 14px;
}

.table-map__seat.is-flipper {
  border-color: var(--deck-color);
  background: var(--deck-color);
  color: var(--card-ink);
}

.table-map__seat.is-next {
  border-style: dashed;
  border-color: var(--deck-color);
}

.table-map__seat.is-away {
  opacity: 0.45;
}

.table-map__seat.is-selected {
  outline: 3px solid var(--focus);
  outline-offset: 2px;
}

/* ---------- Dải người chơi — SPEC.md mục 7.3 ---------- */

/* Cuộn ngang; JS giữ người đang lật ở giữa. */
.player-strip {
  position: relative; /* gốc toạ độ cho vệt sáng chuyển lượt */
  display: flex;
  gap: var(--space-2);
  margin: 0;
  padding: 2px 0;
  overflow-x: auto;
  list-style: none;
  scrollbar-width: none;
}

.strip-chip {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 2px;
  border: 2px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--surface);
}

.strip-chip__main {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  min-height: var(--tap-min);
  padding: var(--space-1) var(--space-3);
  border: 0;
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text);
  font-size: var(--text-sm);
  font-weight: 600;
}

.strip-chip__icon .icon {
  width: 16px;
  height: 16px;
}

/* Người đang lật: nền màu bộ, chữ tối. */
.strip-chip.is-flipper {
  border-color: var(--deck-color);
  background: var(--deck-color);
}

.strip-chip.is-flipper .strip-chip__main {
  color: var(--card-ink);
}

/* Người lật tiếp: mờ hẳn, nhãn "TIẾP" chỉ có viền. */
.strip-chip.is-next {
  background: var(--bg);
}

.strip-chip.is-next .strip-chip__main {
  color: var(--text-muted);
}

.strip-chip__next {
  padding: 0 var(--space-1);
  border: 1px solid var(--text-muted);
  border-radius: var(--radius-pill);
  font-size: 11px;
  letter-spacing: 0.08em;
}

.strip-chip.is-away {
  opacity: 0.45;
}

/* Huy hiệu phạt kéo dài: đồng hồ + số thẻ còn lại. */
.strip-chip__badge {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  min-width: var(--tap-min);
  min-height: var(--tap-min);
  margin-right: 2px;
  padding: 0 var(--space-2);
  border: 0;
  border-radius: var(--radius-pill);
  background: var(--card-ink);
  color: var(--deck-color);
  font-size: var(--text-sm);
  font-weight: 700;
}

.strip-chip__badge .icon {
  width: 16px;
  height: 16px;
}

/* ---------- Sheet Bàn chơi ---------- */

.table-sheet {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.table-sheet__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.table-sheet__row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface-raised);
}

.table-sheet__row.is-away .table-sheet__name {
  opacity: 0.55;
}

.table-sheet__name {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
  min-width: 0;
  font-weight: 600;
  overflow-wrap: anywhere;
}

.table-sheet__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-1);
}

.table-sheet__add {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.table-sheet__seat {
  appearance: auto;
  border-radius: var(--radius-md);
}

/* Sheet nội dung hình phạt kéo dài. */
.penalty-sheet__text {
  font-family: var(--font-card);
  font-size: var(--text-xl);
  font-weight: 700;
  line-height: 1.3;
}

/* ---------- Hiệu ứng — SPEC.md mục 13.3 ---------- */

/* Chuyển màn bằng View Transitions API: mờ dần + trượt 12px, 200ms. */
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 200ms;
  animation-timing-function: ease-out;
}

::view-transition-new(root) {
  animation-name: screen-in;
}

::view-transition-old(root) {
  animation-name: screen-out;
}

@keyframes screen-in {
  from {
    opacity: 0;
    transform: translateY(12px);
  }
}

@keyframes screen-out {
  to {
    opacity: 0;
  }
}

/* Nút loa + menu ở thanh trên màn chơi. */
.play__bar-actions {
  display: inline-flex;
  align-items: center;
}

/* Vệt sáng chuyển lượt: đặt ở chip người vừa lật, JS trượt sang chip người lật mới. */
.turn-glow {
  position: absolute;
  top: 2px;
  bottom: 2px;
  left: var(--glow-left);
  width: var(--glow-width);
  border-radius: var(--radius-pill);
  background: var(--highlight);
  pointer-events: none;
  transform-origin: left center;
}

/* Thẻ luật bay vào thanh luật: bản sao tạm, cố định theo màn hình. */
.rule-fly {
  position: fixed;
  top: var(--fly-top);
  left: var(--fly-left);
  z-index: 20;
  width: var(--fly-w);
  height: var(--fly-h);
  border-radius: var(--radius-lg);
  background: var(--deck-color);
  pointer-events: none;
}

/* Đồng hồ 3 giây cuối: màu --danger (JS lắc mỗi giây). */
.timer.is-urgent {
  border-color: var(--danger);
  background: var(--danger);
  color: var(--card-ink);
}

/* Pháo giấy: tối đa 40 hạt, rơi rồi tự xoá (confetti.js). */
.confetti {
  position: absolute;
  top: var(--top);
  left: var(--left);
  z-index: 5;
  width: 8px;
  height: 12px;
  border-radius: 2px;
  background: var(--c);
  pointer-events: none;
  animation: confetti-fall 1800ms ease-in var(--delay) both;
}

@keyframes confetti-fall {
  from {
    opacity: 1;
    transform: translate(0, -8px) rotate(0);
  }
  80% {
    opacity: 1;
  }
  to {
    opacity: 0;
    transform: translate(var(--x), var(--fall)) rotate(var(--rot));
  }
}

/* Thanh "Có bản mới — tải lại" (sw-register.js): nằm ngoài #app, trên mọi sheet. */
.update-bar {
  position: fixed;
  top: calc(env(safe-area-inset-top, 0px) + var(--space-2));
  right: var(--space-3);
  left: var(--space-3);
  z-index: 30;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-md);
  background: var(--surface-raised);
  box-shadow: var(--card-shadow);
  color: var(--text);
}

.update-bar__text {
  flex: 1 1 100%;
  font-size: var(--text-md);
}

.update-bar__btn {
  min-height: 48px;
}

/* Hiệu ứng nền theo dịp lễ và mùa (backdrop.js, SPEC 13.3a): lớp cố định sau mọi nội dung,
   không nhận chạm. Màu nền nhạt theo hiệu ứng; hạt chỉ animate transform/opacity. */
.season-bg {
  position: fixed;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  pointer-events: none;
}

.season-bg--tet-am { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-red), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-gold), transparent 70%); }
.season-bg--tet-duong { background: radial-gradient(120% 70% at 50% 0%, var(--bd-tint-blue), transparent 70%), radial-gradient(80% 40% at 50% 100%, var(--bd-tint-gold), transparent 70%); }
.season-bg--trung-thu { background: radial-gradient(70% 45% at 75% 8%, var(--bd-tint-gold), transparent 70%), radial-gradient(100% 50% at 50% 100%, var(--bd-tint-red), transparent 70%); }
.season-bg--giang-sinh { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-white), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-red), transparent 70%); }
.season-bg--giang-sinh-he { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-gold), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-red), transparent 70%); }
.season-bg--halloween { background: radial-gradient(110% 60% at 50% 100%, var(--bd-tint-orange), transparent 70%); }
.season-bg--anh-dao { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-pink), transparent 70%); }
.season-bg--valentine { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-pink), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-red), transparent 70%); }
.season-bg--xuan { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-pink), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-mint), transparent 70%); }
.season-bg--ha { background: radial-gradient(120% 60% at 50% 0%, var(--bd-tint-gold), transparent 70%), radial-gradient(90% 50% at 50% 100%, var(--bd-tint-mint), transparent 70%); }
.season-bg--thu { background: radial-gradient(110% 60% at 50% 100%, var(--bd-tint-orange), transparent 70%), radial-gradient(90% 40% at 50% 0%, var(--bd-tint-gold), transparent 70%); }
.season-bg--dong { background: radial-gradient(120% 70% at 50% 0%, var(--bd-tint-blue), transparent 70%), radial-gradient(90% 40% at 50% 100%, var(--bd-tint-white), transparent 70%); }

.bd-p {
  position: absolute;
  top: 0;
  left: 0;
  width: var(--size);
  height: var(--size);
  fill: currentColor;
  opacity: var(--bd-opacity);
  will-change: transform, opacity;
}

.bd-p .bd-cut { fill: var(--bg); }
.bd-p .bd-cut-line { fill: none; stroke: var(--bg); stroke-width: 1.2; opacity: 0.5; }
.bd-p .bd-line { fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }

.bd-tone--gold { color: var(--bd-gold); }
.bd-tone--pink { color: var(--bd-pink); }
.bd-tone--red { color: var(--bd-red); }
.bd-tone--white { color: var(--bd-white); }
.bd-tone--orange { color: var(--bd-orange); }
.bd-tone--mint { color: var(--bd-mint); }
.bd-tone--violet { color: var(--bd-violet); }
.bd-tone--moon { color: var(--bd-moon); }

.bd-p--fall { animation: bd-fall var(--dur) linear var(--delay) infinite; }
.bd-p--rise { animation: bd-rise var(--dur) linear var(--delay) infinite; }
.bd-p--twinkle { animation: bd-twinkle var(--dur) ease-in-out var(--delay) infinite; }
.bd-p--glow { animation: bd-rise var(--dur) linear var(--delay) infinite, bd-blink 2.4s ease-in-out var(--delay) infinite; }
.bd-p--still { opacity: 0.4; transform: translate(var(--x), var(--y)); }

@keyframes bd-fall {
  from { transform: translate(var(--x), -12vh) rotate(0deg); }
  to { transform: translate(calc(var(--x) + var(--drift)), 112vh) rotate(var(--rot)); }
}

@keyframes bd-rise {
  from { transform: translate(var(--x), 112vh); }
  to { transform: translate(calc(var(--x) + var(--drift)), -12vh); }
}

@keyframes bd-twinkle {
  0%, 100% { opacity: 0; transform: translate(var(--x), var(--y)) scale(0.5); }
  50% { opacity: var(--bd-opacity); transform: translate(var(--x), var(--y)) scale(1); }
}

@keyframes bd-blink {
  0%, 100% { opacity: 0.15; }
  50% { opacity: var(--bd-opacity); }
}

/* Giảm hiệu ứng: chỉ còn lớp nền tĩnh (backdrop.js đã không tạo hạt, đây là lớp chặn thứ hai). */
.reduce-motion .bd-p { display: none; }

/* Lớp hạt trước nội dung (~20% hạt rơi/bay): dưới sheet (z 10) và thanh "Có bản mới" (z 30),
   không nhận chạm. Hạt "gần" to hơn và mờ hơn để có chiều sâu mà không che chữ. */
.season-bg--front {
  z-index: 9;
  background: none;
}

.bd-p--near {
  width: calc(var(--size) * 1.35);
  height: calc(var(--size) * 1.35);
  opacity: var(--bd-opacity-near);
}

/* Trang "Về app" (about.js) — danh sách gạch đầu dòng dễ đọc, link giấy phép phông. */
.about {
  gap: var(--space-6);
}

.about__intro {
  color: var(--text-muted);
}

.about__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  margin: 0;
  padding-left: var(--space-5);
}

.about__links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-4);
}

.about__link,
.home__about-link {
  display: inline-flex;
  align-items: center;
  min-height: 48px;
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-decoration: underline;
}

.home__about-link {
  justify-content: center;
  align-self: center;
}

/* ---------- Thẻ đặc biệt (SPEC.md mục 6.1, 13.5 dòng DAC_BIET) ---------- */

/* Viền trong ánh kim --foil thay cho viền mực (thẻ luôn có thêm .card--foil: viền ngoài + dải sáng). */
.card--special .card__inner {
  gap: var(--space-3);
  border-color: var(--foil);
}

.card__special-icon {
  display: inline-flex;
  align-self: center;
  color: var(--card-ink);
}

.card__special-icon .icon {
  width: 64px;
  height: 64px;
  stroke-width: 1.6;
}

.card__special-name {
  margin: 0;
  font-family: var(--font-card);
  font-size: var(--text-lg);
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.card__special-desc {
  margin: 0;
  font-family: var(--font-ui);
  font-size: var(--text-md);
  font-weight: 600;
  line-height: 1.4;
}

/* Thẻ đặc biệt đang chờ chọn: cao theo nội dung (như .card--quiz). */
.card--grow {
  overflow: visible;
}

.special-result {
  margin: 0;
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-md);
  background: var(--card-ink);
  color: var(--deck-color);
  font-family: var(--font-ui);
  font-size: var(--text-md);
  font-weight: 700;
}

/* Danh sách tên / ô gõ luật ngay trên mặt thẻ. */
.special-choices {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  font-family: var(--font-ui);
}

.special-choices__hint {
  margin: 0;
  font-size: var(--text-md);
  font-weight: 700;
}

.special-choices__note {
  margin: 0;
  font-size: var(--text-sm);
}

.special-choices__list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
}

.special-choices__input {
  flex: 0 0 auto;
}

.card-extra__special {
  color: var(--card-ink);
}

/* Biểu tượng lá đang giữ trên chip người chơi — nút riêng, chạm tên vẫn mở Bàn chơi. */
.strip-chip__held {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  min-width: var(--tap-min);
  min-height: var(--tap-min);
  margin-right: 2px;
  padding: 0 var(--space-2);
  border: 1px solid var(--foil);
  border-radius: var(--radius-pill);
  background: var(--surface);
  color: var(--foil);
}

.strip-chip__held .icon {
  width: 16px;
  height: 16px;
}

/* Sheet "Thẻ đang giữ". */
.held-sheet__half {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.held-sheet--table .held-sheet__half--top {
  padding-bottom: var(--space-3);
  border-bottom: 1px dashed var(--border);
  transform: rotate(180deg);
}

.held-card {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: start;
  gap: var(--space-3);
  padding: var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface-raised);
}

.held-card__icon .icon {
  width: 32px;
  height: 32px;
  color: var(--foil);
}

.held-card__text {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
}

.held-card__name {
  margin: 0;
  font-weight: 700;
}

.held-card__use {
  min-height: var(--tap-min);
}

.held-card__reveal {
  align-self: flex-start;
  min-height: var(--tap-min);
  user-select: none;
  -webkit-user-select: none;
  touch-action: none;
}

.held-card__mission {
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-sm);
  background: var(--card-ink);
  color: var(--foil);
  font-weight: 700;
}

.held-card__mission.is-hidden {
  display: none;
}

/* Bánh xe Vòng quay (play/special.js): quay ~5 giây rồi dừng ô người trúng dưới kim chỉ ở đỉnh.
   Chỉ animate transform; góc dừng giữ bằng --wheel-angle. */
.wheel {
  position: relative;
  align-self: center;
  width: 168px;
  height: 168px;
}

.wheel__disc {
  display: block;
  width: 100%;
  height: 100%;
  transform: rotate(var(--wheel-angle, 0deg));
  filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.35));
}

.wheel__seg {
  stroke: var(--card-ink);
  stroke-width: 2;
}

.wheel__seg--a {
  fill: var(--card-ink);
}

.wheel__seg--b {
  fill: var(--highlight);
}

.wheel__seg--c {
  fill: var(--foil);
}

.wheel__name {
  font-family: var(--font-ui);
  font-weight: 700;
}

.wheel__seg--a + .wheel__name {
  fill: var(--deck-color);
}

.wheel__seg--b + .wheel__name,
.wheel__seg--c + .wheel__name {
  fill: var(--card-ink);
}

.wheel__hub {
  fill: var(--foil);
  stroke: var(--card-ink);
  stroke-width: 3;
}

/* Kim chỉ cố định ở đỉnh, không quay theo bánh xe. */
.wheel__pointer {
  position: absolute;
  top: -6px;
  left: 50%;
  width: 0;
  height: 0;
  border-right: 10px solid transparent;
  border-left: 10px solid transparent;
  border-top: 18px solid var(--foil);
  transform: translateX(-50%);
  filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.4));
}

/* Dòng kết quả giấu tới khi bánh xe dừng. */
.special-result.is-pending {
  opacity: 0;
}

/* Thanh "Lỡ tay? Quay lại" / "Chơi lại thẻ này" (SPEC 7.3): nằm trong dòng chảy ở đáy màn chơi,
   không phủ lên thẻ hay nút Đổi phạt. */
.undo-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-2) var(--space-3);
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-pill);
  background: var(--surface-raised);
  color: var(--text-muted);
  font-size: var(--text-sm);
}

.undo-bar__btn {
  min-height: var(--tap-min);
}

.play--table .undo-bar {
  align-self: center;
}

/* Chế độ thường: thanh hoàn tác nằm ngay dưới thẻ, trong dòng chảy — không đè thẻ, không đè nút
   Đổi phạt, luôn trong màn hình. Giữ chỗ cả khi ẩn (visibility) để các nút bên dưới không nhảy. */
.play:not(.play--table) .undo-bar {
  align-self: center;
  width: max-content;
  max-width: 100%;
}

.play:not(.play--table) .undo-bar.is-hidden {
  display: flex !important;
  visibility: hidden;
}
