/* XQBase Explorer — CSS tách khỏi template (v3.37): trước đây nhúng thẳng trong
   HTML nên mỗi lần mở trang phải tải + phân tích lại; nay là file tĩnh, trình duyệt
   giữ cache (template nạp kèm ?v=filemtime nên sửa file là tự lấy bản mới). */
.xqbase-explorer { --xq-blue:#0078D4; --xq-border:#d5d9de; font-size:.9rem; }
/* Nút khóa đăng nhập/đăng xuất — gọn, icon ổ khóa nổi, tên viết hoa chữ đầu */
.xqbase-explorer .xq-lock { display:inline-flex; align-items:center; gap:.35rem; font-weight:600; }
.xqbase-explorer .xq-lock { font-size:1.05rem; line-height:1; padding:.3rem .6rem; }
/* Banner tiêu đề: gradient cyan → xanh milky way, chữ trắng đậm, điểm sao mờ.
   v4.1.9: BỎ scope .xqbase-explorer — banner là thành phần dùng chung, trang CV
   danh thủ (view=master) nạp file này để dùng lại thay vì chép CSS lần thứ 7. */
.xq-banner {
    /* center dọc: có logo 48px nên baseline làm chữ lệch xuống đáy banner */
    display:flex; align-items:center; gap:1rem; flex-wrap:wrap;
    background:
        radial-gradient(1.5px 1.5px at 30% 30%, rgba(255,255,255,.8), transparent),
        radial-gradient(1px 1px at 48% 65%, rgba(255,255,255,.6), transparent),
        radial-gradient(1.5px 1.5px at 62% 25%, rgba(255,255,255,.85), transparent),
        radial-gradient(1px 1px at 78% 60%, rgba(255,255,255,.7), transparent),
        radial-gradient(1px 1px at 90% 35%, rgba(255,255,255,.9), transparent),
        linear-gradient(90deg, #22d3ee 0%, #0e7fb0 25%, #1c3a7a 60%, #101b3f 100%);
    color:#fff; padding:.7rem 1.2rem; border-radius:8px; margin-bottom:.7rem;
    text-shadow:0 1px 3px rgba(0,0,0,.35);
}
.xq-banner .xq-banner-logo {
    width:48px; height:48px; border-radius:50%; align-self:center; flex-shrink:0;
    box-shadow:0 2px 6px rgba(0,0,0,.35);
}
.xq-banner .xq-banner-title { font-weight:800; font-size:1.3rem; letter-spacing:.03em; }
.xq-banner .xq-banner-author { margin-left:auto; font-weight:700; font-style:italic; color:#fff; text-align:right; font-size:.95rem; }
.xq-banner .xq-banner-home { display:flex; align-items:center; gap:1rem; color:#fff!important; text-decoration:none!important; }
.xq-banner .xq-banner-home:hover { opacity:.88; }
@media (max-width:640px) { .xq-banner .xq-banner-title { font-size:1.02rem; } }
.xqbase-explorer .xq-exp-toolbar { display:flex; flex-wrap:wrap; gap:.5rem; align-items:center; padding:.5rem .75rem; background:#f3f5f7; border:1px solid var(--xq-border); border-radius:6px 6px 0 0; }
.xqbase-explorer .xq-exp-main { display:flex; border:1px solid var(--xq-border); border-top:0; border-radius:0 0 6px 6px; min-height:480px; background:#fff; }
/* Cây KHÔNG có thanh cuộn riêng nữa: cao bằng khung ván (mặc định 50 ván) và cuộn
   CHUNG với trang — trước bị ghim 75vh nên nhìn cụt hẳn so với bảng bên phải. */
.xqbase-explorer .xq-exp-tree { width:300px; min-width:220px; border-right:1px solid var(--xq-border); overflow:visible; padding:.5rem 0; flex-shrink:0; }
/* Danh sách ván KHÔNG có thanh cuộn riêng: bảng dài bao nhiêu thì trang dài bấy nhiêu
   (chọn 100 / Tất cả là thấy hết, cuộn bằng trang) */
.xqbase-explorer .xq-exp-list { flex:1 1 auto; overflow:visible; padding:.5rem .75rem; min-width:0; }
/* Mobile: table-layout:fixed + các cột width cố định làm cột tên kỳ thủ co về ~0 (mất tên).
   Cho bảng bề rộng tối thiểu để tràn khung và cuộn ngang thay vì bóp cột. */
@media (max-width: 820px) {
    /* Trên điện thoại: ẩn các cột tên phụ cho dễ đọc
       — Khai cuộc: tên tiếng Anh + tiếng Hoa; Kỳ thủ: tên quốc tế */
    .xqbase-explorer #op-table .op-alt { display:none; }
    .xqbase-explorer #pp-table .pp-alt { display:none; }
    .xqbase-explorer #xq-games-tbl { min-width:760px; }
    .xqbase-explorer #st-table, .xqbase-explorer #stm-table, .xqbase-explorer #stt-table { min-width:640px; }
}
/* Điện thoại: ô tick mặc định của trình duyệt chỉ 13x13px — ngón tay rất khó trúng.
   Phóng to ô và nới ô chứa để chạm dễ (chỉ áp cho màn hẹp, desktop giữ nguyên). */
@media (max-width: 820px) {
    .xqbase-explorer input[type=checkbox] { width:20px; height:20px; }
    .xqbase-explorer #xq-games-tbl td:first-child,
    .xqbase-explorer #pp-table td:first-child,
    .xqbase-explorer #tt-table td:first-child { padding-top:.45rem; padding-bottom:.45rem; }
}
@media (max-width: 820px) { .xqbase-explorer .xq-exp-main { flex-direction:column; } .xqbase-explorer .xq-exp-tree { width:auto; border-right:0; border-bottom:1px solid var(--xq-border); max-height:40vh; } }

/* Tree */
.xq-node { display:flex; align-items:center; gap:.3rem; padding:.15rem .5rem; cursor:pointer; white-space:nowrap; border-radius:4px; line-height:1.7; }
.xq-node:hover { background:#eef4fb; }
.xq-node.sel { background:var(--xq-blue); color:#fff; }
.xq-node.sel a, .xq-node.sel .xq-cnt { color:#fff; }
.xq-node .xq-tw { width:1em; text-align:center; flex-shrink:0; font-size:.75em; color:#888; }
.xq-node.sel .xq-tw { color:#fff; }
.xq-node .xq-lbl { overflow:hidden; text-overflow:ellipsis; flex:1 1 auto; }
.xq-node .xq-cnt { color:#888; font-size:.8em; }
.xq-node .xq-act { display:none; gap:.15rem; flex-shrink:0; }
.xq-node:hover .xq-act { display:inline-flex; }
.xq-node .xq-act button { border:0; background:transparent; cursor:pointer; padding:0 .15rem; font-size:.85em; line-height:1; }
.xq-node.sel .xq-act button { color:#fff; }

/* Games table */
.xq-games-tbl { width:100%; border-collapse:collapse; }
.xq-games-tbl th { background:var(--xq-blue); color:#fff; padding:.35rem .5rem; text-align:left; position:sticky; top:0; cursor:pointer; user-select:none; white-space:nowrap; }
/* Bảng ván: table-layout fixed để admin kéo chỉnh rộng cột có tác dụng; ô dài cắt bằng ellipsis */
#xq-games-tbl { table-layout:fixed; }
#xq-games-tbl td { overflow:hidden; text-overflow:ellipsis; }
/* Cột checkbox (đầu bảng): bỏ ellipsis + padding để ô 26px không tràn → không hiện dấu "…" */
#xq-games-tbl th:first-child, #xq-games-tbl td:first-child {
    overflow:visible; text-overflow:clip; text-align:center; padding-left:0; padding-right:0;
}
/* Tay nắm kéo chỉnh rộng cột (chỉ admin) — mép phải mỗi th */
#xq-games-tbl th { position:sticky; }
.xq-games-tbl th .xq-sort-ar { font-size:.72em; margin-left:.25rem; opacity:.9; }
#xq-games-tbl .xq-colrs { position:absolute; top:0; right:-3px; width:7px; height:100%; cursor:col-resize; z-index:3; }
#xq-games-tbl .xq-colrs:hover { background:rgba(255,255,255,.4); }
body.xq-colresizing { cursor:col-resize; user-select:none; }
.xq-games-tbl td { padding:.3rem .5rem; border-bottom:1px solid #eceff2; white-space:nowrap; }
/* Bảng khai cuộc: tên VN/EN dài → cho xuống dòng, cột chia cố định để bảng vừa khung */
#op-table { table-layout:fixed; }
#op-table td { white-space:normal; word-break:break-word; vertical-align:top; }
.xq-games-tbl tbody tr:hover { background:#f0f6fd; }
.xq-games-tbl a { text-decoration:none; }
.xq-res { display:inline-block; min-width:44px; text-align:center; border-radius:3px; padding:0 .3rem; font-size:.85em; color:#fff; }
.xq-res-w { background:#c0392b; } .xq-res-b { background:#2c3e50; } .xq-res-d { background:#7f8c8d; } .xq-res-u { background:#e6a800; }
/* Nhãn ván phụ phân định (cờ nhanh / chớp / armageddon) — cùng vòng với ván chính */
.xq-tb { font-size:.74em; background:#fde68a; color:#7c2d12; border:1px solid #f1c96b; border-radius:4px; padding:0 .3rem; white-space:nowrap; }
/* Chọn loại giải trong popup sửa giải (cá nhân / đồng đội / cả hai) */
.xq-tour-mode { display:flex; flex-wrap:wrap; gap:1rem; margin-bottom:.6rem; }
.xq-tour-mode label { display:flex; align-items:center; gap:.3rem; font-weight:400; cursor:pointer; margin:0; }
/* Nhãn giai đoạn loại trực tiếp trong bảng điểm (Vô địch / Á quân / Thua bán kết…) */
.xq-ko { font-size:.76em; background:#e0e7ff; color:#3730a3; border:1px solid #c7d2fe; border-radius:4px; padding:0 .35rem; white-space:nowrap; }
/* Badge vòng KO ở cột "Giải/Vòng": to hơn badge trong bảng điểm / sơ đồ nhánh */
.xq-ko-lg { font-size:.95em; font-weight:600; padding:.15rem .55rem; }

/* Modal */
.xq-modal-bd { position:fixed; inset:0; background:rgba(0,0,0,.45); z-index:1050; display:none; }
.xq-modal { position:fixed; top:8vh; left:50%; transform:translateX(-50%); width:min(560px, 94vw); background:#fff; border-radius:8px; z-index:1051; display:none; box-shadow:0 10px 40px rgba(0,0,0,.3); max-height:82vh; overflow:auto; }
.xq-modal .xq-m-head { background:var(--xq-blue); color:#fff; padding:.55rem .9rem; font-weight:600; display:flex; justify-content:space-between; border-radius:8px 8px 0 0; }
.xq-modal .xq-m-head button { background:transparent; border:0; color:#fff; font-size:1.1em; cursor:pointer; }
.xq-modal .xq-m-body { padding: .9rem; }
.xq-modal .xq-m-foot { padding:.6rem .9rem; border-top:1px solid var(--xq-border); display:flex; justify-content:flex-end; gap:.5rem; }
.xq-modal label { font-weight:600; display:block; margin:.5rem 0 .15rem; }
.xq-modal input[type=text], .xq-modal input[type=date], .xq-modal select { width:100%; }
.xq-plist { max-height:260px; overflow:auto; border:1px solid var(--xq-border); border-radius:4px; margin-top:.4rem; }
.xq-plist .xq-prow { display:flex; gap:.5rem; align-items:center; padding:.25rem .5rem; border-bottom:1px solid #f0f0f0; }
.xq-plist .xq-prow:hover { background:#f5f9ff; }
#xq-status { margin-left:auto; font-size:.85em; color:#555; }
.xq-pager { display:flex; gap:.4rem; align-items:center; margin-top:.5rem; flex-wrap:wrap; }

/* Toggle sidebar */
.xqbase-explorer .xq-exp-main.tree-off .xq-exp-tree { display:none; }

/* Hàng lọc đầu cột */
.xq-games-tbl .xq-filter-row th { position:sticky; top:33px; background:#dce6f0; padding:.15rem .3rem; cursor:default; }
.xq-games-tbl .xq-filter-row input, .xq-games-tbl .xq-filter-row select { width:100%; min-width:44px; font-size:.85em; padding:.1rem .3rem; border:1px solid var(--xq-border); border-radius:3px; background:#fff; color:#222; }

/* Menu chọn cột ⚙ */
.xq-cols { position:relative; }
.xq-cols-menu { display:none; position:absolute; right:0; top:calc(100% + 4px); background:#fff; border:1px solid var(--xq-border); border-radius:6px; box-shadow:0 8px 28px rgba(0,0,0,.18); padding:.45rem .7rem; z-index:1000; min-width:170px; }
.xq-cols-menu label { display:flex; gap:.4rem; align-items:center; margin:.15rem 0; white-space:nowrap; cursor:pointer; font-weight:normal; }
/* Tabs Explorer: Ván cờ / Kỳ thủ / Giải đấu */
.xqbase-explorer .xq-tabs { display:flex; gap:.25rem; margin:.6rem 0 0; }
.xqbase-explorer .xq-etab { background:#eef1f4; border:1px solid var(--xq-border); border-bottom:0; border-radius:7px 7px 0 0; padding:.4rem 1.1rem; cursor:pointer; font-weight:600; color:#44515f; }
.xqbase-explorer .xq-etab.active { background:#fff; color:#0078D4; }
.xqbase-explorer #tab-players, .xqbase-explorer #tab-tours, .xqbase-explorer #tab-standings { border:1px solid var(--xq-border); border-radius:0 6px 6px 6px; background:#fff; padding:.7rem; min-height:400px; }
.xqbase-explorer #st-table td, .xqbase-explorer #st-table th { text-align:center; }
.xqbase-explorer #st-table td.st-name, .xqbase-explorer #st-table th.st-name { text-align:left; }
.xqbase-explorer #st-table td.st-pts { font-weight:700; }
/* Ô kết quả trận trong bảng ĐỘI ĐÁNH ĐỘI: màu theo bên đi tiên/hậu ở bàn 1 */
.xqbase-explorer #stm-table td.st-pts { font-weight:700; }
.xqbase-explorer #stm-table td.stm-red { background:#f0f9f2; color:#186a3b; font-weight:600; }
.xqbase-explorer #stm-table td.stm-blk { background:#fdeceb; color:#a03225; font-weight:600; }
.xqbase-explorer #stm-table td.stm-d   { background:#f6f7f9; color:#4a5259; }
/* Nút +/− mở chi tiết thành viên của đội */
.xqbase-explorer .stm-tg { display:inline-block; width:18px; height:18px; line-height:16px; text-align:center;
    border:1px solid #c7d2fe; background:#eef2ff; color:#3730a3; border-radius:4px; cursor:pointer;
    font-weight:700; user-select:none; }
.xqbase-explorer .stm-tg:hover { background:#e0e7ff; }
/* Hàng tiêu đề bảng đồng đội: nền xám nhạt, chữ đậm */
.xqbase-explorer #stm-table thead td { background:#e9ecf1; color:#2c3e50; font-weight:700;
    padding:.3rem .5rem; white-space:nowrap; }
/* Hàng ĐỘI: đậm, đỏ sậm (thành viên bên dưới giữ chữ thường) */
.xqbase-explorer #stm-table tr.stm-teamrow > td { font-weight:700; color:#8b1f1f; }
.xqbase-explorer #tt-table tr.tt-hidden > td { background:#fff7f7; color:#8a949e; }
.xqbase-explorer .tt-hidden-tag { font-size:.72em; font-weight:700; background:#fde2e1; color:#a03225;
    border:1px solid #f5c2c0; border-radius:4px; padding:0 .3rem; vertical-align:1px; }
.xqbase-explorer #stm-table tr.stm-sub > td { background:#fbfcfd; font-size:.94em; font-weight:400; color:#3b4450; }
.xqbase-explorer #stm-table tr.stm-sub td.stm-mem { padding-left:1.6rem; }
/* Bảng điểm: table-layout fixed để admin kéo chỉnh rộng cột có tác dụng */
#st-table { table-layout:fixed; }
#st-table td { overflow:hidden; text-overflow:ellipsis; }
#st-table .xq-colrs { position:absolute; top:0; right:-3px; width:7px; height:100%; cursor:col-resize; z-index:3; }
#st-table .xq-colrs:hover { background:rgba(255,255,255,.4); }
/* Sub-tab Cá nhân / Đồng đội trong tab Bảng điểm */
.xq-subtabs { display:flex; gap:.35rem; align-items:center; margin-bottom:.6rem; flex-wrap:wrap; }
.xq-subtab { border:1px solid var(--xq-border); background:#f3f5f7; color:#44515f; border-radius:6px; padding:.32rem .9rem; cursor:pointer; font-weight:600; font-size:.9em; }
.xq-subtab.on { background:var(--xq-blue); border-color:var(--xq-blue); color:#fff; }
.xqbase-explorer #stt-table td, .xqbase-explorer #stt-table th { text-align:center; }
.xqbase-explorer #stt-table td.st-name, .xqbase-explorer #stt-table th.st-name { text-align:left; }
/* Khối đội kiểu chess-results Team-Composition */
.xqbase-explorer #stt-table tr.stt-bar td { background:#cfd9e6; font-weight:700; font-size:1.05em; text-align:left; padding:.4rem .6rem; }
.xqbase-explorer #stt-table tr.stt-bar .stt-bar-mut { font-weight:600; color:#4a5a6d; font-size:.88em; }
.xqbase-explorer #stt-table tr.stt-hd td { background:#e3eaf2; font-weight:700; color:#2c3e50; padding:.25rem .5rem; }
.xqbase-explorer #stt-table tr.stt-dim td { opacity:.55; }
/* Giải có bảng con: mỗi bảng là 1 TABLE riêng (cột độc lập) + tiêu đề phía trên */
.xqbase-explorer .st-sec-hd { font-weight:800; font-size:1.08em; color:#1c3a7a; text-align:center; margin:.9rem 0 .35rem; }
.xqbase-explorer .st-sub-tbl { table-layout:fixed; width:100%; }
.xqbase-explorer .st-sub-tbl td { overflow:hidden; text-overflow:ellipsis; text-align:center; }
.xqbase-explorer .st-sub-tbl td.st-name, .xqbase-explorer .st-sub-tbl th.st-name { text-align:left; }
.xqbase-explorer .st-sub-tbl td.st-pts { font-weight:700; }
.xqbase-explorer .st-sub-tbl th { text-align:center; }
/* Ô % bề rộng cột trong menu ⚙ Cột */
.xq-cols-menu .xq-cols-hint { font-size:.8em; color:#667; margin:.1rem 0 .35rem; white-space:normal; max-width:230px; }
.xq-cols-menu .xq-colpct { width:52px; height:24px; padding:.05rem .25rem; border:1px solid #d5d9de; border-radius:4px; font-size:.85em; margin-left:.35rem; }

/* ── Sơ đồ cặp đấu loại trực tiếp (bracket) ─────────────────────────────── */
.xq-ko-wrap { display:flex; gap:1.1rem; align-items:flex-start; overflow-x:auto; padding:.35rem .1rem .6rem; }
.xq-ko-col { flex:1 1 260px; min-width:250px; display:flex; flex-direction:column; justify-content:space-around; gap:.7rem; }
.xq-ko-hd { font-weight:700; color:#1c3a7a; text-align:center; padding:.15rem 0 .1rem; border-bottom:2px solid #dbe4ef; }
.xq-ko-card { border:1px solid #e3e7ec; border-radius:10px; box-shadow:0 2px 8px rgba(16,24,40,.07); overflow:hidden; background:#fff; }
.xq-ko-row { display:flex; align-items:center; gap:.4rem; padding:.4rem .55rem; font-size:.92em; }
.xq-ko-row + .xq-ko-row { border-top:1px solid #eef1f4; }
.xq-ko-row .n { flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.xq-ko-row .f { flex:0 0 auto; color:#8a949e; font-size:.85em; }
.xq-ko-row .g { flex:0 0 22px; text-align:center; border-radius:4px; font-weight:600; }
.xq-ko-row .g.cw { background:#fdeceb; color:#c0392b; }   /* đi Tiên (Đỏ) */
.xq-ko-row .g.cb { background:#eceff3; color:#2c3e50; }   /* đi Hậu (Đen) */
.xq-ko-row .g.tb { border:1px dashed #b9a25a; }           /* ván phụ phân định */
.xq-ko-row .g a { color:inherit; text-decoration:none; }
.xq-ko-row .t { flex:0 0 30px; text-align:center; font-weight:800; }
/* Người đi tiếp do admin ghi tay (ván phân định không có biên bản) */
.xq-ko-card { position:relative; }
.xq-ko-card.over { border-color:#c9a227; }
.xq-ko-row .ko-star { color:#c0392b; font-weight:800; margin-left:1px; cursor:help; }
.xq-ko-foot { padding:.25rem .55rem; font-size:.8em; color:#8a6d1b; background:#fffbe9; border-top:1px solid #f0e6c0; }
.xq-ko-foot.muted { color:#8a949e; background:#f7f9fb; border-top-color:#eef1f4; }
.xq-ko-edit { position:absolute; top:2px; right:2px; z-index:2; border:0; background:transparent; color:#8a949e;
    padding:1px 3px; line-height:1; cursor:pointer; opacity:.55; }
.xq-ko-edit:hover { opacity:1; color:var(--xq-blue, #0078D4); }
#kw-modal { display:none; position:fixed; z-index:1061; top:50%; left:50%; transform:translate(-50%,-50%);
    background:#fff; border-radius:12px; box-shadow:0 12px 40px rgba(16,24,40,.28); padding:.9rem 1rem; width:min(440px, 94vw); }
#kw-modal label { font-size:.86em; color:#5a646e; display:block; margin:.5rem 0 .15rem; }
#kw-modal .kw-opt { display:flex; align-items:center; gap:.45rem; padding:.28rem .1rem; }
#kw-bd { display:none; position:fixed; inset:0; background:rgba(16,24,40,.35); z-index:1060; }
.xq-ko-row .b { flex:0 0 auto; }
.xq-ko-row.win { background:#f0f9f2; font-weight:700; }
.xq-ko-row.lose { color:#7b848d; }
.xq-ko-note { font-size:.88em; color:#6b4e00; background:#fff8e1; border:1px solid #f3e2a9; border-radius:8px; padding:.4rem .6rem; margin:.2rem 0 .5rem; }
/* Popup sửa hạng tay (fixed, nổi trên bảng) + dấu * chú thích hạng đã sửa */
#st-rank-menu,
#st-tb-menu { display:none; position:fixed; z-index:3000; background:#fff; border:1px solid #d5d9de; border-radius:8px; box-shadow:0 8px 24px rgba(0,0,0,.22); padding:.6rem .75rem; width:270px; text-align:left; }
#st-rank-menu label,
#st-tb-menu label { font-weight:600; font-size:.82em; display:block; margin:.35rem 0 .1rem; }
#st-rank-menu input,
#st-tb-menu input { width:100%; height:32px; padding:.2rem .5rem; border:1px solid #d5d9de; border-radius:6px; box-sizing:border-box; }
#st-tb-menu .st-tb-auto { font-size:.78em; color:#6b7280; margin-top:.25rem; }
.st-rank-star { color:#c0392b; font-weight:700; cursor:help; margin-left:2px; }
/* Menu chọn điểm bye (fixed, nổi trên bảng) */
#st-bye-menu { display:none; position:fixed; z-index:3000; background:#fff; border:1px solid #d5d9de; border-radius:6px; box-shadow:0 8px 24px rgba(0,0,0,.22); padding:.25rem; min-width:160px; }
#st-bye-menu button { display:block; width:100%; text-align:left; border:0; background:none; padding:.35rem .7rem; cursor:pointer; border-radius:4px; font-size:.9em; color:#222; }
#st-bye-menu button:hover { background:#e8f0fe; }
#st-bye-menu button.on { font-weight:700; color:var(--xq-blue); }
.xqbase-explorer .xq-pp-inp { border:1px solid var(--xq-border); border-radius:4px; padding:.15rem .35rem; width:100%; font-size:.9em; box-sizing:border-box; }
.xqbase-explorer #pp-table td, .xqbase-explorer #tt-table td { vertical-align:middle; }
/* Popup sửa kỳ thủ / đội — các ô trên 1 dòng, cao ~35px.
   Bề rộng do LƯỚI FLEX ở đây quyết định: bootstrap/template hay đặt lại width, max-width,
   margin, float cho .form-control nên phải ép !important, kẻo hàng bị lệch/xuống dòng.
   (Selector nhân đôi .xq-pe-row.xq-pe-row để thắng specificity mà không cần tổ tiên.) */
.xq-pe-row { display:flex; gap:.6rem; flex-wrap:wrap; align-items:flex-end; }
.xq-pe-row.xq-pe-row > div { min-width:0; padding:0; margin:0; }
.xq-pe-row.xq-pe-row label { display:block; margin:0 0 .2rem; font-weight:600; white-space:nowrap; }
.xq-pe-row.xq-pe-row .xq-ac-wrap { display:block; width:100%; }
.xq-pe-row.xq-pe-row .form-control,
.xq-pe-row.xq-pe-row input,
.xq-pe-row.xq-pe-row select {
    display:block; float:none; margin:0;
    width:100% !important; max-width:none !important; min-width:0 !important;
    height:35px !important; padding:.2rem .5rem; box-sizing:border-box;
}

/* Nút ＋/− mở/thu gọn vòng đấu con trong tab Giải đấu */
.xqbase-explorer .tt-exp { border:1px solid #c9d2dc; background:#fff; border-radius:5px; width:22px; height:22px; line-height:1; cursor:pointer; margin:0 .3rem; font-weight:700; color:#0a58ca; padding:0; vertical-align:middle; }
.xqbase-explorer .tt-exp:hover { background:#e8f0fe; border-color:#0a58ca; }
/* Popup thư mục + vòng đấu — 1 hàng, ô cao 35px */
#m-folder .form-control, #m-folder .form-select,
#m-round .form-control { height:35px; padding:.2rem .5rem; box-sizing:border-box; }
/* Popup sửa giải — hàng 3: Từ ngày / Đến ngày / Địa điểm; ô cao 35px */
#m-tour .form-control, #m-tour .form-select { height:35px; padding:.2rem .5rem; box-sizing:border-box; }
/* Tên giải + link bài viết giãn hết khung — bỏ mọi ràng buộc max-width của template/bootstrap */
#m-tour #mt-title, #m-tour #mt-title-en { display:block; width:100% !important; max-width:none !important; }
#m-tour #mt-link { display:block; width:100% !important; max-width:none !important; }
/* Ô link Chess-Results trong popup Nhập bốc thăm cũng giãn hết khung */
#m-import #mi-url { display:block; width:100% !important; max-width:none !important; }
#m-tour .xq-tour-row3 { display:flex; gap:.6rem; flex-wrap:wrap; align-items:flex-end; }
#m-tour .xq-tour-row3 > div { min-width:0; }
#m-tour .xq-f-date { flex:1 1 130px; }
#m-tour .xq-f-venue { flex:2 1 200px; }
/* flatpickr altInput kế thừa class form-control nên cũng cao 35px */
#m-tour input.flatpickr-input { height:35px; }
/* Nhóm nút toggle trong popup Xuất */
#m-export .xq-exp-row { display:flex; flex-wrap:wrap; gap:.4rem; margin:.15rem 0 .3rem; }
#m-export .xq-exp-btn { border:1px solid var(--xq-border); background:#f3f5f7; color:#333; border-radius:6px; padding:.35rem .8rem; cursor:pointer; font-size:.9em; line-height:1.2; }
#m-export .xq-exp-btn.on { background:var(--xq-blue); border-color:var(--xq-blue); color:#fff; font-weight:600; }
#m-export .xq-exp-row.disabled { opacity:.45; pointer-events:none; }

/* Autocomplete tên/đơn vị (nguồn com_chessresults) trong popup sửa kỳ thủ.
   Dropdown được JS chuyển ra document.body (portal) + position:fixed + acPlace():
   thoát hẳn overflow/transform của modal (transform tạo containing block làm
   fixed bị lệch toạ độ), thiếu chỗ dưới thì lật lên trên. Border hardcode vì
   dd ở body không còn thừa kế --xq-border. */
.xq-ac-wrap { position:relative; }
/* Máy cảm ứng: hộp chọn chỉ để bấm-chọn (JS đặt readonly) → con trỏ hình bàn tay */
input.xq-pick-only { cursor:pointer; }
/* …và danh sách phải vừa đầu ngón tay: dòng cao hơn, thanh cuộn to hẳn ra */
@media (pointer: coarse) {
    .xq-ac-dd { max-height:55vh; -webkit-overflow-scrolling:touch; }
    .xq-ac-dd .xq-ac-item { padding:.65rem .6rem; font-size:.95rem; line-height:1.35; }
    .xq-ac-dd::-webkit-scrollbar { width:14px; }
    .xq-ac-dd::-webkit-scrollbar-thumb { background:#9aa3ad; border-radius:7px; border:3px solid #fff; }
    .xq-ac-dd::-webkit-scrollbar-track { background:#f1f3f5; }
}
.xq-ac-dd { display:none; position:fixed; background:#fff; border:1px solid #d5d9de; border-radius:6px; max-height:220px; overflow:auto; z-index:3000; box-shadow:0 8px 24px rgba(0,0,0,.22); font-size:.9rem; }
.xq-ac-dd .xq-ac-item { padding:.35rem .6rem; cursor:pointer; border-bottom:1px solid #f0f0f0; color:#222; }
.xq-ac-dd .xq-ac-item:hover { background:#fff3cd; }

/* Popup đồng bộ kỳ thủ từ com_chessresults (tab Kỳ thủ) */
#m-psync .xq-sync-tabs { display:flex; gap:.35rem; flex-wrap:wrap; margin-bottom:.5rem; }
#m-psync .xq-sync-tab { border:1px solid var(--xq-border); background:#f3f5f7; color:#333; border-radius:6px; padding:.3rem .75rem; cursor:pointer; font-size:.88em; line-height:1.2; }
#m-psync .xq-sync-tab.on { background:var(--xq-blue); border-color:var(--xq-blue); color:#fff; font-weight:600; }
#m-psync .xq-sync-wrap { max-height:48vh; overflow:auto; border:1px solid var(--xq-border); border-radius:4px; }
#m-psync table { width:100%; border-collapse:collapse; font-size:.88em; }
#m-psync th { background:var(--xq-blue); color:#fff; padding:.3rem .45rem; text-align:left; position:sticky; top:0; white-space:nowrap; z-index:1; }
#m-psync td { padding:.25rem .45rem; border-bottom:1px solid #eceff2; vertical-align:top; }
#m-psync tbody tr:hover { background:#f0f6fd; }
#m-psync tr.st-same td { color:#8a949e; }
#m-psync .xq-badge { display:inline-block; border-radius:3px; padding:0 .35rem; font-size:.85em; color:#fff; white-space:nowrap; }
#m-psync .xq-badge.update { background:#e6a800; }
#m-psync .xq-badge.same { background:#8a949e; }
#m-psync .xq-badge.ignored { background:#8a949e; }
#m-psync .xq-diff { color:#b05c00; font-size:.85em; white-space:normal; }
#m-psync .xq-diff .old { color:#c0392b; text-decoration:line-through; }
#m-psync .xq-diff .new { color:#1a7f37; font-weight:600; }

/* Venue autocomplete (bắt chước view tournament com_chessresults).
   Portal ra body + position:fixed (như .xq-ac-dd) để thoát overflow/transform của modal. */
.xq-venue-wrap { position:relative; }
.xq-venue-dd { display:none; position:fixed; background:#fff; border:1px solid #d5d9de; border-radius:6px; max-height:220px; overflow:auto; z-index:3000; box-shadow:0 8px 24px rgba(0,0,0,.22); font-size:.9rem; }
.xq-venue-dd .xq-venue-item { padding:.35rem .6rem; cursor:pointer; font-size:.9em; border-bottom:1px solid #f0f0f0; }
.xq-venue-dd .xq-venue-item:hover { background:#fff3cd; }

/* ══ v3.7.1 HIỆN ĐẠI HOÁ EXPLORER (đồng bộ design system view=game) — thuần override, không đụng logic ══ */

/* (1) CARD HOÁ: nền canvas xám + mọi khung thành card bo góc đổ bóng mềm */
.xqbase-explorer { background:#eef1f5; padding:.9rem; border-radius:14px; }
/* Khối Ván cờ: toolbar (trên) + main (dưới) dính nhau thành 1 card */
.xqbase-explorer .xq-exp-toolbar { background:#fff; border-color:#e3e7ec; border-radius:12px 12px 0 0; box-shadow:0 -1px 6px rgba(16,24,40,.04); }
.xqbase-explorer .xq-exp-main { border-color:#e3e7ec; border-radius:0 0 12px 12px; box-shadow:0 2px 10px rgba(16,24,40,.06); }
.xqbase-explorer .xq-exp-tree { border-right-color:#eceff2; }
/* Các tab-pane còn lại thành card độc lập bo 4 góc (tab pill không còn dính viền) */
.xqbase-explorer #tab-players, .xqbase-explorer #tab-tours, .xqbase-explorer #tab-standings,
.xqbase-explorer #tab-openings, .xqbase-explorer #tab-teams {
    border:1px solid #e3e7ec !important; border-radius:12px !important;
    box-shadow:0 2px 10px rgba(16,24,40,.06); background:#fff;
}
/* Container bảng bo góc nhẹ để header xanh không chọc góc vuông */
.xqbase-explorer .xq-games-tbl th:first-child { border-top-left-radius:8px; }
.xqbase-explorer .xq-games-tbl th:last-child { border-top-right-radius:8px; }
/* Banner bo đồng bộ card */
.xq-banner { border-radius:12px; }

/* (2) TAB CHÍNH → SEGMENTED PILL trong khay nền nhạt */
.xqbase-explorer .xq-tabs {
    display:inline-flex; gap:.25rem; background:#e2e8f0; padding:.3rem; border-radius:999px;
    margin:.7rem 0 .6rem; box-shadow:inset 0 1px 2px rgba(16,24,40,.06);
}
.xqbase-explorer .xq-etab {
    border:0 !important; background:transparent; border-radius:999px !important;
    padding:.38rem 1.05rem; color:#44515f; line-height:1.2;
}
.xqbase-explorer .xq-etab:hover { background:rgba(255,255,255,.65); }
/* Điện thoại: 6 tab (người quản lý có thêm "Đội") rộng hơn màn 360px → khay pill tràn
   ra ngoài và tab cuối bị khuất. Cho xuống hàng + căn giữa thay vì cuộn ngang: người
   dùng thấy hết tab ngay, không phải kéo. */
@media (max-width:560px) {
    .xqbase-explorer .xq-tabs { display:flex; flex-wrap:wrap; justify-content:center; border-radius:14px; max-width:100%; }
    .xqbase-explorer .xq-etab { padding:.38rem .7rem; }
}
.xqbase-explorer .xq-etab.active { background:#fff; color:var(--xq-blue); box-shadow:0 1px 4px rgba(16,24,40,.16); }
/* Sub-tab (Cá nhân/Đồng đội) cùng kiểu pill cho nhất quán */
.xqbase-explorer .xq-subtab { border-radius:999px; }

/* (3) THỐNG NHẤT NÚT: brand cho hành động chính, ghost cùng tông cho phần còn lại, đỏ chỉ khi nguy hiểm */
.xqbase-explorer .btn { border-radius:8px; font-weight:600; }
/* Hành động chính (xanh brand đặc): btn-primary giữ, btn-success (Thêm kỳ thủ/Nhập ván…) quy về brand */
.xqbase-explorer .btn-success { background:var(--xq-blue); border-color:var(--xq-blue); color:#fff; }
.xqbase-explorer .btn-success:hover { background:#0a66b0; border-color:#0a66b0; color:#fff; }
/* Nút phụ (outline/warning/secondary) → ghost trắng cùng tông, hover ánh xanh */
.xqbase-explorer .btn-warning,
.xqbase-explorer .btn-outline-primary,
.xqbase-explorer .btn-outline-secondary,
.xqbase-explorer .btn-secondary {
    background:#fff; border:1px solid #d9dee4; color:#374151;
}
.xqbase-explorer .btn-warning:hover,
.xqbase-explorer .btn-outline-primary:hover,
.xqbase-explorer .btn-outline-secondary:hover,
.xqbase-explorer .btn-secondary:hover {
    background:#f0f7ff; border-color:var(--xq-blue); color:var(--xq-blue);
}
/* Nút nguy hiểm giữ đỏ (chỉ hiện khi có dòng được tick) */
.xqbase-explorer .btn-danger { border-radius:8px; }
/* Modal footer cùng chuẩn: Hủy ghost · nút chính brand (thừa hưởng từ trên) */
.xq-modal .xq-m-foot .btn { border-radius:8px; font-weight:600; }

/* (4) BẢNG DỮ LIỆU: zebra nhẹ + hover rõ + hàng lọc gọn + badge mềm */
.xqbase-explorer .xq-games-tbl tbody tr:nth-child(even) { background:#fafbfd; }
.xqbase-explorer .xq-games-tbl tbody tr:hover { background:#eaf3fe; }
.xqbase-explorer .xq-games-tbl td { padding:.35rem .5rem; }
.xqbase-explorer .xq-games-tbl th { font-size:.9em; letter-spacing:.01em; }
/* Hàng lọc: nền sáng gọn, input bo 6px + focus ring xanh */
.xqbase-explorer .xq-games-tbl .xq-filter-row th { background:#f1f5f9; border-bottom:1px solid #e3e7ec; }
.xqbase-explorer .xq-games-tbl .xq-filter-row input,
.xqbase-explorer .xq-games-tbl .xq-filter-row select { border-radius:6px; border-color:#dfe3e8; padding:.14rem .35rem; }
.xqbase-explorer .xq-games-tbl .xq-filter-row input:focus,
.xqbase-explorer .xq-games-tbl .xq-filter-row select:focus { outline:none; border-color:var(--xq-blue); box-shadow:0 0 0 3px rgba(0,120,212,.14); }
/* Badge kết quả / nhãn bo mềm hơn */
.xqbase-explorer .xq-res { border-radius:6px; font-weight:600; }
.xqbase-explorer .xq-tb, .xqbase-explorer .xq-ko { border-radius:6px; }
/* Khối đội trong bảng đồng đội dịu hơn */
.xqbase-explorer #stt-table tr.stt-bar td { background:#e8eef5; }
.xqbase-explorer #stt-table tr.stt-hd td { background:#f1f5f9; }

/* (5) CÂY THƯ MỤC: dòng bo 8px, chọn = nền xanh nhạt chữ brand (không còn khối xanh đặc) */
.xqbase-explorer .xq-exp-tree { padding:.5rem .35rem; }
.xqbase-explorer .xq-node { border-radius:8px; margin:1px 2px; line-height:1.8; }
.xqbase-explorer .xq-node:hover { background:#eef4fb; }
.xqbase-explorer .xq-node.sel { background:#dcebfb; color:#0a58ca; font-weight:600; }
.xqbase-explorer .xq-node.sel a, .xqbase-explorer .xq-node.sel .xq-cnt { color:#0a58ca; }
.xqbase-explorer .xq-node.sel .xq-tw { color:#0a58ca; }
.xqbase-explorer .xq-node.sel .xq-act button { color:#0a58ca; }
.xqbase-explorer .xq-node .xq-cnt { font-size:.78em; }
.xqbase-explorer .xq-node .xq-act button { border-radius:5px; padding:.05rem .2rem; }
.xqbase-explorer .xq-node .xq-act button:hover { background:rgba(10,88,202,.12); }

/* (6) MODAL bo 12px + bóng sâu; TOAST nổi (JS status() tự tạo #xq-toast) */
.xq-modal { border-radius:12px; box-shadow:0 18px 50px rgba(0,0,0,.28); }
.xq-modal .xq-m-head { border-radius:12px 12px 0 0; }
.xq-modal .xq-m-foot { background:#fafbfc; border-radius:0 0 12px 12px; }
#xq-toast {
    position:fixed; left:50%; bottom:24px; transform:translateX(-50%) translateY(8px);
    z-index:4000; background:#1b1b1b; color:#fff; padding:.5rem .95rem; border-radius:8px;
    font-size:.9rem; box-shadow:0 8px 26px rgba(0,0,0,.3); opacity:0; pointer-events:none;
    transition:opacity .18s, transform .18s; max-width:min(90vw, 560px); white-space:normal;
}
#xq-toast.on { opacity:1; transform:translateX(-50%) translateY(0); }
#xq-toast.err { background:#b42318; }

/* ── v4.0 — Tab Danh thủ Việt + menu chuột phải tab Kỳ thủ ─────────────── */
.xq-ctxmenu { position:fixed; z-index:1060; background:#fff; border:1px solid #cfd4da; border-radius:6px;
  box-shadow:0 6px 24px rgba(0,0,0,.18); padding:.25rem 0; min-width:230px; display:none; font-size:14px; }
.xq-ctxmenu.on { display:block; }
.xq-ctxmenu button { display:flex; width:100%; gap:.5rem; align-items:center; background:none; border:0;
  text-align:left; padding:.4rem .9rem; cursor:pointer; color:#1b1b1b; }
.xq-ctxmenu button:hover { background:#e8f0fe; }
.xq-ctxmenu .xq-ctx-head { padding:.35rem .9rem; font-weight:600; color:#555; border-bottom:1px solid #e5e7eb;
  margin-bottom:.25rem; max-width:280px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.xq-ctxmenu .xq-ctx-sep { height:1px; background:#e5e7eb; margin:.25rem 0; }
.xq-ctxmenu .xq-ctx-danger { color:#b42318; }

/* Ảnh nhỏ trong bảng danh thủ */
.mm-thumb { width:40px; height:52px; object-fit:cover; border-radius:4px; border:1px solid #ddd; display:block; }
.mm-noimg { width:40px; height:52px; border-radius:4px; border:1px dashed #ccc; display:flex;
  align-items:center; justify-content:center; color:#bbb; font-size:18px; }
#mm-table td { vertical-align:middle; }
#mm-table .mm-name { font-weight:600; }
#mm-table .mm-intro { max-width:340px; font-size:.88em; color:#555;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }

/* Popup sửa danh thủ (v4.0.2): cùng khuôn m-pedit, riêng ô nhập cao hơn chút
   cho dễ bấm trên điện thoại (user chốt 39-40px). */
/* Dấu † cho danh thủ đã mất — mờ, rê chuột hiện năm mất (tiêu đề cột vẫn là "Năm sinh") */
#mm-table .mm-died { color:#9aa0a6; cursor:help; font-size:.95em; }

/* Tên quốc tế in nghiêng, nhỏ, ngay dưới tên tiếng Việt trong bảng danh thủ */
#mm-table .mm-name-en { font-size:.82em; font-style:italic; color:#6b7075; line-height:1.25; }

#m-medit .xq-pe-row.xq-pe-row .form-control,
#m-medit .xq-pe-row.xq-pe-row input { height:39px !important; padding:.3rem .55rem; }

/* ── Chế độ NHÚNG (embed=1) — Explorer chạy trong iframe của bài viết ─────────
   plg_content_xqgame in 2 tab: "Ván cờ" (view=game) và "Bảng điểm" (Explorer
   tab standings). Giải đã do shortcode chỉ định nên bỏ hết phần điều hướng:
   banner, toolbar, hàng tab, và hộp chọn Năm/Giải trong tab Bảng điểm.
   DOM vẫn còn nguyên (chỉ ẩn) — JS Explorer tra getElementById các id này. */
.xqbase-explorer.xq-embed-mode .xq-banner,
.xqbase-explorer.xq-embed-mode .xq-exp-toolbar,
.xqbase-explorer.xq-embed-mode .xq-tabs,
.xqbase-explorer.xq-embed-mode #st-year,
.xqbase-explorer.xq-embed-mode label[for="st-tour"],
.xqbase-explorer.xq-embed-mode #st-tour { display:none !important; }
/* Không còn hàng tab ở trên → bỏ góc vuông trái của khung bảng điểm */
.xqbase-explorer.xq-embed-mode #tab-standings { border-radius:6px; min-height:0; }
/* Nhúng trong bài viết thì lề ngoài thừa; iframe tự co theo nội dung */
.xqbase-explorer.xq-embed-mode { padding:0; margin:0; }
