/* ===== khu-en — design system dùng chung cho /pte8020 · /toefl8020 · /det8020 =====

   CHÉP TỪ sat8020/sat.css, CÓ CHỦ Ý — không @import.
   Ba khu này và khu SAT cùng một hệ thiết kế (Arial, góc gần vuông, kẻ mảnh 1px,
   không bóng loè, lấy từ ielts8020/style.css). Nhưng nối bằng @import thì một
   lần sửa màu bên SAT là ba khu ngoại ngữ đổi theo mà không ai biết — đúng kiểu
   hỏng im lặng. Đây là bản riêng: sửa bên SAT KHÔNG ảnh hưởng sang đây, và
   ngược lại.

   MÀU NHẤN ĐỔI THEO KỲ THI, lấy đúng màu logo thật của từng kỳ (giống cách
   speakingcore làm trong lib/exams.ts):
     PTE   teal Pearson    TOEFL xanh ETS    Duolingo xanh lá
   Mỗi kỳ hai sắc vì một màu không làm được cả hai việc:
     --acc      bản đủ tương phản để làm CHỮ trên nền trắng (>= 4.5:1)
     --acc-lite bản đúng màu logo, chỉ dùng cho MẢNG MÀU (gạch tab, tem, thanh)
   Xanh Duolingo #58CC02 rất dễ nhận ra nhưng làm chữ thì mờ không đọc nổi —
   đó chính là lý do phải tách hai biến.

   Đặt trên <body data-exam="pte|toefl|det|toeic">. Thiếu thuộc tính đó thì rơi về
   tông trung tính, trang vẫn đọc được chứ không vỡ. */
