/* Fonts loaded from Google Fonts in index.html */



  /* =========================================================
     TOKENS DÙNG CHUNG (không phụ thuộc theme)
     ========================================================= */
  :root{
    --sp-1:6px; --sp-2:10px; --sp-3:16px; --sp-4:24px;
    --sp-5:36px; --sp-6:52px; --sp-7:80px;
    --maxw:1440px;
    --header-h:68px;
    --radius-pill:999px;

    /* JOB_29 VFX Tokens */
    --fx-tap-scale: 0.92;       /* co nhẹ khi nhấn */
    --fx-trail-color: var(--accent);
    --fx-trail-life: 500ms;     /* thời gian 1 hạt tồn tại rồi biến mất */
    --fx-trail-size: 4px;
    --fx-haptic-ms: 15;         /* độ dài rung (ms), truyền vào navigator.vibrate */

    /* JOB_30 Shop Slot Display Settings */
    --item-slot-max: 78px;
    --item-slot-icon: 30px;

    /* Fallback theme variables (default to pro values, scanline hidden) */
    --bg:#06080f;
    --bg-2:#080b16;
    --surface:#0d1220;
    --surface-2:#121a2c;
    --surface-3:#19243c;
    --border:rgba(0,229,255,.16);
    --border-strong:rgba(124,58,237,.4);
    --text:#e9eef9;
    --text-muted:#8b97b3;
    --text-faint:#5b6788;
    --accent:#00e5ff;
    --accent-2:#7c3aed;
    --brand:#ff2e63;
    --on-accent:#04181f;
    --on-brand:#ffffff;
    --on-primary:#ffffff;
    --grad-primary:linear-gradient(135deg,var(--accent-2),var(--brand));
    --grad-accent:linear-gradient(135deg,var(--accent),#3df0ff);
    --grad-brandtext:linear-gradient(92deg,var(--accent),var(--accent-2) 55%,var(--brand));
    --radius:8px;
    --radius-lg:12px;
    --radius-sm:5px;
    --font-display:"Chakra Petch","Exo 2","Inter",sans-serif;
    --font-body:"Inter",system-ui,sans-serif;
    --display-ls:.5px;
    --display-weight:800;
    --label-tt:uppercase;
    --label-ls:1.2px;
    --glow-accent:0 0 0 1px color-mix(in srgb,var(--accent) 50%,transparent), 0 6px 26px -6px color-mix(in srgb,var(--accent) 65%,transparent), 0 0 70px -15px color-mix(in srgb,var(--accent) 30%,transparent);
    --glow-brand:0 0 0 1px color-mix(in srgb,var(--brand) 55%,transparent), 0 8px 26px -6px color-mix(in srgb,var(--brand) 60%,transparent), 0 0 70px -15px color-mix(in srgb,var(--brand) 30%,transparent);
    --glow-hover-accent:0 0 0 1px color-mix(in srgb,var(--accent) 70%,transparent), 0 14px 40px -8px color-mix(in srgb,var(--accent) 85%,transparent), 0 0 100px -15px color-mix(in srgb,var(--accent) 45%,transparent);
    --glow-hover-brand:0 0 0 1px color-mix(in srgb,var(--brand) 70%,transparent), 0 14px 40px -8px color-mix(in srgb,var(--brand) 80%,transparent), 0 0 100px -15px color-mix(in srgb,var(--brand) 40%,transparent);
    --shadow-sm:0 3px 12px -5px rgba(0,0,0,.7);
    --shadow:0 12px 34px -14px rgba(0,0,0,.85);
    --shadow-lg:0 26px 64px -26px rgba(0,0,0,.9);
    --grid-color:rgba(0,229,255,.07);
    --grid-size:40px;
    --scanline:0;
    --ease:cubic-bezier(.2,.7,.2,1);
    --dur:.14s;
    --hover-lift:-5px;
    --success:#22c55e;
  }

  /* ===== BREAKPOINT CHUẨN (04.00 §7.2) — MỌI @media MỚI PHẢI DÙNG ĐÚNG 1 TRONG 3 SỐ NÀY ===== */
  /* Mobile: max-width: 600px | Tablet: 601px – 1024px | Desktop: > 1024px */

  /* Canvas overlay for particle trail */
  #vfxTrailCanvas {
    position: fixed;
    inset: 0;
    z-index: 1100;
    pointer-events: none;
  }

  /* =========================================================
     THEME · KID  (Arcade Kid — MẶC ĐỊNH, cho trẻ em)
     Vui tươi, tròn trịa, neon dịu, nền xanh đêm.
     ========================================================= */
  [data-theme="kid"]{
    --bg:#0b1020;
    --bg-2:#0d142a;
    --surface:#141a30;
    --surface-2:#1a2240;
    --surface-3:#212a4d;
    --border:rgba(148,163,184,.16);
    --border-strong:rgba(148,163,184,.30);

    --text:#e5e7eb;
    --text-muted:#94a3b8;
    --text-faint:#64748b;

    --accent:#22d3ee;     /* cyan */
    --accent-2:#f472b6;   /* hồng */
    --brand:#fbbf24;      /* vàng-cam ấm — Cửu Long */

    --on-accent:#04222b;
    --on-brand:#1a1206;
    --on-primary:#1a1206;

    --grad-primary:linear-gradient(135deg,var(--brand),#ffd470);
    --grad-accent:linear-gradient(135deg,var(--accent),#7af0ff);
    --grad-brandtext:linear-gradient(92deg,var(--accent),var(--accent-2) 60%,var(--brand));

    --radius:20px;
    --radius-lg:28px;
    --radius-sm:12px;

    --font-display:"Baloo 2","Inter",sans-serif;
    --font-body:"Inter",system-ui,sans-serif;
    --display-ls:-.4px;
    --display-weight:800;
    --label-tt:none;
    --label-ls:.2px;

    --glow-accent:0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent), 0 8px 32px -8px color-mix(in srgb,var(--accent) 45%,transparent), 0 0 60px -20px color-mix(in srgb,var(--accent) 20%,transparent);
    --glow-brand:0 0 0 1px color-mix(in srgb,var(--brand) 40%,transparent), 0 10px 30px -6px color-mix(in srgb,var(--brand) 50%,transparent), 0 0 60px -20px color-mix(in srgb,var(--brand) 25%,transparent);
    --glow-hover-accent:0 0 0 1px color-mix(in srgb,var(--accent) 55%,transparent), 0 16px 48px -10px color-mix(in srgb,var(--accent) 70%,transparent), 0 0 80px -20px color-mix(in srgb,var(--accent) 30%,transparent);
    --glow-hover-brand:0 0 0 1px color-mix(in srgb,var(--brand) 60%,transparent), 0 16px 48px -10px color-mix(in srgb,var(--brand) 75%,transparent), 0 0 80px -20px color-mix(in srgb,var(--brand) 35%,transparent);
    --shadow-sm:0 4px 14px -6px rgba(0,0,0,.55);
    --shadow:0 14px 40px -16px rgba(0,0,0,.7);
    --shadow-lg:0 30px 70px -28px rgba(0,0,0,.8);

    --grid-color:rgba(148,163,184,.06);
    --grid-size:46px;
    --scanline:0;

    --ease:cubic-bezier(.2,.9,.3,1.4);
    --dur:.22s;
    --hover-lift:-7px;
    --success:#34d399;
  }

  /* =========================================================
     THEME · PRO  (Cyber Pro — cho thanh niên, chất esports)
     Tối sâu, sắc cạnh, tương phản cao, sci-fi/đấu trường.
     ========================================================= */
  [data-theme="pro"]{
    --bg:#06080f;
    --bg-2:#080b16;
    --surface:#0d1220;
    --surface-2:#121a2c;
    --surface-3:#19243c;
    --border:rgba(0,229,255,.16);
    --border-strong:rgba(124,58,237,.4);

    --text:#e9eef9;
    --text-muted:#8b97b3;
    --text-faint:#5b6788;

    --accent:#00e5ff;     /* cyan điện */
    --accent-2:#7c3aed;   /* tím */
    --brand:#ff2e63;      /* crimson nhấn */

    --on-accent:#04181f;
    --on-brand:#ffffff;
    --on-primary:#ffffff;

    --grad-primary:linear-gradient(135deg,var(--accent-2),var(--brand));
    --grad-accent:linear-gradient(135deg,var(--accent),#3df0ff);
    --grad-brandtext:linear-gradient(92deg,var(--accent),var(--accent-2) 55%,var(--brand));

    --radius:8px;
    --radius-lg:12px;
    --radius-sm:5px;

    --font-display:"Chakra Petch","Exo 2","Inter",sans-serif;
    --font-body:"Inter",system-ui,sans-serif;
    --display-ls:.5px;
    --display-weight:800;
    --label-tt:uppercase;
    --label-ls:1.2px;

    --glow-accent:0 0 0 1px color-mix(in srgb,var(--accent) 50%,transparent), 0 6px 26px -6px color-mix(in srgb,var(--accent) 65%,transparent), 0 0 70px -15px color-mix(in srgb,var(--accent) 30%,transparent);
    --glow-brand:0 0 0 1px color-mix(in srgb,var(--brand) 55%,transparent), 0 8px 26px -6px color-mix(in srgb,var(--brand) 60%,transparent), 0 0 70px -15px color-mix(in srgb,var(--brand) 30%,transparent);
    --glow-hover-accent:0 0 0 1px color-mix(in srgb,var(--accent) 70%,transparent), 0 14px 40px -8px color-mix(in srgb,var(--accent) 85%,transparent), 0 0 100px -15px color-mix(in srgb,var(--accent) 45%,transparent);
    --glow-hover-brand:0 0 0 1px color-mix(in srgb,var(--brand) 70%,transparent), 0 14px 40px -8px color-mix(in srgb,var(--brand) 80%,transparent), 0 0 100px -15px color-mix(in srgb,var(--brand) 40%,transparent);
    --shadow-sm:0 3px 12px -5px rgba(0,0,0,.7);
    --shadow:0 12px 34px -14px rgba(0,0,0,.85);
    --shadow-lg:0 26px 64px -26px rgba(0,0,0,.9);

    --grid-color:rgba(0,229,255,.07);
    --grid-size:40px;
    --scanline:.65;

    --ease:cubic-bezier(.2,.7,.2,1);
    --dur:.14s;
    --hover-lift:-5px;
    --success:#22c55e;
  }

  /* =========================================================
     THEME · CYBERPUNK (Cyberpunk Panoramic Environment)
     Khối CSS thiết kế độc lập cho theme Cyberpunk.
     Art Director/Coder có thể tùy biến các biến CSS ở đây:
     ========================================================= */
  [data-theme="cyberpunk"] {
    /* Ví dụ đổi màu chủ đạo cyberpunk:
    --bg: #09011a;
    --bg-2: #0e0229;
    --surface: #17043a;
    --surface-2: #21074e;
    --border: rgba(0, 255, 153, 0.2);
    --accent: #00ff99; 
    --accent-2: #ff007f;
    --brand: #ff0055;
    --scanline: 0.15;
    */
  }

  /* =========================================================
     THEME · NOSTALGIA (Nostalgia/Hồi Ức Panoramic Environment)
     Khối CSS thiết kế độc lập cho theme Hồi Ức.
     Art Director/Coder có thể tùy biến các biến CSS ở đây:
     ========================================================= */
  [data-theme="nostalgia"] {
    /* Ví dụ đổi màu hoài cổ ấm áp:
    --bg: #1c1512;
    --bg-2: #241c18;
    --surface: #2d231e;
    --surface-2: #3a2e27;
    --border: rgba(217, 119, 70, 0.2);
    --accent: #d97746;
    --accent-2: #b45309;
    --brand: #f59e0b;
    --scanline: 0.3;
    */
  }

  /* =========================================================
     RESET
     ========================================================= */
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
  html{scroll-behavior:smooth}
  /* Chặn Pull-to-Refresh nhầm khi cuộn hết nội dung bên trong 1 popup (Cửa Hàng,
     Xóm Làng, Rương, Bộ Sưu Tập Thần Thú, Sách Thần Thú...). Mỗi popup có khung
     cuộn nội bộ riêng (.village-modal-body, #inventoryModalContent,
     .pet-collection-body, .pet-guide-body...) — khi người dùng vuốt hết cỡ khung
     đó, trình duyệt "chuyền" động tác cuộn dư lên body/html rồi hiểu nhầm thành
     cử chỉ kéo-làm-mới-trang. Chặn tại gốc html+body 1 lần, không cần vá riêng
     từng popup — tự động áp dụng cho cả popup thêm sau này. Đồng bộ tinh thần
     overscroll-behavior-x đã dùng cho trang game (chặn vuốt-cạnh back/forward).
     Không ảnh hưởng cuộn dọc bình thường của trang, chỉ chặn hành vi "bật lại"
     ở đúng 2 đầu mút trên/dưới. */
  html, body{overscroll-behavior-y:contain}
  body{
    font-family:var(--font-body);
    background:var(--bg);
    color:var(--text);
    line-height:1.6;
    -webkit-font-smoothing:antialiased;
    overflow-x:hidden;
    position:relative;
    min-height:100vh;
    transition:background .4s ease, color .4s ease;
  }
  /* Ánh sáng nền mạnh hơn, gamer feel */
  body::before{
    content:"";position:fixed;inset:0;z-index:-2;
    background:
      radial-gradient(65% 55% at 8% -8%, color-mix(in srgb,var(--accent) 22%,transparent), transparent 60%),
      radial-gradient(60% 50% at 96% -4%, color-mix(in srgb,var(--accent-2) 22%,transparent), transparent 60%),
      radial-gradient(75% 60% at 50% 115%, color-mix(in srgb,var(--brand) 16%,transparent), transparent 60%),
      radial-gradient(40% 35% at 50% 50%, color-mix(in srgb,var(--accent) 6%,transparent), transparent 70%),
      linear-gradient(180deg,var(--bg),var(--bg-2));
    transition:background .4s ease;
  }
  /* Lưới mờ gợi không gian cyber */
  body::after{
    content:"";position:fixed;inset:0;z-index:-1;opacity:.75;
    background-image:
      linear-gradient(var(--grid-color) 1px,transparent 1px),
      linear-gradient(90deg,var(--grid-color) 1px,transparent 1px);
    background-size:var(--grid-size) var(--grid-size);
    mask-image:radial-gradient(90% 70% at 50% 25%,#000,transparent 90%);
  }
  /* Scanline tinh tế — chỉ hiện ở theme Pro (qua --scanline) */
  .fx-scanline{
    position:fixed;inset:0;z-index:-1;pointer-events:none;
    opacity:var(--scanline);
    background:repeating-linear-gradient(180deg,transparent 0 2px,rgba(0,0,0,.45) 2px 3px);
    mix-blend-mode:overlay;
  }

  img{max-width:100%;display:block}
  .currency-icon {
    display: inline-block !important;
    width: 1.2em;
    height: 1.2em;
    vertical-align: -0.15em;
    object-fit: contain;
  }
  button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
  a{color:inherit;text-decoration:none}
  ul{list-style:none}

  h1,h2,h3,h4,.font-display{
    font-family:var(--font-display);
    line-height:1.15;
    letter-spacing:var(--display-ls);
  }

  /* Focus rõ ràng, dễ thấy cho trẻ em */
  :focus-visible{outline:3px solid var(--accent);outline-offset:3px;border-radius:8px}

  .wrap{width:100%;max-width:var(--maxw);margin-inline:auto;padding-inline:clamp(12px,2.5vw,40px)}

  /* ===== Nút bấm (>=44px) ===== */
  .btn{
    display:inline-flex;align-items:center;justify-content:center;gap:9px;
    min-height:40px;padding:0 18px;border-radius:var(--radius-pill);
    font-weight:700;font-size:14px;letter-spacing:var(--label-ls);
    text-transform:var(--label-tt);
    transition:transform var(--dur) var(--ease), box-shadow var(--dur) ease, background var(--dur) ease, color var(--dur) ease;
    white-space:nowrap;
    /* Loại bỏ độ trễ ~300ms trước khi trình duyệt phát click thật trên di động
       (nó chờ xem có phải double-tap-zoom không) và tắt hẳn double-tap-zoom
       trên chính nút — nguồn gây hành vi bấm "lạ"/kép khó tái hiện lại được
       trên nút bấm di động. Áp dụng toàn site vì mọi nút đều dùng class này. */
    touch-action:manipulation;
  }
  .btn:active{transform:translateY(1px) scale(var(--fx-tap-scale, 0.92))}
  /* `.btn{display:inline-flex}` is an author rule, so it silently beats the
     browser's default `[hidden]{display:none}` (author styles always win over
     UA styles regardless of specificity) — any code doing `btn.hidden = true`
     on a `.btn` element stays fully visible AND clickable. Real bug found
     2026-08-07: the Pet Species modal's Save button stayed on-screen after
     switching to its Assets step, so a second click silently re-submitted the
     form. Force it here once, site-wide, instead of chasing this per-button. */
  .btn[hidden]{display:none!important}

  /* Scale co nhẹ khi nhấn cho các phần tử có thuộc tính vfx-tap */
  [data-vfx-tap] {
    transition: transform var(--dur, 0.15s) var(--ease, ease);
  }
  [data-vfx-tap]:active {
    transform: scale(var(--fx-tap-scale, 0.92)) !important;
  }

  .btn-primary{color:var(--on-primary);background:var(--grad-primary);box-shadow:var(--glow-brand)}
  .btn-primary:hover{transform:translateY(-3px) scale(1.02);box-shadow:var(--glow-hover-brand)}

  .btn-accent{color:var(--on-accent);background:var(--grad-accent);box-shadow:var(--glow-accent)}
  .btn-accent:hover{transform:translateY(-3px) scale(1.02);box-shadow:var(--glow-hover-accent)}

  .btn-ghost{color:var(--text);background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border)}
  .btn-ghost:hover{background:var(--surface-3);box-shadow:inset 0 0 0 1px var(--border-strong),0 8px 24px -8px rgba(0,0,0,.5);transform:translateY(-2px)}

  .btn-lg{min-height:60px;padding:0 34px;font-size:18px}

  /* JOB_31 — Nút nhỏ gọn (khắc phục .btn-sm chưa từng được định nghĩa) */
  .btn-sm {
    min-height: 34px;
    padding: 0 14px;
    font-size: 13px;
    gap: 6px;
  }
  /* JOB_31 — Nút ICON hành động vuông nhỏ (Edit/Delete/Search... trong bảng) */
  .btn-icon {
    position: relative;
    min-height: 32px;
    width: 32px;
    padding: 0;
    font-size: 15px;
    border-radius: var(--radius-sm);
    flex-shrink: 0;
  }
  /* NV2: Vùng chạm vô hình expanded hit-slop (tối thiểu 44px) cho thiết bị di động/màn hình cảm ứng */
  .btn-icon::before {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 44px;
    height: 44px;
    pointer-events: auto;
  }
  .btn-icon.danger { color: var(--accent-2); box-shadow: inset 0 0 0 1px var(--accent-2); }

  .chip{
    display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 13px;
    border-radius:var(--radius-pill);font-size:12.5px;font-weight:600;
    letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border);color:var(--text-muted);
    transition:background .18s ease, box-shadow .18s ease, color .18s ease;
  }
  .chip:hover{
    background:var(--surface-3);
    box-shadow:inset 0 0 0 1px var(--border-strong),0 4px 16px -6px color-mix(in srgb,var(--accent) 25%,transparent);
    color:var(--text);
  }

  /* =========================================================
     HEADER
     ========================================================= */
  .site-header{
    position:sticky;top:0;z-index:50;height:var(--header-h);display:flex;align-items:center;
    background:color-mix(in srgb,var(--bg) 78%,transparent);
    backdrop-filter:blur(20px) saturate(160%);
    border-bottom:1px solid var(--border);
    box-shadow:0 1px 0 0 color-mix(in srgb,var(--accent) 10%,transparent), 0 4px 24px -8px rgba(0,0,0,.4);
  }
  .header-inner{display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}

  .logo{display:flex;align-items:center;gap:12px;flex-shrink:0}
  .logo-mark{
    width:46px;height:46px;flex-shrink:0;display:grid;place-items:center;font-size:26px;
    border-radius:var(--radius-sm);
    background:radial-gradient(120% 120% at 30% 20%,var(--surface-3),var(--bg-2));
    box-shadow:var(--glow-accent), inset 0 0 18px color-mix(in srgb,var(--accent) 25%,transparent);
    animation:floaty 4s ease-in-out infinite;
  }
  @keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
  .logo-text{display:flex;flex-direction:column;line-height:1}
  .logo-text b{
    font-family:var(--font-display);font-weight:800;font-size:19px;letter-spacing:.3px;
    background:var(--grad-brandtext);-webkit-background-clip:text;background-clip:text;color:transparent;
  }
  .logo-text span{font-size:11px;color:var(--text-muted);font-weight:600;letter-spacing:1.5px;text-transform:uppercase}

  .header-tools{display:flex;align-items:center;gap:12px}

  /* Nút gạt theme (demo) */
  .theme-switch{display:flex;gap:4px;padding:4px;border-radius:var(--radius-pill);background:var(--bg-2);box-shadow:inset 0 0 0 1px var(--border)}
  .theme-switch button{
    min-height:36px;padding:0 14px;border-radius:var(--radius-pill);
    font-size:12.5px;font-weight:700;color:var(--text-muted);
    letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    transition:all var(--dur) var(--ease);
  }
  .theme-switch button[aria-pressed="true"]{color:var(--on-accent);background:var(--grad-accent);box-shadow:var(--glow-accent)}

  /* Nút chọn ngôn ngữ — trigger dùng .btn/.btn-ghost/.btn-sm chuẩn, dropdown dùng .dropdown-menu chuẩn */
  #langDropdown [data-lang][aria-pressed="true"]{color:var(--on-accent);background:var(--grad-accent);box-shadow:var(--glow-accent)}

  .account{display:flex;align-items:center;gap:10px;flex-shrink:0}
  .auth-trigger{display:flex;gap:10px}
  .auth-trigger.hide{display:none}

  .user-box{display:none;align-items:center;gap:12px}
  .user-box.show{display:flex}
  .user-pill{
    display:flex;align-items:center;gap:10px;padding:6px 8px 6px 6px;
    background:var(--surface-2);border-radius:var(--radius-pill);box-shadow:inset 0 0 0 1px var(--border);
    flex-shrink:0;
    transition: transform var(--dur) var(--ease), background var(--dur) ease, box-shadow var(--dur) ease;
  }
  .user-pill:hover {
    transform: translateY(-2.5px);
    background: var(--surface-3) !important;
    box-shadow: inset 0 0 0 1px var(--border-strong) !important;
  }
  .user-pill:active {
    transform: translateY(0);
  }
  .avatar{
    width:36px;height:36px;border-radius:50%;flex-shrink:0;display:grid;place-items:center;font-size:18px;
    background:var(--grad-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-2) 40%,transparent);
    position:relative; /* JOB_51 follow-up — làm điểm neo cho .avatar-frame-overlay ở Header, đúng khuôn .board-av */
  }
  .user-name{
    font-weight:700;font-size:14px;padding-right:4px;
    white-space:nowrap;
    max-width:140px;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .avatar-menu-container{flex-shrink:0}

  /* Interactive Header Elements Polish */
  .balance-chip {
    cursor: pointer;
    transition: transform var(--dur) var(--ease), background var(--dur) ease, box-shadow var(--dur) ease;
  }
  .balance-chip:hover {
    transform: translateY(-2px);
    background: var(--surface-3) !important;
    box-shadow: inset 0 0 0 1px var(--border-strong) !important;
  }
  .balance-chip:active {
    transform: translateY(0);
  }

  .energy-widget {
    transition: transform var(--dur) var(--ease), background var(--dur) ease, box-shadow var(--dur) ease;
  }
  .energy-widget:hover {
    transform: translateY(-2px);
    background: var(--surface-3) !important;
    box-shadow: inset 0 0 0 1px var(--border-strong) !important;
  }
  .energy-widget:active {
    transform: translateY(0);
  }

  /* Dropdown Menu styling and animation */
  .dropdown-menu {
    animation: dropdownFadeIn 0.2s cubic-bezier(0.16, 1, 0.3, 1) !important;
  }
  @keyframes dropdownFadeIn {
    from { opacity: 0; transform: translateY(-8px); }
    to { opacity: 1; transform: translateY(0); }
  }
  .dropdown-menu .btn {
    border: 1px solid transparent !important;
    transition: background var(--dur) ease, color var(--dur) ease, border-color var(--dur) ease !important;
  }
  .dropdown-menu .btn:hover {
    background: var(--surface-2) !important;
    border-color: var(--border-strong) !important;
    transform: none !important;
  }

  /* Responsive Spacing & Header Controls */
  /* [Micro-Adjustment] Chỉnh khoảng cách các nút header tránh đè nhau trên màn nhỏ */
  @media (max-width: 860px) {
    .header-inner { gap: 8px !important; }
    .header-tools { gap: 6px !important; }
    .user-box { gap: 8px !important; }
    .header-status { gap: 6px !important; }
  }
  /* [Micro-Adjustment] Ẩn chuyển ngôn ngữ khi màn hình nhỏ hơn 680px */
  @media (max-width: 680px) {
    .lang-switch { display: none !important; }
  }
  /* [Micro-Adjustment] Ẩn text logo để ưu tiên các nút chức năng chính */
  @media (max-width: 520px) {
    .logo-text { display: none !important; }
    .chip { padding: 0 8px !important; gap: 4px !important; }
  }

  /* Header hẹp (điện thoại dọc, tablet/desktop thu cửa sổ): chỉ giữ x/y. */
  @media (max-width: 600px) {
    .energy-widget { padding: 4px 8px !important; gap: 4px !important; }
    .energy-widget .energy-header-icon,
    .energy-widget .energy-bar-outer,
    .energy-widget #headerRegenTimer { display: none !important; }
  }

  /* =========================================================
     HERO
     ========================================================= */
  .hero{position:relative;padding:clamp(22px,3.5vw,44px) 0 clamp(18px,3vw,32px)}
  .hero-inner{display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(24px,5vw,56px);align-items:center}
  .hero-badge{
    display:inline-flex;align-items:center;gap:8px;margin-bottom:18px;height:34px;padding:0 15px;
    border-radius:var(--radius-pill);font-size:13px;font-weight:600;color:var(--accent);
    letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    background:color-mix(in srgb,var(--accent) 14%,transparent);
    box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 32%,transparent);
  }
  .hero h1{font-size:clamp(34px,6vw,58px);font-weight:var(--display-weight);margin-bottom:18px}
  .hero h1 .brand{background:var(--grad-primary);-webkit-background-clip:text;background-clip:text;color:transparent}
  .hero h1 .neon{background:var(--grad-brandtext);-webkit-background-clip:text;background-clip:text;color:transparent}
  .hero p.lead{font-size:clamp(16px,2vw,19px);color:var(--text-muted);max-width:46ch;margin-bottom:30px}
  .hero-cta{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
  .hero-stats{display:flex;gap:26px;margin-top:34px;flex-wrap:wrap}
  .hero-stats .stat b{display:block;font-family:var(--font-display);font-weight:800;font-size:26px;color:var(--text)}
  .hero-stats .stat span{font-size:13px;color:var(--text-muted)}

  .hero-art{position:relative;display:grid;place-items:center;min-height:280px}
  .dragon-orb{
    width:min(320px,80%);aspect-ratio:1;border-radius:50%;display:grid;place-items:center;
    font-size:clamp(110px,18vw,160px);position:relative;
    background:
      radial-gradient(60% 60% at 35% 30%,color-mix(in srgb,var(--accent) 38%,transparent),transparent 60%),
      radial-gradient(60% 60% at 70% 75%,color-mix(in srgb,var(--accent-2) 35%,transparent),transparent 60%),
      radial-gradient(120% 120% at 50% 50%,var(--surface-3),var(--bg-2));
    box-shadow:var(--glow-accent),var(--shadow-lg);
    animation:floaty 5s ease-in-out infinite;
  }
  .dragon-orb::after{
    content:"";position:absolute;inset:-2px;border-radius:50%;z-index:-1;filter:blur(22px);opacity:.45;
    background:conic-gradient(from 0deg,var(--accent),var(--accent-2),var(--brand),var(--accent));
    animation:spin 14s linear infinite;
  }
  @keyframes spin{to{transform:rotate(360deg)}}
  .orbit{
    position:absolute;font-size:30px;background:var(--surface-2);width:58px;height:58px;border-radius:var(--radius);
    display:grid;place-items:center;
    box-shadow:var(--shadow),inset 0 0 0 1px var(--border-strong),0 0 20px -8px color-mix(in srgb,var(--accent) 40%,transparent);
    animation:floaty 4s ease-in-out infinite;
    transition:box-shadow .3s ease, transform .3s ease;
  }
  .orbit:hover{box-shadow:var(--shadow-lg),inset 0 0 0 1px var(--border-strong),var(--glow-accent);transform:scale(1.15)!important}
  .orbit.o1{top:6%;right:14%;animation-delay:.4s}
  .orbit.o2{bottom:10%;left:6%;animation-delay:1.1s}
  .orbit.o3{bottom:26%;right:4%;animation-delay:.8s}

  /* =========================================================
     SECTIONS chung
     ========================================================= */
  .section{padding:clamp(20px,3vw,36px) 0}
  .section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;margin-bottom:clamp(20px,3vw,30px);flex-wrap:wrap}
  .section-head h2{font-size:clamp(24px,3.6vw,34px);font-weight:var(--display-weight);display:flex;align-items:center;gap:12px}
  .section-head p{color:var(--text-muted);font-size:14.5px;margin-top:4px}
  .section-emoji{
    width:46px;height:46px;border-radius:var(--radius-sm);display:grid;place-items:center;font-size:24px;
    background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border),0 0 20px -8px color-mix(in srgb,var(--accent) 30%,transparent);
    transition:box-shadow .3s ease, transform .3s ease;
  }
  .section-emoji:hover{transform:scale(1.1) rotate(-5deg);box-shadow:inset 0 0 0 1px var(--border-strong),var(--glow-accent)}

  /* =========================================================
     GAME GRID
     ========================================================= */
  .group{margin-bottom:clamp(34px,5vw,52px)}
  .group-head{display:flex;align-items:center;gap:12px;margin-bottom:18px;flex-wrap:wrap}
  .group-head h3{font-size:clamp(18px,2.6vw,23px);font-weight:700}
  .group-head .count{font-size:13px;color:var(--text-faint);font-weight:600}
  .group-bar{flex:1;height:1px;background:linear-gradient(90deg,var(--border-strong),transparent);min-width:30px}

  .game-grid{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(232px,1fr))}

  .card{
    position:relative;background:var(--surface);border-radius:var(--radius);overflow:hidden;
    box-shadow:var(--shadow-sm),inset 0 0 0 1px var(--border);
    transition:transform var(--dur) var(--ease), box-shadow var(--dur) ease;
    display:flex;flex-direction:column;
  }
  /* mouse-light glow effect on card hover */
  .card::before{
    content:"";position:absolute;inset:0;z-index:0;pointer-events:none;opacity:0;
    background:radial-gradient(circle at var(--mx,50%) var(--my,0%), color-mix(in srgb,var(--accent) 18%,transparent) 0%, transparent 60%);
    transition:opacity .3s ease;
    border-radius:inherit;
  }
  .card:hover::before{opacity:1}
  .card > *{position:relative;z-index:1}
  .card:hover{transform:translateY(var(--hover-lift));box-shadow:var(--shadow),inset 0 0 0 1px var(--border-strong),0 0 40px -15px color-mix(in srgb,var(--accent) 25%,transparent)}

  .card-thumb{aspect-ratio:16/10;position:relative;display:grid;place-items:center;font-size:54px;overflow:hidden}
  .card-thumb::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 45%,color-mix(in srgb,var(--surface) 85%,transparent))}
  .card-thumb .emoji{position:relative;z-index:1;filter:drop-shadow(0 8px 16px rgba(0,0,0,.4));transition:transform .3s var(--ease)}
  .card:hover .card-thumb .emoji{transform:scale(1.12) rotate(-4deg)}

  .badge-genre{
    position:absolute;top:10px;left:10px;z-index:2;height:22px;padding:0 8px;border-radius:var(--radius-pill);
    font-size:10.5px;font-weight:700;letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    background:color-mix(in srgb,var(--bg) 70%,transparent);backdrop-filter:blur(6px);
    box-shadow:inset 0 0 0 1px rgba(255,255,255,.14);color:#fff;display:inline-flex;align-items:center;
  }
  .badge-live{
    position:absolute;top:10px;right:10px;z-index:2;height:22px;padding:0 8px 0 7px;border-radius:var(--radius-pill);
    font-size:10px;font-weight:800;letter-spacing:.4px;display:inline-flex;align-items:center;gap:4px;
    background:var(--accent);color:var(--on-accent);
  }
  .badge-live .dot{width:5px;height:5px;border-radius:50%;background:currentColor;animation:pulse 1.4s ease-in-out infinite}
  @keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}
  .badge-soon{
    position:absolute;top:10px;right:10px;z-index:2;height:22px;padding:0 8px;border-radius:var(--radius-pill);
    font-size:10px;font-weight:700;letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    background:color-mix(in srgb,var(--bg) 70%,transparent);backdrop-filter:blur(6px);
    box-shadow:inset 0 0 0 1px rgba(255,255,255,.16);color:var(--text-muted);display:inline-flex;align-items:center;
  }

  /* 2026-07-13 — Owner phản hồi: thu gọn đệm trên/dưới .card-body để tăng diện tích hiển thị ảnh
     đại diện (.card-thumb tỉ lệ cố định aspect-ratio:16/10 theo chiều rộng cột — thẻ tổng thể
     thấp lại thì ảnh chiếm tỉ trọng chiều cao LỚN HƠN). Đồng thời bỏ hẳn .card-meta ("Luyện trí
     não"/"Báo tôi khi mở") khỏi mọi thẻ game (đã gỡ khỏi HTML ở index.js). Áp dụng CHUNG mọi kích
     thước màn hình (không riêng mobile): Tên Game + nút Chơi/Tiếp tục/Khóa nằm CHUNG 1 hàng thay
     vì xếp dọc — `.card-title` dùng `flex:1` + ellipsis (tên game dài không tràn khỏi hàng, vẫn
     đọc được đầy đủ qua `title=""` đã thêm ở index.js), `.card-foot` không co giãn
     (`flex-shrink:0`) để nút luôn giữ nguyên kích thước. */
  .card-body{padding:8px 14px 10px;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;flex:1}
  .card-title{font-family:var(--font-display);font-weight:700;font-size:16px;line-height:1.25;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .card-foot{margin-top:0;display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-shrink:0}

  .play-btn{
    min-height:36px;padding:0 12px;border-radius:var(--radius-pill);font-weight:800;font-size:12.5px;
    letter-spacing:var(--label-ls);text-transform:var(--label-tt);
    color:var(--on-accent);background:var(--grad-accent);
    box-shadow:0 6px 18px -8px color-mix(in srgb,var(--accent) 70%,transparent);
    transition:transform var(--dur) var(--ease),box-shadow var(--dur) ease;
  }
  .play-btn:hover{transform:translateY(-3px) scale(1.04);box-shadow:var(--glow-hover-accent)}
  /* Nút Chơi/Mở Khóa chỉ icon (2026-07-11) — bỏ text, gọn thành hình tròn, không đụng
     .resume-btn (vẫn giữ text "Tiếp tục", không nằm trong yêu cầu rút gọn). */
  .play-btn.icon-only{width:36px;height:36px;min-height:36px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0}
  /* 2026-07-13 — nhãn nút "Tiếp tục" tách 2 span, mặc định hiện bản đầy đủ; mobile đổi sang
     "Tiếp" (xem @media ≤600px bên dưới) — CSS-driven, không cần JS phát hiện viewport. */
  .resume-label-short{display:none}

  .soon-tag{
    min-height:36px;padding:0 10px;border-radius:var(--radius-pill);font-weight:700;font-size:12px;
    letter-spacing:var(--label-ls);text-transform:var(--label-tt);color:var(--text-muted);
    background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border);display:inline-flex;align-items:center;gap:5px;
    white-space:nowrap;
  }

  .card.soon{opacity:.92}
  .card.soon .card-thumb{filter:saturate(.85)}
  .card.elite{box-shadow:var(--shadow-sm),inset 0 0 0 1px color-mix(in srgb,var(--brand) 22%,transparent)}
  .card.elite:hover{box-shadow:var(--shadow),0 0 0 1px color-mix(in srgb,var(--brand) 40%,transparent)}

  /* =========================================================
     LEADERBOARD
     ========================================================= */
  .board-wrap{display:grid;grid-template-columns:1.3fr .85fr;gap:22px;align-items:start}
  /* JOB_54 — lưới 2×2 (Thập Đại Cao Thủ, Điểm Game, Vàng, Kim Cương) dùng chung cho trang chủ
     và bxh.php, thay thế .board-wrap (game+aside) và .wealth-boards (gold+diamond) cũ. */
  .lb-grid-2x2{display:grid;grid-template-columns:1fr 1fr;gap:22px;align-items:start}
  /* JOB_54 hotfix — .lb-board-header CỐ ĐỊNH chiều cao (khớp khung tiêu đề mặc định) +
     overflow:visible: khi banner (chiều cao do Admin tự chỉnh, có thể LỚN hơn khung) được bật,
     ảnh KHÔNG bị cắt và KHÔNG đẩy khung giãn ra — chỉ tự "tràn" lên phía TRÊN (giống logic
     logo Header vượt khổ `--header-h`), tuyệt đối không tràn xuống dưới đè lên .board-list. */
  .lb-board-header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:nowrap;height:40px;overflow:visible;margin-bottom:16px}
  .lb-board-header.lb-banner-active{align-items:flex-end;justify-content:center}
  .lb-board-title{margin-bottom:0}
  .lb-board-banner{width:auto;max-width:100%;object-fit:contain;border-radius:var(--radius-sm);display:block}
  /* JOB_54 hotfix 2 — dời banner xuống 16px (giảm bớt phần tràn lên trên) theo yêu cầu Owner:
     bxh.php có thanh tab "⚡ Bảng Hiện Tại/📅 Lịch Sử Kỳ" nằm sát ngay trên lưới 2×2 (khác
     index.php có khoảng đệm rộng hơn phía trên) nên banner tràn lên hết cỡ dễ che mất thanh tab
     đó. margin-bottom âm trên item neo flex-end = đẩy item xuống dưới cùng khoảng đó (không phá
     luật "chỉ tràn lên" — chỉ bớt bớt khoảng tràn, phần dôi ra vẫn nằm gọn trong khoảng cách 16px
     đã có sẵn giữa khung tiêu đề và .board-list bên dưới, không đè lên nội dung). */
  .lb-board-header.lb-banner-active .lb-board-banner{margin-bottom:-16px}
  .lb-board-toprow{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:16px}
  .lb-board-toprow .lb-board-header{margin-bottom:0;flex:1 1 auto}
  .panel{
    background:var(--surface);border-radius:var(--radius-lg);
    box-shadow:var(--shadow-sm),inset 0 0 0 1px var(--border);
    padding:clamp(18px,2.5vw,26px);
    transition:box-shadow .3s ease;
  }
  .panel:hover{
    box-shadow:var(--shadow),inset 0 0 0 1px var(--border-strong),0 0 50px -20px color-mix(in srgb,var(--accent) 15%,transparent);
  }
  /* 2026-07-11 — giảm 10% khoảng trống giữa các thứ hạng (gap 10px->9px, padding 13/15->12/14),
     áp dụng cho MỌI bảng xếp hạng dùng chung .board-list/.board-row (BXH trang chủ, bxh.php,
     trong game...), không tách riêng mobile — cùng 1 mức thu gọn ở mọi kích thước màn hình. */
  .board-list{display:flex;flex-direction:column;gap:9px;margin-top:4px}
  .board-row{
    display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:var(--radius-sm);
    background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border);
    transition:transform .18s var(--ease), box-shadow .18s ease, background .18s ease;
  }
  .board-row:hover{transform:translateX(5px);background:var(--surface-3);box-shadow:inset 0 0 0 1px var(--border-strong), 4px 0 20px -8px color-mix(in srgb,var(--accent) 30%,transparent)}

  /* JOB_21 — Highlight cả dòng Top 1/2/3 (không chỉ ô rank), kế thừa .board-row.top-1
     animation rankGlow đã có sẵn ở dòng 999-1008 (KHÔNG xóa/trùng lặp animation đó). */
  .board-row.top-1{
    background:linear-gradient(90deg,color-mix(in srgb,var(--brand) 14%,transparent),transparent 70%);
  }
  .board-row.top-2{
    --metal-gold:#f1c40f; /* JOB_54 — Top 2 đổi bạc→vàng, theo luật Đỏ(1)-Vàng(2)-Trắng(3) */
    background:linear-gradient(90deg,color-mix(in srgb,var(--metal-gold) 16%,transparent),transparent 70%);
    box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--metal-gold) 35%,transparent);
  }
  .board-row.top-3{
    --metal-white:#e2e8f0; /* JOB_54 — Top 3 đổi đồng→trắng, theo luật Đỏ(1)-Vàng(2)-Trắng(3) */
    background:linear-gradient(90deg,color-mix(in srgb,var(--metal-white) 16%,transparent),transparent 70%);
    box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--metal-white) 35%,transparent);
  }

  .crown-badge{
    display:inline-block;
    margin-left:2px;
    font-size:13px;
    transform-origin:center;
    animation:crownPulse 1.8s ease-in-out infinite;
  }
  @keyframes crownPulse{
    0%,100%{ transform:scale(1) rotate(0deg); filter:drop-shadow(0 0 2px color-mix(in srgb,var(--brand) 60%,transparent)); }
    50%{ transform:scale(1.18) rotate(-4deg); filter:drop-shadow(0 0 6px color-mix(in srgb,var(--brand) 80%,transparent)); }
  }

  .board-av[data-uid]{ cursor:pointer; }

  /* JOB_130 — BXH Lực Chiến Thần Thú: gộp cột Thứ Hạng vào góc dưới-phải Avatar để tiết kiệm bề
     ngang trên mobile (bảng này trước đây rộng hơn hẳn các BXH khác vì có thêm cột .rank riêng).
     Wrapper đặt NGOÀI .board-av (không phải bên trong) vì Engine.renderAvatar() ghi đè innerHTML. */
  .pet-power-av-wrap{position:relative;flex-shrink:0;line-height:0}
  .pet-power-rank-badge{
    position:absolute;right:-4px;bottom:-4px;min-width:18px;height:18px;padding:0 3px;
    border-radius:999px;display:grid;place-items:center;font-family:var(--font-display);
    font-weight:800;font-size:10px;background:var(--surface-3);color:var(--text-muted);
    box-shadow:0 0 0 2px var(--surface-2);z-index:3;
  }
  .pet-power-rank-badge.top-1{background:var(--grad-primary);color:var(--on-primary);box-shadow:0 0 0 2px var(--surface-2),var(--glow-brand)}
  .pet-power-rank-badge.top-2{background:linear-gradient(135deg,#f1c40f,#f39c12);color:#3a2a00}
  .pet-power-rank-badge.top-3{background:linear-gradient(135deg,#e2e8f0,#94a3b8);color:#1e293b}
  .board-row.pet-power-row{gap:10px}

  .rank{
    width:38px;height:38px;flex-shrink:0;border-radius:var(--radius-sm);display:grid;place-items:center;
    font-family:var(--font-display);font-weight:800;font-size:16px;background:var(--surface-3);color:var(--text-muted);
  }
  .board-row.top-1 .rank{background:var(--grad-primary);color:var(--on-primary);box-shadow:var(--glow-brand)}
  .board-row.top-2 .rank{background:linear-gradient(135deg,#f1c40f,#f39c12);color:#3a2a00}
  .board-row.top-3 .rank{background:linear-gradient(135deg,#e2e8f0,#94a3b8);color:#1e293b}
  .board-av{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;font-size:20px;background:var(--surface-3);box-shadow:inset 0 0 0 1px var(--border);position:relative}
  /* JOB_49/JOB_51 follow-up — Khung Avatar: PNG nền trong suốt phủ lớn hơn avatar, không chặn
     click/hover. Tăng từ 130%->150% (2026-07-11) — 130% khiến khung trông "lọt thỏm" bên trong
     viền box-shadow mặc định của .avatar/.board-av (Header, Mini Profile), nhất là ở avatar cỡ
     lớn (Mini Profile 72px). */
.avatar-frame-overlay{position:absolute;inset:-25%;pointer-events:none;z-index:2;object-fit:contain;width:150%;height:150%;max-width:none}

/* Game 17 — compact Divine Pet identity in the social mini profile. */
.mini-profile-pet-slot{display:flex;flex-direction:column;align-items:center;gap:3px;max-width:114px;text-align:center;flex-shrink:0;position:relative}
.mini-profile-pet-art{width:92px;height:92px;border-radius:10px;background:var(--surface-2);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 16%,transparent)}
.mini-profile-pet-art.condition-sick,.mini-profile-pet-art.condition-coma{border-color:color-mix(in srgb,var(--danger) 70%,var(--border));box-shadow:0 0 12px color-mix(in srgb,var(--danger) 30%,transparent)}
.mini-profile-pet-art img{width:100%;height:100%;object-fit:cover;display:block}
.mini-profile-pet-actions{position:absolute;inset:0;pointer-events:none;z-index:2}
.mini-profile-pet-element{position:absolute;top:4px;left:4px;min-width:33px;padding:3px 5px;border-radius:999px;color:#fff;font-size:8px;font-weight:900;line-height:1;text-shadow:0 1px 2px rgba(0,0,0,.5);box-shadow:0 1px 4px rgba(0,0,0,.35)}
.mini-profile-pet-element.element-kim{background:#bc921f}.mini-profile-pet-element.element-moc{background:#25854a}.mini-profile-pet-element.element-thuy{background:#1976bf}.mini-profile-pet-element.element-hoa{background:#bd3b3b}.mini-profile-pet-element.element-tho{background:#68717c}.mini-profile-pet-element.element-none{background:var(--surface-3)}
.mini-profile-pet-compare{position:absolute;left:4px;bottom:4px;pointer-events:auto;width:27px;height:27px;border:1px solid color-mix(in srgb,var(--accent) 60%,var(--border));border-radius:50%;background:color-mix(in srgb,var(--surface) 82%,transparent);color:var(--text);font-size:13px;display:grid;place-items:center;cursor:pointer;backdrop-filter:blur(4px)}
.mini-profile-pet-compare:hover,.mini-profile-pet-compare:focus-visible{border-color:var(--accent);background:var(--surface);outline:none}
.mini-profile-pet-level{position:absolute;right:4px;bottom:4px;min-width:20px;padding:2px 4px;border-radius:5px;background:color-mix(in srgb,var(--surface) 90%,transparent);border:1px solid var(--border);font-size:10px;font-weight:900;color:var(--brand);line-height:1.1}
/* JOB 118 follow-up (Owner 2026-08-05): bảng màu độ hiếm Thần Thú dùng chung TOÀN SITE (BXH,
   trang chủ...) — cùng tên class/màu với virtual_pet.css để đồng bộ với Hồ Sơ Chính. */
.pet-rarity-inline{display:inline-flex;align-items:center;justify-content:center;padding:1px 6px;border:1px solid transparent;border-radius:999px;font-size:9px;font-weight:900;letter-spacing:.04em;line-height:1.2;text-transform:uppercase;color:#fff;white-space:nowrap}
.pet-rarity-inline.rarity-common{background:#f4f4f6;color:#1a1a2e;border-color:#c8c8d4}
.pet-rarity-inline.rarity-uncommon,.pet-rarity-inline.rarity-rare{background:#177ddc;border-color:#0d5aa8}
.pet-rarity-inline.rarity-epic{background:#7b2cbf;border-color:#55208c}
.pet-rarity-inline.rarity-legendary,.pet-rarity-inline.rarity-mythic{background:#c62828;border-color:#8f1a1a}
.pet-tooltip-condition{display:inline-flex;align-items:center;padding:2px 7px;border-radius:999px;font-size:10px;font-weight:800;line-height:1.2}
.pet-tooltip-condition.condition-healthy{background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.3)}
.pet-tooltip-condition.condition-sick{background:rgba(245,158,11,.15);color:#f59e0b;border:1px solid rgba(245,158,11,.3)}
.pet-tooltip-condition.condition-coma{background:rgba(239,68,68,.15);color:#ef4444;border:1px solid rgba(239,68,68,.3)}
.mini-profile-pet-condition{position:absolute;top:4px;right:4px;max-width:48px;padding:2px 4px;border-radius:4px;background:color-mix(in srgb,var(--surface) 88%,transparent);font-size:8px;font-weight:800;line-height:1.1;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mini-profile-pet-art.condition-healthy .mini-profile-pet-condition{color:#22c55e}
.mini-profile-pet-art.condition-sick .mini-profile-pet-condition{color:#f59e0b}
.mini-profile-pet-art.condition-coma .mini-profile-pet-condition{color:#ef4444}
.mini-profile-pet-name,.mini-profile-pet-species{display:block;max-width:114px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mini-profile-pet-name{font-size:11px;font-weight:800;color:var(--text)}.mini-profile-pet-species{font-size:9px;color:var(--text-muted)}.mini-profile-pet-rarity{display:inline-block;margin-left:3px;padding:1px 4px;border:1px solid transparent;border-radius:999px;color:#fff;font-size:8px;font-weight:900;line-height:1.2;vertical-align:1px}
/* JOB 118 follow-up (Owner 2026-08-05): bảng màu độ hiếm chuẩn — cùng tông virtual_pet.css */
.mini-profile-pet-rarity.rarity-common{background:#f4f4f6;color:#1a1a2e;border-color:#c8c8d4}
.mini-profile-pet-rarity.rarity-uncommon,.mini-profile-pet-rarity.rarity-rare{background:#177ddc;border-color:#0d5aa8}
.mini-profile-pet-rarity.rarity-epic{background:#7b2cbf;border-color:#55208c}
.mini-profile-pet-rarity.rarity-legendary,.mini-profile-pet-rarity.rarity-mythic{background:#c62828;border-color:#8f1a1a}
.mini-profile-pet-tooltip-condition{display:inline-block;padding:2px 7px;border-radius:999px;font-size:9px;font-weight:800;line-height:1.2}
.mini-profile-pet-tooltip-condition.condition-healthy{background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.3)}
.mini-profile-pet-tooltip-condition.condition-sick{background:rgba(245,158,11,.15);color:#f59e0b;border:1px solid rgba(245,158,11,.3)}
.mini-profile-pet-tooltip-condition.condition-coma{background:rgba(239,68,68,.15);color:#ef4444;border:1px solid rgba(239,68,68,.3)}
.mini-profile-pet-tooltip{position:fixed;z-index:10020;width:min(280px,calc(100vw - 20px));padding:9px 10px;border:1px solid color-mix(in srgb,var(--accent) 55%,var(--border));border-radius:9px;background:color-mix(in srgb,var(--surface-2) 96%,#000);box-shadow:var(--shadow-lg);color:var(--text);font-size:11px;line-height:1.35;pointer-events:none}.mini-profile-pet-tooltip-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:5px;font-weight:900}.mini-profile-pet-tooltip-meta{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:7px}.mini-profile-pet-tooltip-badge{padding:2px 5px;border-radius:999px;background:var(--surface-3);font-size:9px;font-weight:800}.mini-profile-pet-tooltip-badge.element-kim{background:#bc921f}.mini-profile-pet-tooltip-badge.element-moc{background:#25854a}.mini-profile-pet-tooltip-badge.element-thuy{background:#1976bf}.mini-profile-pet-tooltip-badge.element-hoa{background:#bd3b3b}.mini-profile-pet-tooltip-badge.element-tho{background:#68717c}.mini-profile-pet-tooltip-vitals{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px 8px;color:var(--text-muted)}.mini-profile-pet-tooltip-vitals b{color:var(--text);font-weight:800}.mini-profile-pet-tooltip-combat{margin-top:6px;padding-top:6px;border-top:1px solid var(--border);color:var(--text-muted)}
.mini-profile-pet-compare-panel{position:absolute;z-index:8;top:calc(100% + 5px);left:0;width:min(290px,80vw);padding:8px;border:1px solid var(--border);border-radius:8px;background:var(--surface-2);box-shadow:var(--shadow-lg);font-size:10px;color:var(--text);text-align:left}.mini-profile-compare-head{font-weight:900;color:var(--brand);margin-bottom:5px}.mini-profile-compare-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}.mini-profile-compare-grid div{min-width:0;display:flex;flex-direction:column;gap:2px}.mini-profile-compare-grid b{font-size:9px;color:var(--text-muted)}.mini-profile-compare-grid span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mini-profile-compare-relation{margin-top:6px;padding-top:5px;border-top:1px solid var(--border);font-weight:700}
@media (max-width:480px){.mini-profile-pet-slot{max-width:92px}.mini-profile-pet-art{width:76px;height:76px}.mini-profile-pet-name,.mini-profile-pet-species{max-width:92px}.mini-profile-pet-condition{display:none}.mini-profile-pet-compare-panel{width:min(250px,76vw)}}
  .board-name{flex:1;font-weight:700;font-size:15px}
  .board-name small{display:block;font-weight:500;font-size:12px;color:var(--text-faint)}
  .board-score{font-family:var(--font-display);font-weight:800;font-size:18px;color:var(--brand)}
  .board-score span{font-size:12px;color:var(--text-muted);font-weight:600;margin-left:2px}

  /* Mũi tên delta xếp hạng */
  .rank-delta-indicator {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 11px;
    font-weight: 700;
    margin-left: 6px;
    padding: 2px 6px;
    border-radius: var(--radius-sm, 4px);
    transition: all 0.3s ease;
    animation: deltaFadeIn 0.3s ease forwards;
  }
  @keyframes deltaFadeIn {
    from { opacity: 0; transform: scale(0.85); }
    to { opacity: 1; transform: scale(1); }
  }
  .delta-new {
    background: rgba(244, 63, 94, 0.15);
    color: var(--clg-pink, #f43f5e);
    border: 1px solid rgba(244, 63, 94, 0.3);
  }
  .delta-up {
    background: rgba(16, 185, 129, 0.15);
    color: var(--success, #10b981);
    border: 1px solid rgba(16, 185, 129, 0.3);
  }
  .delta-down {
    background: rgba(245, 158, 11, 0.15);
    color: var(--accent-2, #f59e0b);
    border: 1px solid rgba(245, 158, 11, 0.3);
  }
  .delta-equal {
    color: var(--text-muted, #a0aec0);
    opacity: 0.5;
    background: transparent;
    border: none;
    padding: 0;
    margin-left: 6px;
  }

  .empty-state{
    margin-top:18px;padding:26px 18px;text-align:center;border-radius:var(--radius-sm);
    border:1.5px dashed var(--border-strong);
    background:repeating-linear-gradient(135deg,transparent,transparent 9px,color-mix(in srgb,var(--text-muted) 5%,transparent) 9px,color-mix(in srgb,var(--text-muted) 5%,transparent) 18px);
    transition:border-color var(--dur) ease, background var(--dur) ease, transform var(--dur) var(--ease);
    animation: fadeIn var(--dur-normal) var(--ease);
  }
  .empty-state:hover {
    border-color: var(--accent);
    background: repeating-linear-gradient(135deg,transparent,transparent 9px,color-mix(in srgb,var(--accent) 3%,transparent) 9px,color-mix(in srgb,var(--accent) 3%,transparent) 18px);
    transform: translateY(-2px);
  }
  @keyframes fadeIn {
    from { opacity: 0; transform: translateY(6px); }
    to { opacity: 1; transform: translateY(0); }
  }
  .empty-state .ico{font-size:38px;margin-bottom:8px}
  .empty-state p{color:var(--text-muted);font-size:14px}
  .empty-state b{color:var(--text)}

  .board-aside h3{font-size:19px;font-weight:700;margin-bottom:8px}
  .board-aside p{color:var(--text-muted);font-size:14px;margin-bottom:18px}
  .perk{display:flex;gap:12px;align-items:flex-start;margin-bottom:14px}
  .perk .pi{width:38px;height:38px;flex-shrink:0;border-radius:var(--radius-sm);display:grid;place-items:center;font-size:19px;background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--border)}
  .perk b{font-size:14.5px;display:block}
  .perk small{color:var(--text-muted);font-size:13px}
  /* JOB_54 — .board-aside dời xuống dưới lưới 2×2, full-width; 3 khối perk xếp hàng ngang. */
  .board-aside-below{width:100%}
  .perks-row{display:flex;gap:20px;flex-wrap:wrap}
  .perks-row .perk{flex:1 1 220px;margin-bottom:0}

  /* =========================================================
     AUTH MODAL
     ========================================================= */
  .modal-overlay{
    position:fixed;inset:0;z-index:100;display:none;align-items:center;justify-content:center;padding:20px;
    background:color-mix(in srgb,var(--bg) 70%,transparent);backdrop-filter:blur(8px);
  }
  .modal-overlay.open{display:flex;animation:fade .2s ease}
  @keyframes fade{from{opacity:0}to{opacity:1}}
  .modal{
    width:100%;max-width:430px;background:var(--surface);border-radius:var(--radius-lg);
    box-shadow:var(--shadow-lg),inset 0 0 0 1px var(--border-strong);padding:clamp(22px,4vw,32px);position:relative;
    animation:pop .26s var(--ease);
    overscroll-behavior-y:contain;
  }
  @keyframes pop{from{transform:translateY(14px) scale(.96);opacity:0}to{transform:none;opacity:1}}
  .modal-close{
    position:absolute;top:16px;right:16px;width:38px;height:38px;border-radius:50%;display:grid;place-items:center;font-size:18px;
    background:var(--surface-2);color:var(--text-muted);box-shadow:inset 0 0 0 1px var(--border);transition:all .15s ease;
  }
  .modal-close:hover{background:var(--surface-3);color:var(--text)}
  .modal-brand{display:flex;align-items:center;gap:12px;margin-bottom:6px}
  .modal-brand .logo-mark{width:40px;height:40px;font-size:22px;animation:none}
  .modal h2{font-size:22px;font-weight:var(--display-weight)}
  .modal .sub{color:var(--text-muted);font-size:14px;margin-bottom:22px}

  .tabs{display:flex;gap:6px;padding:5px;background:var(--bg-2);border-radius:var(--radius-pill);margin-bottom:22px;box-shadow:inset 0 0 0 1px var(--border)}
  .tab{flex:1;min-height:44px;border-radius:var(--radius-pill);font-weight:700;font-size:14.5px;color:var(--text-muted);letter-spacing:var(--label-ls);text-transform:var(--label-tt);transition:all var(--dur) var(--ease)}
  .tab.active{color:var(--on-accent);background:var(--grad-accent);box-shadow:var(--glow-accent)}

  .field{margin-bottom:16px}
  .field label{display:block;font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:7px}
  .field input{
    width:100%;min-height:50px;padding:0 16px;border-radius:var(--radius-sm);
    background:var(--bg-2);color:var(--text);font-size:15px;font-family:inherit;
    box-shadow:inset 0 0 0 1px var(--border);transition:box-shadow .16s ease;
  }
  .field input::placeholder{color:var(--text-faint)}
  .field input:focus{outline:none;box-shadow:inset 0 0 0 2px var(--accent)}

  input[type="checkbox"], input[type="radio"],
  .field input[type="checkbox"], .field input[type="radio"] {
    width: 16px; height: 16px; min-height: 0; padding: 0;
    flex-shrink: 0; box-shadow: none; cursor: pointer;
    accent-color: var(--accent);
  }

  .form-error{
    display:none;align-items:center;gap:9px;margin-bottom:16px;padding:11px 14px;border-radius:var(--radius-sm);
    background:color-mix(in srgb,var(--brand) 16%,transparent);color:color-mix(in srgb,var(--brand) 60%,#fff);
    font-size:13.5px;font-weight:600;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 30%,transparent);
  }
  .form-error.show{display:flex}

  .pane{display:none}
  .pane.active{display:block}
  .modal .btn{width:100%}
  .modal-hint{text-align:center;font-size:13px;color:var(--text-muted);margin-top:18px}
  .modal-hint button{color:var(--accent);font-weight:700}

  /* Google OAuth button */
  .btn-google{
    display:flex;align-items:center;justify-content:center;gap:10px;width:100%;
    min-height:48px;padding:0 20px;border-radius:var(--radius-sm);
    background:#fff;color:#3c4043;font-size:15px;font-weight:600;
    box-shadow:0 1px 4px rgba(0,0,0,.25),inset 0 0 0 1px rgba(0,0,0,.08);
    transition:box-shadow .18s ease,transform .12s ease;
    cursor:pointer;border:none;font-family:inherit;
  }
  .btn-google:hover{box-shadow:0 3px 12px rgba(0,0,0,.22),inset 0 0 0 1px rgba(0,0,0,.12);transform:translateY(-1px)}
  .btn-google:active{transform:translateY(0)}
  .btn-google .g-logo{width:20px;height:20px;flex-shrink:0}

  /* Or divider */
  .or-divider{
    display:flex;align-items:center;gap:12px;margin:16px 0;color:var(--text-faint);
    font-size:13px;font-weight:500;
  }
  .or-divider::before,.or-divider::after{
    content:'';flex:1;height:1px;background:var(--border);
  }

  /* =========================================================
     FOOTER
     ========================================================= */
  .site-footer{margin-top:clamp(30px,5vw,56px);border-top:1px solid var(--border);padding:clamp(28px,4vw,44px) 0}
  .footer-inner{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
  .footer-note{color:var(--text-muted);font-size:14px;max-width:42ch}
  .footer-note b{color:var(--text)}
  .footer-tags{display:flex;gap:10px;flex-wrap:wrap}
  .copyright{margin-top:18px;font-size:13px;color:var(--text-faint)}

  /* =========================================================
     RESPONSIVE
     ========================================================= */
  /* [Standard Breakpoint] Tablet layout (1024px và nhỏ hơn) */
  @media (max-width:1024px){
    .hero-inner{grid-template-columns:1fr;text-align:center}
    .hero p.lead{margin-inline:auto}
    .hero-cta,.hero-stats{justify-content:center}
    .hero-art{order:-1;min-height:230px}
    .board-wrap{grid-template-columns:1fr}
    .lb-grid-2x2{grid-template-columns:1fr}
    .logo-text span{display:none}
  }
  /* [Standard Breakpoint] Mobile layout (600px và nhỏ hơn) */
  @media (max-width:600px){
    :root{--header-h:60px}
    /* 2026-07-12 — Owner phản hồi: ẩn hẳn logo (từ 2026-07-11) khiến khó bấm về Trang Chủ khi
       đang chơi game. Đổi lại: HIỆN icon logo nhưng thu nhỏ còn 50% kích thước bản máy tính/
       tablet (`.logo-mark`/ảnh logo Admin tự tải đều dùng chung `zoom:.5` — scale đúng 50% GIÁ TRỊ
       THỰC ĐANG HIỂN THỊ, không hardcode px, nên vẫn đúng tỉ lệ nếu Admin đổi site_logo_height sau
       này). `zoom` (khác `transform:scale`) co luôn khoảng không gian chiếm chỗ trong layout, vẫn
       tiết kiệm diện tích header cho các thanh công cụ khác. `.logo-text` (tên site + slogan) vẫn
       ẩn để giữ gọn — chỉ icon mới cần bấm về Trang Chủ. */
    .logo{display:flex}
    .logo-mark{zoom:.5}
    .logo-text{display:none}
    .theme-switch button{padding:0 10px;font-size:11.5px}
    .game-grid{grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:12px}
    .card-thumb{font-size:40px}
    /* 2026-07-13 — Owner phản hồi: hàng Tên Game + nút Chơi/Tiếp tục/Khóa đã dùng chung 1 hàng ở
       MỌI kích thước màn hình (base rule .card-body/.card-title/.card-foot phía trên) — ở mobile
       thu nhỏ thêm 1 chút nữa cho vừa hàng hẹp. */
    .card-body{padding:7px 10px 9px;gap:6px}
    .card-title{font-size:12px}
    .play-btn.icon-only{width:28px;height:28px;min-height:28px;font-size:13px}
    .play-btn:not(.icon-only){min-height:26px;padding:0 8px;font-size:10.5px}
    .resume-label-full{display:none}
    .resume-label-short{display:inline}
    /* 2026-07-11 — 3 ô thống kê Hero (24 trò chơi/100% thân thiện/0đ) nhỏ lại 20% */
    .hero-stats{gap:18px}
    .hero-stats .stat b{font-size:20.8px}
    .hero-stats .stat span{font-size:10.4px}
    /* 2026-07-11 — Nút Bắt Đầu Chơi/Xem Bảng Vàng: 2 hàng -> 1 hàng, kích thước ~nửa .btn-lg gốc */
    .hero-cta{flex-direction:row;align-items:stretch;flex-wrap:nowrap;gap:8px}
    .hero-cta .btn{flex:1;width:auto;min-height:32px;padding:0 10px;font-size:13px}
    /* Ngân Khố (Header): mobile chỉ hiện icon + tổng tiền, ẩn nhãn chữ để gọn diện tích */
    .balance-chip-label{display:none}
    .logo-text b{font-size:16px}
    /* 2026-07-12 — Owner phản hồi: dropdown Ngân Khố (#localCurrencyMegaChipDropdown) + Chuông
       thông báo (.notif-dropdown) đều JS gán inline `position:absolute; right:0` tương đối 1
       khung hẹp (chip/nút) nằm gần mép trái màn hình mobile — dropdown rộng 260-320px tràn ra
       NGOÀI bên trái, cắt mất chữ. Cả 2 cùng dùng chung class `.dropdown-menu` (xem khai báo
       animation ở trên) nên sửa 1 chỗ áp dụng cho cả 2: chuyển sang `position:fixed`, canh GIỮA
       viewport theo chiều ngang, giới hạn chiều rộng vừa màn hình — `!important` bắt buộc vì
       phải thắng inline style JS. */
    .dropdown-menu{
      position:fixed !important;
      left:50% !important; right:auto !important;
      top:calc(var(--header-h) + 8px) !important;
      transform:translateX(-50%) !important;
      width:calc(100vw - 24px) !important;
      max-width:340px;
    }
    /* 2026-07-12 — Owner phản hồi: 2 nút "Tiếp tục/Bắt đầu mới" ở popup ván chơi tạm dừng
       (Engine.showResumeUI(), .resume-container) dùng .btn-lg nguyên bản (min-height:60px,
       padding:0 34px) — không có override mobile riêng như .hero-cta đã có, nên tràn khỏi màn
       hình hẹp. Thu nhỏ theo đúng tỉ lệ ~nửa đã dùng cho .hero-cta .btn (tiền lệ đã duyệt). */
    .resume-container .btn{min-height:32px !important;padding:0 10px !important;font-size:13px !important;}
  }
  /* [Micro-Adjustment] Tinh chỉnh cột game cho thiết bị cực nhỏ (<400px) */
  @media (max-width:400px){
    .game-grid{grid-template-columns:1fr 1fr;gap:10px}
    .card-thumb{font-size:36px;aspect-ratio:4/3}
  }



  /* =========================================================
     GAME FULLSCREEN & OVERSCROLL PROTECTION (universal, mọi game)
     Owner yêu cầu 2026-07-30: vuốt di chuyển nhân vật trên di động dễ bị hiểu nhầm
     thành cử chỉ back/reload trình duyệt. overscroll-behavior-x chặn cử chỉ vuốt-cạnh
     ngay khi vào trang game (không cần bấm gì); nút Toàn màn hình (Engine.initGameFullscreen,
     core.js) là lớp bảo vệ bổ sung, không bắt buộc dùng.
     ========================================================= */
  body.clg-game-page {
    overscroll-behavior-x: none;
  }
  #gamePlayArea {
    overscroll-behavior: none;
  }
  .game-fullscreen-btn {
    position: absolute;
    top: 8px;
    right: 8px;
    z-index: 20;
    width: 36px;
    height: 36px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
    line-height: 1;
  }

  /* =========================================================
     MEMORY MATCH GAME STYLES
     ========================================================= */
  .game-container {
    max-width: 600px;
    margin: var(--sp-4) auto;
    padding: var(--sp-4);
    background: var(--surface);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow), inset 0 0 0 1px var(--border);
    text-align: center;
    position: relative;
    overflow: hidden;
  }
  /* JOB_53 — Viền góc khung game theo Cấp Giao Diện ĐANG TRANG BỊ (khác khung avatar BXH vốn
     theo Cấp sở hữu cao nhất, xem 04.00 §15.4-mới). .game-container có overflow:hidden nên viền
     góc KHÔNG đặt trực tiếp bên trong nó — phải là con của .game-frame-wrap (bọc ngoài, không
     overflow:hidden) để có thể tràn ra ngoài biên khung cho thực tế (offset âm). */
  .game-frame-wrap {
    position: relative;
  }
  .game-frame-corner {
    position: absolute;
    width: 15%;
    max-width: 110px;
    height: auto;
    pointer-events: none;
    z-index: 3;
  }
  .game-frame-corner-tl { top: -14px;    left: -14px; }
  .game-frame-corner-tr { top: -14px;    right: -14px; }
  .game-frame-corner-bl { bottom: -14px; left: -14px; }
  .game-frame-corner-br { bottom: -14px; right: -14px; }
  .game-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: var(--sp-4);
    flex-wrap: wrap;
    gap: 12px;
  }
  .game-stats {
    display: flex;
    gap: 12px;
    align-items: center;
  }
  .game-stat-box {
    background: var(--bg-2);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 8px 14px;
    min-width: 90px;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 15px;
    box-shadow: var(--shadow-sm);
  }
  .game-stat-box .label {
    display: block;
    font-size: 10px;
    color: var(--text-muted);
    text-transform: uppercase;
    margin-bottom: 2px;
    letter-spacing: 0.5px;
  }
  .memory-board {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 12px;
    margin: 0 auto var(--sp-4) auto;
    aspect-ratio: 1;
    max-width: 440px;
    width: 100%;
  }
  .memory-card {
    perspective: 1000px;
    aspect-ratio: 1;
    cursor: pointer;
  }
  .memory-card-inner {
    position: relative;
    width: 100%;
    height: 100%;
    text-align: center;
    transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
    transform-style: preserve-3d;
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm), inset 0 0 0 1px var(--border);
  }
  .memory-card.flipped .memory-card-inner {
    transform: rotateY(180deg);
  }
  .memory-card.matched {
    cursor: default;
  }
  .memory-card.matched .memory-card-inner {
    transform: rotateY(180deg);
    box-shadow: 0 0 15px var(--success), inset 0 0 0 2px var(--success);
    animation: match-pulse 0.4s ease-in-out;
  }
  @keyframes match-pulse {
    0% { transform: rotateY(180deg) scale(1); }
    50% { transform: rotateY(180deg) scale(1.08); }
    100% { transform: rotateY(180deg) scale(1); }
  }
  .card-front, .card-back {
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    border-radius: var(--radius);
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .card-back {
    background: radial-gradient(circle, var(--surface-3) 0%, var(--surface-2) 100%);
    border: 2px solid var(--border-strong);
    color: var(--accent);
    font-size: 32px;
    font-weight: 800;
    overflow: hidden;
  }
  .card-back-icon {
    display: inline-block;
    text-shadow: 0 0 8px color-mix(in srgb, var(--accent) 40%, transparent);
    animation: pulse 2s infinite ease-in-out;
  }
  .card-front {
    background: radial-gradient(circle, var(--surface-2) 0%, var(--surface-3) 100%);
    border: 2px solid var(--border-strong);
    transform: rotateY(180deg);
    font-size: clamp(24px, 5vw, 42px);
    overflow: hidden;
  }
  .card-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: inherit;
    pointer-events: none;
  }
  .memory-card.matched .card-front {
    border-color: var(--success);
    background: radial-gradient(circle, var(--surface-3) 0%, rgba(52, 211, 153, 0.15) 100%);
  }
  .memory-match-score-popup {
    position: fixed;
    z-index: 120;
    transform: translate(-50%, -50%);
    pointer-events: none;
    white-space: nowrap;
    color: var(--success);
    font-family: var(--font-display);
    font-size: clamp(13px, 3vw, 18px);
    font-weight: 800;
    text-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
    animation: memory-match-score-float 0.9s ease-out forwards;
  }
  @keyframes memory-match-score-float {
    from { opacity: 0; transform: translate(-50%, -35%) scale(0.92); }
    20% { opacity: 1; }
    to { opacity: 0; transform: translate(-50%, -135%) scale(1.04); }
  }
  /* Win Modal & HUD */
  .game-win-modal {
    position: fixed;
    inset: 0;
    z-index: 100;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: rgba(5, 8, 18, 0.85);
    backdrop-filter: blur(8px);
  }
  .game-win-modal.open {
    display: flex;
    animation: fade .2s ease;
  }
  .game-win-content {
    width: 100%;
    max-width: 440px;
    background: var(--surface);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg), inset 0 0 0 1px var(--border-strong);
    padding: var(--sp-4);
    text-align: center;
    position: relative;
    animation: pop .26s cubic-bezier(.2,.9,.3,1.4);
    max-height: 90vh;
    overflow-y: auto;
  }
  .win-actions-row {
    display: flex;
    gap: 12px;
    margin-top: 20px;
    flex-wrap: wrap;
  }
  .win-actions-row .btn {
    flex: 1 1 140px;  /* co được tới tối thiểu 140px rồi mới xuống dòng, không ép tràn ngang */
  }
  /* [Micro-Adjustment] Chuyển nút modal thắng cuộc thành cột đứng ở thiết bị cực nhỏ (<380px) */
  @media (max-width: 380px) {
    .win-actions-row {
      flex-direction: column;
    }
    .win-actions-row .btn {
      flex: 1 1 auto;
      width: 100%;
    }
  }
  .game-win-close {
    position: absolute;
    top: 16px;
    right: 16px;
    background: none;
    border: none;
    font-size: 24px;
    line-height: 1;
    color: var(--text-muted);
    cursor: pointer;
    transition: color 0.15s ease, transform 0.15s ease;
    padding: 4px;
    border-radius: var(--radius-sm);
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .game-win-close:hover {
    color: var(--text);
    transform: scale(1.1);
  }
  .game-win-close:active {
    transform: scale(0.95);
  }
  .win-emoji {
    font-size: 64px;
    margin-bottom: var(--sp-2);
    display: block;
    animation: floaty 3s ease-in-out infinite;
  }
  .win-stats-list {
    margin: var(--sp-3) 0;
    background: var(--bg-2);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: var(--sp-3);
  }
  .win-stat-row {
    display: flex;
    justify-content: space-between;
    padding: 8px 0;
    border-bottom: 1px solid var(--border);
    font-size: 15px;
  }
  .win-stat-row:last-child {
    border-bottom: none;
  }
  .win-stat-row span:first-child {
    color: var(--text-muted);
  }
  .win-stat-row span:last-child {
    font-weight: 700;
    color: var(--text);
  }
  .win-stat-row.score-row span:last-child {
    color: var(--brand);
    font-size: 18px;
    font-family: var(--font-display);
  }

  /* [Micro-Adjustment] Thu hẹp gap và góc bo của memory board trên màn hình <480px */
  @media (max-width: 480px) {
    .memory-board {
      gap: 8px;
    }
    .memory-card-inner {
      border-radius: var(--radius-sm);
    }
    .card-front, .card-back {
      border-radius: var(--radius-sm);
    }
    .card-back {
      font-size: 24px;
    }
  }

  /* =========================================================
     GAMER ENHANCEMENTS — Neon, Glow, Pro-mode extras
     ========================================================= */

  /* Neon glow text helper */
  .neon-text{
    text-shadow:0 0 8px color-mix(in srgb,var(--accent) 70%,transparent),
                0 0 24px color-mix(in srgb,var(--accent) 40%,transparent),
                0 0 48px color-mix(in srgb,var(--accent) 20%,transparent);
  }

  /* Top rank rows glow animation */
  .board-row.top-1{
    box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 40%,transparent),
               0 0 30px -12px color-mix(in srgb,var(--brand) 50%,transparent);
    animation:rankGlow 2.8s ease-in-out infinite;
  }
  @keyframes rankGlow{
    0%,100%{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 40%,transparent),0 0 30px -12px color-mix(in srgb,var(--brand) 50%,transparent)}
    50%{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 65%,transparent),0 0 45px -10px color-mix(in srgb,var(--brand) 70%,transparent)}
  }

  /* Group head accent left border */
  .group-head{
    padding-left:10px;
    border-left:3px solid var(--accent);
    position:relative;
  }
  .group-head::after{
    content:'';position:absolute;left:-3px;top:0;bottom:0;width:3px;
    background:var(--grad-accent);
    filter:blur(4px);
    opacity:0.7;
  }

  /* Pro theme: stronger neon borders on cards */
  [data-theme="pro"] .card{
    box-shadow:var(--shadow-sm),inset 0 0 0 1px rgba(0,229,255,.14);
  }
  [data-theme="pro"] .card:hover{
    box-shadow:var(--shadow),inset 0 0 0 1px rgba(0,229,255,.35),0 0 50px -15px rgba(0,229,255,.2);
  }
  [data-theme="pro"] .play-btn{
    background:linear-gradient(135deg,#00e5ff,#3df0ff);
    color:#04181f;
    font-weight:900;
    letter-spacing:1.5px;
    text-transform:uppercase;
  }
  [data-theme="pro"] .site-header{
    border-bottom:1px solid rgba(0,229,255,.2);
    box-shadow:0 1px 0 0 rgba(0,229,255,.12), 0 4px 24px -8px rgba(0,0,0,.6);
  }
  [data-theme="pro"] .section-emoji{
    box-shadow:inset 0 0 0 1px rgba(0,229,255,.25),0 0 20px -6px rgba(0,229,255,.35);
  }
  [data-theme="pro"] .group-head{
    border-left-color:var(--accent);
  }
  [data-theme="pro"] .board-row.top-1{
    animation:rankGlowPro 2.5s ease-in-out infinite;
  }
  @keyframes rankGlowPro{
    0%,100%{box-shadow:inset 0 0 0 1px rgba(255,46,99,.45),0 0 30px -12px rgba(255,46,99,.5)}
    50%{box-shadow:inset 0 0 0 1px rgba(255,46,99,.7),0 0 50px -10px rgba(255,46,99,.65)}
  }
  [data-theme="pro"] .logo-mark{
    box-shadow:var(--glow-accent),inset 0 0 22px rgba(0,229,255,.18);
    border:1px solid rgba(0,229,255,.25);
  }

  /* Kid theme: softer rounded warm glow */
  [data-theme="kid"] .logo-mark{
    box-shadow:var(--glow-brand),inset 0 0 18px color-mix(in srgb,var(--brand) 20%,transparent);
  }

  /* Perk icon hover */
  .perk .pi{
    transition:transform .25s var(--ease), box-shadow .25s ease;
  }
  .perk:hover .pi{
    transform:scale(1.15) rotate(-6deg);
    box-shadow:inset 0 0 0 1px var(--border-strong),var(--glow-accent);
  }

  /* Game grid min card size on tablets */
  /* [Standard Breakpoint] Grid game trên Tablet (601px - 1024px) */
  @media (max-width:1024px) and (min-width:601px){
    .game-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}
  }

  /* Board wrap stacks on tablet */
  /* [Standard Breakpoint] Leaderboard xếp chồng trên màn hình 1024px và nhỏ hơn (đã đồng bộ) */
  @media (max-width:1024px){
    .board-wrap{grid-template-columns:1fr}
    .lb-grid-2x2{grid-template-columns:1fr}
  }

  /* Hero section safe padding on small screens */
  /* [Micro-Adjustment] Giảm size quả cầu rồng và padding hero trên màn hình <480px */
  @media (max-width:480px){
    .hero{padding:clamp(14px,3vw,28px) 0 clamp(12px,2.5vw,20px)}
    .dragon-orb{width:min(240px,75%);font-size:clamp(80px,16vw,130px)}
  }

  /* Ensure no overflow on very narrow screens */
  /* [Micro-Adjustment] Co nhỏ header bar trên thiết bị cực hẹp <360px */
  @media (max-width:360px){
    .header-tools{gap:4px!important}
    .lang-switch{display:none!important}
    .chip{padding:0 7px!important;font-size:11px!important}
  }

  /* Smooth theme-switch active highlight */
  .theme-switch button[aria-pressed="true"],
  .lang-switch button[aria-pressed="true"]{
    position:relative;
  }
  .theme-switch button[aria-pressed="true"]::after,
  .lang-switch button[aria-pressed="true"]::after{
    content:'';position:absolute;inset:-2px;border-radius:inherit;
    background:var(--grad-accent);
    filter:blur(8px);
    opacity:0.25;
    z-index:-1;
  }

  /* =========================================================
     DIFFICULTY SELECTOR (Memory Match & Games)
     ========================================================= */
  .difficulty-selector {
    display: inline-flex;
    gap: 8px;
    margin-bottom: var(--sp-4);
    padding: 4px;
    background: var(--surface-2);
    border-radius: var(--radius-pill);
    border: 1px solid var(--border);
  }
  .diff-btn {
    border: none;
    outline: none;
    padding: 8px 20px;
    border-radius: var(--radius-pill);
    cursor: pointer;
    font-weight: 700;
    font-size: 13px;
    display: flex;
    align-items: center;
    gap: 6px;
    transition: all 0.2s;
    background: transparent;
    color: var(--text-muted);
  }
  .diff-btn:hover {
    color: var(--text);
  }
  .diff-btn.active[data-difficulty="easy"] {
    background: #22c55e !important;
    color: #fff !important;
  }
  .diff-btn.active[data-difficulty="medium"] {
    background: #eab308 !important;
    color: #000 !important;
  }
  .diff-btn.active[data-difficulty="hard"] {
    background: #ef4444 !important;
    color: #fff !important;
  }

/* =============================================================
   SHARED COMPONENTS — Dùng chung ≥2 trang (gộp từ B4 - 01.17)
   ============================================================= */

/* Alert boxes — profile.php, admin.php (100% giống nhau) */
.success-alert {
  background: rgba(16, 185, 129, 0.15);
  border: 1px solid rgb(16, 185, 129);
  color: #34d399;
  padding: 12px;
  border-radius: var(--radius-sm);
  margin-bottom: 20px;
  display: none;
  font-weight: 500;
}
.error-alert {
  background: rgba(239, 68, 68, 0.15);
  border: 1px solid rgb(239, 68, 68);
  color: #f87171;
  padding: 12px;
  border-radius: var(--radius-sm);
  margin-bottom: 20px;
  display: none;
  font-weight: 500;
}

/* PIN input — profile.php, wallet.php (100% giống nhau) */
.input-pin {
  letter-spacing: 12px;
  font-size: 24px;
  text-align: center;
  max-width: 150px;
}

/* History/ledger table — wallet.php, admin_update.php (100% giống nhau) */
.history-table {
  width: 100%;
  border-collapse: collapse;
  margin-top: 15px;
  font-size: 14px;
}
.history-table th, .history-table td {
  padding: 12px 10px;
  text-align: left;
  border-bottom: 1px solid var(--border);
}
.history-table th {
  color: var(--text-muted);
  font-weight: 600;
}
.history-table tr:hover td {
  background: rgba(255,255,255,0.02);
}
.ledger-amount { font-weight: 700; }
.ledger-amount.plus { color: #10b981; }
.ledger-amount.minus { color: #ef4444; }

/* =============================================================
   SHARED SIDEBAR, BADGES & GLOW EFFECTS — consolidated B4
   ============================================================= */

/* Sidebar split navigation layout — profile.php, admin.php, admin_update.php */
.admin-layout, .profile-container {
  display: grid;
  grid-template-columns: 260px 1fr;
  gap: 30px;
  margin: 40px auto;
}
/* [Standard Breakpoint] Tablet layout (1024px và nhỏ hơn) - Chuyển sang 1 cột dọc */
@media (max-width: 1024px) {
  .admin-layout, .profile-container {
    grid-template-columns: 1fr;
  }
}
.admin-nav, .profile-nav {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 15px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  align-self: start;
}
.admin-nav button, .profile-nav button {
  text-align: left;
  padding: 12px 16px;
  border-radius: var(--radius-sm);
  font-weight: 600;
  transition: all 0.2s ease;
  background: transparent;
  border: 1px solid transparent;
  color: var(--text-muted);
  cursor: pointer;
  width: 100%;
}
.admin-nav button:hover, .admin-nav button.active,
.profile-nav button:hover, .profile-nav button.active {
  background: var(--surface-2);
  color: var(--text);
  border-color: var(--border-strong);
}
.admin-nav button.active, .profile-nav button.active {
  border-left: 4px solid var(--brand);
  background: var(--surface-3);
  border-color: var(--border-strong);
}
.admin-pane, .settings-pane {
  display: none;
  animation: fadeIn 0.3s ease;
}
.admin-pane.active, .settings-pane.active {
  display: block;
}
/* JOB_103_FIX_01: Embedded Admin Pane in sub-pane container */
#games-tab-pet-library > #pane-pet-library {
  display: block;
}

.sub-tab-bar{
  display:flex;
  gap:4px;
  border-bottom:1px solid var(--border);
  margin-bottom:16px;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.sub-tab-bar::-webkit-scrollbar{ display:none; }

.sub-tab{
  padding:10px 16px;
  min-height:44px;
  background:transparent;
  border:none;
  color:var(--text-muted);
  font-family:var(--font-display, inherit);
  font-size:14px;
  cursor:pointer;
  border-bottom:2px solid transparent;
  white-space:nowrap;
  flex-shrink:0;
  transition:color var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.sub-tab:hover{ color:var(--text); }
.sub-tab.active{ color:var(--accent); border-bottom-color:var(--accent); }

.sub-pane{ display:none; }
.sub-pane.active{ display:block; }

/* JOB_77 centralized asset libraries */
.library-toolbar{display:flex;gap:var(--sp-2);align-items:center;margin:var(--sp-3) 0;flex-wrap:wrap}
.asset-library-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:var(--sp-3);margin-top:var(--sp-3)}
.asset-library-card{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-2);display:flex;flex-direction:column;gap:var(--sp-1);min-width:0}
.asset-library-card small{color:var(--text-muted)}
.asset-library-card>img{width:72px;height:72px;object-fit:contain}
.game-frame-preview,.mini-game-frame-preview{display:grid;grid-template-columns:1fr 1fr;gap:3px;background:var(--surface-3);padding:3px;border-radius:var(--radius-sm)}
.game-frame-preview img,.mini-game-frame-preview img{width:100%;height:48px;object-fit:contain;min-width:0}.game-frame-preview span{height:48px;display:grid;place-items:center;color:var(--text-faint)}
.mini-game-frame-preview{width:52px;flex:0 0 52px}.mini-game-frame-preview img{height:22px}
.asset-library-modal{max-width:min(760px,calc(100vw - 32px));max-height:80vh;overflow:auto;padding:var(--sp-4)}
@media (max-width:480px){.asset-library-grid{grid-template-columns:1fr 1fr}.asset-library-card{padding:var(--sp-1)}}

/* JOB_77 fix UI (Owner phản hồi 2026-07-20) — <audio controls> có bề rộng nội tại ~300px, tràn
   khỏi cột lưới 190px làm các thẻ chồng đè lên nhau. Ép audio co theo cột + nới cột khi có audio. */
/* Thư viện Âm Thanh = DANH SÁCH 1 cột (không phải lưới thẻ): <audio controls> Chrome có bề rộng
   tối thiểu nội tại nên nhét vào cột lưới hẹp là tràn đè lên nhau, ép width:100% không cứu được. */
.asset-library-list{display:flex;flex-direction:column;gap:var(--sp-2)}
/* Gọn ĐÚNG 1 dòng, KHÔNG wrap: wrap khiến nút rớt xuống dòng dưới và giãn hết bề ngang
   (chính là hiện tượng "vỡ khung" Owner báo). */
.asset-library-row{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:nowrap;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-2) var(--sp-3)}
.asset-library-row .alr-name{flex:1 1 auto;min-width:0;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.asset-library-row .alr-name em{color:var(--text-muted);font-style:normal;font-size:12px}
.asset-library-row audio{flex:0 1 230px;min-width:120px;height:32px}
.asset-library-row .btn{flex:0 0 auto}
@media (max-width:520px){.asset-library-row audio{flex:0 1 150px}}
.asset-library-card audio{width:100%;min-width:0;max-width:100%;display:block;height:34px}
.asset-library-card strong{overflow-wrap:anywhere}
.asset-library-card small{overflow-wrap:anywhere}
.asset-library-card .btn{margin-top:auto;align-self:stretch}

/* Nút mở thư viện = ICON quyển sách 📖 (Owner chốt 2026-07-20), vuông gọn, không giãn.
   🔎 Gốc lỗi "tràn sang phải" KHÔNG phải do nút giãn, mà do <select> trong flex mặc định
   min-width:auto (= min-content). Tên option dài ("Bí Mật Rừng Xanh") làm select không chịu co,
   đẩy cả hàng rộng quá khung, nút đứng cuối bị đẩy văng ra ngoài. Phải có min-width:0 trên select
   (đã đặt inline) + chặn tràn ở hàng chứa. */
.lib-btn{flex:0 0 auto;width:32px;min-width:32px;padding:0;font-size:15px}
.skin-tier-label{font-size:11px;color:var(--text-muted);flex:0 0 58px}

/* 🔎 GỐC LỖI THẬT (mất 3 vòng mới ra): style.css dòng ~893 có `.modal .btn{width:100%}` với độ
   ưu tiên 0,2,0 — THẮNG `.btn-icon`/`.lib-btn` (0,1,0). Vì vậy MỌI nút icon nằm trong modal đều
   bị kéo giãn hết bề ngang, ép <select> co lại còn mỗi mũi tên và ép chữ trong hàng nhạc chồng
   lên nhau. Nút icon vốn PHẢI vuông (04.00 §8.4) nên chặn lại đúng phạm vi, không đụng nút chữ. */
.modal .btn-icon,.modal .lib-btn{width:32px;min-width:32px;flex:0 0 auto;padding:0}
.modal .asset-library-row .btn{width:auto}

/* Game 17 — compact species workbench. Keeps the dialog fully inside the viewport:
   header/footer are fixed and only the middle area scrolls. */
.pet-species-modal-overlay{position:fixed!important;inset:0!important;z-index:10050!important;align-items:flex-start!important;padding:24px 16px!important;overflow-y:auto!important;overscroll-behavior:contain}
.pet-habitat-asset-modal-overlay{z-index:10060!important}
.pet-species-workbench-modal{width:min(920px,calc(100vw - 32px));max-width:920px;margin:0 auto;padding:0;display:flex;flex-direction:column;overflow:visible}
.pet-species-modal-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;padding:18px 34px;border-bottom:1px solid var(--border);flex:0 0 auto;background:var(--surface)}
.pet-species-modal-head h3{margin:0;font-size:19px}.pet-species-modal-head p{margin:4px 0 0;color:var(--text-muted);font-size:12px;line-height:1.4}
.pet-species-modal-tabs{display:flex;gap:8px;padding:10px 34px;border-bottom:1px solid var(--border);background:var(--surface-2);flex:0 0 auto}
.pet-species-modal-tab{width:auto!important;font-size:12px;font-weight:700;color:var(--text-muted);padding:6px 10px;border:0;border-radius:999px;background:var(--surface-3);cursor:pointer}
.pet-species-modal-tab.is-active{color:var(--on-accent);background:var(--accent)}
.pet-species-modal-body{display:flex;flex:none;min-height:0;overflow:visible;flex-direction:column;gap:18px;padding:22px 34px 28px;margin:0}
.pet-species-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 26px}.pet-species-form-grid-spaced{margin-top:16px}
/* Information fields use a compact label : control row. The Vitals and Decay
   cards below deliberately keep their own existing layouts. */
.pet-species-form-grid>.field{display:grid;grid-template-columns:minmax(108px,38%) minmax(0,1fr);column-gap:10px;align-items:center;margin:0}
.pet-species-form-grid>.field>label{grid-column:1;margin:0;line-height:1.35}.pet-species-form-grid>.field>input,.pet-species-form-grid>.field>select,.pet-species-form-grid>.field>textarea{grid-column:2;min-width:0;margin:0}
.pet-species-form-grid>.field>textarea{align-self:start}.pet-species-form-grid>.field>.hint{grid-column:2;margin-top:3px;line-height:1.35}
.pet-species-basic-fields{padding:14px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2)}
.pet-species-basic-fields-title{font-weight:700;margin:0 0 14px;color:var(--text)}
.pet-species-active-mark{color:#22c55e;font-size:22px;font-weight:900;line-height:1;text-shadow:0 1px 5px rgba(34,197,94,.35)}
.pet-species-card-actions{display:flex;align-items:center;gap:6px}.pet-species-icon-action{padding:3px;background:transparent;border:0;box-shadow:none;color:var(--text-muted);font-size:15px;line-height:1;cursor:pointer}.pet-species-icon-action:hover{color:var(--text);transform:translateY(-1px)}.pet-species-icon-action.is-danger:hover{color:var(--danger)}
.pet-species-advanced-fields{border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 14px 14px;background:var(--surface-2)}
.pet-species-advanced-fields summary{cursor:pointer;padding:13px 0;font-weight:700}.pet-species-advanced-fields summary span{font-weight:400;font-size:12px;color:var(--text-muted);margin-left:5px}
.pet-species-modal-foot{display:flex;gap:10px;justify-content:flex-end;padding:14px 0 0;margin-top:auto;border-top:1px solid var(--border);background:var(--surface)}.pet-species-modal-foot .btn{width:auto}
.pet-species-assets-intro{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2)}
.pet-species-assets-intro strong{font-size:15px}.pet-species-assets-intro p{margin:4px 0 0;font-size:12px;line-height:1.45;color:var(--text-muted)}.pet-species-choose-assets{width:auto!important;white-space:nowrap;cursor:pointer}
.pet-species-asset-rules{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}.pet-species-asset-rules span{font-size:11px;padding:4px 7px;border-radius:999px;background:var(--surface-3);color:var(--text-muted)}
.pet-species-asset-batch-message{min-height:0;font-size:12px;color:var(--text-muted)}.pet-species-asset-batch-message.is-error{color:#dc2626}.pet-species-asset-batch-message.is-success{color:#15803d}
.pet-species-asset-upload-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}.pet-species-asset-slot{min-width:0;padding:9px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2)}
.pet-species-asset-thumb{height:82px;margin-bottom:8px;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid var(--border);border-radius:6px;background:var(--surface-3);color:var(--text-muted);font-size:10px}.pet-species-asset-thumb img{width:100%;height:100%;object-fit:contain;display:block}.pet-species-asset-thumb.is-habitat img{object-fit:cover}
.pet-species-asset-slot.is-present{border-color:#15803d}.pet-species-asset-slot.is-special{grid-column:span 1}.pet-species-asset-slot strong,.pet-species-asset-slot small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pet-species-asset-slot strong{font-size:11px}.pet-species-asset-slot small{margin-top:4px;font-size:10px;color:var(--text-muted)}.pet-species-asset-slot .present{color:#15803d}.pet-species-asset-slot .missing{color:#b45309}
@media (max-width:640px){.pet-species-modal-overlay{padding:8px!important}.pet-species-workbench-modal{width:calc(100vw - 16px)}.pet-species-modal-head{padding:14px}.pet-species-modal-tabs,.pet-species-modal-body{padding-left:18px;padding-right:18px}.pet-species-form-grid{grid-template-columns:1fr}.pet-species-assets-intro{align-items:flex-start;flex-direction:column}.pet-species-asset-upload-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* Admin Action Toast — shared feedback for every Admin mutation. */
#admin-action-toast-region{
  position:fixed;
  left:50%;
  bottom:max(20px, env(safe-area-inset-bottom));
  z-index:1100;
  width:min(calc(100vw - 32px), 520px);
  transform:translateX(-50%);
  pointer-events:none;
}
.admin-action-toast{
  display:flex;
  align-items:center;
  gap:var(--sp-2, 10px);
  min-height:48px;
  padding:var(--sp-2, 10px) var(--sp-3, 16px);
  border:1px solid var(--success, #22c55e);
  border-radius:var(--radius, 8px);
  background:var(--surface-2, #17263a);
  color:var(--text, #edf3fb);
  box-shadow:var(--shadow-lg, 0 12px 32px rgba(0,0,0,.35));
  pointer-events:auto;
  animation:admin-action-toast-in var(--dur, .18s) var(--ease, ease-out);
}
.admin-action-toast--error{border-color:var(--danger, #fb7185);}
.admin-action-toast-icon{
  display:grid;
  width:24px;
  height:24px;
  flex:0 0 24px;
  place-items:center;
  border-radius:50%;
  background:color-mix(in srgb, var(--success, #22c55e) 18%, transparent);
  color:var(--success, #22c55e);
  font-weight:900;
}
.admin-action-toast--error .admin-action-toast-icon{
  background:color-mix(in srgb, var(--danger, #fb7185) 18%, transparent);
  color:var(--danger, #fb7185);
}
.admin-action-toast-message{flex:1; min-width:0; font-size:.875rem; font-weight:700; line-height:1.4;}
.admin-action-toast-close{
  display:grid;
  width:28px;
  height:28px;
  flex:0 0 28px;
  padding:0;
  place-items:center;
  border:1px solid var(--border, rgba(148,163,184,.3));
  border-radius:var(--radius-sm, 6px);
  background:transparent;
  color:var(--text-muted, #aab6c7);
  cursor:pointer;
  font:inherit;
  font-size:1.2rem;
  line-height:1;
}
.admin-action-toast-close:hover,.admin-action-toast-close:focus-visible{color:var(--text, #fff); border-color:var(--border-strong, rgba(255,255,255,.5));}
@keyframes admin-action-toast-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
#editorGameSkinTiersList>div{min-width:0;overflow-x:hidden}
#editorGameSkinTiersList select{max-width:100%}
#editorGameSkinTiersList>div>div{min-width:0}

/* Form Thêm/Sửa tài nguyên game — chuẩn 04.00 §10.3e (head / body cuộn / foot cố định). */
.game-asset-form-modal,.game-asset-confirm{max-width:min(560px,calc(100vw - 32px));display:flex;flex-direction:column;max-height:85vh}
.game-asset-form-modal .modal-head,.game-asset-confirm .modal-head{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3);border-bottom:1px solid var(--border)}
.game-asset-form-modal .modal-head h3,.game-asset-confirm .modal-head h3{margin:0;flex:1}
.game-asset-form-modal .modal-body,.game-asset-confirm .modal-body{padding:var(--sp-3);overflow-y:auto;flex:1}
.game-asset-form-modal .modal-foot,.game-asset-confirm .modal-foot{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3);border-top:1px solid var(--border)}
.gfs-corner-row{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-2)}
.gfs-corner-slot{display:flex;flex-direction:column;align-items:center;gap:4px;min-width:0}
.gfs-corner-thumb{width:100%;height:56px;display:grid;place-items:center;background:var(--surface-3);border:1px dashed var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}
.gfs-corner-thumb img{max-width:100%;max-height:100%;object-fit:contain}
@media (max-width:480px){.gfs-corner-row{grid-template-columns:1fr 1fr}}

/* Badges component — shared across admin pages */
.badge {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
}
.badge.active, .badge.success, .badge.new { background: rgba(16, 185, 129, 0.2); color: #10b981; }
.badge.soon, .badge.modified { background: rgba(245, 158, 11, 0.2); color: #fbbf24; }
.badge.maintenance, .badge.failed { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
.badge.pending { background: rgba(59, 130, 246, 0.2); color: #3b82f6; }
.badge.applied { background: rgba(107, 114, 128, 0.2); color: #9ca3af; }
.badge.rolled-back { background: rgba(139, 92, 246, 0.2); color: #a78bfa; }

/* Mouse Light Glow Effect — admin.php, admin_update.php */
.panel, .game-card {
  position: relative;
}
.panel::before, .game-card::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(circle at var(--mx, 50%) var(--my, 0%), color-mix(in srgb, var(--accent) 18%, transparent) 0%, transparent 60%);
  transition: opacity 0.3s ease;
  border-radius: inherit;
}
.panel:hover::before, .game-card:hover::before {
  opacity: 1;
}
.panel > *, .game-card > * {
  position: relative;
  z-index: 1;
}

.game-with-leaderboard { display: flex; gap: var(--sp-4); align-items: flex-start; flex-wrap: wrap; }
/* .game-container gốc có max-width:600px + margin:auto (dành cho layout 1 cột standalone) — trong
   ngữ cảnh 2 cột này phải gỡ 2 giới hạn đó thì flex-grow mới thực sự giãn khung Game lấp đầy
   khoảng trống dư ra (chốt Owner 2026-07-10, bug "không responsive"/còn khoảng trắng thừa). */
.game-with-leaderboard .game-container { flex: 1 1 480px; max-width: none; margin: 0; }
/* JOB_53 — khi .game-container được bọc thêm .game-frame-wrap (để viền góc tràn ra ngoài biên
   không bị overflow:hidden cắt mất), wrapper mới là flex item thật sự — .game-container bên
   trong chỉ cần lấp đầy 100% wrapper, không tự set flex nữa (không phải flex item trực tiếp). */
.game-with-leaderboard .game-frame-wrap { flex: 1 1 480px; max-width: none; }
.game-with-leaderboard .game-frame-wrap .game-container { max-width: none; margin: 0; width: 100%; box-sizing: border-box; }
/* Thu gọn BXH còn ~2/3 chiều rộng cũ, sau đó nới lại +100px theo phản hồi Owner (áp dụng chung mọi game):
   flex:0 = không tự giãn nở, toàn bộ không gian dư dồn hết cho .game-container */
.game-with-leaderboard .game-leaderboard-panel { flex: 0 1 420px; max-width: 420px; min-width: 240px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--sp-2); }
/* [Standard Breakpoint] Tablet layout (1024px và nhỏ hơn) - Xếp game và leaderboard dọc */
@media (max-width: 1024px) {
  .game-with-leaderboard { flex-direction: column; }
  .game-with-leaderboard .game-leaderboard-panel { order: 2; width: 100%; max-width: none; }
}
.board-myrank { background: rgba(255,255,255,0.06); font-weight: 700; }
.board-divider { text-align: center; color: var(--text-muted); padding: 4px 0; }

/* =============================================================
   JOB_48 — GAME SKIN PROGRESSIVE UNLOCK (component dùng chung mọi game)
   ============================================================= */
/* JOB_48 — Đặt trong hàng back-button/title (đầu trang), gọn hơn bản đứng-riêng ban đầu */
.skin-unlock-card {
  display: flex; align-items: center; gap: var(--sp-2); flex-wrap: nowrap;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-pill);
  padding: 6px 8px 6px 14px; margin: 0;
}
.skin-unlock-card .skin-unlock-info { flex: 0 1 220px; min-width: 160px; }
.skin-unlock-card .skin-unlock-name { font-weight: 700; margin-bottom: 4px; color: var(--text); font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Số bàn đã thắng đè trực tiếp LÊN thanh trạng thái (giống ống Năng Lượng ở header), không phải dòng text riêng bên dưới */
.skin-unlock-track { position: relative; width: 100%; height: 18px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; }
.skin-unlock-fill { position: absolute; inset: 0; width: 0; height: 100%; border-radius: 999px; background: var(--grad-accent); transition: width 0.4s ease; }
.skin-unlock-track-text {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font-size: 10px; font-weight: 700; color: #fff; white-space: nowrap; padding: 0 4px;
  text-shadow: 0 1px 2px rgba(0,0,0,0.6); pointer-events: none;
}
.skin-unlock-action { min-height: 32px; padding: 0 14px; font-size: 13px; flex-shrink: 0; }

.game-skin-selector {
  min-height: 36px; font-size: 13px; padding: 0 10px; border-radius: var(--radius-sm);
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text);
}

/* Hiệu ứng chúc mừng khi Kích Hoạt Giao Diện mới (JOB_48) */
@keyframes skinActivatePulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.05); }
  100% { transform: scale(1); }
}
.skin-unlock-card.activating { animation: skinActivatePulse 0.6s ease; }

/* =============================================================
   2048 GAME STYLES
   ============================================================= */
.num2048-board-outer {
  position: relative;
  width: 100%;
  max-width: 440px;
  margin: 0 auto var(--sp-4) auto;
  aspect-ratio: 1;
  background: var(--surface-2);
  border: 2px solid var(--border-strong);
  border-radius: var(--radius-lg);
  padding: 12px;
  box-sizing: border-box;
  box-shadow: var(--shadow-sm);
  user-select: none;
  touch-action: none; /* Block scrolling when swiping */
}

/* Static grid of cells */
.num2048-grid {
  display: grid;
  width: 100%;
  height: 100%;
  gap: 10px;
  grid-template-rows: repeat(var(--grid-rows, 4), 1fr);
  grid-template-columns: repeat(var(--grid-cols, 4), 1fr);
  box-sizing: border-box;
}

.num2048-cell {
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.05);
  border-radius: var(--radius);
  box-sizing: border-box;
}

/* Tile container overlay */
.num2048-tile-container {
  position: absolute;
  top: 12px;
  left: 12px;
  right: 12px;
  bottom: 12px;
  pointer-events: none;
  width: calc(100% - 24px);
  height: calc(100% - 24px);
}

/* A single active tile */
.num2048-tile {
  position: absolute;
  left: 0;
  top: 0;
  box-sizing: border-box;
  padding: 5px;
  /* Animating grid moves */
  transition: transform 0.12s ease-in-out, opacity 0.12s ease-in-out;
  font-family: var(--font-display);
  font-weight: 800;
  z-index: 10;
}

.num2048-tile-inner {
  width: 100%;
  height: 100%;
  border-radius: var(--radius);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  font-size: clamp(20px, 4.5vw, 36px);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  transition: background 0.15s ease, color 0.15s ease, transform 0.12s ease;
  box-shadow: var(--shadow-sm), inset 0 0 0 1px rgba(255, 255, 255, 0.1);
  box-sizing: border-box;
  animation: num2048-tile-spawn 0.18s ease-out;
}

/* Spawn / Merge Animations */
@keyframes num2048-tile-spawn {
  0% { transform: scale(0); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}

.num2048-tile-merged .num2048-tile-inner {
  animation: num2048-tile-merge 0.18s ease-in-out;
}

@keyframes num2048-tile-merge {
  0% { transform: scale(1); }
  50% { transform: scale(1.15); }
  100% { transform: scale(1); }
}

/* Different Tile Values Styling (Using vibrant tokens/HSL) */
.num2048-tile-2 .num2048-tile-inner { background: linear-gradient(135deg, #475569, #64748b); color: #fff; }
.num2048-tile-4 .num2048-tile-inner { background: linear-gradient(135deg, #1e293b, #334155); color: #e2e8f0; }
.num2048-tile-8 .num2048-tile-inner { background: linear-gradient(135deg, #ea580c, #f97316); color: #fff; box-shadow: 0 0 12px rgba(249, 115, 22, 0.2); }
.num2048-tile-16 .num2048-tile-inner { background: linear-gradient(135deg, #dc2626, #ef4444); color: #fff; box-shadow: 0 0 15px rgba(239, 68, 68, 0.3); }
.num2048-tile-32 .num2048-tile-inner { background: linear-gradient(135deg, #db2777, #ec4899); color: #fff; box-shadow: 0 0 15px rgba(236, 72, 153, 0.35); }
.num2048-tile-64 .num2048-tile-inner { background: linear-gradient(135deg, #9333ea, #a855f7); color: #fff; box-shadow: 0 0 18px rgba(168, 85, 247, 0.4); }
.num2048-tile-128 .num2048-tile-inner { background: linear-gradient(135deg, #4f46e5, #6366f1); color: #fff; box-shadow: 0 0 20px rgba(99, 102, 241, 0.45); }
.num2048-tile-256 .num2048-tile-inner { background: linear-gradient(135deg, #0d9488, #14b8a6); color: #fff; box-shadow: 0 0 22px rgba(20, 184, 166, 0.5); }
.num2048-tile-512 .num2048-tile-inner { background: linear-gradient(135deg, #0891b2, #06b6d4); color: #fff; box-shadow: 0 0 24px rgba(6, 182, 212, 0.55); }
.num2048-tile-1024 .num2048-tile-inner { background: linear-gradient(135deg, #ca8a04, #eab308); color: #000; font-weight: 900; box-shadow: 0 0 28px rgba(234, 179, 8, 0.6); }
.num2048-tile-2048 .num2048-tile-inner { 
  background: linear-gradient(135deg, #d97706, #fbbf24, #f59e0b); 
  color: #1a1206; 
  font-weight: 900;
  box-shadow: 0 0 35px #fbbf24, inset 0 0 10px rgba(255, 255, 255, 0.6);
  animation: num2048-gold-pulse 2s infinite ease-in-out;
}
.num2048-tile-super .num2048-tile-inner {
  background: linear-gradient(135deg, #7c3aed, #ff2e63, #00e5ff);
  color: #fff;
  font-weight: 900;
  box-shadow: 0 0 45px #00e5ff, inset 0 0 15px rgba(255, 255, 255, 0.7);
}

@keyframes num2048-gold-pulse {
  0%, 100% { box-shadow: 0 0 25px #fbbf24, inset 0 0 10px rgba(255, 255, 255, 0.6); transform: scale(1); }
  50% { box-shadow: 0 0 45px #fbbf24, inset 0 0 15px rgba(255, 255, 255, 0.8); transform: scale(1.02); }
}

/* Adjust font size for larger numbers */
.num2048-tile-128 .num2048-tile-inner,
.num2048-tile-256 .num2048-tile-inner,
.num2048-tile-512 .num2048-tile-inner {
  font-size: clamp(16px, 3.8vw, 28px);
}
.num2048-tile-1024 .num2048-tile-inner,
.num2048-tile-2048 .num2048-tile-inner,
.num2048-tile-super .num2048-tile-inner {
  font-size: clamp(14px, 3.2vw, 24px);
}

/* Invalid-move feedback: quick shake instead of dead silence on a no-op swipe */
@keyframes num2048-shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-6px); }
  40% { transform: translateX(5px); }
  60% { transform: translateX(-4px); }
  80% { transform: translateX(3px); }
}
.num2048-shake {
  animation: num2048-shake 0.22s ease-in-out;
}

/* Merge particle burst — ported from match3's spawnParticles(), same visual language */
.num2048-particles {
  position: absolute;
  width: 0;
  height: 0;
  pointer-events: none;
  z-index: 20;
}
.num2048-particle {
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 50%;
  opacity: 1;
  transition: transform 0.5s ease-out, opacity 0.5s ease-out;
  will-change: transform, opacity;
}

/* Combo text ("Combo x3!") for a swipe that merges more than one pair at once */
.num2048-combo-text {
  position: absolute;
  top: 40%;
  left: 50%;
  transform: translate(-50%, -50%) scale(0.7);
  opacity: 0;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(18px, 5vw, 28px);
  color: #ffd60a;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5), 0 0 16px rgba(255, 214, 10, 0.6);
  pointer-events: none;
  z-index: 30;
  transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 0.3s ease;
}
.num2048-combo-text-show {
  opacity: 1;
  transform: translate(-50%, -50%) scale(1);
}

/* =============================================================
   2048 MOBILE RESPONSIVE LAYOUT & CONTROLS FIXES
   ============================================================= */
@media (max-width: 600px) {
  .game-with-leaderboard .game-container {
    flex: 1 1 auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  .game-container {
    padding: var(--sp-2) !important;
    border-radius: var(--radius) !important;
    margin: var(--sp-2) auto !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }
  /* JOB_53 — .game-frame-wrap cũng cần gỡ giới hạn max-width/flex y hệt .game-container ở trên,
     vì giờ WRAPPER mới là flex item thật (xem rule desktop phía trên định nghĩa .game-frame-wrap). */
  .game-with-leaderboard .game-frame-wrap {
    flex: 1 1 auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  /* JOB_53 — thu nhỏ viền góc + giảm độ tràn ra ngoài trên mobile, tránh đè lên nội dung hẹp
     (nút BẮT ĐẦU CHƠI/ô độ khó) hoặc tràn ra ngoài viewport. */
  .game-frame-corner {
    width: 20%;
    max-width: 64px;
  }
  .game-frame-corner-tl { top: -8px;    left: -8px; }
  .game-frame-corner-tr { top: -8px;    right: -8px; }
  .game-frame-corner-bl { bottom: -8px; left: -8px; }
  .game-frame-corner-br { bottom: -8px; right: -8px; }
  .game-header {
    flex-direction: column !important;
    align-items: center !important;
    gap: var(--sp-2) !important;
    margin-bottom: var(--sp-2) !important;
  }
  .game-stats {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 8px !important;
    width: 100% !important;
  }
  .game-stat-box {
    min-width: 0 !important;
    padding: 6px 10px !important;
    font-size: 13px !important;
    text-align: center !important;
  }
  .num2048-board-outer {
    padding: 8px !important;
    border-radius: var(--radius-sm) !important;
    max-width: 100% !important;
    margin-bottom: var(--sp-2) !important;
  }
  .num2048-tile-container {
    top: 8px !important;
    left: 8px !important;
    right: 8px !important;
    bottom: 8px !important;
    width: calc(100% - 16px) !important;
    height: calc(100% - 16px) !important;
  }
  .num2048-grid {
    gap: 6px !important;
  }
  .num2048-tile {
    padding: 3px !important;
  }
  .num2048-tile-inner {
    border-radius: var(--radius-sm) !important;
  }
  .difficulty-selector {
    flex-wrap: wrap !important;
    justify-content: center !important;
    margin-bottom: var(--sp-2) !important;
  }
  .diff-btn {
    padding: 6px 12px !important;
    font-size: 12px !important;
  }
}

/* =============================================================
   WHACK-A-MOLE GAME STYLES
   ============================================================= */
.whack-mole-grid {
  display: grid;
  width: 100%;
  aspect-ratio: 1;
  max-width: 440px;
  margin: 0 auto var(--sp-4) auto;
  gap: 16px;
  background: var(--surface-2);
  border: 2px solid var(--border-strong);
  border-radius: var(--radius-lg);
  padding: 16px;
  box-sizing: border-box;
  box-shadow: var(--shadow-sm);
  user-select: none;
}

.whack-mole-cell {
  position: relative;
  aspect-ratio: 1;
  background: transparent;
  overflow: hidden;
  border-radius: var(--radius);
}

/* Hole style: CSS brown circle/ellipse at the bottom of the cell */
.whack-mole-hole {
  position: absolute;
  bottom: 0;
  left: 5%;
  width: 90%;
  height: 40%;
  background: radial-gradient(ellipse at center, #3e2723 0%, #1b0000 100%);
  border: 2px solid #5d4037;
  border-radius: 50%;
  z-index: 1;
  box-shadow: inset 0 8px 16px rgba(0,0,0,0.8), 0 4px 8px rgba(0,0,0,0.4);
}

/* Active element inside cell (mole or bomb) */
.whack-mole-item {
  position: absolute;
  top: 100%; /* Hidden below by default */
  left: 15%;
  width: 70%;
  height: 75%;
  z-index: 2;
  display: grid;
  place-items: center;
  font-size: clamp(32px, 7vw, 64px);
  cursor: pointer;
  transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.15), opacity 0.2s ease;
  pointer-events: auto;
}

.whack-mole-item img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
}

/* Active class when mole/bomb is up */
.whack-mole-item.up {
  transform: translateY(-90%);
}

.whack-mole-item.hit {
  animation: hit-shake 0.15s ease-in-out 2;
  opacity: 0.5;
  pointer-events: none;
}

@keyframes hit-shake {
  0%, 100% { transform: translateY(-90%) rotate(0deg); }
  25% { transform: translateY(-90%) rotate(-10deg); }
  75% { transform: translateY(-90%) rotate(10deg); }
}

/* Floating indicators like +10 or -15 */
.whack-mole-floating-score {
  position: absolute;
  z-index: 10;
  font-family: var(--font-display);
  font-weight: 900;
  font-size: 20px;
  pointer-events: none;
  animation: float-up-fade 0.8s ease-out forwards;
}

.whack-mole-floating-score.plus {
  color: var(--success);
  text-shadow: 0 0 8px rgba(52, 211, 153, 0.6);
}

.whack-mole-floating-score.minus {
  color: #ef4444;
  text-shadow: 0 0 8px rgba(239, 68, 68, 0.6);
}

@keyframes float-up-fade {
  0% { transform: translateY(0); opacity: 1; }
  100% { transform: translateY(-50px); opacity: 0; }
}

  /* [Micro-Adjustment] Thu hẹp gap và padding lưới game whack-mole trên màn hình <480px */
  @media (max-width: 480px) {
    .whack-mole-grid {
      gap: 8px !important;
      padding: 8px !important;
    }
  }

.explode-shake {
  animation: grid-shake 0.4s ease-in-out;
}

@keyframes grid-shake {
  0%, 100% { transform: translateX(0); }
  10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
  20%, 40%, 60%, 80% { transform: translateX(5px); }
}

/* Shared Preset Thumbnail Styles for Game Editor Modal */
.preset-thumb {
  aspect-ratio: 1;
  background: var(--surface-3);
  border: 1.5px solid var(--border);
  border-radius: 6px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 4px;
  transition: all 0.2s ease;
}
.preset-thumb:hover {
  border-color: var(--brand);
  background: var(--surface-4);
  transform: translateY(-1px);
}
.preset-thumb.active {
  border-color: var(--brand);
  background: rgba(96, 165, 250, 0.15);
  box-shadow: 0 0 8px rgba(96, 165, 250, 0.3);
}
.preset-thumb img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

/* Wealth Boards Layout (B§5) */
.wealth-boards {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}

/* [Standard Breakpoint] Tablet/Desktop layout (601px trở lên) - Xếp 2 cột song song */
@media (min-width: 601px) {
  .wealth-boards {
    grid-template-columns: 1fr 1fr;
  }
}

.wealth-board {
  background: var(--bg-pane);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px;
}

/* JOB_04 — Sảnh Giao Thương trong Shop Modal */
.exch-label{display:block;font-size:13px;font-weight:700;color:var(--text-muted);margin:14px 0 6px}
.exch-select,.exch-input{width:100%;min-height:44px;padding:0 12px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--surface-2);color:var(--text);font-size:15px}
.exch-preview{margin:14px 0;font-size:15px;color:var(--text)}
.exch-muted{color:var(--text-muted);font-size:13px}
.exch-warn{color:var(--brand,#ef4444);font-weight:700}
.exch-msg{margin-top:10px;font-size:14px}

/* Card Locked Styles */
.card-locked {
  position: relative;
}
.card-locked .card-thumb {
  opacity: 0.6;
  filter: grayscale(1) blur(0.5px);
  transition: opacity 0.3s, filter 0.3s;
}
.card-locked:hover .card-thumb {
  opacity: 0.8;
  filter: grayscale(0.5);
}

/* =========================================================
   GLOBAL BROADCAST SYSTEM (JOB_23)
   ========================================================= */
.broadcast-bar {
  position: fixed;
  top: var(--header-h);
  left: 0;
  width: 100%;
  z-index: 45;
  overflow: hidden;
  white-space: nowrap;
  background: transparent;
  height: 36px;
  display: flex;
  align-items: center;
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;  /* THÊM: ẩn mượt, không bao giờ chặn click kể cả khi "active" */
}
.broadcast-bar.running {
  opacity: 1;
}
.broadcast-bar.active {
  background: rgba(0, 0, 0, var(--broadcast-dim-alpha, 0.75));
  backdrop-filter: blur(4px);
  border-bottom: 1px solid var(--border);
}
.broadcast-bar-track {
  display: inline-block;
  padding-left: 100%;
  will-change: transform;
  font-size: 14px;
  white-space: nowrap;
}

.modal-overlay.broadcast-vip {
  align-items: flex-start;
  padding-top: var(--vip-top-offset, 12vh);
}
.modal.broadcast-vip {
  box-shadow: var(--glow-accent), var(--shadow-lg);
  animation: broadcastPopIn .35s var(--ease);
}
@keyframes broadcastPopIn {
  from { transform: translateY(-24px) scale(.9); opacity: 0 }
  to { transform: none; opacity: 1 }
}
@keyframes broadcastGlowPulse {
  0%, 100% { box-shadow: 0 0 10px rgba(251, 191, 36, 0.4); }
  50% { box-shadow: 0 0 25px rgba(251, 191, 36, 0.8); }
}

/* =========================================================
   GLOBAL INVENTORY SYSTEM (JOB_24)
   ========================================================= */
.global-inventory-fab, .inventory-fab {
  position: fixed;
  bottom: 24px;
  right: 24px;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--brand, #fbbf24), #d97706);
  border: 2px solid rgba(255, 255, 255, 0.2);
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4), inset 0 2px 4px rgba(255, 255, 255, 0.3);
  cursor: pointer;
  z-index: 60;
  display: flex;
  align-items: center;
  justify-content: center;
  /* CHỈ transition transform + box-shadow (2 thứ hiệu ứng hover thực sự dùng).
     Trước đây là `all` nên khi class .inventory-fab-plain được gắn sau lúc tạo nút
     (config tải xong muộn hơn authChange), nút bị "nhảy" kích thước/vị trí 0.3s mỗi
     lần tải trang. Cũng tránh animate thuộc tính layout (width/bottom/right). */
  transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275),
              box-shadow 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

.global-inventory-fab:hover, .inventory-fab:hover {
  transform: scale(1.1) translateY(-2px);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5), inset 0 2px 4px rgba(255, 255, 255, 0.4);
}

.global-inventory-fab:active, .inventory-fab:active {
  transform: scale(0.95);
}

.global-inventory-fab .fab-icon, .inventory-fab .fab-icon {
  font-size: 28px;
  line-height: 1;
}
.inventory-fab-custom-icon { display: block; width: 30px; height: 30px; object-fit: contain; }

/* Icon Rương Chứa Đồ tự upload (PNG đẹp riêng) — bỏ vòng tròn nền cam-vàng mặc định,
   để ảnh đứng độc lập và to hơn (Owner yêu cầu 2026-07-30). */
.inventory-fab.inventory-fab-plain {
  background: none;
  border: none;
  box-shadow: none;
  width: 64px;
  height: 64px;
  /* File PNG có sẵn viền trong suốt bên trong (phải ~11.7%, đáy ~16.7% kích thước ảnh),
     nên khoảng cách NHÌN THẤY luôn lớn hơn giá trị bottom/right ở đây. Trừ hao phần viền
     đó để mép ảnh THẬT cách cạnh màn hình ~10px cả hai phía (Owner yêu cầu 2026-07-30).
     KHÔNG hạ right xuống dưới 4px: huy hiệu số lượng nằm ở right:-4px so với nút, thấp hơn
     nữa là huy hiệu bị cắt mất khỏi mép màn hình. */
  bottom: 0;
  right: 4px;
}
.inventory-fab.inventory-fab-plain:hover {
  box-shadow: none;
}
.inventory-fab-plain .inventory-fab-custom-icon {
  width: 100%;
  height: 100%;
}

/* NV4: Khi đang chơi game (canvas full màn mobile) — FAB lùi vào góc nhỏ hơn, KHÔNG ẩn hẳn (04.00 §6.2) */
body.game-active .global-inventory-fab,
body.game-active .inventory-fab {
  bottom: 12px;
  right: 12px;
  transform: scale(0.8);
}
@media (max-width: 600px) {
  body.game-active .global-inventory-fab,
  body.game-active .inventory-fab {
    bottom: 8px;
    right: 8px;
    transform: scale(0.72);
  }
}

.inventory-fab-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  border-radius: var(--radius-pill, 999px);
  background: var(--danger, #ef4444);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 4px;
  border: 1.5px solid var(--surface-2, #111827);
  box-shadow: 0 2px 5px rgba(0,0,0,0.3);
}

/* Inventory Item Grid inside Modal */
.inventory-item-card {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  background: var(--surface-3, #1f2937);
  border: 1px solid var(--border, #374151);
  border-radius: var(--radius, 8px);
  transition: all 0.2s ease;
}

.inventory-item-card:hover {
  border-color: var(--brand, #fbbf24);
  background: var(--surface-4, #2d3748);
}

.inventory-item-info {
  display: flex;
  align-items: center;
  gap: 12px;
}

.inventory-item-icon-wrapper {
  font-size: 28px;
  line-height: 1;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2, #111827);
  border-radius: 8px;
  border: 1px solid var(--border-strong, #4b5563);
}

.inventory-item-details {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.inventory-item-name {
  font-weight: 700;
  font-size: 14px;
  color: var(--text, #f9fafb);
}

.inventory-item-tags {
  display: flex;
  align-items: center;
  gap: 6px;
}

.inventory-item-qty {
  font-size: 12px;
  font-weight: 700;
  color: var(--brand, #fbbf24);
  background: rgba(251, 191, 36, 0.1);
  padding: 2px 6px;
  border-radius: 4px;
}

.inventory-item-lock-tag {
  font-size: 10px;
  font-weight: 600;
  padding: 2px 6px;
  border-radius: 4px;
}

.inventory-item-lock-tag.locked {
  background: rgba(239, 68, 68, 0.1);
  color: #f87171;
}

.inventory-item-lock-tag.tradeable {
  background: rgba(16, 185, 129, 0.1);
  color: #34d399;
}

/* =========================================================
   JOB_28 — CUSTOM SCROLLBAR
   ========================================================= */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--bg-2); }
::-webkit-scrollbar-thumb { background: var(--surface-3); border-radius: var(--radius-sm); border: 2px solid var(--bg-2); }
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
* { scrollbar-width: thin; scrollbar-color: var(--surface-3) var(--bg-2); }

#logoMark.has-custom-logo {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  animation: none !important;
  width: auto !important;
  height: var(--header-h) !important;   /* ĐỔI: cố định = chiều cao header, KHÔNG để auto (auto gây căn giữa lệch cả 2 phía) */
  display: block !important;
  position: relative !important;         /* THÊM */
  overflow: visible !important;          /* THÊM */
}
#logoMark.has-custom-logo img,
#logoMark.has-custom-logo video {
  position: absolute !important;         /* THÊM: thoát khỏi luồng tính chiều cao của cha */
  top: 0 !important;                     /* THÊM: neo đúng mép trên = mép trên header */
  left: 0 !important;                    /* THÊM */
  max-width: none !important;            /* THÊM — BẮT BUỘC */
}

#footerLogoMark.has-custom-logo,
#authModalLogoMark.has-custom-logo {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  animation: none !important;
  width: auto !important;
  height: 40px !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
}
#footerLogoMark.has-custom-logo img,
#footerLogoMark.has-custom-logo video,
#authModalLogoMark.has-custom-logo img,
#authModalLogoMark.has-custom-logo video {
  height: 40px !important;
  max-height: 40px !important;
  width: auto !important;
  object-fit: contain !important;
  display: block !important;
}


/* =========================================================
   JOB_30 — MMO ITEM SLOT GRID + TOOLTIP + KIẾN TRÚC KHUNG
   ========================================================= */

.item-slot-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(calc(var(--item-slot-max) - 18px), var(--item-slot-max)));
  gap: var(--sp-2, 8px);
  justify-content: start;
}

/* Rương chứa đồ: giữ cố định chiều cao ~3 hàng vật phẩm; hàng thứ 4 trở đi cuộn dọc
   bên trong thay vì phình to khung modal — rõ nhất trên mobile khi nhiều loại vật
   phẩm khiến số hàng tăng nhanh. Scoped riêng #inventoryModalContent, không đụng
   lưới Cửa Hàng (dùng chung class .item-slot-grid). Chiều cao 1 hàng = ô vuông
   (--item-slot-max) + khoảng cách với tên (4px, inline style .inv-slot-wrap) + tên
   2 dòng (1.2em * 2 * 10px = 24px).
*/
#inventoryModalContent .item-slot-grid {
  max-height: calc((var(--item-slot-max) + 28px) * 3 + var(--sp-2, 8px) * 2);
  overflow-y: auto;
  overscroll-behavior-y: contain;
  padding-right: 4px;
}

/* Tên vật phẩm: cố định 2 dòng, nút giá không lệch cao-thấp */
.item-slot-name {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  line-height: 1.2;
  min-height: calc(1.2em * 2);
  text-align: center;
  font-size: 10px;
  color: var(--text-muted);
  max-width: 72px;
  word-break: break-word;
}

.item-slot {
  position: relative;
  width: 100%;
  max-width: var(--item-slot-max);
  aspect-ratio: 1 / 1;
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color 0.18s ease, transform 0.18s ease, box-shadow 0.18s ease;
  overflow: hidden;
  user-select: none;
}

.item-slot:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0,0,0,0.3);
}
[data-theme="kid"] .item-slot { border-radius: var(--radius); }

.item-slot-icon {
  width: 70%;
  height: 70%;
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  font-size: var(--item-slot-icon);
}

.item-slot-qty {
  position: absolute;
  bottom: 2px;
  right: 4px;
  font-size: 11px;
  font-weight: 700;
  color: var(--text);
  text-shadow: 0 1px 2px rgba(0,0,0,.8);
  pointer-events: none;
}

.item-tooltip {
  display: none;
  position: fixed;
  z-index: 9500;
  max-width: 240px;
  min-width: 160px;
  background: var(--surface);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lg);
  padding: 10px 12px;
  font-size: 12px;
  color: var(--text);
  pointer-events: none;
}
.item-tooltip b {
  display: block;
  margin-bottom: 4px;
  color: var(--brand);
  font-size: 13px;
}
.item-tooltip p {
  margin: 0 0 6px 0;
  color: var(--text-muted);
  line-height: 1.4;
}
.item-tooltip-row {
  display: flex;
  justify-content: space-between;
  gap: 8px;
  margin-top: 4px;
}
.item-tooltip-row span { color: var(--text-muted); }
.item-tooltip-row b { color: var(--text); font-size: 11px; }

/* Kiến trúc khung MMO — dải mái vòm + phân tầng nền */
.mmo-architecture-frame {
  position: relative;
  background: var(--surface);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
  padding-top: calc(var(--sp-4, 16px) + 6px);
}
.mmo-architecture-frame::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 6px;
  background: var(--grad-primary, linear-gradient(90deg, var(--brand, #fbbf24), var(--accent, #22d3ee)));
  z-index: 0;
}
.mmo-architecture-frame .mmo-frame-inner {
  background: var(--surface-2);
  border-radius: var(--radius-sm);
  padding: var(--sp-3, 12px);
  position: relative;
  z-index: 1;
}

/* BXH card — fix token không tồn tại --bg-pane/--r-md → dùng token chuẩn + mái vòm */
.bxh-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px;
  box-shadow: var(--shadow-lg);
  position: relative;
  overflow: hidden;
}
.bxh-card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 4px;
  background: var(--grad-primary, linear-gradient(90deg, var(--brand, #fbbf24), var(--accent, #22d3ee)));
}

/* Wealth board fix token */
.wealth-board {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 20px;
  box-shadow: var(--shadow-lg);
}

/* [Micro-Adjustment] Giảm nhẹ size slot hòm đồ để hiển thị đẹp trên màn hình cực nhỏ (<375px) */
@media (max-width: 375px) {
  .item-slot-grid { grid-template-columns: repeat(auto-fit, minmax(calc(var(--item-slot-max) - 28px), calc(var(--item-slot-max) - 16px))); justify-content: start; }
}

/* Mission card dùng mmo-architecture-frame kế thừa */
.mission-card {
  position: relative;
  overflow: hidden;
}
.mission-card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: var(--grad-primary, linear-gradient(90deg, var(--brand, #fbbf24), var(--accent, #22d3ee)));
}

/* =========================================================
   JOB_31 N2 — Admin Pane: Thu gọn form input/select (không zoom-out)
   ========================================================= */

/* Mọi input/select trong admin pane thu về 38px — chuẩn §3c */
.admin-pane input[type="text"],
.admin-pane input[type="number"],
.admin-pane input[type="email"],
.admin-pane input[type="password"],
.admin-pane select,
.admin-pane textarea {
  font-size: 13px;
}
.admin-pane input[type="text"],
.admin-pane input[type="number"],
.admin-pane input[type="email"],
.admin-pane input[type="password"],
.admin-pane select {
  min-height: 38px;
  padding: 0 10px;
}

/* .setting-grid — layout tự co minmax không vỡ ngang (§3c) */
.setting-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--sp-3, 16px);
}
.setting-grid-lg {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--sp-3, 16px);
}

/* .form-section — card bọc cụm field admin */
.form-section {
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: var(--sp-3, 16px);
}
.form-section h4 {
  font-size: 14px;
  font-weight: 700;
  margin: 0 0 12px 0;
  color: var(--brand);
  display: flex;
  align-items: center;
  gap: 6px;
}

/* .field — label + input wrapper trong admin */
.field {
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.field label {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-muted);
}

/* Responsive admin layout: xuống 1 cột ở mobile */
@media (max-width: 600px) {
  .setting-grid, .setting-grid-lg {
    grid-template-columns: 1fr;
  }
  .admin-pane input[type="text"],
  .admin-pane input[type="number"],
  .admin-pane select {
    min-height: 40px; /* ngón tay dễ bấm */
  }
}

.whack-mole-godot-page { padding-top: var(--sp-4); padding-bottom: var(--sp-4); min-height: calc(100vh - var(--header-h) - 120px); }
.whack-mole-godot-toolbar { display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-3); margin-bottom:var(--sp-3); }
.whack-mole-godot-shell { width:100%; max-width:100%; padding:0; overflow:hidden; background:linear-gradient(145deg,#173d31,#285d42); }
.whack-mole-godot-board { position:relative; width:100%; min-width:0; min-height:540px; background:linear-gradient(145deg,#173d31,#285d42); border-radius:12px; overflow:hidden; }
.whack-mole-godot-loading { position:absolute; inset:0; z-index:2; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px; color:var(--text-muted); background:linear-gradient(145deg,#173d31,#285d42); pointer-events:none; }
.whack-mole-godot-loading-logo { display:block; width:200px; height:136px; max-width:calc(100% - 32px); object-fit:contain; }
.whack-mole-godot-iframe { display:block; width:100%; min-width:0; border:0; border-radius:12px; background:#173d31; }
.whack-mole-godot-fallback { padding:var(--sp-6); text-align:center; }
@media (max-width:600px) {
  .whack-mole-godot-page .game-with-leaderboard,
  .whack-mole-godot-page .game-container,
  .whack-mole-godot-page .game-frame-wrap { width:100%!important; max-width:100%!important; min-width:0!important; box-sizing:border-box!important; }
  .whack-mole-godot-page { padding-left:6px; padding-right:6px; }
  .whack-mole-godot-toolbar { gap:8px; }
}

/* =========================================================
   JOB_75 — Avatar frame library (scoped admin pane)
   ========================================================= */
#pane-avatar-frames.af-pane { display: grid; gap: var(--sp-4); }
#pane-avatar-frames .af-header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-3); padding-bottom: var(--sp-3); border-bottom: 1px solid var(--border); }
#pane-avatar-frames .af-header h3, #pane-avatar-frames .af-editor-heading h4, #pane-avatar-frames .af-panel-heading h4, #pane-avatar-frames .af-frame-card h4, #pane-avatar-frames .af-group-row h4 { margin: 0; }
#pane-avatar-frames .af-header p, #pane-avatar-frames .af-panel-heading p, #pane-avatar-frames .af-code, #pane-avatar-frames .af-ref-summary, #pane-avatar-frames .af-draft-filename { margin: var(--sp-1) 0 0; color: var(--text-muted); font-size: 13px; }
#pane-avatar-frames .af-tabs, #pane-avatar-frames .af-toolbar-actions, #pane-avatar-frames .af-form-actions, #pane-avatar-frames .af-card-actions, #pane-avatar-frames .af-badges { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1); }
#pane-avatar-frames .af-tabs { flex-shrink: 0; padding: var(--sp-1); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-pill); }
#pane-avatar-frames .af-toolbar { display: flex; align-items: end; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-3); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius); }
#pane-avatar-frames .af-toolbar-fields { display: grid; grid-template-columns: repeat(3, minmax(140px, 1fr)); gap: var(--sp-2); flex: 1; }
#pane-avatar-frames .af-control, #pane-avatar-frames .af-form-grid > label, #pane-avatar-frames .af-draft-details label, #pane-avatar-frames .af-editor-card > label { display: grid; gap: var(--sp-1); color: var(--text-muted); font-size: 12px; font-weight: 600; }
#pane-avatar-frames .af-control input, #pane-avatar-frames .af-control select, #pane-avatar-frames .af-form-grid input, #pane-avatar-frames .af-form-grid select, #pane-avatar-frames .af-editor-card > label input, #pane-avatar-frames .af-draft-details input, #pane-avatar-frames .af-draft-details select { width: 100%; box-sizing: border-box; }
#pane-avatar-frames .af-disclosure { position: relative; }
#pane-avatar-frames .af-disclosure summary { list-style: none; cursor: pointer; }
#pane-avatar-frames .af-disclosure summary::-webkit-details-marker { display: none; }
#pane-avatar-frames .af-disclosure[open] .af-action-panel { position: absolute; right: 0; top: calc(100% + var(--sp-2)); z-index: 10; width: min(440px, calc(100vw - var(--sp-5))); }
#pane-avatar-frames .af-action-panel, #pane-avatar-frames .af-editor-card { display: grid; gap: var(--sp-2); padding: var(--sp-3); background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius); box-shadow: var(--shadow-lg); }
#pane-avatar-frames .af-check { display: flex; gap: var(--sp-1); align-items: center; color: var(--text-muted); font-size: 13px; }
/* Sửa Khung / Cấp-Thu hồi giờ là popup (không còn cột sidebar cố định) — lưới khung
   avatar dùng trọn chiều rộng thay vì bị cột 280-380px rỗng ăn chỗ (Owner báo 2026-07-29). */
#pane-avatar-frames .af-workspace { display: block; }
#pane-avatar-frames .af-groups-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, 380px); align-items: start; gap: var(--sp-3); }
#pane-avatar-frames .af-frame-grid, #pane-avatar-frames .af-group-list, #pane-avatar-frames .af-upload-drafts { display: grid; gap: var(--sp-2); }
#pane-avatar-frames .af-frame-grid { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
#pane-avatar-frames .af-frame-card { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: var(--sp-2); padding: var(--sp-2); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); }
#pane-avatar-frames .af-frame-card.is-disabled, #pane-avatar-frames .af-group-row.is-disabled { opacity: .7; }
#pane-avatar-frames .af-frame-preview, #pane-avatar-frames .af-draft-preview { aspect-ratio: 1; background-color: var(--surface-3); background-image: linear-gradient(45deg, var(--surface-2) 25%, transparent 25%, transparent 75%, var(--surface-2) 75%), linear-gradient(45deg, var(--surface-2) 25%, transparent 25%, transparent 75%, var(--surface-2) 75%); background-position: 0 0, var(--sp-2) var(--sp-2); background-size: calc(var(--sp-2) * 2) calc(var(--sp-2) * 2); border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
#pane-avatar-frames .af-frame-preview { display: grid; place-items: center; color: var(--text-faint); }
#pane-avatar-frames .af-frame-preview img, #pane-avatar-frames .af-draft-preview { width: 100%; height: 100%; object-fit: contain; }
#pane-avatar-frames .af-frame-content { min-width: 0; }
#pane-avatar-frames .af-frame-card h4, #pane-avatar-frames .af-group-row h4 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }
#pane-avatar-frames .af-badge { display: inline-flex; align-items: center; min-height: 22px; padding: 0 var(--sp-1); border: 1px solid var(--border); border-radius: var(--radius-pill); color: var(--text-muted); background: var(--surface-3); font-size: 11px; }
#pane-avatar-frames .af-badge.is-active { color: var(--success); border-color: var(--success); }
#pane-avatar-frames .af-badge.is-disabled { color: var(--text-faint); border-color: var(--border-strong); }
#pane-avatar-frames .af-ref-summary { font-size: 12px; }
#pane-avatar-frames .af-card-actions { grid-column: 1 / -1; justify-content: flex-end; padding-top: var(--sp-1); border-top: 1px solid var(--border); }
#pane-avatar-frames .af-editor-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); }
#pane-avatar-frames .af-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-2); }
#pane-avatar-frames .af-full-field { grid-column: 1 / -1; }
#pane-avatar-frames .af-refs, #pane-avatar-frames .af-feedback { color: var(--text-muted); font-size: 12px; }
#pane-avatar-frames .af-empty-state { grid-column: 1 / -1; margin: 0; padding: var(--sp-4); border: 1px dashed var(--border-strong); border-radius: var(--radius); color: var(--text-muted); text-align: center; }
#pane-avatar-frames .af-group-row { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); padding: var(--sp-3); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); }
#pane-avatar-frames .af-draft-card { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: var(--sp-2); margin: 0; padding: var(--sp-2); border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-2); }
#pane-avatar-frames .af-draft-card legend { padding: 0 var(--sp-1); color: var(--text-muted); font-size: 12px; }
#pane-avatar-frames .af-draft-body { display: grid; gap: var(--sp-1); }
#pane-avatar-frames .af-draft-filename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#pane-avatar-frames .af-draft-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-1); }
#pane-avatar-frames .af-action-panel input[type="file"] { max-width: 100%; color: var(--text-muted); font-size: 13px; }
#pane-avatar-frames button:focus-visible, #pane-avatar-frames summary:focus-visible, #pane-avatar-frames input:focus-visible, #pane-avatar-frames select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Popup Sửa Khung — khối xem trước + đổi ảnh (chọn từ thư viện hoặc upload mới) */
.af-frame-image-editor { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: var(--sp-2); align-items: start; margin-bottom: var(--sp-3); }
.af-frame-image-preview { aspect-ratio: 1; background-color: var(--surface-3); background-image: linear-gradient(45deg, var(--surface-2) 25%, transparent 25%, transparent 75%, var(--surface-2) 75%), linear-gradient(45deg, var(--surface-2) 25%, transparent 25%, transparent 75%, var(--surface-2) 75%); background-position: 0 0, var(--sp-2) var(--sp-2); background-size: calc(var(--sp-2) * 2) calc(var(--sp-2) * 2); border: 1px solid var(--border); border-radius: var(--radius-sm); display: grid; place-items: center; overflow: hidden; }
.af-frame-image-preview img { width: 100%; height: 100%; object-fit: contain; }
.af-frame-image-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1); }

@media (max-width: 768px) {
  #pane-avatar-frames .af-toolbar, #pane-avatar-frames .af-header { align-items: stretch; flex-direction: column; }
  #pane-avatar-frames .af-toolbar-fields { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #pane-avatar-frames .af-groups-layout { grid-template-columns: 1fr; }
  #pane-avatar-frames .af-disclosure[open] .af-action-panel { position: static; width: auto; margin-top: var(--sp-2); }
}
@media (max-width: 600px) {
  #pane-avatar-frames .af-toolbar-fields, #pane-avatar-frames .af-form-grid, #pane-avatar-frames .af-draft-details { grid-template-columns: 1fr; }
  #pane-avatar-frames .af-toolbar-actions { align-items: stretch; flex-direction: column; }
  #pane-avatar-frames .af-disclosure, #pane-avatar-frames .af-disclosure summary { width: 100%; }
  #pane-avatar-frames .af-frame-grid { grid-template-columns: 1fr; }
  #pane-avatar-frames .af-group-row { align-items: flex-start; flex-direction: column; }
  #pane-avatar-frames .af-card-actions { justify-content: flex-start; }
}