:root {
  --navy:#1C355F; --navy-2:#274B85; --acc:#0E6EA0; --acc-lite:#2EA5D6; --acc-soft:#EAF6FD;
  --bg:#F7F9FC; --card:#FFFFFF; --line:#E5E7EB; --line-2:#D1D5DB;
  --muted:#6B7280; --text:#1F2937;
  --ok:#065F46; --okbg:#D1FAE5; --warn:#B45309; --warnbg:#FEF3E2;
  --err:#991B1B; --errbg:#FEE2E2;
  --radius:6px; --shadow:0 1px 2px rgba(16,24,40,.06);
}
/* --- Màu nhấn theo từng kỳ thi --- */
body[data-exam="pte"]   { --acc:#00857B; --acc-lite:#00B39F; --acc-soft:#E6F6F4; }
body[data-exam="toefl"] { --acc:#1454C8; --acc-lite:#2E6FE0; --acc-soft:#E9EFFC; }
body[data-exam="det"]   { --acc:#3E8E00; --acc-lite:#58CC02; --acc-soft:#EEF9E4; }
/* TOEIC — cam đất. Ba khu kia đã lấy hết xanh lá, xanh dương và xanh mòng két;
   thêm một sắc xanh nữa là bốn khu nhìn như nhau ở đuôi mắt, và tem "đang ở khu
   nào" mất tác dụng đúng lúc cần nhất (chuyển qua lại giữa hai khu). */
body[data-exam="toeic"] { --acc:#B4531A; --acc-lite:#E2701F; --acc-soft:#FCF0E7; }
/* Tiếng Đức — đỏ thẫm lấy từ quốc kỳ Đức, đủ xa cam đất của TOEIC để không
   nhầm hai khu khi chuyển tab qua lại. */
body[data-exam="duc"]   { --acc:#A31E22; --acc-lite:#CE3438; --acc-soft:#FAEAEA; }

* { box-sizing:border-box; margin:0; }
html { scroll-behavior:smooth; }
body { font-family:Arial,"Helvetica Neue",Helvetica,system-ui,-apple-system,sans-serif;
  background:var(--bg); color:var(--text); line-height:1.6; }
img { max-width:100%; }
a { color:var(--navy-2); }

/* Phóng to trên màn rộng — để khu SAT không nhỏ hơn phần còn lại của luyenthi8020
   (style.css của site mẹ zoom 1.15 từ 1000px). Chỉ bật từ 1240px: ở mốc đó bố cục
   vẫn còn 1240/1.10 = 1127px, rộng hơn MỌI breakpoint trong file này (lớn nhất 900px),
   nên media query không bị lệch vì zoom. Trang thi (body.exam) giữ nguyên 100% —
   trong đó có nhiều thanh position:fixed và cần đúng tỷ lệ như Bluebook thật. */
@media (min-width:1240px) { body:not(.exam) { zoom:1.10; } }
@media (min-width:1700px) { body:not(.exam) { zoom:1.15; } }
.wrap { max-width:1080px; margin:0 auto; padding:0 20px; }
.muted { color:var(--muted); }
.hidden { display:none !important; }

/* ===== Header 2 tầng — y ielts8020 ===== */
.site-header { background:#fff; border-bottom:1px solid var(--line-2); position:sticky; top:0; z-index:200; }
.site-header .top-row { display:flex; align-items:center; gap:20px; height:58px; }
.site-logo { display:flex; align-items:center; gap:9px; text-decoration:none; flex:none; }
.site-logo img { height:36px; }
.site-logo span { font-weight:800; color:var(--navy); font-size:15px; letter-spacing:.2px; }
.header-cta { margin-left:auto; display:flex; gap:9px; align-items:center; }
.header-cta > .btn { padding:8px 15px; font-size:13.5px; }
.cta-stack { display:flex; flex-direction:column; align-items:stretch; gap:3px; min-width:0; }
.cta-stack .btn { padding:4px 13px; font-size:12.5px; line-height:1.4; border-radius:8px;
  max-width:250px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.btn { display:inline-block; border:0; border-radius:4px; padding:10px 18px; font-size:14px;
  font-weight:700; cursor:pointer; text-decoration:none; text-align:center;
  -webkit-user-select:none; user-select:none; touch-action:manipulation; }
.btn-acc { background:var(--acc); color:#fff; }
.btn-acc:hover { background:#0A5A84; }
.btn-navy { background:var(--navy); color:#fff; }
.btn-navy:hover { background:#274B85; }
.btn-outline { background:#fff; color:var(--navy); border:1px solid var(--line-2); }
.btn-outline:hover { border-color:var(--navy); background:#F3F6FB; }
.btn-lg { padding:14px 28px; font-size:16px; }
.btn[disabled] { opacity:.5; cursor:not-allowed; }

/* Thanh tab: dải xám, tab đang chọn nổi trắng + gạch XANH đáy (đổi từ hồng 23/8/2026) */
.tabbar { background:#EEF2F8; border-top:1px solid var(--line-2); border-bottom:1px solid var(--line-2); }
.main-nav { position:relative; display:flex; gap:0; align-items:stretch; justify-content:flex-start; }
.nav-item { position:static; display:flex; border-right:1px solid #DCE3ED; }
.nav-item:first-child { border-left:1px solid #DCE3ED; }
.main-nav a { position:relative; text-decoration:none; color:#374151; font-size:13.5px; font-weight:700;
  padding:12px 16px; border-bottom:3px solid transparent; border-radius:0;
  flex:0 0 auto; text-align:center; line-height:1.35; white-space:nowrap;
  display:flex; flex-direction:row; align-items:center; gap:7px; justify-content:center;
  transition:color .14s, background .14s, border-color .14s; }
.main-nav a:hover { color:var(--navy); background:#E3EAF4; }
.main-nav a.active { color:var(--navy); background:#fff; border-bottom-color:var(--acc);
  margin-bottom:-1px; padding-bottom:13px; }
.main-nav a.active:hover { background:#fff; }
.main-nav a .t-badge { background:#fff; color:var(--navy); border:1px solid var(--line-2);
  font-size:9.5px; font-weight:800; letter-spacing:.5px; border-radius:3px;
  padding:2px 5px; line-height:1.4; flex:none; }
.main-nav a.active .t-badge { border-color:var(--acc); color:var(--acc); }
/* Tem "HOT" của tab Đề dự đoán — tô đặc cho nổi hơn kiểu viền. Đây là tem DUY
   NHẤT còn lại trên thanh tab (23/8/2026); .free giữ lại phòng khi cần dùng lại. */
.main-nav a .t-badge.hot,
.main-nav a.active .t-badge.hot,
.main-nav a .t-badge.free,
.main-nav a.active .t-badge.free { background:var(--acc); border-color:var(--acc); color:#fff; }
/* Menu xổ ngang — y ielts8020 */
.nav-drop { position:absolute; top:100%; left:0; right:0; z-index:60;
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; padding:12px 14px;
  background:#F4F7FB; border-bottom:1px solid var(--line-2);
  box-shadow:0 10px 24px rgba(16,24,40,.12);
  opacity:0; visibility:hidden; transform:translateY(-4px); transition:.14s ease; }
.nav-item.has-drop:hover .nav-drop, .nav-item.has-drop:focus-within .nav-drop {
  opacity:1; visibility:visible; transform:none; }
.main-nav .nav-drop a { flex:none; display:flex; align-items:center; justify-content:flex-start;
  gap:6px; text-align:left; white-space:nowrap; padding:9px 14px; font-size:13.5px;
  font-weight:600; color:var(--text); background:#fff; border:1px solid #DCE3ED;
  border-bottom:1px solid #DCE3ED; border-radius:4px; }
.main-nav .nav-drop a:hover { background:var(--navy); border-color:var(--navy); color:#fff; }

/* ===== Khung trang ===== */
/* CHỈ đặt padding TRÊN/DƯỚI. Viết dạng rút gọn "padding:28px 0 64px" là đè luôn
   padding hai bên 20px mà .wrap vừa đặt ở trên — và vì mọi <main> trong khu SAT
   đều mang cả hai lớp (class="page wrap"), chữ dính sát mép màn hình trên điện
   thoại ở TOÀN BỘ khu. Trên máy tính không thấy vì max-width:1080px đã tự chừa lề.
   Sửa 26/8/2026 khi dựng khu Khoá học — trang đọc dài là chỗ lộ rõ nhất. */
.page { padding-top:28px; padding-bottom:64px; }
.kicker { color:var(--acc); font-weight:800; font-size:13px; text-transform:uppercase; letter-spacing:1.2px; margin-bottom:6px; }
h1.page-title { color:var(--navy); font-size:clamp(26px,3.6vw,36px); line-height:1.2; letter-spacing:-.3px; }
.page-lead { color:var(--muted); font-size:16px; max-width:720px; margin-top:6px; }
h2.sec-title { color:var(--navy); font-size:clamp(20px,2.6vw,26px); line-height:1.25; margin:34px 0 12px; }
.grid { display:grid; gap:18px; }
.grid.c2 { grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); }
.grid.c3 { grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); }
.card { background:var(--card); border:1px solid var(--line); border-radius:var(--radius); padding:22px; box-shadow:var(--shadow); }
.card h3 { color:var(--navy); font-size:17px; margin-bottom:8px; }
.pill { display:inline-block; font-size:11px; font-weight:800; letter-spacing:.4px; border-radius:3px; padding:2px 7px; border:1px solid var(--line-2); color:var(--navy); background:#fff; }
.pill.pro { border-color:var(--acc); color:var(--acc); }
.pill.free { border-color:#0E9F6E; color:#0E9F6E; }
.pill.done { border-color:#0E9F6E; color:#065F46; background:var(--okbg); }

/* ===== Bố cục 2 cột: rail trái (3 mức khó) + nội dung ===== */
.layout { display:grid; grid-template-columns:230px 1fr; gap:26px; align-items:start; margin-top:22px; }
.rail { position:sticky; top:120px; background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; }
.rail .rail-tieu-de { font-size:11px; font-weight:800; letter-spacing:.9px; text-transform:uppercase;
  color:var(--muted); padding:12px 16px 8px; }
.rail a { display:flex; align-items:center; justify-content:space-between; gap:8px; padding:11px 16px;
  font-size:14px; font-weight:600; color:var(--text); text-decoration:none; border-left:3px solid transparent; }
.rail a:hover { background:#F3F6FB; }
.rail a.on { color:var(--navy); background:var(--acc-soft); border-left-color:var(--acc); font-weight:800; }
.rail a .n { font-size:12px; color:var(--muted); font-weight:700; }
.rail .rail-chu-thich { font-size:12px; color:var(--muted); padding:10px 16px 14px; border-top:1px solid var(--line); line-height:1.5; }

/* ===== Thanh phân trang kho đề lẻ (23/8/2026) =====
   Kho nhân ba đưa mỗi dạng nhỏ lên 96 bộ; ô "Tất cả" đổ hết một lượt thì dài gấp
   bốn màn hình và trình duyệt phải dựng 96 ô xem trước có SVG cùng lúc. Cắt 24 thẻ
   một trang, đúng con số đã chốt cho /luyen-tap bên ielts8020.
   Nút hai đầu khi hết đường dựng bằng <span>, không phải <a> tô mờ — xem chú thích
   trong khu-luyen.js. Vì vậy .tat ở đây chỉ lo phần nhìn, không phải phần chặn. */
.phan-trang { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:10px; margin:18px 0 4px; padding-top:14px; border-top:1px solid var(--line); }
.phan-trang .pt-dem { font-size:13px; color:var(--muted); font-weight:600; }
.phan-trang .pt-nut-hang { display:flex; flex-wrap:wrap; gap:6px; }
.phan-trang .pt-nut, .phan-trang .pt-so {
  display:inline-flex; align-items:center; justify-content:center; min-width:34px; height:34px;
  padding:0 10px; font-size:13.5px; font-weight:700; text-decoration:none; color:var(--text);
  background:#fff; border:1px solid #DCE3ED; border-radius:4px; }
.phan-trang a.pt-nut:hover, .phan-trang a.pt-so:hover { border-color:var(--navy); }
.phan-trang .pt-so.on { background:var(--navy); border-color:var(--navy); color:#fff; }
.phan-trang .pt-nut.tat { color:var(--muted); background:#F3F6FB; border-color:var(--line); cursor:default; }

/* Điện thoại: dãy số trang là thứ tràn ngang trước tiên. Cho nó cuộn ngang trong
   khung riêng thay vì đẩy cả trang lệch — bẫy đã gặp ở các bảng rộng của web. */
@media (max-width:560px) {
  .phan-trang { flex-direction:column; align-items:stretch; }
  .phan-trang .pt-nut-hang { overflow-x:auto; flex-wrap:nowrap; padding-bottom:4px; }
}

/* Dải sub-tab 4 dạng nhỏ trong trang Verbal/Math */
.dom-tabs { display:flex; flex-wrap:wrap; gap:8px; margin:18px 0 4px; }
.dom-tabs a { text-decoration:none; font-size:13.5px; font-weight:700; color:var(--text);
  background:#fff; border:1px solid #DCE3ED; border-radius:4px; padding:9px 14px; }
.dom-tabs a.on { background:var(--navy); border-color:var(--navy); color:#fff; }
.dom-tabs a:hover:not(.on) { border-color:var(--navy); }

/* Thẻ đề lẻ */
/* ===== Thẻ đề lẻ — có ô XEM TRƯỚC nội dung thật (23/8/2026) =====
   Trước đây danh sách là 255 dòng ngang giống hệt nhau: mã · tên · mức · số câu.
   Đọc như bảng kê kho, không mời được ai bấm vào làm. Nay mỗi thẻ mở đầu bằng một
   mẩu nội dung THẬT của chính bộ đó — hình vẽ trong đề (Toán) hoặc mấy dòng đầu
   của đề bài dựng thành ô giấy (Verbal). Xem oXem() trong khu-luyen.js.
   Lưới tự co theo bề rộng: 2–3 cột trên máy tính, 1 cột trên điện thoại. */
.de-list { display:grid; gap:12px; margin-top:14px;
  grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); }
.de-item { display:flex; flex-direction:column; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); overflow:hidden; text-decoration:none; color:var(--text);
  transition:border-color .12s ease, transform .12s ease; }
.de-item:hover { border-color:var(--acc); transform:translateY(-2px); }

/* Ô xem trước — cao cố định để mọi thẻ bằng nhau dù nội dung dài ngắn khác nhau */
.de-xem { display:flex; align-items:center; justify-content:center; height:126px;
  background:#F5F8FC; border-bottom:1px solid var(--line); overflow:hidden; padding:10px; }
.de-xem.hinh svg { max-width:100%; max-height:106px; height:auto; width:auto; }
/* Ô giấy: chữ đề thật, dựng cho giống một mẩu trang đề. Chữ có chân + hàng chữ
   thưa để khác hẳn phần giao diện xung quanh — nhìn là biết đây là NỘI DUNG. */
.de-xem.chu { align-items:flex-start; padding:0; position:relative; background:#fff; }
.de-xem.chu > span { display:block; padding:13px 15px 0; font-size:12.5px; line-height:1.62;
  font-family:Georgia,"Times New Roman",serif; color:#334155; }
/* Chữ bị cắt ngang thân dòng trông như lỗi — phủ một dải trắng mờ dần ở đáy để
   nó đọc ra là "còn nữa" chứ không phải "vỡ layout". */
.de-xem.chu::after { content:""; position:absolute; left:0; right:0; bottom:0; height:44px;
  background:linear-gradient(rgba(255,255,255,0),#fff 88%); }
/* Bảng số liệu của đề — thu nhỏ vừa ô, cắt phần thừa. Giữ nguyên hình bảng vì gỡ
   thẻ ra chữ thì thành một dãy chữ số rời rạc, đọc không ra gì. */
.de-xem.bang { align-items:flex-start; justify-content:flex-start; padding:10px 0 0 12px;
  background:#fff; position:relative; }
/* Bảng để RỘNG TỰ NHIÊN rồi cắt ở mép phải, không bóp từng ô. Bóp ô thì mọi tiêu đề
   cột thành "More tha…", "45 minut…" — đọc ra thứ gì đó hỏng. Cắt ở mép thì đọc ra
   "bảng còn nữa", đúng thứ nó là. Dải trắng mờ ở mép phải nói hộ điều đó. */
.de-xem.bang table { border-collapse:collapse; font-size:10.5px; line-height:1.35; width:auto; }
.de-xem.bang th, .de-xem.bang td { border:1px solid var(--line); padding:3px 6px;
  text-align:left; color:#334155; white-space:nowrap; }
.de-xem.bang th { background:#F5F8FC; font-weight:700; color:var(--navy); }
/* Cắt cả hai chiều: mép phải (còn cột) và mép dưới (còn dòng). Không có dải mờ
   ở đáy thì dòng cuối bị xén ngang thân chữ, đọc ra là vỡ layout chứ không phải
   "bảng còn nữa". Hai lớp phủ nên dùng ::after cho phải và ::before cho dưới. */
.de-xem.bang::after { content:""; position:absolute; top:0; bottom:0; right:0; width:38px;
  background:linear-gradient(90deg,rgba(255,255,255,0),#fff 82%); }
.de-xem.bang::before { content:""; position:absolute; left:0; right:0; bottom:0; height:26px;
  background:linear-gradient(rgba(255,255,255,0),#fff 85%); z-index:1; }
.de-xem.trong { font-size:13px; font-weight:800; color:var(--line-2); letter-spacing:1px; }

.de-than { display:flex; flex-direction:column; gap:6px; padding:12px 14px 13px; flex:1; }
.de-item .hang-tren { display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.de-item .ma { flex:none; font-size:11px; font-weight:800; color:var(--muted); letter-spacing:.4px;
  background:#F3F6FB; border-radius:3px; padding:3px 7px; }
.de-item .ten { font-weight:700; color:var(--navy); font-size:14.5px; line-height:1.4; }
.de-item .meta { margin-top:auto; font-size:12.5px; color:var(--muted); }
.de-item:hover .meta { color:var(--acc); }
.de-item .diem { font-weight:800; color:var(--ok); font-size:12.5px; margin-left:auto; }

/* Thẻ đề full / dự đoán. Từ 23/8/2026 thẻ mở đầu bằng ô xem trước nội dung thật
   (.de-xem, dựng bởi SAT.oXem) nên phần chữ lùi vào .fc-than — padding chuyển từ
   thẻ xuống thân, để ô xem trước tràn sát mép thẻ như một tấm ảnh bìa. */
.full-card { background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; display:flex; flex-direction:column; }
.full-card .fc-than { padding:16px 20px 18px; display:flex; flex-direction:column; gap:9px; flex:1; }
.full-card h3 { color:var(--navy); font-size:16.5px; line-height:1.35; }
.full-card .chi-tiet { font-size:13px; color:var(--muted); line-height:1.55; }
/* Mô tả trọng tâm của đề dự đoán do người soạn viết, dài ngắn rất khác nhau —
   có thẻ 2 dòng, có thẻ 8 dòng, để nguyên thì cả lưới so le như răng cưa.
   Kẹp 4 dòng cho các thẻ cao bằng nhau; ai cần đọc đủ thì rê chuột (title). */
/* (23/8/2026) Thẻ đề dự đoán nay mang HAI dòng trọng tâm (Verbal và Math) nên kẹp
   2 dòng mỗi dòng thay vì 4 — tổng chiều cao giữ nguyên, lưới vẫn phẳng. */
.full-card .chi-tiet.trong-tam { display:-webkit-box; -webkit-line-clamp:2;
  -webkit-box-orient:vertical; overflow:hidden; }
.full-card .hang-nut { margin-top:auto; display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.full-card .kq-cu { font-size:12.5px; color:var(--ok); font-weight:700; }

/* Hộp PRO — kiểu pro-box của luyenthi + bảng gói của ielts8020 */
.pro-box { background:#fff; border:2px solid var(--acc); border-radius:var(--radius); padding:24px; margin-top:26px; }
.pro-box h3 { color:var(--navy); font-size:19px; }
.goi-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px; margin-top:26px; }
.goi { border:1px solid var(--line-2); border-radius:var(--radius); padding:18px; display:flex; flex-direction:column; gap:6px; background:#fff; }
.goi.hay { border-color:var(--acc); box-shadow:0 0 0 1px var(--acc); position:relative; }
.goi .nhan { font-size:12px; font-weight:800; letter-spacing:.5px; text-transform:uppercase; color:var(--muted); }
.goi.hay .nhan { color:var(--acc); }
/* (24/8/2026) Ô giá đọc theo thứ tự NGÀY → THÁNG → TỔNG GÓI. Con số to nhất là
   giá mỗi ngày: một ly cà phê mỗi ngày dễ gật đầu hơn một cục tiền. Tổng gói vẫn
   ghi đủ nhưng nằm dưới cùng, sau một đường kẻ — giấu nó đi là mất tin, để nó lên
   đầu là mất người. Cùng khuôn với pro.html của ielts8020. */
.goi { position:relative; padding-top:22px; }
/* (24/8/2026) Con số mỗi ngày to hẳn lên (30 → 36px) và đổi từ navy sang --acc:
   navy đọc như chữ tiêu đề bình thường, còn --acc là màu xanh nút bấm nên mắt
   bắt được ngay đâu là giá. Bó chữ lại letter-spacing:-1px để "6.600đ/ngày" vẫn
   nằm gọn một dòng trong ô rộng ~180px của lưới 4 cột; flex-wrap là lối thoát
   cho gói "Mua đứt" (con số 7 chữ số, không cách nào nhét một dòng). */
.goi .gia { font-size:36px; font-weight:800; color:var(--acc); line-height:1.1;
            letter-spacing:-1px; display:flex; align-items:baseline;
            flex-wrap:wrap; gap:1px; }
.goi .gia small { font-size:14px; color:var(--muted); font-weight:700; letter-spacing:0; }
.goi.hay .gia { font-size:38px; }
.goi.hay { background:var(--acc-soft); }
.goi .thang { font-size:13.5px; color:var(--text); font-weight:700; }
/* Giá gốc gạch ngang = giá MỖI THÁNG của gói 1 tháng. Có mốc để so thì con số
   "≈ 100.000đ/tháng" mới nói lên điều gì; đứng một mình nó chỉ là một con số. */
.goi .goc { color:var(--muted); font-weight:700; text-decoration:line-through;
            text-decoration-thickness:1.5px; margin-right:3px; }
.goi .tk { display:inline-block; font-size:11.5px; font-weight:800; color:#fff;
           background:var(--ok); border-radius:999px; padding:2px 9px; margin-left:6px; }
/* Tiết kiệm càng nhiều thì nhãn càng to — bốn nhãn cùng một cỡ thì phải đọc hết
   bốn con số mới biết bậc nào lợi. Bậc ≥40% tách hẳn xuống dòng riêng, viết hoa:
   đó là thứ đáng nhìn nhất trong cả ô giá. */
.goi .tk.vua { font-size:13px; padding:3px 11px; }
.goi .tk.manh { display:block; width:-moz-fit-content; width:fit-content;
                margin:8px 0 2px; font-size:15px; padding:4px 13px;
                letter-spacing:.3px; text-transform:uppercase;
                box-shadow:0 2px 6px rgba(6,95,70,.28); }
/* margin-top:auto nằm ở .tong chứ không ở .btn: bốn ô có phần mô tả dài ngắn
   khác nhau, đẩy nút xuống đáy mà để dòng tổng trôi tự do thì bốn dòng tổng nằm
   ở bốn độ cao khác nhau, mắt không so ngang được. */
.goi .tong { font-size:12.5px; color:var(--muted); margin-top:auto; padding-top:9px;
             border-top:1px dashed var(--line-2); }
.goi .tong b { color:var(--text); font-weight:800; }
/* Nhãn "được chọn nhiều nhất" đè lên viền trên. .goi-grid phải có khoảng thở ở
   trên, không thì nhãn bị khối phía trước cắt mất một nửa. */
.goi .tag-hay { position:absolute; top:-12px; left:50%; transform:translateX(-50%);
                background:var(--acc); color:#fff; font-size:11.5px; font-weight:800;
                letter-spacing:.2px; border-radius:999px; padding:3px 13px; white-space:nowrap; }
.goi .ngay { font-size:12.5px; color:var(--ok); font-weight:700; }
.goi .mo { font-size:13px; color:var(--muted); line-height:1.5; }
.goi .btn { margin-top:10px; }

/* (9/9/2026) Bảng "cấu trúc kỳ thi" trên trang bán, gấp lại — xem khu-en/_dung.py.
   Trang bán chỉ có một việc: cho người ta lý do và một cái nút. Mọi thứ tra cứu
   được thì gấp lại, đừng bắt người đang định trả tiền cuộn qua nó. */
.pro-dang { margin-top:26px; border-top:1px solid var(--line-2); padding-top:14px; }
.pro-dang summary { cursor:pointer; font-weight:800; color:var(--navy); font-size:15px; }
.pro-dang > div { margin-top:12px; }
.msg { border-radius:4px; padding:10px 14px; font-size:13.5px; margin-top:10px; }
.msg.err { background:var(--errbg); color:var(--err); }
.help { background:#F8FAFC; border:1px dashed var(--line-2); border-radius:4px; padding:12px 14px; font-size:13px; color:var(--muted); margin-top:12px; }

/* Ô dẫn vào 4 khu con, đặt ngay dưới h1 của trang hub SAT. Vừa là lối vào cho
   khách mới (bảng điều khiển bên dưới rỗng khi chưa làm bài nào), vừa là đường
   cho Google bò sang các trang con. */
.lt-o { display:flex; flex-direction:column; gap:4px; background:#fff;
  border:1px solid var(--line); border-radius:var(--radius); padding:14px 16px;
  text-decoration:none; transition:border-color .15s, box-shadow .15s, transform .15s; }
.lt-o:hover { border-color:var(--acc); box-shadow:var(--shadow); transform:translateY(-2px); }
.lt-o b { color:var(--navy); font-size:15px; }
.lt-o span { color:var(--muted); font-size:12.5px; line-height:1.5; }

/* FAQ trang hub — nội dung phải HIỂN THỊ thì khối FAQPage mới khai được.
   Dùng <details> nên nội dung vẫn nằm trong DOM và Google đọc được, chỉ gập lại
   cho gọn; đây là dạng Google chấp nhận. */
.sat-faq { display:flex; flex-direction:column; gap:8px; margin-top:12px; }
.sat-faq details { background:#fff; border:1px solid var(--line); border-radius:var(--radius); }
.sat-faq summary { cursor:pointer; padding:13px 16px; font-weight:600; color:var(--navy);
  font-size:14.5px; list-style:none; display:flex; justify-content:space-between; align-items:center; gap:12px; }
.sat-faq summary::-webkit-details-marker { display:none; }
.sat-faq summary::after { content:"+"; color:var(--acc); font-weight:700; font-size:18px; flex:none; }
.sat-faq details[open] summary::after { content:"−"; }
.sat-faq summary:hover { color:var(--acc); }
.sat-faq p { padding:0 16px 14px; margin:0; color:var(--muted); font-size:14px; line-height:1.65; }

/* ===== Lộ trình của Tôi ===== */
.lt-hero { background:linear-gradient(135deg,#EAF6FD,#F5FAFE 60%,#fff); border:1px solid #C7E4F4;
  border-radius:var(--radius); padding:24px; margin-top:20px; display:flex; gap:20px; align-items:center; flex-wrap:wrap; }
.lt-hero .noi-dung { flex:1 1 380px; }
.lt-hero h2 { color:var(--navy); font-size:20px; margin-bottom:6px; }
.stat-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:14px; margin-top:18px; }
.stat { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:16px 18px; }
.stat .so { font-size:26px; font-weight:800; color:var(--navy); font-variant-numeric:tabular-nums; }
.stat .so small { font-size:13px; color:var(--muted); font-weight:600; }
.stat .ten { font-size:12.5px; color:var(--muted); margin-top:2px; }
/* Thanh Skills Insight: 8 dạng nhỏ, % đúng */
.si-grid { display:grid; grid-template-columns:1fr 1fr; gap:6px 36px; margin-top:14px; }
.si-cot h4 { color:var(--navy); font-size:14.5px; margin:10px 0 8px; }
.si-item { padding:7px 0; border-bottom:1px solid var(--line); }
.si-item .d { display:flex; justify-content:space-between; font-size:13px; margin-bottom:4px; }
.si-item .d b { color:var(--navy); font-weight:700; }
.si-item .d span { color:var(--muted); font-variant-numeric:tabular-nums; }
.si-bar { height:9px; background:#EEF2F8; border-radius:2px; overflow:hidden; display:flex; }
.si-bar i { display:block; height:100%; background:var(--navy); }
.si-bar i.thap { background:var(--acc); }
/* Lịch sử làm bài */
.ls-table { width:100%; border-collapse:collapse; font-size:13.5px; background:#fff; border:1px solid var(--line); }
.ls-table th { text-align:left; font-size:11.5px; letter-spacing:.5px; text-transform:uppercase; color:var(--muted); padding:10px 14px; border-bottom:1px solid var(--line-2); background:#F8FAFC; }
.ls-table td { padding:10px 14px; border-bottom:1px solid var(--line); }
.ls-table tr:last-child td { border-bottom:0; }

/* ===== Kết quả HV ===== */
.wins-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:18px; margin-top:18px; }
.win-card { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:22px; }
.win-top { display:flex; align-items:baseline; gap:8px; }
.win-label { font-size:11px; font-weight:800; letter-spacing:.8px; color:#fff; background:var(--navy); border-radius:3px; padding:2px 7px; }
.win-total { font-size:34px; font-weight:800; color:var(--navy); }
.win-max { color:var(--muted); font-size:14px; }
.win-subs { display:flex; gap:18px; margin:10px 0; }
.win-sub b { display:block; font-size:19px; color:var(--navy); }
.win-sub span { font-size:11.5px; color:var(--muted); }
.win-stars { color:#F59E0B; letter-spacing:2px; }
.win-name { font-weight:800; color:var(--navy); margin-top:6px; }
.win-course { font-size:12.5px; color:var(--muted); }
.win-quote { font-size:13px; color:var(--text); margin-top:8px; font-style:italic; }

/* =====================================================================
   PHÒNG THI — nhái màn Bluebook (Digital SAT). Nền trắng, thanh trên/dưới
   kẻ mảnh, chữ đen, không màu mè. Chỉ dùng trong thi.html / lam-bai.html.
   ===================================================================== */
body.exam { background:#fff; }
.bb-top { position:sticky; top:0; z-index:100; background:#fff; border-bottom:1px solid #E5E7EB;
  display:grid; grid-template-columns:1fr auto 1fr; align-items:center; padding:10px 22px; gap:10px; }
.bb-top .ten-de { font-size:14px; font-weight:700; color:#111827; justify-self:start; line-height:1.3; }
.bb-top .ten-de small { display:block; font-weight:400; color:#6B7280; font-size:12px; }
.bb-timer { justify-self:center; text-align:center; }
.bb-timer .t { font-size:20px; font-weight:800; color:#111827; font-variant-numeric:tabular-nums; letter-spacing:.5px; }
.bb-timer .t.sap-het { color:#B91C1C; }
.bb-timer button { background:none; border:1px solid #D1D5DB; border-radius:999px; font-size:11px; padding:2px 12px; cursor:pointer; color:#374151; }
.bb-top .cong-cu { justify-self:end; display:flex; gap:14px; align-items:center; }
.bb-top .cong-cu button, .bb-top .cong-cu a { background:none; border:0; cursor:pointer; color:#111827;
  font-size:12px; display:flex; flex-direction:column; align-items:center; gap:1px; text-decoration:none; }
.bb-top .cong-cu .ico { font-size:17px; line-height:1; }
.bb-stage { max-width:1240px; margin:0 auto; padding:26px 22px 90px; }
/* RW: đoạn văn trái — câu hỏi phải, kẻ giữa như Bluebook */
.bb-2cot { display:grid; grid-template-columns:1fr 1fr; gap:0; min-height:52vh; }
.bb-2cot .doan { padding:6px 34px 6px 6px; border-right:2px solid #E5E7EB; font-size:15.5px; line-height:1.75; color:#111827; }
.bb-2cot .hoi { padding:6px 6px 6px 34px; }
.bb-1cot { max-width:720px; margin:0 auto; }
.q-so-hang { display:flex; align-items:center; gap:10px; background:#F3F4F6; border-bottom:1px solid #D1D5DB; padding:6px 10px; margin-bottom:18px; }
.q-so { background:#111827; color:#fff; font-weight:800; font-size:14px; padding:2px 10px; }
.q-danh-dau { display:flex; align-items:center; gap:5px; font-size:12.5px; color:#374151; background:none; border:0; cursor:pointer; }
.q-danh-dau .co { font-size:15px; }
.q-danh-dau.on { color:#B91C1C; font-weight:700; }
.q-gach-btn { margin-left:auto; background:none; border:1px solid #9CA3AF; border-radius:3px; font-size:11px; font-weight:700; padding:1px 7px; cursor:pointer; color:#374151; text-decoration:line-through; }
.q-gach-btn.on { background:#111827; color:#fff; border-color:#111827; }
.q-stem { font-size:15.5px; line-height:1.7; color:#111827; }
.q-stem table { border-collapse:collapse; margin:14px auto; font-size:14px; }
.q-stem table th, .q-stem table td { border:1px solid #6B7280; padding:6px 12px; text-align:center; }
.q-stem table th { background:#F3F4F6; }
.q-fig { margin:14px auto; text-align:center; max-width:420px; }
.q-fig svg { width:100%; height:auto; }
.q-opts { list-style:none; padding:0; margin:18px 0 0; display:grid; gap:10px; }
.q-opt { position:relative; display:flex; align-items:flex-start; gap:12px; border:1px solid #6B7280;
  border-radius:6px; padding:11px 14px; cursor:pointer; font-size:15px; line-height:1.55; background:#fff; }
.q-opt:hover { background:#F9FAFB; }
.q-opt .chu { flex:none; width:26px; height:26px; border:1.5px solid #111827; border-radius:50%;
  display:flex; align-items:center; justify-content:center; font-weight:800; font-size:13px; }
.q-opt.chon { border:2px solid #2563EB; padding:10px 13px; background:#EFF6FF; }
.q-opt.chon .chu { background:#2563EB; border-color:#2563EB; color:#fff; }
.q-opt.gach { opacity:.45; }
.q-opt.gach .nd { text-decoration:line-through; }
.q-opt .gach-x { position:absolute; right:8px; top:8px; font-size:11px; border:1px solid #9CA3AF;
  border-radius:3px; padding:0 5px; background:#fff; cursor:pointer; display:none; }
.bb-stage.che-do-gach .q-opt .gach-x { display:block; }
/* chấm chữa (đề lẻ + xem lại): tô đúng/sai */
.q-opt.dung { border:2px solid #059669; background:#ECFDF5; }
.q-opt.dung .chu { background:#059669; border-color:#059669; color:#fff; }
.q-opt.sai { border:2px solid #DC2626; background:#FEF2F2; }
.q-opt.sai .chu { background:#DC2626; border-color:#DC2626; color:#fff; }
.q-spr input { font-size:18px; padding:9px 13px; border:1.5px solid #6B7280; border-radius:5px; width:190px; font-family:inherit; }
.q-spr .luat { font-size:12.5px; color:#6B7280; margin-top:8px; line-height:1.6; }
.q-giai { margin-top:18px; border:1px solid var(--line-2); border-left:4px solid var(--navy); background:#F8FAFC; border-radius:4px; padding:14px 16px; font-size:14px; line-height:1.7; }
.q-giai .bay { margin-top:8px; color:var(--warn); }
.q-giai .nhan { font-size:11px; font-weight:800; letter-spacing:.6px; text-transform:uppercase; color:var(--muted); display:block; margin-bottom:4px; }
/* Thanh dưới */
.bb-bottom { position:fixed; left:0; right:0; bottom:0; z-index:100; background:#fff; border-top:1px solid #E5E7EB;
  display:grid; grid-template-columns:1fr auto 1fr; align-items:center; padding:10px 22px; }
.bb-bottom .hv-ten { font-size:13.5px; font-weight:700; color:#111827; justify-self:start; }
.bb-qnav-btn { justify-self:center; background:#111827; color:#fff; border:0; border-radius:6px;
  font-size:13.5px; font-weight:700; padding:8px 16px; cursor:pointer; display:flex; align-items:center; gap:7px; }
.bb-bottom .di-chuyen { justify-self:end; display:flex; gap:9px; }
.bb-bottom .di-chuyen button { background:#2563EB; color:#fff; border:0; border-radius:999px;
  font-size:14px; font-weight:700; padding:9px 24px; cursor:pointer; }
.bb-bottom .di-chuyen button.lui { background:#fff; color:#2563EB; border:1px solid #2563EB; }
.bb-bottom .di-chuyen button[disabled] { opacity:.4; cursor:not-allowed; }
/* Bảng câu hỏi (question palette) nổi từ nút giữa */
.bb-palette { position:fixed; bottom:64px; left:50%; transform:translateX(-50%); z-index:120;
  background:#fff; border:1px solid #D1D5DB; border-radius:8px; box-shadow:0 12px 34px rgba(16,24,40,.22);
  padding:16px 18px; width:min(480px, 94vw); }
.bb-palette h4 { font-size:13.5px; color:#111827; text-align:center; margin-bottom:4px; }
.bb-palette .chu-thich { display:flex; justify-content:center; gap:16px; font-size:11.5px; color:#374151;
  border-bottom:1px solid #E5E7EB; padding-bottom:8px; margin-bottom:10px; }
.bb-palette .o-luoi { display:grid; grid-template-columns:repeat(auto-fill,minmax(38px,1fr)); gap:7px; }
.bb-palette .o { position:relative; border:1px dashed #6B7280; background:#fff; color:#2563EB;
  font-weight:700; font-size:13px; padding:7px 0; text-align:center; cursor:pointer; border-radius:3px; }
.bb-palette .o.da-tra-loi { background:#2563EB; border:1px solid #2563EB; color:#fff; }
.bb-palette .o.hien-tai::after { content:"📍"; position:absolute; top:-9px; right:-4px; font-size:11px; }
.bb-palette .o.danh-dau { outline:2px solid #B91C1C; outline-offset:1px; }
.bb-palette .dong { display:block; margin:12px auto 0; background:none; border:1px solid #2563EB;
  color:#2563EB; border-radius:999px; font-size:12.5px; font-weight:700; padding:5px 18px; cursor:pointer; }
/* Màn giữa module / nộp / kết quả */
.bb-nghi { max-width:640px; margin:60px auto; text-align:center; }
.bb-nghi h2 { color:#111827; font-size:24px; margin-bottom:10px; }
.bb-nghi p { color:#374151; margin-bottom:10px; }
.bb-nghi .dem { font-size:44px; font-weight:800; color:var(--navy); font-variant-numeric:tabular-nums; margin:16px 0; }
.kq-box { max-width:760px; margin:40px auto; }
.kq-tong { display:flex; gap:20px; align-items:center; justify-content:center; flex-wrap:wrap; margin:22px 0; }
.kq-o { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:20px 30px; text-align:center; min-width:170px; }
.kq-o .so { font-size:38px; font-weight:800; color:var(--navy); font-variant-numeric:tabular-nums; }
.kq-o .ten { font-size:12.5px; color:var(--muted); }
.kq-o.tong-diem { border:2px solid var(--acc); }
.kq-o.tong-diem .so { color:var(--acc); }

/* ===== Bảng điểm kiểu College Board — chỉ dùng ở màn Kết quả của đề FULL =====
   Nhái đúng khối "SAT Scores" trong báo cáo điểm của College Board: cột trái là
   TỔNG + hai phần (kèm khoảng điểm và phân vị), cột phải là Knowledge and Skills
   chia đôi Reading and Writing | Math. Mỗi dạng nhỏ là một DÃY Ô — MỖI Ô LÀ MỘT
   CÂU, ô tô đậm là câu làm đúng; như vậy nhìn phát biết sai mấy câu chứ không
   phải đọc thanh phần trăm rồi tự nhân chia.
   Màn kết quả của đề LẺ (lam-bai.html) vẫn giữ .kq-tong + .si-item cũ vì đề lẻ
   không có thang 1600 nên không có gì để dựng thành bảng điểm. */
.kq-box.kq-rong { max-width:1060px; }
.sr { display:grid; grid-template-columns:342px 1fr; background:var(--card);
  border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; margin:22px 0; }
.sr-rail { padding:18px 20px 22px; border-right:1px solid var(--line); background:#FBFCFE; }
.sr-than { padding:18px 22px 22px; }
.sr-nhan { font-size:11px; font-weight:700; letter-spacing:.9px; text-transform:uppercase; color:var(--muted); }
.sr-hang { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.sr-so { font-size:38px; font-weight:800; line-height:1.1; color:var(--navy); font-variant-numeric:tabular-nums; }
.sr-thang { font-size:11.5px; color:var(--muted); border-left:1px solid var(--line-2); padding-left:8px; }
.sr-pv { margin-left:auto; font-size:11px; font-weight:700; color:var(--navy-2); white-space:nowrap;
  border:1px solid var(--line-2); border-radius:999px; padding:2px 9px; }
.sr-phu { font-size:11.5px; color:var(--muted); margin-top:3px; font-variant-numeric:tabular-nums; }
.sr-phu:empty { display:none; }
.sr-tong { border:2px solid var(--acc); border-radius:6px; padding:11px 13px; margin-top:4px; }
.sr-tong .sr-so { color:var(--acc); }
.sr-tong .sr-pv { color:var(--acc); border-color:var(--acc); }
.sr-vach { height:1px; background:var(--line); margin:16px 0 12px; }
.sr-phan { padding:11px 0; border-bottom:1px dashed var(--line); }
.sr-phan:last-child { border-bottom:0; padding-bottom:0; }
.sr-phan .sr-so { font-size:29px; }
.sr-ten { font-size:13px; font-weight:700; color:var(--navy); margin-bottom:1px; }
.sr-ten em { font-style:normal; font-weight:400; font-size:11px; color:var(--muted); }
.sr-than h3 { font-size:17px; color:var(--navy); }
.sr-lead { font-size:12.5px; color:var(--muted); margin-top:2px; }
.sr-cot { display:grid; grid-template-columns:1fr 1fr; gap:0 26px; margin-top:14px; }
.sr-cot h4 { font-size:12.5px; color:var(--navy); border-bottom:1px solid var(--line); padding-bottom:5px; }
.sr-dom { padding:9px 0; }
.sr-dom > b { display:block; font-size:12.5px; font-weight:700; color:var(--text); }
.sr-dom > span { display:block; font-size:11px; color:var(--muted); margin:1px 0 5px; font-variant-numeric:tabular-nums; }
.sr-dom > span b { color:var(--navy); font-weight:700; }
.sr-dom > span b.sr-yeu { color:var(--acc); }
.sr-oo { display:flex; gap:2px; }
.sr-oo i { flex:1 1 0; height:13px; border-radius:1px; background:#EDF1F7; border:1px solid #DCE3ED; }
.sr-oo i.on { background:var(--navy); border-color:var(--navy); }
.sr-oo i.on.yeu { background:var(--acc); border-color:var(--acc); }
.sr-ghi { font-size:11.5px; line-height:1.55; color:var(--muted); margin-top:14px;
  border-top:1px solid var(--line); padding-top:10px; }
/* Trang thi (body.exam) KHÔNG bị zoom, nên mốc dưới đây là px viewport thật. */
@media (max-width:880px) {
  .sr { grid-template-columns:1fr; }
  .sr-rail { border-right:0; border-bottom:1px solid var(--line); }
  .sr-cot { grid-template-columns:1fr; }
  .sr-cot > div + div h4 { margin-top:14px; }
}
/* Reference sheet (toán) */
.bb-ref { position:fixed; top:64px; right:18px; z-index:130; width:min(560px,92vw); max-height:74vh; overflow:auto;
  background:#fff; border:1px solid #D1D5DB; border-radius:8px; box-shadow:0 14px 40px rgba(16,24,40,.25); padding:18px 20px; }
.bb-ref h4 { font-size:14px; margin-bottom:10px; color:#111827; }
.bb-ref .luoi { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:12px; font-size:12.5px; text-align:center; }
.bb-ref figure { margin:0; }
.bb-ref .dong { display:block; margin:14px auto 0; background:none; border:1px solid #2563EB; color:#2563EB;
  border-radius:999px; font-size:12.5px; font-weight:700; padding:5px 18px; cursor:pointer; }
/* chú thích đúng/sai ở màn xem lại */
.xem-lai-nav { display:flex; flex-wrap:wrap; gap:6px; margin:14px 0; }
.xem-lai-nav button { border:1px solid var(--line-2); background:#fff; border-radius:3px; min-width:34px;
  padding:5px 0; font-size:12.5px; font-weight:700; cursor:pointer; color:var(--text); }
.xem-lai-nav button.dung { background:var(--okbg); color:var(--ok); border-color:#A7F3D0; }
.xem-lai-nav button.sai { background:var(--errbg); color:var(--err); border-color:#FECACA; }
.xem-lai-nav button.on { outline:2px solid var(--navy); }

/* ===== Responsive ===== */
@media (max-width:900px) {
  .layout { grid-template-columns:1fr; }
  .rail { position:static; display:flex; flex-wrap:wrap; }
  .rail .rail-tieu-de, .rail .rail-chu-thich { display:none; }
  .rail a { border-left:0; border-bottom:3px solid transparent; flex:1 1 auto; justify-content:center; }
  .rail a.on { border-bottom-color:var(--acc); }
  .bb-2cot { grid-template-columns:1fr; }
  .bb-2cot .doan { border-right:0; border-bottom:2px solid #E5E7EB; padding:6px 6px 20px; margin-bottom:18px; }
  .bb-2cot .hoi { padding:6px; }
  .si-grid { grid-template-columns:1fr; }
}
@media (max-width:760px) {
  .main-nav { overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .nav-drop { display:none; }
  .header-cta > .btn.an-mobile { display:none; }
  /* (4/9/2026 tối) Header 375px tràn ngang 7px trên cả 8 khu ngoại ngữ — bộ QA 01-quet
     bắt: logo 150 + gap 20 + nút Đổi môn 79 + gap 20 + cụm Đăng nhập/PRO 93 + lề 40 =
     402 > 375. Cùng lỗi header chính đã sửa cùng ngày (style.css). Ở đây: co gap còn
     10px, cụm nút PRO bớt lề ngang, và dưới 400px ẩn chữ "PTE 8020" cạnh logo — tên
     khu vẫn nằm ngay trong h1 và tiêu đề trang, không mất thông tin. */
  .site-header .top-row { gap:10px; }
  .cta-stack .btn { padding:4px 10px; }
  /* Nút Quản trị (chỉ admin/editor thấy) co còn cái cờ-lê trên điện thoại */
  #satAdminBtn .nhan-adm { display:none; }
  #satAdminBtn { padding:8px 11px; }
  .bb-top { padding:8px 12px; }
  .bb-top .ten-de small { display:none; }
  .bb-stage { padding:18px 14px 100px; }
  .bb-bottom { padding:8px 12px; }
  .bb-bottom .hv-ten { display:none; }
  .bb-bottom { grid-template-columns:auto 1fr; }
  .bb-bottom .di-chuyen { justify-self:end; }
}
@media (max-width:400px) {
  .site-logo span { display:none; }
}

/* ===== (23/8/2026) Ba thứ Bluebook thật có mà phòng thi còn thiếu ===== */

/* Directions — trong Bluebook là bảng xổ ngay dưới tên module, mở/đóng được */
.bb-huongdan { max-width:1240px; margin:0 auto; padding:0 22px; }
.bb-huongdan > button { background:none; border:0; cursor:pointer; padding:10px 0 2px;
  font-size:13.5px; font-weight:700; color:#2563EB; display:flex; align-items:center; gap:5px; }
.bb-huongdan .noi-dung { display:none; border:1px solid #D1D5DB; border-radius:8px; background:#F9FAFB;
  padding:14px 16px; margin-top:8px; font-size:13.5px; line-height:1.7; color:#111827; }
.bb-huongdan.mo .noi-dung { display:block; }
.bb-huongdan .noi-dung .viet { margin-top:10px; padding-top:10px; border-top:1px dashed #D1D5DB; color:#4B5563; }

/* Bôi vàng + ghi chú — công cụ Annotate của phần Reading and Writing */
mark.hl { padding:1px 0; border-radius:2px; cursor:pointer; }
mark.hl.v { background:#FDE68A; }
mark.hl.x { background:#BBF7D0; }
mark.hl.h { background:#BFDBFE; }
mark.hl[data-nc]::after { content:"✎"; font-size:11px; vertical-align:super; color:#B45309; margin-left:1px; }
#hlMenu { position:fixed; z-index:150; background:#fff; border:1px solid #D1D5DB; border-radius:8px;
  box-shadow:0 8px 24px rgba(16,24,40,.2); padding:7px; display:flex; gap:6px; align-items:center; }
#hlMenu .mau { width:22px; height:22px; border-radius:50%; border:1px solid #9CA3AF; cursor:pointer; }
#hlMenu .mau.v { background:#FDE68A; } #hlMenu .mau.x { background:#BBF7D0; } #hlMenu .mau.h { background:#BFDBFE; }
#hlMenu button.chu { background:none; border:1px solid #D1D5DB; border-radius:6px; cursor:pointer;
  font-size:12px; padding:4px 8px; color:#111827; }
.bb-nc { position:fixed; z-index:150; background:#fff; border:1px solid #D1D5DB; border-radius:8px;
  box-shadow:0 8px 24px rgba(16,24,40,.2); padding:10px; width:260px; }
.bb-nc textarea { width:100%; height:70px; border:1px solid #D1D5DB; border-radius:6px; padding:6px;
  font:inherit; font-size:13px; resize:vertical; }
.bb-nc .hang { display:flex; gap:6px; justify-content:flex-end; margin-top:7px; }

/* Thanh kéo chia đôi — Bluebook cho kéo rộng/hẹp cột đoạn văn */
.bb-2cot { grid-template-columns:var(--cot,1fr) 6px 1fr; }
.bb-2cot .keo { cursor:col-resize; background:#E5E7EB; border-radius:3px; }
.bb-2cot .keo:hover { background:#9CA3AF; }
.bb-2cot .doan { border-right:0; padding-right:22px; }
.bb-2cot .hoi { padding-left:22px; }
@media (max-width:860px) {
  .bb-2cot { grid-template-columns:1fr; }
  .bb-2cot .keo { display:none; }
  .bb-2cot .doan { border-bottom:2px solid #E5E7EB; padding:6px 6px 20px; margin-bottom:18px; }
}

/* ===== Bảng so sánh FREE / SAT PRO + FAQ (khuôn lấy từ pro.html của ielts8020) ===== */
.cmp { width:100%; border-collapse:collapse; background:#fff; border-radius:10px; overflow:hidden;
  box-shadow:var(--shadow); margin-top:22px; }
.cmp th, .cmp td { border:1px solid var(--line); padding:12px 15px; font-size:14.5px; text-align:center; }
.cmp th { background:var(--navy); color:#fff; font-size:14px; }
.cmp td:first-child { text-align:left; font-weight:600; }
.cmp .y { color:var(--ok); font-weight:800; }
.cmp .n { color:#B91C1C; opacity:.6; }
.cmp tr.row-dd td { background:var(--acc-soft); font-size:15px; }
.cmp tr.row-dd td:first-child { border-left:5px solid var(--acc); }
.cmp-cuon { overflow-x:auto; }
details.faq { background:#fff; border:1px solid var(--line); border-radius:6px; padding:14px 18px; margin-bottom:10px; }
details.faq summary { font-weight:700; color:var(--navy); cursor:pointer; font-size:15px; }
details.faq p { margin-top:10px; color:#374151; font-size:14.5px; line-height:1.75; }

/* ---- Cổng gác lời giải (mô hình sản phẩm chốt 23/8/2026) --------------------
   Free LÀM được và XEM ĐÁP ÁN được ở mọi đề lẻ + 2 đề test đầu vào; phần HƯỚNG
   DẪN GIẢI THÍCH mới là hàng của SAT PRO. Khối này thay chỗ .q-giai khi chưa có
   PRO — cố ý giữ đúng khung và khoảng cách của .q-giai để bố cục không nhảy. */
.giai-khoa { margin-top:18px; border:1px dashed var(--acc); border-left:4px solid var(--acc);
  background:linear-gradient(135deg,#FDF2F8,#F5F7FF); border-radius:4px; padding:14px 16px; }
.giai-khoa .nhan { font-size:11px; font-weight:800; letter-spacing:.6px; text-transform:uppercase;
  color:var(--acc); display:block; margin-bottom:6px; }
.giai-khoa p { margin:0 0 10px; font-size:14px; line-height:1.7; color:#374151; }
.giai-khoa .nut { display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
.giai-khoa .phu { font-size:12.5px; color:var(--muted); }

/* Tem "test đầu vào" trên thẻ đề mô phỏng miễn phí */
.pill.dauvao { border-color:#0E9F6E; color:#0E9F6E; background:#ECFDF5; }
.bang-dauvao { border:1px solid #A7F3D0; background:#ECFDF5; border-radius:12px; padding:14px 18px;
  margin:0 0 18px; font-size:14.5px; line-height:1.75; color:#065F46; }
.bang-dauvao b { color:#064E3B; }

/* Khu làm mờ cho người chưa có PRO (cùng cách ielts8020 đang dùng ở /du-doan) */
.mo-wrap { position:relative; }
.mo-trong { filter:blur(7px) saturate(.85); opacity:.7; pointer-events:none;
  user-select:none; -webkit-user-select:none; }
.mo-giu { position:sticky; top:30vh; height:0; z-index:6; display:flex; justify-content:center; }
.mo-cta { background:#fff; border:1.5px solid var(--line-2); border-radius:14px;
  box-shadow:0 12px 34px rgba(28,53,95,.22); padding:20px 24px; text-align:center;
  max-width:360px; transform:translateY(-50%); }
.mo-cta p { font-size:13.5px; color:var(--muted); margin:8px 0 14px; line-height:1.65; }
.mo-cta .phu { font-size:12px; margin:10px 0 0; }

/* ===== THẺ TÀI LIỆU CÓ ẢNH XEM THỬ (trang /sat8020/ket-qua) =================
   Vì sao có khối này: trước 23/8/2026 thẻ tài liệu chỉ có tiêu đề + mô tả +
   nút tải. Khách không biết bên trong là gì nên phải ĐĂNG KÝ TÀI KHOẢN mới xem
   được — đúng thứ tự ngược. Nay mỗi thẻ bày sẵn MỘT TRANG THẬT bên trong sách
   (chọn tay, ưu tiên trang có đồ thị / hình học / bảng công thức màu), bấm vào
   là phóng to đọc được.

   Ảnh cắt từ MÉP TRÊN (object-position:top) chứ không căn giữa: đầu trang mới
   là chỗ có tiêu đề chương — cắt giữa thì ra một mảng chữ không rõ là gì.
   ========================================================================== */
.tl-o { display:flex; flex-direction:column; overflow:hidden; padding:0; }
.tl-anh {
  position:relative; display:block; width:100%; aspect-ratio:4/3;
  border:none; padding:0; margin:0; background:#EEF2F7; cursor:zoom-in;
  border-bottom:1px solid var(--line); overflow:hidden;
}
/* PHÓNG VÀO GÓC TRÊN-TRÁI, ĐỪNG THU CẢ TRANG A4 (24/8/2026).
   Ảnh xem thử là một trang sách thật, tỉ lệ 4/3 đúng bằng khung — nghĩa là
   object-fit:cover không cắt gì cả, cả trang bị bóp xuống bề ngang ~250px của
   thẻ. Ở cỡ đó chữ nhỏ hơn 3px: người xem chỉ thấy một mảng xám mờ và tưởng
   ảnh hỏng, đúng thứ khối bìa trắng trơn ở nửa màn hình đầu trang Tài liệu.
   Nay phóng 1,55 lần và neo vào GÓC TRÊN-TRÁI: tiêu đề chương, bảng và hình
   của trang hiện ra đọc được ngay trên thẻ. Bấm vào vẫn mở nguyên trang.
   Neo TRÁI chứ không phải giữa vì trang sách căn lề trái — neo giữa là cụt
   mất chữ đầu dòng của tiêu đề. Ai thêm ảnh xem thử mới thì chọn trang có
   thứ đáng xem nằm ở một phần ba trên bên trái (xem BAN-GIAO-ANH-XEM-THU.md). */
.tl-anh img {
  width:100%; height:100%; object-fit:cover; object-position:top left;
  display:block; transform:scale(1.55); transform-origin:top left;
  transition:transform .35s ease;
}
.tl-anh:hover img, .tl-anh:focus-visible img { transform:scale(1.62); }
.tl-anh .tl-nhan {
  position:absolute; left:0; right:0; bottom:0; padding:22px 14px 10px;
  background:linear-gradient(to top,rgba(15,23,42,.82),rgba(15,23,42,0));
  color:#fff; font-size:12.5px; font-weight:700; letter-spacing:.2px;
  display:flex; align-items:center; gap:6px;
}
.tl-anh:focus-visible { outline:3px solid var(--acc); outline-offset:-3px; }
.tl-than { padding:18px 20px 20px; display:flex; flex-direction:column; flex:1; }
.tl-than h3 { margin:0 0 6px; }
.tl-than .tl-mo { font-size:14px; color:var(--muted); line-height:1.55; margin:0 0 14px; flex:1; }
.tl-than .btn { align-self:flex-start; }

/* Lightbox — bấm ảnh để đọc trang đó ở cỡ thật */
.tl-lop {
  position:fixed; inset:0; z-index:300; background:rgba(15,23,42,.88);
  display:flex; align-items:center; justify-content:center;
  /* chừa đáy cho dòng chú thích cố định, không thì nó đè lên chân trang ảnh */
  padding:22px 16px 78px; overflow:hidden;
}
.tl-lop img {
  /* max-height:100% KHÔNG ăn khi cha đang overflow:auto — phải khoá theo chiều
     cao màn hình, nếu không trang A4 tràn quá màn hình và người xem phải cuộn.
     BẪY ZOOM: body có zoom 1.10/1.15 từ 1240px, mà `vh` KHÔNG bị zoom chia lại —
     `calc(100vh - 110px)` vì thế nở ra 1.10 lần và đẩy ảnh lên quá mép trên.
     Dùng phần trăm của .tl-lop (chính nó là inset:0 nên cao đúng màn hình, và
     phần trăm thì nằm trong cùng hệ toạ độ đã zoom). Cha phải hết overflow:auto
     để phần trăm có mốc — ảnh đã tự vừa nên không cần cuộn nữa. */
  max-width:min(860px,100%); max-height:100%;
  width:auto; height:auto; object-fit:contain;
  border-radius:8px; box-shadow:0 24px 70px rgba(0,0,0,.5); background:#fff;
}
.tl-lop .tl-dong {
  position:fixed; top:16px; right:18px; width:42px; height:42px; border:none;
  border-radius:50%; background:#fff; color:var(--navy); font-size:20px;
  cursor:pointer; line-height:1; box-shadow:0 4px 14px rgba(0,0,0,.3);
}
.tl-lop .tl-chu {
  position:fixed; left:0; right:0; bottom:0; padding:14px 18px;
  background:rgba(15,23,42,.92); color:#fff; font-size:13.5px; text-align:center;
}
@media (max-width:600px) { .tl-anh { aspect-ratio:3/2; } }

/* ===== Màn đăng nhập đè lên trang (SAT.moDangNhap) =====
   Không đá người dùng sang /dang-nhap nữa — xổ hộp này ngay tại trang đang xem.
   z-index phải trên MỌI thứ của phòng thi (thanh bb-top/bb-bottom, máy tính
   Desmos 140, bảng công thức 130), nên để 400. */
.dn-lop { position:fixed; inset:0; z-index:400; background:rgba(16,24,40,.55);
  display:flex; align-items:center; justify-content:center; padding:20px; }
.dn-hop { position:relative; width:min(400px,100%); background:#fff; border-radius:10px;
  padding:26px 26px 22px; box-shadow:0 20px 60px rgba(16,24,40,.35); text-align:center; }
.dn-hop h3 { font-size:19px; color:var(--navy); }
.dn-hop > p { font-size:13px; color:var(--muted); margin-top:7px; line-height:1.6; }
.dn-dong { position:absolute; top:8px; right:10px; border:0; background:none; cursor:pointer;
  font-size:17px; line-height:1; color:var(--muted); padding:5px 7px; }
.dn-google { display:flex; align-items:center; justify-content:center; gap:10px; width:100%;
  margin-top:18px; padding:12px 16px; font:700 15px/1 Arial,sans-serif; color:#3C4043; cursor:pointer;
  background:#fff; border:1px solid var(--line-2); border-radius:6px; }
.dn-google:hover { background:#F7F9FC; }
.dn-google:disabled { opacity:.65; cursor:default; }
.dn-msg { font-size:12.5px; color:var(--err); margin-top:9px; }
.dn-msg:empty { display:none; }
.dn-phu { font-size:12px; color:var(--muted); margin-top:14px;
  border-top:1px solid var(--line); padding-top:12px; }

/* Dải ảnh lớp SAT trên trang bán gói (pro.html). Cùng vai trò với dải ảnh lớp ở
   pro.html của ielts8020: bằng chứng "có lớp thật, có người thật" đặt ngay trước
   FAQ. Cắt theo tỷ lệ cố định để 3 ảnh khác kích thước vẫn thành một dải phẳng. */
.pro-anh { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin:46px 0 0; }
.pro-anh img { width:100%; aspect-ratio:4/3; object-fit:cover; border-radius:var(--radius);
  border:1px solid var(--line); display:block; }
@media (max-width:700px) { .pro-anh { grid-template-columns:1fr 1fr; }
  .pro-anh img:nth-child(3) { display:none; } }

/* ===== Dải giới thiệu cho khách lạ ở trang hub (#daiKhachLa) =====
   Chỉ hiện khi CHƯA đăng nhập — xem dungDaiKhachLa() trong sat8020/index.html.
   Nguyên tắc: ảnh trước, chữ sau, đúng một nút. Toàn bộ phần "ảnh" là nội dung
   THẬT của đề đang có trong kho, không phải ảnh minh hoạ mua ngoài. */
.dkl { margin:6px 0 30px; }
.dkl .page-title { margin-bottom:16px; }
.dkl-anh { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; }
.dkl-o { display:block; border:1px solid var(--line); border-radius:var(--radius);
  overflow:hidden; text-decoration:none; background:#fff;
  transition:border-color .12s ease, transform .12s ease; }
.dkl-o:hover { border-color:var(--acc); transform:translateY(-2px); }
/* Ô xem trước ở đây cao hơn ở thẻ đề: đây là thứ đầu tiên khách nhìn thấy,
   hình vẽ nhỏ quá thì không đọc ra là một câu hỏi thật. */
.dkl-o .de-xem { height:150px; border-bottom:0; }
.dkl-o .de-xem.hinh svg { max-height:128px; }
.dkl-chu { margin:9px 0 0; font-size:13px; color:var(--muted); text-align:center; }

.dkl-bang { display:flex; flex-wrap:wrap; align-items:center; gap:10px; margin:18px 0 18px; }
.dkl-diem { display:flex; align-items:baseline; gap:4px; flex-wrap:wrap;
  background:var(--acc-soft); border:1px solid #C7E4F4; border-radius:var(--radius);
  padding:9px 14px; }
.dkl-diem b { font-size:22px; font-weight:800; color:var(--navy); line-height:1; }
.dkl-diem span { font-size:12px; color:var(--muted); }
.dkl-diem i { font-style:normal; font-size:12.5px; color:var(--muted); flex:1 0 100%; }
.dkl-them { font-size:13px; font-weight:700; white-space:nowrap; }

@media (max-width:820px) {
  .dkl-anh { grid-template-columns:1fr 1fr; }
  .dkl-o:nth-child(n+3) { display:none; }   /* 2 ô là đủ trên điện thoại */
  .dkl-o .de-xem { height:130px; }
  .dkl .btn-lg { display:block; text-align:center; }
}

/* =====================================================================
   KHỐI TĂNG TRƯỞNG ĐIỂM — pro.html, ngay dưới bảng giá.
   Biểu đồ là SVG viết tay trong pro.html chứ không dùng thư viện: ba đường
   thẳng và bốn dòng chữ thì kéo cả một thư viện vẽ đồ thị về là đắt vô lý,
   mà trang bán hàng có thêm một file JS ngoài là thêm một chỗ để hỏng.
   ===================================================================== */
.tang-truong { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:26px 24px 24px; margin-top:30px; box-shadow:var(--shadow); }
.tang-truong h2 { color:var(--navy); font-size:23px; line-height:1.3; }
.tang-truong h2 b { color:var(--acc); }
.tang-truong .lead { color:var(--muted); font-size:14.5px; line-height:1.65;
  max-width:760px; margin-top:8px; }
.tt-do-thi { display:block; width:100%; height:auto; max-width:760px; margin:18px auto 4px; }
.tt-o { display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:14px; margin-top:18px; }
.tt-o > div { background:var(--acc-soft); border-radius:var(--radius); padding:14px 16px; }
.tt-o b { display:block; color:var(--navy); font-size:14.5px; margin-bottom:4px; }
.tt-o span { font-size:13px; color:var(--text); line-height:1.55; }

/* =====================================================================
   KHUNG MÀN THI cho ô xem trước của thẻ ĐỀ ĐẦY ĐỦ (SAT.oXem có cờ manHinh).
   Nội dung bên trong vẫn là .de-xem cũ; khung này chỉ thêm thanh trên có
   đồng hồ + nhãn module, và hàng A/B/C/D ở đáy. Ba thứ đó là cái người ta
   nhận ra ngay là màn Bluebook, mà lại rẻ — không thêm ảnh, không thêm request.
   KHÔNG dùng cho kho đề lẻ: đề lẻ không có đồng hồ và không chia module.
   ===================================================================== */
.de-man { border-bottom:1px solid var(--line); background:#fff; }
.dm-top { display:flex; align-items:center; gap:8px; padding:5px 10px;
  border-bottom:1px solid var(--line); background:#fff; }
.dm-gio { font-size:12px; font-weight:800; color:#111827; font-variant-numeric:tabular-nums; }
.dm-nhan { font-size:10.5px; color:var(--muted); font-weight:600; margin-left:auto;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* Ô nội dung thấp hơn 126px cũ để chừa chỗ cho hai thanh, tổng chiều cao thẻ
   giữ nguyên — nếu không thì lưới đề trên trang chủ tụt hàng. */
.de-man .de-xem { height:104px; border-bottom:0; }
.de-man .de-xem.hinh svg { max-height:88px; }
.dm-day { display:flex; align-items:center; gap:6px; padding:6px 10px;
  border-top:1px solid var(--line); background:#FAFBFD; }
.dm-day i { width:17px; height:17px; border:1.5px solid var(--line-2); border-radius:50%;
  font-style:normal; font-size:9.5px; font-weight:800; color:var(--muted);
  display:flex; align-items:center; justify-content:center; }
.dm-day i:first-child { border-color:#2563EB; background:#2563EB; color:#fff; }
.dm-next { margin-left:auto; background:#2563EB; color:#fff; border-radius:999px;
  font-size:10px; font-weight:800; padding:2px 11px; }

/* =====================================================================
   BẢNG XẾP HẠNG THEO NGÀY (SAT.veBXH) — /giai-de, /verbal, /math.
   Cố ý gọn và nhạt màu: đây là thứ đứng CẠNH khu học chứ không phải thứ
   người ta vào để xem. To hơn kho đề là đảo mất trọng tâm của trang.
   ===================================================================== */
.bxh { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:18px 20px 16px; margin-top:30px; box-shadow:var(--shadow); }
.bxh-dau { display:flex; align-items:baseline; gap:12px; flex-wrap:wrap; }
.bxh-dau h3 { color:var(--navy); font-size:17px; }
.bxh-phu { font-size:12.5px; color:var(--muted); }
.bxh-tai, .bxh-trong { font-size:13.5px; color:var(--muted); padding:14px 0 4px; }
/* Bảng hẹp hơn màn hình thì cuộn ngang TRONG khối, không đẩy cả trang trượt. */
.bxh-cuon { overflow-x:auto; margin-top:12px; }
.bxh-bang { width:100%; border-collapse:collapse; font-size:13.5px; min-width:520px; }
.bxh-bang th { text-align:left; font-size:11.5px; font-weight:800; letter-spacing:.4px;
  text-transform:uppercase; color:var(--muted); padding:0 10px 7px; border-bottom:1px solid var(--line); }
.bxh-bang th:not(:nth-child(2)):not(:first-child) { text-align:right; }
.bxh-bang td { padding:8px 10px; border-bottom:1px solid var(--line); color:var(--text); }
.bxh-bang td.s { text-align:right; font-variant-numeric:tabular-nums; }
.bxh-bang td.h { width:38px; font-weight:800; color:var(--muted); font-size:15px;
  font-variant-numeric:tabular-nums; }
/* Ba hạng đầu: trước đây là huy chương 🥇🥈🥉 — emoji màu, mỗi máy render một
   kiểu và lệch hẳn tông với bảng. Nay vẫn là số hạng như mọi dòng, chỉ đậm và
   đổi sang màu nhấn để mắt bắt được ngay ba dòng đầu. */
.bxh-bang td.h.top3 { color:var(--acc); font-size:16px; }
.bxh-bang tr:last-child td { border-bottom:0; }
.bxh-bang tr.toi td { background:var(--acc-soft); }
.bxh-bang tr.toi td:first-child { border-left:3px solid var(--acc); padding-left:7px; }
.bxh-ban { font-size:10.5px; font-weight:800; letter-spacing:.3px; text-transform:uppercase;
  color:#fff; background:var(--acc); border-radius:999px; padding:1px 7px; margin-left:5px; }
.bxh-toi { font-size:13px; color:var(--text); margin-top:11px; }
.bxh-toi b { color:var(--acc); }
.bxh-nhac { font-size:12.5px; color:var(--warn); background:var(--warnbg);
  border-radius:4px; padding:8px 12px; margin-top:12px; }

/* Bánh răng SVG của nút Quản trị (sat-app.js). Dùng SVG một màu thay emoji 🔧
   để nút ăn theo màu chữ của nút và không đổi hình giữa các máy. Trên điện
   thoại .nhan-adm ẩn đi, còn lại đúng cái bánh răng — xem @media ở trên. */
.ico-adm { vertical-align:-3px; }

/* ==========================================================================
   KHOÁ HỌC (26/8/2026) — mục lục /khoa-hoc và trang bài học /bai-hoc
   78 bài dựng từ giáo trình LaTeX, xem sat8020/_build_khoahoc.py.

   Hai nguyên tắc chi phối cả khối này:
   ① Trang bài học là trang ĐỌC DÀI (5–24 KB chữ mỗi bài), nên nó hẹp hơn phần
     còn lại của khu SAT — dòng dài quá 90 ký tự thì mắt nhảy dòng sai, và đây là
     chỗ duy nhất người ta ngồi đọc mười phút liền.
   ② Các hộp lý thuyết giữ ĐÚNG bốn vai của sách in: khái niệm · ví dụ mẫu ·
     giải thích tiếng Việt · lỗi thường gặp. Đổi màu thì đổi cả bốn cùng lúc,
     đừng để hai hộp cùng một màu — người đọc phân biệt vai bằng màu trước khi
     kịp đọc nhãn.
   ========================================================================== */
.kh-phan-mota { color:var(--muted); font-size:14.5px; max-width:760px; margin:14px 0 4px; }

.kh-tiendo { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin:14px 0 6px;
  background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:11px 14px; }
.kh-td-thanh { flex:1 1 200px; height:8px; background:#EEF2F7; border-radius:999px; overflow:hidden; }
.kh-td-thanh i { display:block; height:100%; background:var(--acc-lite); border-radius:999px; }
.kh-td-chu { font-size:13px; color:var(--muted); }
.kh-td-chu b { color:var(--navy); }

.kh-chuong { margin-top:30px; }
.kh-ch-ten { display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  color:var(--navy); font-size:19px; line-height:1.3; }
.kh-ch-ma { font-size:12px; font-weight:800; letter-spacing:.6px; color:#fff;
  background:var(--navy); border-radius:3px; padding:3px 8px; }
.kh-ch-so { font-size:12px; font-weight:700; color:var(--muted); }
.kh-ch-mota { color:var(--muted); font-size:13.5px; margin:6px 0 12px; max-width:760px; }

.kh-ds { list-style:none; display:grid; gap:8px; }
.kh-bai { display:flex; align-items:center; gap:13px; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:12px 15px; text-decoration:none; color:var(--text);
  transition:border-color .15s, box-shadow .15s; }
.kh-bai:hover { border-color:var(--acc); box-shadow:var(--shadow); }
.kh-so { flex:none; width:28px; height:28px; display:flex; align-items:center; justify-content:center;
  border-radius:999px; background:var(--acc-soft); color:var(--acc); font-size:13px; font-weight:800; }
.kh-than { display:flex; flex-direction:column; gap:1px; min-width:0; flex:1; }
.kh-ten { font-size:15px; font-weight:700; color:var(--navy); line-height:1.35; }
.kh-ten-vi { font-size:13.5px; color:var(--text); line-height:1.4; }
.kh-meta { font-size:12.5px; color:var(--muted); }
.kh-diem { color:var(--ok); }
.kh-xong { flex:none; width:24px; height:24px; display:flex; align-items:center; justify-content:center;
  border-radius:999px; background:var(--okbg); color:var(--ok); font-weight:800; font-size:13px; }

/* ===== Trang bài học ===== */
.kh-doc { max-width:820px; }
.kh-duong { display:flex; align-items:center; gap:7px; flex-wrap:wrap; font-size:12.5px;
  color:var(--muted); margin-bottom:12px; }
.kh-duong a { color:var(--muted); text-decoration:none; }
.kh-duong a:hover { color:var(--acc); text-decoration:underline; }
.kh-duong b { color:var(--navy); }

.lt-muc-tieu { background:var(--acc-soft); border-left:3px solid var(--acc); border-radius:4px;
  padding:12px 16px; margin:18px 0 6px; font-size:14.5px; line-height:1.6; }

.lt-than { font-size:16px; line-height:1.75; margin-top:20px; }
.lt-than p { margin:13px 0; }
.lt-than h2 { color:var(--navy); font-size:21px; line-height:1.3; margin:32px 0 6px;
  padding-top:16px; border-top:1px solid var(--line); }
.lt-than h3 { color:var(--navy); font-size:17px; margin:22px 0 4px; }
.lt-than ul, .lt-than ol { margin:12px 0 12px 22px; }
.lt-than li { margin:6px 0; }
.lt-than u { text-decoration:underline; text-underline-offset:3px; }
.lt-than code { background:#F1F5F9; border:1px solid var(--line); border-radius:3px;
  padding:1px 5px; font-size:.92em; font-family:"SF Mono",Menlo,Consolas,monospace; }
.lt-giua { text-align:center; }
.lt-giua > table, .lt-giua .lt-bang-cuon { margin-left:auto; margin-right:auto; text-align:left; }

/* Bốn hộp của sách in. Nhãn nằm trong .lt-nhan, dựng bởi _build_khoahoc.py. */
.lt-nhan { font-size:11px; font-weight:800; letter-spacing:.8px; text-transform:uppercase;
  margin-bottom:5px; }
.lt-key, .lt-concept, .lt-vd, .lt-vn, .lt-bay { border-radius:5px; padding:13px 16px; margin:18px 0;
  font-size:15px; line-height:1.65; }
.lt-key   { background:#F1F5FA; border-left:3px solid var(--navy); }
.lt-concept { background:#EEF2F8; border-left:3px solid var(--navy); }
.lt-concept .lt-nhan { color:var(--navy); }
.lt-vd    { background:#fff; border:1px solid var(--navy); }
.lt-vd .lt-nhan { color:var(--navy); }
.lt-vn    { background:var(--acc-soft); border-left:3px solid var(--acc-lite); }
.lt-vn .lt-nhan { color:var(--acc); }
.lt-bay   { background:var(--warnbg); border-left:3px solid var(--warn); }
.lt-bay .lt-nhan { color:var(--warn); }
.lt-key p:first-child, .lt-concept p:first-child, .lt-vd p:first-child,
.lt-vn p:first-child, .lt-bay p:first-child { margin-top:0; }
.lt-key p:last-child, .lt-concept p:last-child, .lt-vd p:last-child,
.lt-vn p:last-child, .lt-bay p:last-child { margin-bottom:0; }

/* Đoạn văn đề Đọc–Viết trong ví dụ mẫu (lệnh \passage của giáo trình) */
.lt-doan-de { background:#FBFCFE; border:1px solid var(--line); border-radius:4px;
  padding:12px 15px; margin:12px 0; font-size:14.5px; line-height:1.7; font-style:italic; }
.lt-muctieu { font-style:italic; color:var(--navy); margin:10px 0; }

/* Bảng số liệu. Bọc trong khung cuộn riêng — bảng 5 cột trên điện thoại mà không
   có khung này thì đẩy lệch cả trang, đúng bẫy đã gặp ở bảng xếp hạng. */
.lt-bang-cuon { overflow-x:auto; margin:16px 0; }
.lt-bang { border-collapse:collapse; font-size:14px; min-width:min(100%,420px); background:#fff; }
.lt-bang th, .lt-bang td { border:1px solid var(--line); padding:7px 12px; text-align:left;
  vertical-align:top; }
.lt-bang th { background:#F1F5FA; color:var(--navy); font-weight:800; }

/* Hình dựng lại từ TikZ (_tikz2svg.py) và 4 biểu đồ vẽ tay (_hinh_bieudo.py) */
.lt-hinh { margin:18px 0; text-align:center; }
.lt-hinh svg { max-width:100%; height:auto; }

/* Công thức dài (hệ phương trình, hằng đẳng thức xếp cột) tràn ngang trên điện
   thoại — cho cuộn trong khung của nó thay vì đẩy cả trang. */
.lt-than .katex-display { overflow-x:auto; overflow-y:hidden; padding:2px 0; }

/* ===== Khối bài tập cuối bài học ===== */
.kh-lam { background:#fff; border:1px solid var(--acc); border-radius:var(--radius);
  padding:20px 22px; margin:34px 0 0; }
.kh-lam h2 { color:var(--navy); font-size:19px; margin-bottom:6px; }
.kh-lam p { font-size:14.5px; color:var(--text); }
.kh-tang { display:inline-flex; gap:6px; flex-wrap:wrap; margin-top:10px; }
.kh-tang i { font-style:normal; font-size:11.5px; font-weight:800; letter-spacing:.2px;
  border-radius:3px; padding:3px 9px; }
.kh-tang .n  { background:#F1F5FA; color:var(--muted); }
.kh-tang .k  { background:var(--acc-soft); color:var(--acc); }
.kh-tang .rk { background:var(--warnbg); color:var(--warn); }
.kh-nut { display:flex; gap:10px; flex-wrap:wrap; margin-top:15px; }
.kh-nut .btn { padding:11px 20px; }
#khXong.kh-da-xong { border-color:#0E9F6E; color:#065F46; background:var(--okbg); }
.kh-kq { font-size:13px; color:var(--muted); margin-top:11px; }

.kh-tiep { display:flex; justify-content:space-between; gap:12px; margin-top:22px; }
.kh-tiep a { display:flex; flex-direction:column; gap:2px; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:11px 16px; text-decoration:none; color:var(--muted);
  font-size:12.5px; max-width:48%; }
.kh-tiep a:hover { border-color:var(--acc); }
.kh-tiep a b { color:var(--navy); font-size:14px; }
.kh-tiep .kh-sa { text-align:right; }

@media (max-width:560px) {
  .lt-than { font-size:15.5px; }
  .kh-bai { align-items:flex-start; }
  .kh-lam { padding:16px; }
}

/* Bốn phương án của một câu ví dụ trong bài học — phải là (A)(B)(C)(D), không
   phải 1·2·3·4: lời giải ngay dưới nó viết "Answer (C)". Dựng bằng counter thay
   vì ghi chữ cái vào dữ liệu, để thêm/bớt phương án không phải sửa nội dung. */
.lt-chon { list-style:none; counter-reset:pa; margin:12px 0 12px 2px; }
.lt-chon li { counter-increment:pa; position:relative; padding-left:36px; margin:6px 0; }
.lt-chon li::before { content:"(" counter(pa, upper-alpha) ")"; position:absolute; left:0;
  font-weight:800; color:var(--navy); }

/* ==========================================================================
   TẦNG TỰ HỌC (26/8/2026) — sat8020-giao-trinh/tu-hoc/<MÃ>.md

   Roger bỏ hướng video, nên phần thầy đáng lẽ giảng phải nằm trên trang. Sáu khối
   tiếng Việt xếp quanh bản lý thuyết tiếng Anh có sẵn. Nguyên tắc phối màu: khối
   nào là VIỆC PHẢI LÀM thì có viền nhấn, khối nào là ĐỌC THÊM thì phẳng — người
   tự học cuộn qua một trang dài, phải phân biệt được bằng mắt trước khi đọc chữ.
   ========================================================================== */
.th-o { margin:26px 0; font-size:16px; line-height:1.75; }
.th-o p { margin:12px 0; }
.th-o ul { margin:10px 0 10px 22px; }
.th-o li { margin:5px 0; }
.th-nhan { color:var(--navy); font-size:20px; line-height:1.3; margin-bottom:8px;
  padding-top:18px; border-top:1px solid var(--line); }
.th-muc { color:var(--navy); font-size:17px; margin:22px 0 2px; }
.th-lien { color:var(--acc); font-weight:600; }

/* Vào bài — câu chuyện dẫn nhập, đọc trước khi vào lý thuyết */
.th-vao { background:#F8FAFD; border:1px solid var(--line); border-radius:var(--radius);
  padding:16px 18px; font-size:15.5px; }
.th-vao .th-nhan { border-top:0; padding-top:0; font-size:16px; }
.th-vao p:last-child { margin-bottom:0; }

/* Cần biết trước — danh sách móc sang bài khác */
.th-truoc { background:#fff; border-left:3px solid var(--acc-lite); border-radius:4px;
  padding:13px 16px; font-size:15px; }
.th-truoc .th-nhan { border-top:0; padding-top:0; font-size:15px;
  text-transform:uppercase; letter-spacing:.6px; color:var(--acc); }
.th-truoc ul { margin:6px 0 0 20px; }

/* Ba chỗ mất điểm */
.th-sai .th-muc { color:var(--warn); font-size:15.5px; }
.th-sai { background:var(--warnbg); border-radius:5px; padding:14px 18px; }
.th-sai .th-nhan { border-top:0; padding-top:0; color:var(--warn); font-size:17px; }
.th-sai p:last-child { margin-bottom:0; }

/* Tự kiểm tra */
.th-cau { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:15px 17px; margin:12px 0; }
.th-so { font-size:11px; font-weight:800; letter-spacing:.8px; text-transform:uppercase;
  color:var(--acc); margin-bottom:5px; }
.th-de { font-size:15.5px; line-height:1.7; }
.th-pa { list-style:none; counter-reset:tp; margin:10px 0 0; }
.th-pa li { counter-increment:tp; position:relative; padding-left:34px; margin:5px 0;
  font-size:15px; }
.th-pa li::before { content:"(" counter(tp, upper-alpha) ")"; position:absolute; left:0;
  font-weight:800; color:var(--navy); }
/* Ô đúng KHÔNG được tô sẵn: cả điểm của phần này là người học tự chọn rồi mới mở
   lời chữa. Chỉ đánh dấu trong DOM để lời chữa nói đúng chữ cái. */
.th-pa li.dung { }
.th-chua { margin-top:11px; border-top:1px dashed var(--line-2); padding-top:9px; }
.th-chua summary { cursor:pointer; font-size:13.5px; font-weight:700; color:var(--acc);
  list-style:none; }
.th-chua summary::-webkit-details-marker { display:none; }
.th-chua summary::after { content:" ↓"; }
.th-chua[open] summary::after { content:" ↑"; }
.th-nhan-dap { display:inline-block; font-size:12px; font-weight:800; letter-spacing:.4px;
  background:var(--okbg); color:var(--ok); border-radius:3px; padding:3px 10px; margin:9px 0 2px; }
.th-chua p { font-size:15px; margin:9px 0; }

/* Tóm tắt bỏ túi — thứ đọc lại trước khi thi */
.th-tom { background:var(--acc-soft); border-radius:5px; padding:15px 18px; }
.th-tom .th-nhan { border-top:0; padding-top:0; color:var(--acc); font-size:17px; }
.th-tom ul { margin:6px 0 0 20px; }
.th-tom li { margin:7px 0; font-size:15.5px; }

/* Nhãn dẫn vào bản tiếng Anh */
.th-nhan-en span { display:block; font-size:13.5px; font-weight:400; color:var(--muted);
  margin-top:3px; line-height:1.55; }

@media (max-width:560px) {
  .th-o { font-size:15.5px; }
  .th-vao, .th-sai, .th-tom { padding:13px 15px; }
}

/* Bảng thuật ngữ Anh–Việt, đứng TRƯỚC thân bài tiếng Anh. Người học cầm sẵn nghĩa rồi
   mới đọc — nếu không thì mỗi từ lạ là một lần dừng lại tra, và đọc một mạch mới là
   thứ phần Đọc–Viết đòi hỏi. */
.tv-cuon { overflow-x:auto; }
.tv-bang { border-collapse:collapse; width:100%; font-size:14.5px; background:#fff;
  min-width:min(100%,520px); }
.tv-bang th, .tv-bang td { border:1px solid var(--line); padding:8px 12px; text-align:left;
  vertical-align:top; }
.tv-bang th { background:#F1F5FA; color:var(--navy); font-weight:800; font-size:12px;
  letter-spacing:.4px; text-transform:uppercase; }
.tv-bang .tv-en { font-weight:700; color:var(--navy); white-space:nowrap; }
.tv-bang .tv-vi { color:var(--text); }
.tv-bang .tv-gt { color:var(--muted); font-size:13.5px; }
.th-tv .th-nhan { border-top:0; padding-top:0; font-size:17px; }

/* ===================================================================
   KHU NGOẠI NGỮ — phần riêng, không có trong hệ thiết kế của khu SAT
   =================================================================== */

/* --- Dải chọn dạng bài + lọc độ khó --- */
.kho-tabs { display:flex; flex-wrap:wrap; gap:8px; margin:18px 0 10px; }
.kho-tabs a { text-decoration:none; font-size:13.5px; font-weight:700; color:var(--text);
  background:#fff; border:1px solid var(--line-2); border-radius:4px; padding:8px 13px; }
.kho-tabs a.on { background:var(--navy); border-color:var(--navy); color:#fff; }
.kho-tabs a:hover:not(.on) { border-color:var(--acc); }
.kho-tabs a .n { font-size:11.5px; color:var(--muted); font-weight:700; margin-left:4px; }
.kho-tabs a.on .n { color:#CBD5E1; }
.kho-loc { display:flex; flex-wrap:wrap; align-items:center; gap:7px; margin-bottom:6px; }
.kho-loc .loc-nhan { font-size:12px; font-weight:800; letter-spacing:.6px;
  text-transform:uppercase; color:var(--muted); margin-right:3px; }
.kho-loc a { text-decoration:none; font-size:12.5px; font-weight:700; color:var(--muted);
  border:1px solid var(--line); border-radius:99px; padding:4px 11px; background:#fff; }
.kho-loc a.on { color:var(--acc); border-color:var(--acc); background:var(--acc-soft); }

/* Tem độ khó — năm bậc, đi từ xám sang đỏ. Chỉ dùng MÀU VIỀN + CHỮ, không tô
   nền đặc: mỗi thẻ đề đã có một tem rồi, tô đặc cả lưới là rối mắt. */
.pill.kho.d1 { border-color:#94A3B8; color:#475569; }
.pill.kho.d2 { border-color:#0E9F6E; color:#047857; }
.pill.kho.d3 { border-color:var(--acc); color:var(--acc); }
.pill.kho.d4 { border-color:#D97706; color:#B45309; }
.pill.kho.d5 { border-color:#DC2626; color:#B91C1C; }

/* --- Lưới thẻ đề --- */
.de-list { display:grid; gap:12px; margin-top:12px;
  grid-template-columns:repeat(auto-fill,minmax(268px,1fr)); }
.de-item { display:flex; flex-direction:column; gap:9px; background:#fff;
  border:1px solid var(--line); border-radius:var(--radius); padding:14px 15px;
  text-decoration:none; color:var(--text); transition:border-color .12s, transform .12s; }
.de-item:hover { border-color:var(--acc); transform:translateY(-2px); }
.de-dau { display:flex; gap:6px; flex-wrap:wrap; }
.de-than { font-size:13.5px; line-height:1.55; flex:1; }
.de-chan { display:flex; justify-content:space-between; gap:8px; font-size:12px;
  color:var(--muted); border-top:1px solid var(--line); padding-top:8px; }

/* --- Màn mở của một đề --- */
.de-mo-nhan { display:flex; gap:7px; margin-bottom:9px; }
.de-mo h1 { font-size:24px; color:var(--navy); }
.de-mo-luoi { display:grid; gap:16px; margin:20px 0;
  grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); }
.luat-thi { margin:0; padding-left:20px; font-size:14px; line-height:1.75; }
.tu-vung { margin:10px 0 0; padding-left:18px; font-size:14px; line-height:1.7; }
.de-mo-nut { display:flex; flex-wrap:wrap; gap:10px; margin-top:18px; }
.luot-con { font-size:13.5px; }
.ghi-chu { font-size:12.5px; color:var(--muted); line-height:1.6; margin-top:16px;
  border-left:3px solid var(--line-2); padding-left:12px; }

/* --- Phòng làm bài --- */
/* ===================================================================
   PHÒNG THI — dựng theo màn hình thi thật: dải trên xám nhạt có tên phần
   bên trái và đồng hồ bên phải, vùng làm bài trắng ở giữa, dải dưới có
   nút đi tiếp nằm SÁT PHẢI. Học viên quen tay ở đâu thì vào phòng thi
   tay vẫn ở đó.
   =================================================================== */
.de-lam { background:#fff; border:1px solid var(--line-2); border-radius:var(--radius);
  overflow:hidden; margin-top:18px; box-shadow:0 1px 3px rgba(16,24,40,.07); }
.de-thanh { display:flex; align-items:center; justify-content:space-between; gap:12px;
  background:#EDF1F6; color:var(--navy); border-bottom:1px solid var(--line-2);
  padding:11px 18px; }
.de-thanh-ten { font-weight:800; font-size:14px; letter-spacing:.2px; }
/* Đồng hồ có nhãn như màn thi thật — con số trần không nói nó đang đếm cái gì */
.dong-ho { font-variant-numeric:tabular-nums; font-weight:800; font-size:18px;
  background:#fff; color:var(--navy); border:1px solid var(--line-2); border-radius:4px;
  padding:4px 12px; min-width:66px; text-align:center; }
/* Năm giây cuối đổi đỏ và nhấp — hết giờ là TỰ NỘP, phải báo trước cho người làm */
.dong-ho.gap { background:#DC2626; color:#fff; border-color:#DC2626;
  animation:nhap 1s steps(2,end) infinite; }
@keyframes nhap { 50% { opacity:.45; } }
.de-noi { padding:22px 24px; }
.de-van { font-size:16.5px; line-height:1.85; white-space:normal; }
.de-hinh { border:1px solid var(--line); border-radius:var(--radius); padding:10px; background:#fff; }
.de-hinh svg { display:block; width:100%; height:auto; }
.de-hinh-ghi { font-size:12.5px; margin-top:8px; }

.de-nghe { text-align:center; padding:26px 0; }
.de-nghe p { font-size:15px; margin-top:14px; }
.song { display:flex; align-items:flex-end; justify-content:center; gap:5px; height:44px; }
.song span { width:6px; background:var(--acc-lite); border-radius:3px;
  animation:song 1s ease-in-out infinite; }
.song span:nth-child(1){height:14px;animation-delay:0s}
.song span:nth-child(2){height:30px;animation-delay:.15s}
.song span:nth-child(3){height:44px;animation-delay:.3s}
.song span:nth-child(4){height:26px;animation-delay:.45s}
.song span:nth-child(5){height:16px;animation-delay:.6s}
@keyframes song { 0%,100%{transform:scaleY(.4)} 50%{transform:scaleY(1)} }
/* Dải nghe gọn nằm TRÊN câu hỏi — băng chạy đồng thời với đề (5/9/2026).
   Sóng đứng im + mờ khi băng chưa chạy / đã hết; .chay thì sóng nhấp. */
.de-dai-nghe { display:flex; align-items:center; gap:12px; margin-bottom:16px;
  padding:10px 14px; background:var(--acc-soft); border:1px solid var(--line-2);
  border-radius:var(--radius); font-weight:700; font-size:14px; color:var(--navy); }
.de-dai-nghe .song.nho { height:22px; gap:3px; flex:none; }
.de-dai-nghe .song.nho span { width:4px; opacity:.4; animation-play-state:paused; }
.de-dai-nghe.chay .song.nho span { opacity:1; animation-play-state:running; }
.song.nho span:nth-child(1){height:8px} .song.nho span:nth-child(2){height:15px}
.song.nho span:nth-child(3){height:22px} .song.nho span:nth-child(4){height:13px}
.song.nho span:nth-child(5){height:9px}

.de-ghi { display:flex; align-items:center; gap:10px; margin:18px 0 14px;
  font-weight:700; color:#B91C1C; }
.cham-do { width:12px; height:12px; border-radius:50%; background:#DC2626;
  animation:nhap 1s steps(2,end) infinite; flex:none; }
.de-nhap { width:100%; margin-top:16px; padding:13px 14px; font-size:15.5px; line-height:1.7;
  font-family:inherit; border:1px solid var(--line-2); border-radius:var(--radius); resize:vertical; }
.de-nhap:focus { outline:2px solid var(--acc); outline-offset:-1px; border-color:var(--acc); }
.de-chon { display:grid; gap:9px; margin-top:16px; }
.de-chon label { display:flex; gap:10px; align-items:flex-start; font-size:15px; line-height:1.6;
  border:1px solid var(--line-2); border-radius:var(--radius); padding:11px 14px; cursor:pointer; }
.de-chon label:hover { border-color:var(--acc); background:var(--acc-soft); }
.de-cho { text-align:center; padding:70px 20px; }
.de-cho h2 { font-size:19px; color:var(--navy); margin-top:18px; }
.quay { width:38px; height:38px; margin:0 auto; border-radius:50%;
  border:3px solid var(--acc-soft); border-top-color:var(--acc); animation:quay .9s linear infinite; }
@keyframes quay { to { transform:rotate(360deg); } }

/* --- Thẻ điểm --- */
.the-diem { display:flex; flex-wrap:wrap; gap:24px; align-items:center; background:#fff;
  border:1px solid var(--line); border-left:5px solid var(--acc);
  border-radius:var(--radius); padding:24px 26px; margin-top:18px; }
.the-so { display:flex; flex-direction:column; align-items:flex-start; min-width:150px; }
.the-so .nhan { font-size:11.5px; font-weight:800; letter-spacing:1px;
  text-transform:uppercase; color:var(--muted); }
.the-so .so { font-size:56px; font-weight:800; color:var(--acc); line-height:1.05; }
.the-so .tren { font-size:13px; color:var(--muted); }
.the-thanh { width:100%; height:7px; background:var(--acc-soft); border-radius:4px; margin-top:10px; }
.the-thanh i { display:block; height:100%; background:var(--acc-lite); border-radius:4px; }
.the-chu { flex:1; min-width:250px; }
.the-chu h1 { font-size:20px; color:var(--navy); margin-bottom:7px; }
.the-chu p { font-size:14.5px; line-height:1.7; }

.tc-luoi { display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(280px,1fr)); }
.tc { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:15px 16px; }
.tc-dau { display:flex; justify-content:space-between; font-size:14.5px; color:var(--navy); }
.tc-thanh { height:6px; background:#EEF2F7; border-radius:3px; margin:9px 0 10px; }
.tc-thanh i { display:block; height:100%; background:var(--acc); border-radius:3px; }
.tc p { font-size:13.5px; line-height:1.65; }
.tc .pill { margin-top:8px; }

.tr { background:#F7F9FC; border:1px solid var(--line); border-radius:var(--radius);
  padding:13px 15px; font-family:inherit; font-size:14.5px; line-height:1.75; white-space:pre-wrap; }
.bang-sai { width:100%; border-collapse:collapse; font-size:14px; margin-top:6px; }
.bang-sai th, .bang-sai td { border-bottom:1px solid var(--line); padding:7px 9px; text-align:left; }
.bang-sai th { font-size:12px; text-transform:uppercase; letter-spacing:.5px; color:var(--muted); }
.sua { border-left:3px solid var(--line-2); padding-left:12px; margin:12px 0; }
.sua .sai { color:#B91C1C; text-decoration:line-through; font-size:14.5px; }
.sua .dung { color:#047857; font-weight:700; font-size:14.5px; margin-top:3px; }

.help { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:18px 20px; font-size:14.5px; color:var(--muted); margin-top:14px; }

@media (max-width:620px) {
  .de-noi { padding:18px 16px; }
  .the-so .so { font-size:44px; }
  .de-mo h1 { font-size:20px; }
}

/* --- Bài tập theo bậc --- */
.bt-ds { display:grid; gap:12px; margin-top:16px; }
.bt-cau { display:flex; gap:14px; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:16px 18px; }
.bt-so { flex:none; width:28px; height:28px; border-radius:50%; background:var(--acc-soft);
  color:var(--acc); font-weight:800; font-size:13px; display:flex; align-items:center;
  justify-content:center; }
.bt-than { flex:1; min-width:0; }
.bt-de { font-size:15.5px; line-height:1.75; }
.bt-nhap { width:100%; max-width:420px; margin-top:11px; padding:9px 12px; font-size:15px;
  font-family:inherit; border:1px solid var(--line-2); border-radius:var(--radius); }
.bt-nhap:focus { outline:2px solid var(--acc); outline-offset:-1px; border-color:var(--acc); }
.bt-nhap.dung { border-color:#0E9F6E; background:var(--okbg); }
.bt-nhap.sai { border-color:#DC2626; background:var(--errbg); }
.bt-kq { font-size:13.5px; margin-top:7px; }
.bt-kq.dung { color:var(--ok); font-weight:700; }
.bt-kq.sai { color:var(--err); }

/* --- Dải giới thiệu cho khách chưa đăng nhập --- */
.gt-dai { padding:6px 0 4px; }
.gt-dai h1 { font-size:27px; color:var(--navy); line-height:1.3; }
.gt-o { display:grid; gap:14px; margin:22px 0 8px;
  grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); }
.gt-the { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:16px 17px; text-decoration:none; color:var(--text); display:block;
  transition:border-color .12s, transform .12s; }
.gt-the:hover { border-color:var(--acc); transform:translateY(-2px); }
.gt-the b { color:var(--navy); font-size:15.5px; display:block; }
.gt-the span { font-size:12px; color:var(--acc); font-weight:800; }
.gt-the p { font-size:13px; color:var(--muted); line-height:1.6; margin-top:7px; }

/* --- Khối mô-đun trên trang lộ trình (khu có K.nhanh) ------------------------
   Teil/Aufgabe/Part là TASK nằm TRONG một mô-đun, không phải kỳ thi con — nên
   mỗi mô-đun bày như MỘT BÀI THI: hàng chip số liệu, dải Teil nối nhau kiểu
   stepper theo đúng thứ tự làm bài, rồi mới tới thẻ luyện từng dạng. */
.gt-cta { display:flex; gap:10px; flex-wrap:wrap; margin:16px 0 2px; }
.md-khoi { margin:30px 0 4px; }
.md-dau { display:flex; align-items:baseline; gap:8px 14px; flex-wrap:wrap; }
.md-dau .sec-title { margin:0; }
.md-chip-day { display:inline-flex; gap:6px; flex-wrap:wrap; }
.md-chip { font-size:11.5px; font-weight:800; color:var(--acc); background:var(--acc-soft);
  border-radius:999px; padding:3px 10px; white-space:nowrap; }
.md-mo { font-size:14px; max-width:70ch; margin-top:7px; }
.md-teil { display:flex; align-items:stretch; margin:14px 0 0; overflow-x:auto;
  padding-bottom:3px; }
.md-teil-o { flex:1 1 0; min-width:104px; text-align:center; padding:9px 10px;
  border:1px solid var(--line); background:#fff; text-decoration:none; }
.md-teil-o + .md-teil-o { border-left:0; }
.md-teil-o:first-child { border-radius:10px 0 0 10px; }
.md-teil-o:last-child { border-radius:0 10px 10px 0; }
.md-teil-o i { display:block; font-style:normal; font-size:10.5px; font-weight:900;
  letter-spacing:.4px; text-transform:uppercase; color:var(--acc); }
.md-teil-o b { display:block; font-size:12.5px; color:var(--navy); line-height:1.35;
  max-width:18ch; margin:0 auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.md-teil-o span { font-size:11px; color:var(--muted); }
.md-teil-o:hover { background:var(--acc-soft); border-color:var(--acc); }
.gt-the .gt-tem { display:flex; justify-content:space-between; align-items:center;
  gap:8px; margin-bottom:7px; }
.gt-the .gt-tem i { font-style:normal; font-size:10.5px; font-weight:900;
  letter-spacing:.4px; text-transform:uppercase; color:var(--acc);
  background:var(--acc-soft); border-radius:6px; padding:2px 8px; }
.gt-the .gt-tem u { text-decoration:none; }
.gt-the .gt-meta { display:block; font-size:11.5px; font-weight:400;
  color:var(--muted); margin-top:2px; }
.md-thi { margin:12px 0 0; }

/* --- Bảng điều khiển --- */
.lt-hero { display:flex; flex-wrap:wrap; gap:20px; align-items:center; justify-content:space-between;
  background:#fff; border:1px solid var(--line); border-left:5px solid var(--acc);
  border-radius:var(--radius); padding:20px 22px; margin:16px 0 6px; }
.lt-hero h2 { font-size:18px; color:var(--navy); margin-bottom:5px; }
.lt-hero .noi-dung { flex:1; min-width:260px; }
.stat-grid { display:grid; gap:14px; margin-top:12px;
  grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); }
.stat { background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:15px 16px; }
.stat-so { display:block; font-size:27px; font-weight:800; color:var(--acc); line-height:1.2; }
.stat-ten { font-size:12.5px; color:var(--muted); }
.dang-hang { display:block; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:13px 16px; margin-top:10px; text-decoration:none; color:var(--text); }
.dang-hang:hover { border-color:var(--acc); }
.dang-ten { display:flex; justify-content:space-between; gap:10px; flex-wrap:wrap; font-size:14px; }
.dang-ten b { color:var(--navy); }
.dang-ten span { font-size:12.5px; color:var(--muted); }
.dang-thanh { height:6px; background:#EEF2F7; border-radius:3px; margin-top:9px; }
.dang-thanh i { display:block; height:100%; background:var(--acc-lite); border-radius:3px; }
.bang-ls { width:100%; border-collapse:collapse; font-size:14px; background:#fff;
  border:1px solid var(--line); border-radius:var(--radius); margin-top:10px; }
.bang-ls th, .bang-ls td { border-bottom:1px solid var(--line); padding:10px 13px; text-align:left; }
.bang-ls th { font-size:11.5px; text-transform:uppercase; letter-spacing:.6px; color:var(--muted); }
.bang-ls tr:last-child td { border-bottom:0; }
.sec-title { font-size:17px; color:var(--navy); margin:26px 0 4px; }
.gia-the .gia { font-size:31px; font-weight:800; color:var(--acc); margin:6px 0 4px; }
.gia-the .gia span { font-size:14px; font-weight:600; color:var(--muted); }
.gia-the .btn { margin-top:12px; }
.de-thumb { border:1px solid var(--line); border-radius:4px; overflow:hidden; background:#fff; }
.de-thumb svg { display:block; width:100%; height:auto; }
.bt-goi { font-size:13px; color:var(--muted); margin-top:6px; }
.bt-tu-cham { font-size:12.5px; margin-top:9px; }
.bt-nghe { margin-top:10px; padding:7px 14px; font-size:13px; }
.cho-trong { display:inline-block; min-width:76px; border-bottom:2px solid var(--acc);
  color:transparent; }
.bt-doi { margin-top:7px; font-size:14.5px; line-height:1.8; color:var(--text); }
.w-dung { color:var(--ok); }
.w-sai { color:var(--err); background:var(--errbg); border-radius:3px; padding:0 3px;
  text-decoration:underline; text-decoration-style:wavy; }

/* --- Kho đề: 20 dạng gom theo kỹ năng --- */
.kho-nhom { display:flex; flex-wrap:wrap; align-items:center; gap:7px; width:100%; margin-bottom:8px; }
.kho-nhom-ten { font-size:11px; font-weight:800; letter-spacing:.9px; text-transform:uppercase;
  color:var(--muted); min-width:38px; }
.kho-nhom a { text-decoration:none; font-size:12.5px; font-weight:700; color:var(--text);
  background:#fff; border:1px solid var(--line-2); border-radius:4px; padding:6px 10px; }
.kho-nhom a.on { background:var(--navy); border-color:var(--navy); color:#fff; }
.kho-nhom a:hover:not(.on) { border-color:var(--acc); }
.kho-nhom a .n { font-size:11px; color:var(--muted); font-weight:700; margin-left:3px; }
/* Trọng số điểm của dạng bài (PTE: 4% · 15% · <1%…). Đặt TRƯỚC số đề và tô khác
   màu, vì hai con số cạnh nhau cùng kiểu chữ thì người đọc gộp thành một. */
.kho-nhom a .ts { font-size:10.5px; font-weight:800; color:#B45309; background:#FEF3C7;
  border-radius:5px; padding:1px 4px; margin-left:4px; letter-spacing:.2px; }
.kho-nhom a.on .ts { color:#FDE68A; background:rgba(255,255,255,.14); }
.kho-nhom a.on .n { color:#CBD5E1; }
#khoTabs { display:block; }

/* --- Ô làm bài của các dạng tự soạn --- */
.de-yeu-cau { font-size:14.5px; color:var(--navy); font-weight:700; line-height:1.6;
  margin-bottom:14px; padding-bottom:12px; border-bottom:1px solid var(--line); }
.canh-bao { font-size:13.5px; color:var(--warn); background:var(--warnbg);
  border-radius:var(--radius); padding:9px 13px; margin-bottom:12px; }
.bao-do { font-size:15px; font-weight:800; color:#fff; background:#DC2626;
  border-radius:var(--radius); padding:12px 16px; margin-top:18px; }

/* Chỗ trống nằm GIỮA DÒNG chữ: ô nhập phải cùng đường chân chữ, không thì cả
   đoạn văn nhảy dòng loạn lên mỗi khi có ô. */
.de-van.co-o { line-height:2.4; }
.o-trong, .o-chon { display:inline-block; vertical-align:baseline; font-family:inherit;
  font-size:15px; padding:3px 8px; margin:0 3px; border:1px solid var(--acc);
  border-radius:4px; background:var(--acc-soft); min-width:118px; }
.o-trong:focus, .o-chon:focus { outline:2px solid var(--acc); outline-offset:-1px; background:#fff; }
/* Ô rộng ĐÚNG bằng số chữ cái phải điền (Read and Complete của DET). Bỏ
   min-width 118px của ô thường, không thì mọi ô đều rộng như nhau và mất sạch
   manh mối độ dài — đó là manh mối chính của dạng bài này. Chữ đều để đếm ô
   bằng mắt được. */
.o-trong.o-dung-do-dai { min-width:0; font-family:ui-monospace,"SF Mono",Menlo,monospace;
  font-size:14.5px; letter-spacing:1px; padding:3px 6px; text-align:center; }
.o-trong-mo { display:inline-block; min-width:96px; border-bottom:2px solid var(--acc-lite); }

.ngan-hang { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:16px;
  padding:12px 14px; background:var(--acc-soft); border-radius:var(--radius); }
.nh-nhan { font-size:11px; font-weight:800; letter-spacing:.8px; text-transform:uppercase;
  color:var(--acc); width:100%; }
.ngan-hang b { font-size:14.5px; background:#fff; border:1px solid var(--acc);
  border-radius:4px; padding:5px 11px; }

.manh-ds { display:grid; gap:10px; margin:6px 0 16px; }
.manh { display:flex; gap:12px; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:12px 15px; }
.manh b { flex:none; width:26px; height:26px; border-radius:50%; background:var(--acc-soft);
  color:var(--acc); display:flex; align-items:center; justify-content:center; font-size:13px; }
.manh p { font-size:14.5px; line-height:1.7; }
.thu-tu { max-width:160px; letter-spacing:5px; text-transform:uppercase; font-weight:800;
  font-size:19px; text-align:center; }

/* Bấm vào từ sai: cả đoạn là vùng bấm nên phải cho thấy rõ từ nào bấm được */
.de-van.bam-tu { line-height:2.1; cursor:default; }
.de-van.bam-tu .tu { border-radius:3px; padding:1px 2px; cursor:pointer; }
.de-van.bam-tu .tu:hover { background:#EEF2F7; }
.de-van.bam-tu .tu.chon { background:#FEE2E2; color:#991B1B; font-weight:700;
  box-shadow:inset 0 -2px 0 #DC2626; }
.de-van.doi-chieu { background:#F7F9FC; border:1px solid var(--line);
  border-radius:var(--radius); padding:14px 16px; font-size:15.5px; }

/* Đếm từ đổi màu theo khuôn — sai khuôn là 0 điểm nên phải báo TRƯỚC khi nộp */
.dem-tu { font-size:13px; font-weight:700; }
.dem-tu.ok { color:var(--ok); }
.dem-tu.hong { color:var(--err); }
.de-chu-de { display:block; color:var(--navy); font-size:14px; margin-bottom:5px; }

/* --- Khoá học --- */
.hoc-nhom { margin-bottom:30px; }
.hoc-nhom .sec-title span { font-size:12px; font-weight:700; color:var(--muted); }
.hoc-nhom-mo { font-size:13.5px; margin-bottom:12px; }
.hoc-luoi { display:grid; gap:12px; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); }
.hoc-the { display:block; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:15px 17px; text-decoration:none; color:var(--text);
  transition:border-color .12s, transform .12s; position:relative; }
.hoc-the:hover { border-color:var(--acc); transform:translateY(-2px); }
.hoc-so { position:absolute; top:13px; right:15px; font-size:12px; font-weight:800;
  color:var(--acc); background:var(--acc-soft); border-radius:99px; padding:2px 9px; }
.hoc-ten b { display:block; color:var(--navy); font-size:15.5px; padding-right:36px; }
.hoc-ten i { display:block; font-style:normal; font-size:12.5px; color:var(--acc); margin-top:2px; }
.hoc-the p { font-size:13px; color:var(--muted); line-height:1.6; margin-top:8px; }

.crumb { font-size:13px; color:var(--muted); margin-bottom:6px; }
.crumb span { margin:0 7px; }
.muc-tieu { background:var(--acc-soft); border-left:4px solid var(--acc);
  border-radius:var(--radius); padding:14px 18px; margin:16px 0 22px; }
.muc-tieu b { display:block; font-size:12px; letter-spacing:.7px; text-transform:uppercase;
  color:var(--acc); margin-bottom:5px; }
.muc-tieu p { font-size:14.5px; line-height:1.75; }

.bai-hoc { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  padding:26px 30px; font-size:15.5px; line-height:1.85; }
.bai-hoc h2 { font-size:19px; color:var(--navy); margin:26px 0 10px; }
.bai-hoc h2:first-child { margin-top:0; }
.bai-hoc h3 { font-size:16px; color:var(--navy); margin:20px 0 8px; }
.bai-hoc p { margin-bottom:13px; }
.bai-hoc ul, .bai-hoc ol { margin:0 0 14px 20px; }
.bai-hoc li { margin-bottom:7px; }
.bai-hoc table { width:100%; border-collapse:collapse; font-size:14px; margin:6px 0 16px; }
.bai-hoc th, .bai-hoc td { border:1px solid var(--line); padding:9px 11px; text-align:left;
  vertical-align:top; }
.bai-hoc th { background:#F4F7FA; font-size:12.5px; text-transform:uppercase;
  letter-spacing:.4px; color:var(--muted); }
.bai-hoc code { background:#F1F5F9; border-radius:3px; padding:1px 5px; font-size:14px; }
/* Ba khối nhấn: công thức nói, bẫy mất điểm, ví dụ mẫu */
.kh-cong-thuc { background:var(--acc-soft); border-left:4px solid var(--acc);
  border-radius:var(--radius); padding:14px 18px; margin:16px 0; }
.kh-bay { background:var(--errbg); border-left:4px solid #DC2626;
  border-radius:var(--radius); padding:14px 18px; margin:16px 0; }
/* CHỈ thẻ <b> đầu khối mới là TIÊU ĐỀ khối. Không viết ".kh-bay b": trong ba
   khối này còn đầy <b> in đậm bình thường — nhãn đầu dòng, ô đầu bảng, từ nhấn
   giữa câu — và biến tất cả thành tiêu đề khối viết hoa cỡ 12px thì chúng vừa
   bị xuống dòng vô cớ vừa NHỎ hơn chữ quanh nó, tức là chỗ nhấn mạnh lại thành
   chỗ mờ nhất. (Phát hiện 27/8/2026: 62/73 khối của khoá PTE đang dính.) */
.kh-bay > b:first-child, .kh-cong-thuc > b:first-child, .kh-mau > b:first-child {
  display:block; font-size:12px; letter-spacing:.7px;
  text-transform:uppercase; margin-bottom:6px; }
.kh-bay > b:first-child { color:#B91C1C; }
.kh-cong-thuc > b:first-child { color:var(--acc); }
.kh-mau { background:#F7F9FC; border:1px solid var(--line); border-radius:var(--radius);
  padding:14px 18px; margin:16px 0; }
.kh-mau > b:first-child { color:var(--muted); }
.kh-mau .en { font-size:15.5px; line-height:1.9; }
.bai-cuoi { display:flex; flex-wrap:wrap; gap:10px; margin-top:22px; }
.bai-dieu-huong { display:flex; justify-content:space-between; gap:14px; margin-top:26px; }
.bai-dieu-huong a { flex:1; max-width:48%; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); padding:12px 16px; text-decoration:none; color:var(--text); }
.bai-dieu-huong a:hover { border-color:var(--acc); }
.bai-dieu-huong a.phai { text-align:right; }
.bai-dieu-huong span { display:block; font-size:11.5px; color:var(--muted);
  text-transform:uppercase; letter-spacing:.6px; }
.bai-dieu-huong b { color:var(--navy); font-size:14.5px; }
@media (max-width:620px) { .bai-hoc { padding:20px 18px; } }

/* --- Danh sách đề thi thử đầy đủ --- */
.thi-the { background:#fff; border:1px solid var(--line); border-left:5px solid var(--acc);
  border-radius:var(--radius); padding:22px 24px; margin-bottom:18px; }
.thi-dau { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:12px; margin-bottom:8px; }
.thi-the h2 { font-size:19px; color:var(--navy); }
.thi-tem { display:flex; gap:6px; flex-wrap:wrap; }
.thi-the table { margin:12px 0 4px; }

/* ===================================================================
   THẺ ĐIỂM ĐỀ ĐẦY ĐỦ — dựng theo khuôn Score Report của kỳ thi thật
   Học viên sẽ cầm tờ báo điểm thật sau khi thi, nên tờ ở đây phải đọc
   được bằng CÙNG một thói quen mắt: cùng thứ tự khối, cùng cách chia
   Communicative / Enabling, cùng kiểu vòng tròn và thanh ngang.
   KHÔNG mang logo hay tên của tổ chức khảo thí nào.
   =================================================================== */
.bao-diem { background:#fff; border:1px solid var(--line); border-radius:var(--radius);
  overflow:hidden; margin-top:16px; }

.bd-dau { display:flex; flex-wrap:wrap; align-items:center; gap:10px;
  background:var(--acc-soft); border-bottom:1px solid var(--line);
  padding:13px 22px; font-size:14px; }
.bd-hieu { font-weight:800; color:var(--navy); letter-spacing:.2px; }
.bd-vach { color:var(--line-2); }
.bd-ky { font-weight:700; color:var(--acc); }
.bd-loai { color:var(--muted); }
.bd-ma { margin-left:auto; font-size:12px; color:var(--muted);
  font-variant-numeric:tabular-nums; letter-spacing:.5px; }

.bd-than { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:20px; padding:22px; border-bottom:1px solid var(--line); }
.bd-nguoi { display:flex; align-items:center; gap:15px; }
/* Ô chữ cái đầu thay ảnh: tờ thật có ảnh thí sinh, mình không có và cũng không
   nên có — nhưng bỏ trống chỗ đó thì bố cục lệch hẳn so với tờ thật. */
.bd-anh { width:60px; height:60px; border-radius:6px; background:var(--acc);
  color:#fff; font-size:26px; font-weight:800; display:flex; align-items:center;
  justify-content:center; flex:none; }
.bd-ten b { display:block; font-size:17px; color:var(--navy); }
.bd-ten span { display:block; font-size:12.5px; color:var(--muted); line-height:1.55; }

/* Khiên điểm tổng — hình dáng lấy đúng ý tờ báo điểm: một khối màu đặc, số to,
   góc dưới vát. Đây là thứ mắt tìm đầu tiên khi mở tờ giấy ra. */
.bd-khien { position:relative; min-width:118px; padding:14px 20px 22px; text-align:center;
  background:var(--acc); color:#fff;
  clip-path:polygon(0 0, 100% 0, 100% 78%, 50% 100%, 0 78%); }
.bd-khien .k-nhan { display:block; font-size:10.5px; letter-spacing:1px;
  text-transform:uppercase; opacity:.9; }
.bd-khien .k-so { display:block; font-size:44px; font-weight:800; line-height:1.05; }
.bd-khien .k-thang { display:block; font-size:11px; opacity:.85; }

.bd-muc { font-size:16px; color:var(--navy); padding:18px 22px 0; }
.bd-muc i { font-style:normal; font-size:13px; color:var(--muted); font-weight:400; }

/* --- Bốn vòng tròn kỹ năng giao tiếp --- */
.ct-hang { display:grid; gap:14px; padding:14px 22px 4px;
  grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); }
.ct-o { position:relative; text-align:center; }
.ct-vong { width:72px; height:72px; }
.ct-so { position:absolute; top:24px; left:0; right:0; font-size:20px; font-weight:800; }
.ct-en { display:block; font-size:13px; font-weight:700; color:var(--navy); margin-top:2px; }
.ct-vi { display:block; font-size:11.5px; color:var(--muted); }

/* --- Thanh ngang có vạch mốc Overall --- */
/* Ba cột khai bằng BIẾN để vạch mốc Overall tính đúng mép trái của thanh.
   Bản đầu đặt vạch bằng một công thức phỏng chừng (calc(% * 0.62 + 38%)) và nó
   lệch hẳn khỏi chỗ đáng lẽ phải cắt qua các thanh — mà lệch ở đây thì tệ hơn
   không có vạch, vì cả tờ báo điểm đọc được là nhờ mọi thanh so với MỘT đường. */
.tb-khung { position:relative; padding:12px 22px 18px;
  --c1:150px; --c2:34px; --g:10px; --pad:22px; }
.tb-hang { display:grid; grid-template-columns:var(--c1) var(--c2) 1fr;
  align-items:center; gap:var(--g); padding:3px 0; }
.tb-ten { font-size:12.5px; color:var(--navy); font-weight:700; line-height:1.25; }
.tb-ten i { display:block; font-style:normal; font-size:11px; color:var(--muted); font-weight:400; }
.tb-so { font-size:13px; font-weight:800; color:var(--text); text-align:right;
  font-variant-numeric:tabular-nums; }
/* Đỉnh thang của ô năng lực nền: sáu ô đó chạy 0–100 chứ không chạy theo
   thang tổng của khu, nên phải in ra để không ai đọc '72' thành 72/300. */
.tb-tran { font-weight:600; color:var(--muted); font-size:11px; margin-left:1px }

.tb-rail { display:block; height:15px; background:#F1F4F8; border-radius:2px; overflow:hidden; }
.tb-rail i { display:block; height:100%; border-radius:2px; }
.tb-nhom { font-size:12.5px; font-weight:800; color:var(--navy); margin:14px 0 4px;
  padding-top:12px; border-top:1px solid var(--line); }
.tb-nhom i { font-style:normal; font-size:11px; color:var(--muted); font-weight:400; }
/* Vạch mốc Overall chạy dọc qua cả nhóm thanh — đúng chi tiết làm tờ báo điểm
   thật đọc được trong một giây: mọi thanh so với một đường duy nhất. */
.tb-vach { position:absolute; top:8px; bottom:14px; width:2px; background:var(--navy);
  left:calc(var(--pad) + var(--c1) + var(--g) + var(--c2) + var(--g)
            + (100% - var(--pad) * 2 - var(--c1) - var(--c2) - var(--g) * 2) * var(--p)); }
.tb-vach i { position:absolute; top:-2px; left:6px; font-style:normal; font-size:11px;
  font-weight:800; color:var(--navy); white-space:nowrap; }
.bd-ghi { font-size:12.5px; color:var(--muted); line-height:1.65;
  padding:0 22px 20px; }

@media (max-width:640px) {
  .bd-than { justify-content:center; }
  .tb-khung { --c1:110px; --c2:30px; --pad:16px; }
  .tb-vach { display:none; }
}

.bao-cho { background:var(--warnbg); border-left:4px solid #D97706; border-radius:var(--radius);
  padding:13px 17px; font-size:14px; line-height:1.7; margin-bottom:16px; }
.ti { font-weight:800; }
.ti.ok { color:var(--ok); }
.ti.vua { color:var(--warn); }
.ti.yeu { color:var(--err); }
/* Dải dưới: nút đi tiếp SÁT PHẢI, đúng chỗ tay để trên màn thi thật. */
.de-nut { display:flex; justify-content:flex-end; gap:10px; align-items:center;
  background:#F7F9FC; border-top:1px solid var(--line); padding:13px 20px; }
.de-noi > .btn { margin-top:18px; }

/* --- Cụm đọc của TOEFL: bài đọc trái, câu hỏi phải (đúng màn thi thật) --- */
.hai-cot { display:grid; grid-template-columns:1fr 1fr; gap:0; margin:-22px -24px; }
.hc-doc { padding:20px 22px; font-size:15px; line-height:1.85; max-height:62vh;
  overflow-y:auto; border-right:1px solid var(--line); background:#FCFDFE; }
.hc-hoi { padding:20px 22px; }
.hc-hoi .de-yeu-cau { border-bottom:0; padding-bottom:0; margin-bottom:14px; }
@media (max-width:820px) {
  .hai-cot { grid-template-columns:1fr; }
  .hc-doc { max-height:38vh; border-right:0; border-bottom:1px solid var(--line); }
}


/* ==========================================================================
   TỪ VỰNG (/tu-vung · /on-tu) — chỉ khu TOEIC dùng.
   Xem khu-en/trang-tu-vung.js để biết vì sao ba khu kia cố ý không có mục này.
   ========================================================================== */
.tu-luoi { display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr));
  gap:14px; margin-top:16px; }
.tu-the { background:#fff; border:1px solid var(--vien,#E3E8EF); border-radius:var(--radius);
  padding:16px 18px; }
.tu-the.thuoc { border-color:var(--acc); background:var(--acc-soft); }
.tu-dau { display:flex; align-items:baseline; flex-wrap:wrap; gap:8px; margin-bottom:6px; }
.tu-dau h3 { margin:0; font-size:20px; color:var(--navy); }
.tu-loai { font-style:italic; color:#64748B; font-size:13px; }
.tu-ipa { color:#64748B; font-size:13px; font-family:ui-monospace,Menlo,monospace; }
.tu-nghia { margin:2px 0 6px; font-weight:700; color:#0F172A; }
.tu-vd { margin:8px 0; padding-left:12px; border-left:3px solid var(--acc-lite);
  color:#334155; font-size:14.5px; }
.tu-vd-vi { display:block; color:#64748B; font-size:13.5px; margin-top:3px; }
.tu-col { margin-top:10px; }
.tu-col ul { margin:4px 0 0; padding-left:18px; color:#334155; font-size:14px; }
.tu-col li { margin:2px 0; }
.tu-ho { margin-top:8px; font-size:14px; color:#334155; }
/* Ô "dễ nhầm" phải nổi hơn phần còn lại của thẻ: đó là chỗ Part 5 lấy điểm,
   và nếu nó chìm bằng thân thẻ thì mắt lướt qua đúng dòng quan trọng nhất. */
.tu-bay { margin-top:10px; background:#FEF3C7; border-left:3px solid #D97706;
  padding:8px 10px; border-radius:6px; font-size:14px; color:#78350F; }
.the-thanh.nho { display:inline-block; width:90px; height:6px; background:#E3E8EF;
  border-radius:3px; overflow:hidden; vertical-align:middle; }
.the-thanh.nho i { display:block; height:100%; background:var(--acc); }

.on-tu { max-width:640px; margin:0 auto; }
.on-thanh { display:flex; align-items:center; gap:12px; color:#64748B; font-size:13.5px;
  margin-bottom:14px; }
.on-vach { flex:1; height:6px; background:#E3E8EF; border-radius:3px; overflow:hidden; }
.on-vach i { display:block; height:100%; background:var(--acc); transition:width .2s; }
.on-the { background:#fff; border:1px solid var(--vien,#E3E8EF); border-radius:var(--radius);
  padding:32px 24px; text-align:center; cursor:pointer; min-height:230px; }
.on-the h1 { margin:6px 0; font-size:34px; color:var(--navy); }
.on-hop { font-size:12px; color:#64748B; text-transform:uppercase; letter-spacing:1px; }
.on-mat { margin-top:18px; text-align:left; }
.on-mat .tu-nghia { font-size:19px; text-align:center; }

/* Tiêu đề khối NHÁNH THI trên trang lộ trình (TOEIC L&R vs S&W). */
.nhanh-ten { margin:20px 0 8px; font-size:15px; color:var(--navy); font-weight:800;
  text-transform:uppercase; letter-spacing:.6px; }
.nhanh-ten .muted { text-transform:none; letter-spacing:0; font-weight:600; font-size:13px; }

/* ---- ĐỀ TỦ THÁNG (trang-tu.js) — tiền tố tude- vì .tu-the đã thuộc trang Từ vựng ---- */
.tude-tien-do { background:#fff; border:1px solid var(--vien,#E3E8EF); border-radius:var(--radius);
  padding:16px 18px; margin:14px 0 6px; }
.tude-tien-do .tude-so { font-size:15px; margin-bottom:8px; }
.tude-tien-do .tude-so b { font-size:22px; color:var(--acc); }
.tude-dang { margin:14px 0 20px; }
.tude-dang-dau { display:flex; justify-content:space-between; align-items:baseline;
  gap:10px; margin-bottom:8px; }
.tude-o { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:8px; }
.tude-the { position:relative; display:flex; align-items:center; gap:8px; background:#fff;
  border:1px solid var(--vien,#E3E8EF); border-radius:10px; padding:8px 10px;
  font-size:13px; color:inherit; text-decoration:none; min-width:0; }
.tude-the:hover { border-color:var(--acc); }
.tude-the i { font-style:normal; font-weight:700; color:var(--muted,#6B7686);
  flex:none; font-size:12px; }
.tude-the span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.tude-the u { text-decoration:none; margin-left:auto; flex:none; color:var(--acc); font-weight:700; }
.tude-the.xong { background:var(--acc-soft,#EAF6F1); border-color:var(--acc); }
.tude-the.xong i { color:var(--acc); }

/* ── Dải tên riêng cuối trang ─────────────────────────────────────────────
   Khai "PTE8020 là tên gọi tắt của khu…" + link sang tên riêng các khu khác.
   Dựng bởi dai_ten_rieng() trong khu-en/_dung.py.

   Đây là chỗ DUY NHẤT chuỗi "PTE8020" nằm trong chữ nhìn thấy được của trang,
   nên KHÔNG được display:none, không được nhét vào <details> đóng, và không
   được để JS vẽ — cả ba đều làm Google hạ giá trị hoặc bỏ qua nó. Cỡ chữ nhỏ
   và màu nhạt là đủ để nó không tranh chỗ với nội dung chính. */
.th-dai{max-width:1120px;margin:56px auto 28px;padding:18px 20px 20px;
  border-top:1px solid var(--vien,#e5e7eb);color:var(--nhat,#6b7280);
  font-size:13.5px;line-height:1.65}
.th-dai p{margin:0}
.th-dai p + p{margin-top:7px}
.th-dai b{color:var(--chu,#111827)}
.th-dai a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.th-dai a:hover{color:var(--nhan,#2563eb)}
.th-ds{word-spacing:.02em}

/* ===== Xem lại từng câu sau khi thi đề đầy đủ (trang-xem-lai.js) ===== */
.xl-tom { display:flex; flex-wrap:wrap; gap:26px; background:#fff; border:1px solid var(--line);
  border-left:5px solid var(--acc); border-radius:var(--radius); box-shadow:var(--shadow);
  padding:16px 22px; margin-bottom:4px; }
.xl-tom-o { display:flex; flex-direction:column; gap:2px; }
.xl-tom-o .nhan { font-size:11.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); font-weight:600; }
.xl-tom-o .so { font-size:26px; font-weight:800; color:var(--navy); font-variant-numeric:tabular-nums; }
.xl-tom-o .so.xl-do { color:var(--err); }
.xl-thanh { display:flex; flex-wrap:wrap; gap:10px; margin:14px 0 20px; }

.xl-doan { background:var(--acc-soft); border:1px solid var(--line); border-radius:var(--radius);
  padding:14px 18px; margin:22px 0 12px; }
.xl-doan h4 { font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted);
  margin:0 0 8px; font-weight:700; }

.xl-cau { background:#fff; border:1px solid var(--line); border-left:4px solid var(--line-2);
  border-radius:var(--radius); padding:15px 18px; margin-bottom:12px; }
.xl-cau.xl-ok  { border-left-color:#0E9F6E; }
.xl-cau.xl-sai { border-left-color:#DC2626; }
.xl-dau { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:9px; }
.xl-so { display:inline-flex; align-items:center; justify-content:center; min-width:26px; height:26px;
  border-radius:4px; background:var(--navy); color:#fff; font-size:12.5px; font-weight:700;
  font-variant-numeric:tabular-nums; padding:0 6px; }
.xl-dang { font-size:12.5px; color:var(--muted); font-weight:600; }
.xl-kq { margin-left:auto; font-size:12px; font-weight:700; padding:2px 10px; border-radius:999px; }
.xl-ok-nhan  { background:var(--okbg);   color:var(--ok); }
.xl-sai-nhan { background:var(--errbg);  color:var(--err); }
.xl-cho-nhan, .xl-kq.xl-cho { background:var(--warnbg); color:var(--warn); }
.xl-stem { font-size:15px; line-height:1.6; margin:0 0 10px; }
.xl-hinh { max-width:420px; margin:0 0 12px; }
.xl-hinh svg { width:100%; height:auto; display:block; }

.xl-lc { list-style:none; display:grid; gap:7px; margin:0 0 12px; padding:0; }
.xl-lc li { display:flex; gap:9px; align-items:flex-start; font-size:14.5px; line-height:1.55;
  border:1px solid var(--line-2); border-radius:var(--radius); padding:9px 12px; }
.xl-lc li.dung { border:2px solid #059669; background:#ECFDF5; }
.xl-lc li.sai  { border:2px solid #DC2626; background:#FEF2F2; }
.xl-nhan { margin-left:auto; font-size:11px; font-weight:700; padding:1px 8px; border-radius:999px;
  white-space:nowrap; align-self:center; }
.xl-nhan-dung { background:#059669; color:#fff; }
.xl-nhan-chon { background:var(--navy); color:#fff; }

.xl-doi { display:flex; flex-wrap:wrap; gap:24px; margin:0 0 12px; }
.xl-doi > div { display:flex; flex-direction:column; gap:2px; font-size:14.5px; }
.xl-doi .muted { font-size:11.5px; letter-spacing:.05em; text-transform:uppercase; font-weight:600; }

.xl-giai { background:var(--acc-soft); border-radius:var(--radius); padding:12px 15px; }
.xl-giai h4 { font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--acc);
  margin:0 0 5px; font-weight:700; }
.xl-giai p { font-size:14.5px; line-height:1.65; margin:0; white-space:pre-wrap; }

.xl-ghi { margin-top:10px; }
.xl-ghi summary { font-size:13px; font-weight:600; color:var(--acc); cursor:pointer; }
.xl-ghi pre { white-space:pre-wrap; font-family:inherit; font-size:13.5px; line-height:1.6;
  color:var(--text); background:var(--bg); border:1px solid var(--line); border-radius:var(--radius);
  padding:12px 14px; margin:8px 0 0; }

@media (max-width:600px) {
  .xl-tom { gap:18px; padding:14px 16px; }
  .xl-tom-o .so { font-size:22px; }
  .xl-kq { margin-left:0; }
}

/* Dạng nhiều ô (PTE RWFIB, DET DR-FILL): mỗi ô một bộ chọn riêng */
.xl-nhieu-o { display:grid; gap:12px; margin:0 0 12px; }
.xl-o-khoi { border-left:3px solid var(--line-2); padding-left:12px; }
.xl-o-nhan { font-size:11.5px; letter-spacing:.05em; text-transform:uppercase;
  color:var(--muted); font-weight:700; margin-bottom:5px; }
.xl-nhieu-o .xl-lc { margin-bottom:0; }
.xl-nhieu-o .xl-lc li { padding:6px 10px; font-size:14px; }

/* Đáp án / bài làm nhiều ô: mỗi ô một dòng, không gộp thành "hoặc" */
.xl-o { margin:2px 0 0; padding-left:20px; font-weight:400; }
.xl-o li { margin-bottom:2px; }

/* Dạng sắp xếp: phải thấy chính các mảnh câu */
.xl-manh { margin:0 0 12px; padding-left:22px; font-size:14.5px; line-height:1.55; }
.xl-manh li { margin-bottom:4px; }

/* ===== KHUÔN BA TẦNG trang cửa (6/9/2026): chọn cấp · Bài hôm nay · kho gập theo cấp ===== */
.gt-h1 { font-size:27px; color:var(--navy); line-height:1.3; font-weight:800; margin:0; }
.cap-chon { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin:18px 0 12px; }
.cap-chon .cap-hoi { font-size:13px; font-weight:800; color:var(--muted); text-transform:uppercase; letter-spacing:.8px; margin-right:4px; }
.cap-chon button, .cap-chon a { appearance:none; background:#fff; border:1.5px solid var(--line-2); color:var(--navy);
  border-radius:99px; padding:7px 14px; font-size:14px; font-weight:700; cursor:pointer; text-decoration:none; line-height:1.2; }
.cap-chon button:hover, .cap-chon a:hover { border-color:var(--acc); }
.cap-chon button.on, .cap-chon a.on { background:var(--acc); border-color:var(--acc); color:#fff; }
.cap-chon.nho { margin:4px 0 14px; }
.cap-chon.nho button, .cap-chon.nho a { padding:5px 12px; font-size:13px; }
.hn-the { display:flex; gap:22px; align-items:center; flex-wrap:wrap; background:linear-gradient(135deg,#EAF6FD,#F5FAFE 60%,#fff);
  border:1px solid #C7E4F4; border-radius:var(--radius); padding:20px 22px; margin-top:6px; }
.hn-the .hn-nd { flex:1 1 320px; min-width:0; }
.hn-the h2 { color:var(--navy); font-size:21px; margin:2px 0 6px; line-height:1.3; }
.hn-the .hn-tom { font-size:13.5px; color:#374151; line-height:1.6; margin-top:8px; max-width:62ch; }
.hn-the .hn-nut { display:flex; flex-direction:column; align-items:center; gap:8px; flex:none; }
.hn-the .hn-nut .btn-lg { padding:14px 26px; font-size:16px; }
.hn-the .hn-doi { font-size:13px; color:var(--muted); text-decoration:underline; }
.hn-phu { margin-top:12px; }
details.gt-cap { border:1px solid var(--line); border-radius:var(--radius); background:#fff; margin:10px 0; padding:0 16px; }
details.gt-cap summary { cursor:pointer; list-style:none; display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding:13px 0; font-size:15px; color:var(--navy); }
details.gt-cap summary::-webkit-details-marker { display:none; }
details.gt-cap summary::before { content:""; width:8px; height:8px; border-right:2px solid var(--muted); border-bottom:2px solid var(--muted); transform:rotate(-45deg); margin-right:4px; flex:none; transition:transform .15s; }
details.gt-cap[open] summary::before { transform:rotate(45deg); }
details.gt-cap summary span { color:var(--muted); font-weight:500; font-size:13.5px; }
details.gt-cap summary u { margin-left:auto; text-decoration:none; font-size:12.5px; font-weight:800; color:var(--acc); }
details.gt-cap .md-teil { margin-bottom:6px; }
details.gt-cap .md-thi { margin:6px 0 14px; font-size:14px; }
.ks-the { margin-top:18px; background:#FFF8E6; border:1px solid #F3D98B; border-radius:var(--radius); padding:14px 16px; }
.ks-the b { display:block; color:var(--navy); font-size:15px; margin-bottom:10px; }
.ks-nut { display:flex; flex-wrap:wrap; gap:8px; }
.ks-nut button { appearance:none; background:#fff; border:1.5px solid var(--line-2); color:var(--navy); border-radius:99px; padding:7px 14px; font-size:13.5px; font-weight:700; cursor:pointer; }
.ks-nut button:hover { border-color:var(--acc); color:var(--acc); }
.ks-nut button.ks-bo { border-color:transparent; color:var(--muted); font-weight:600; }
/* pinyin (HSK): ruby nhỏ trên chữ Hán, tắt là gỡ ruby */
ruby.py { ruby-position:over; }
ruby.py rt { font-size:.6em; color:var(--muted); font-weight:500; letter-spacing:.2px; }
.nut-pinyin { font-size:12.5px; padding:6px 10px; }
.nut-pinyin.on { border-color:var(--acc); color:var(--acc); }
@media (max-width:640px) {
  .hn-the { padding:16px; }
  .hn-the .hn-nut { width:100%; }
  .hn-the .hn-nut .btn-lg { width:100%; text-align:center; }
  .gt-h1 { font-size:22px; }
}

/* Điều kiện của gói cam kết đầu ra — đứng ngay trong ô giá, không giấu xuống
   trang điều khoản: bán một lời hứa thì điều kiện phải đọc được cùng lúc với giá. */
.goi .ck-dk { margin: 8px 0 12px; padding-left: 18px; text-align: left; font-size: 13px;
  color: var(--mo, #6B7280); line-height: 1.5; }
.goi .ck-dk li { margin: 3px 0; }
