/* Design system cvwork.vn — NỀN SÁNG, mirror token /brand.css (nguồn sự thật; giữ đồng bộ).
   Lime --brand CHỈ nền/viền (làm chữ chỉ 1.21:1, không đọc được); chữ lime -> --brand-ink;
   chữ TRÊN nền lime -> --on-brand. Cùng vốn component với các trang tĩnh app (tool.css). */
:root{--bg:#FFFFFF;--panel:#FFFFFF;--raised:#EDF1EC;
--ink:#0A0F0D;--muted:#4A5A54;--faint:#64736C;--line:#E4EAE5;--line-strong:#CDD8D1;
--brand:#B6FF3C;--brand-ink:#3F6212;--on-brand:#0A0F0D;--brand-wash:rgba(182,255,60,.28);--g:#3F6212;--l:#EDF1EC;--m:#4A5A54;
--disp:'Space Grotesk',sans-serif;--mono:'JetBrains Mono',monospace}
*{box-sizing:border-box}
/* Header lại MỘT hàng (logo + hàng icon nhóm cùng dòng, 15/09 chiều) -> KHÔNG còn scroll-padding-top
   46px của bản hai hàng; các `scroll-margin-top` căn tay cho header một hàng lại đúng như cũ. */
body{margin:0;font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:var(--ink);background:var(--bg);line-height:1.55;-webkit-font-smoothing:antialiased}
.wrap{max-width:1000px;margin:0 auto;padding:22px 16px 64px}
header{background:rgba(255,255,255,.82);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20}
/* Bề ngang header = bề ngang .shell (1200 kể từ 15/09/2026, trước là 1360 khi còn menu trái).
   Cùng số + cùng padding 16 thì logo, hàng icon nhóm và mép nội dung thẳng một đường; lệch số là
   logo thụt vào giữa trang. Hàng icon nhóm (.gnavin) cũng phải dùng đúng số này. */
header .hd{max-width:1200px;margin:0 auto;padding:12px 16px;display:flex;align-items:center;gap:18px}
header .brand{display:inline-flex;flex:none;align-items:center;gap:9px;color:var(--ink);text-decoration:none;font-size:18px;font-weight:700;font-family:var(--disp);letter-spacing:-.01em;white-space:nowrap}
header .brand img{width:30px;height:30px;border-radius:8px;flex:none}
/* Chữ cạnh logo là "CV Work" (= SITE), KHÔNG phải "cvwork.vn". Google lấy tên site trên SERP từ
   JSON-LD WebSite.name + og:site_name + chữ logo ở trang chủ; chữ logo là domain thì nó tin domain
   và in "cvwork.vn". Đổi chữ ở đây thì cả 3 tín hiệu mới nói CÙNG một tên. Rule `.dot` cũ (tô riêng
   phần ".vn") đã bỏ theo — `.dot` còn dùng ở .aglive, không liên quan. */
nav.bc{font-size:13px;color:var(--faint);margin:16px 0 4px}nav.bc a{color:var(--ink);text-decoration:none;font-weight:500}nav.bc a:hover{text-decoration:underline}
h1{font-family:var(--disp);font-weight:700;font-size:28px;margin:10px 0 6px;letter-spacing:-.02em;color:var(--ink)}.sub{color:var(--muted);margin:0 0 20px;font-size:15.5px}.sub .sal{color:var(--ink);font-weight:600}
/* Link nằm trong <p class=sub> (vd "Xem bảng kỹ năng lương cao →" ở khối kỹ năng ngành): không có
   rule này thì ra xanh/tím mặc định + gạch chân. Đặt ở sheet CHÍNH chứ đừng ở _ROLE_CHIP_CSS —
   khối kỹ năng dựng ở _skill_hilite_block KHÔNG nhúng CSS đó, chỉ trả <div class=rolechips>. */
.sub a{color:var(--ink);text-decoration:none;font-weight:600}.sub a:hover{text-decoration:underline}
.sfbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:10px;margin:6px 0 22px}
.sfbar input,.sfbar select{border:1px solid var(--line);background:var(--raised);border-radius:10px;padding:10px 13px;font-size:14px;color:var(--ink);font-family:inherit;outline:none;height:42px}
.sfbar input{flex:1;min-width:180px}.sfbar select{flex:none;cursor:pointer;max-width:180px}
.sfbar button{flex:none;border:0;background:var(--brand);color:var(--ink);font-weight:700;font-family:var(--disp);font-size:14px;border-radius:10px;padding:0 20px;height:42px;cursor:pointer}
@media(max-width:560px){.sfbar input,.sfbar select{flex:1 1 100%;max-width:none}.sfbar button{flex:1 1 100%}}
h2{font-family:var(--disp);font-weight:600;font-size:19px;margin:32px 0 12px;color:var(--ink);letter-spacing:-.01em;display:flex;align-items:baseline;gap:10px}
h2 .seemore{margin-left:auto;font-size:13px;font-weight:600;color:var(--ink);text-decoration:none}h2 .seemore:hover{text-decoration:underline}
.cbrand{display:flex;gap:16px;align-items:flex-start;background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:16px 18px;margin:6px 0 18px}
.cbrand .clogo{width:64px;height:64px;object-fit:contain;border-radius:12px;background:#fff;border:1px solid var(--line);flex:none}
.cbrand .clogo-ph{display:flex;align-items:center;justify-content:center;font-family:var(--disp);font-size:30px;font-weight:700;color:var(--ink);background:var(--brand-wash)}
.cbrand .clogo-cv{padding:9px;background:var(--brand-wash)}
.cfacts{display:flex;flex-wrap:wrap;gap:7px;margin-top:9px}
.cfact{font-size:12.5px;color:var(--muted);background:var(--raised);border-radius:999px;padding:4px 11px}.cfact b{color:var(--ink);font-weight:600}
.cweb{display:inline-block;margin-top:9px;font-size:13px;font-weight:600;color:var(--ink);text-decoration:none}.cweb:hover{text-decoration:underline}
.cdesc{color:var(--muted);font-size:14px;margin:10px 0 0;line-height:1.6}
/* Mục lục nhảy nhanh trang công ty + chừa chỗ cho header dính (top:74px) khi nhảy tới neo */
.ctoc{display:flex;flex-wrap:wrap;gap:7px;margin:2px 0 14px}
.ctoc a{font-size:13px;font-weight:600;color:var(--ink);background:var(--brand-wash);border:1px solid transparent;border-radius:999px;padding:6px 13px;text-decoration:none}
.ctoc a:first-child{background:var(--brand);color:var(--on-brand)}
.ctoc a:hover{border-color:var(--brand-ink)}
[id="viec"],[id="tinh-thanh"],[id="ky-nang"]{scroll-margin-top:86px}
.cstats{display:flex;flex-wrap:wrap;gap:10px;margin:2px 0 14px}
.cstat{flex:1;min-width:120px;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:13px 15px}
.cstat b{display:block;font-family:var(--disp);font-size:24px;font-weight:700;color:var(--ink);letter-spacing:-.02em}
.cstat i{font-style:normal;font-size:12.5px;color:var(--muted)}
.cskills{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin:0 0 12px}
.cskills .lbl{font-size:12.5px;color:var(--faint);margin-right:2px}
.cskill{font-size:12.5px;color:var(--ink);background:var(--raised);border-radius:999px;padding:4px 11px;font-weight:500}
.csrc{font-size:12.5px;color:var(--faint);margin:0 0 16px}
.pvdist{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin:0 0 18px}
.pvttl{font-size:12.5px;color:var(--faint);margin-bottom:10px}
.pvrow{display:flex;align-items:center;gap:10px;margin:6px 0}
.pvn{width:120px;font-size:13px;color:var(--ink);flex:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pvbar{flex:1;height:9px;background:var(--raised);border-radius:999px;overflow:hidden}.pvbar>span{display:block;height:9px;background:var(--brand);border-radius:999px}
.pvc{width:40px;text-align:right;font-size:12.5px;color:var(--muted);font-family:var(--mono);flex:none}
ul.aitools{list-style:none;padding:0;margin:0}ul.aitools li{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 15px;margin-bottom:9px;font-size:14px;color:var(--muted);line-height:1.55}ul.aitools li b{color:var(--ink)}
.chips{display:flex;flex-wrap:wrap;gap:8px}.chips .chip{font-size:13px;color:var(--ink);background:var(--brand-wash);border-radius:999px;padding:6px 13px;text-decoration:none;font-weight:500}.chips .chip:hover{background:var(--brand);color:var(--on-brand)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:9px}
.grid a{display:flex;justify-content:space-between;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;text-decoration:none;color:var(--ink);font-size:14px;font-weight:500;transition:border-color .12s,transform .12s}
.grid a:hover{border-color:var(--brand-ink);transform:translateY(-1px)}
.grid a .c{color:var(--ink);font-weight:600;font-size:12px;font-family:var(--mono);background:var(--raised);border-radius:999px;padding:2px 8px;white-space:nowrap}
/* Thẻ VIỆC LÀM trong .grid: phụ đề là TÊN CÔNG TY, dài tuỳ ý -> không dùng được viên chip
   `nowrap` ở trên (tên "Tổng Công Ty Cổ Phần Bảo Hiểm Ngân Hàng TMCP Công Thương Việt Nam"
   nở hết cỡ, ép tiêu đề xuống cột 1 CHỮ/DÒNG rồi tràn khỏi thẻ — đã cắn ở /luong/*).
   Xếp dọc: tiêu đề trên, công ty dưới dạng chữ thường, cho xuống dòng thoải mái. */
.grid.gjob a{flex-direction:column;align-items:flex-start;gap:4px}
.grid.gjob a .c{font-family:inherit;font-weight:500;color:var(--muted);background:none;padding:0;white-space:normal;line-height:1.35}
/* Khối tỉnh/chi nhánh cty: mặc định 1 dòng, nút đóng/mở (thuần CSS, không JS) */
.pvcol{position:relative}.pvtog{position:absolute;width:0;height:0;opacity:0}
.pvgrid{max-height:47px;overflow:hidden;transition:max-height .28s ease}
.pvtog:checked~.pvgrid{max-height:3000px}
.pvmore{display:inline-flex;align-items:center;gap:6px;margin-top:11px;cursor:pointer;color:var(--ink);font-weight:600;font-size:14px;user-select:none}
.pvmore::after{content:"Xem tất cả tỉnh / chi nhánh ▾"}
.pvtog:checked~.pvmore::after{content:"Thu gọn ▴"}
.pvtog:focus-visible~.pvmore{outline:2px solid var(--brand-ink);outline-offset:3px;border-radius:6px}
ul.jobs{list-style:none;padding:0;margin:0}
li.job{display:flex;gap:12px;align-items:flex-start;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin-bottom:10px;transition:border-color .12s}li.job:hover{border-color:var(--brand-ink)}
li.job .jlogo{width:44px;height:44px;border-radius:11px;object-fit:contain;background:#fff;border:1px solid var(--line);flex:none}
li.job .jltr{display:flex;align-items:center;justify-content:center;font-family:var(--disp);font-weight:700;font-size:19px;color:var(--ink);background:var(--raised);position:relative;overflow:hidden}
li.job .jltr>img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;border-radius:inherit}
li.job .jbody{flex:1;min-width:0}
li.job .jtags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
li.job .jtag{font-size:12px;color:var(--muted);background:var(--raised);border-radius:999px;padding:3px 10px}
li.job .jai{display:inline-flex;align-items:center;gap:3px;vertical-align:middle;margin-left:7px;font-size:10.5px;
font-weight:700;letter-spacing:.03em;line-height:1;padding:3px 7px 3px 5px;border-radius:999px;white-space:nowrap;
color:#1a5fb4;background:linear-gradient(100deg,#e7f0ff,#f0e8ff);border:1px solid #cfe0ff}
li.job .jai svg{width:11px;height:11px;fill:currentColor;flex:none}
@media(prefers-color-scheme:dark){li.job .jai{color:#a8c7ff;background:linear-gradient(100deg,#16233d,#231a3d);border-color:#2c3f66}}
li.job a.t{font-size:16px;color:var(--ink);text-decoration:none;font-weight:600;font-family:var(--disp);letter-spacing:-.01em}li.job a.t:hover{color:var(--ink)}
li.job .meta{color:var(--muted);font-size:13.5px;margin-top:5px}li.job .sal{color:var(--ink);font-weight:600}
/* Dòng cty (jco) và dòng lương·nơi làm (jsl) tách 2 dòng -> nới ít thôi, kẻo thẻ cao lêu nghêu */
li.job .meta+.meta{margin-top:2px}li.job .jloc{color:var(--muted)}
li.job .dates{color:var(--faint);font-size:12.5px;margin-top:5px}li.job .ddl{color:var(--ink);font-weight:600}
.intro{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:12px;padding:15px 17px;margin:22px 0;font-size:15px;color:var(--ink)}
.lead{margin:18px 0 6px}.lead h2{margin:0 0 8px;font-size:20px}.lead p{margin:0 0 10px;font-size:15px;line-height:1.65;color:var(--ink)}.lead ul.wul{margin:0 0 10px;padding-left:20px}.lead ul.wul li{margin:3px 0;font-size:15px;line-height:1.55}
/* Thẻ mẫu CV — mini "trang giấy" giống bản CV xuất ra trong app */
.cvgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin:6px 0 8px}
.cvcard{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:16px;transition:border-color .12s,transform .12s;display:flex;flex-direction:column}
.cvcard:hover{border-color:var(--brand-ink);transform:translateY(-1px)}
.cvcard .cvhead{display:flex;align-items:center;gap:11px;margin-bottom:11px}
.cvcard .cvava{width:42px;height:42px;border-radius:50%;background:var(--brand-wash);color:var(--ink);display:flex;align-items:center;justify-content:center;font-family:var(--disp);font-weight:700;font-size:17px;flex:none}
.cvcard h3.cvname{font-family:var(--disp);font-weight:700;font-size:16px;color:var(--ink);letter-spacing:-.01em;margin:0;display:block}
.cvcard .cvrole{font-size:12.5px;color:var(--ink);font-weight:600}
.cvcard .cvsum{font-size:13.5px;color:var(--muted);line-height:1.55;margin:0 0 11px}
.cvcard .cvlabel{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--faint);margin:0 0 7px}
.cvcard .cvskills{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
.cvcard .cvskill{font-size:12px;color:var(--ink);background:var(--raised);border-radius:999px;padding:4px 11px}
.cvcard .cvopen{margin-top:13px;display:inline-flex;align-items:center;gap:6px;align-self:flex-start;background:var(--brand);color:var(--on-brand);text-decoration:none;padding:8px 15px;border-radius:999px;font-weight:700;font-size:13px;font-family:var(--disp)}
.cvcard .cvopen:hover{background:var(--brand-ink);color:#fff}
.fmenu{display:flex;flex-wrap:wrap;gap:10px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:12px 14px;margin:0 0 24px}
.fdd{position:relative}
.fdd>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--ink);background:var(--raised);border:1px solid var(--line-strong);border-radius:999px;padding:8px 15px;user-select:none;white-space:nowrap;transition:border-color .12s,color .12s}
.fdd>summary::-webkit-details-marker{display:none}
.fdd>summary:hover,.fdd[open]>summary{border-color:var(--brand-ink);color:var(--ink)}
.fdd>summary .cv{font-size:10px;color:var(--faint);transition:transform .15s}
.fdd[open]>summary .cv{transform:rotate(180deg)}
.fdd-pop{position:absolute;z-index:40;top:calc(100% + 6px);left:0;width:min(300px,84vw);background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;box-shadow:0 12px 30px rgba(10,15,13,.14);padding:10px}
.fdd-q{width:100%;font:inherit;font-size:13.5px;padding:8px 11px;border:1px solid var(--line-strong);border-radius:9px;background:var(--bg);color:var(--ink);margin-bottom:8px}
.fdd-q:focus{outline:none;border-color:var(--brand-ink)}
.fdd-list{max-height:262px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}
.fdd-list a{display:block;flex:none;font-size:13.5px;text-decoration:none;color:var(--ink);border-radius:8px;padding:8px 11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fdd-list a:hover{background:var(--raised);color:var(--ink)}
.fdd-list a.on{background:var(--brand);color:var(--on-brand);font-weight:600}
.fdd-none{font-size:13px;color:var(--faint);padding:8px 11px}
.faq details{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:2px 16px;margin-bottom:9px}
.faq summary{font-family:var(--disp);font-weight:600;cursor:pointer;color:var(--ink);padding:13px 0;list-style:none}.faq summary::-webkit-details-marker{display:none}
.faq details[open] summary{color:var(--ink)}.faq details>div{margin:0 0 13px;color:var(--muted);font-size:14.5px}
footer{border-top:1px solid var(--line);margin-top:44px;padding-top:20px;color:var(--faint);font-size:13px}footer b{color:var(--ink)}
/* Chân trang BA CỘT (chủ site 15/09 chiều: "chia 3 cột"): cột 1 = tên site + slogan, icon mạng xã hội
   ngay dưới, nguồn dữ liệu, Giới thiệu · Liên hệ; cột 2 = Ngành đang tuyển nhiều; cột 3 = Đang được
   tìm nhiều (thiếu từ khoá nóng thì còn hai cột). Link trong hai cột xếp DỌC mỗi dòng một link. */
.ft3c{display:grid;grid-template-columns:1.25fr 1fr 1fr;gap:18px 32px;align-items:start}
.ftc .fth{display:block;color:var(--ink);font-weight:700;margin-bottom:6px}
.ftc .fl a{display:block;padding:2px 0}.ft1{margin-bottom:8px}.ftd{margin:8px 0 0}
@media(max-width:820px){.ft3c{grid-template-columns:1fr;gap:16px}}
/* Link mạng xã hội ở chân trang. Màu đặt TƯỜNG MINH: thẻ a trong file này không kế thừa màu chữ
   của footer, để mặc định là ra link xanh mặc định trình duyệt giữa khối chữ xám. */
.fsoc{display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.fsoc a{display:inline-flex;align-items:center;gap:6px;color:var(--muted);text-decoration:none;font-size:13px}
.fsoc a:hover{color:var(--ink)}
.fsoc svg{width:15px;height:15px;flex:none}
.app{display:inline-block;background:var(--brand);color:var(--on-brand);text-decoration:none;padding:11px 20px;border-radius:999px;font-weight:700;margin-top:8px;font-family:var(--disp)}.app:hover{background:var(--brand-ink);color:#fff}
.article{max-width:720px}.article p{margin:13px 0;font-size:15.5px;color:var(--ink)}
.article ul.wul{margin:10px 0;padding-left:20px}.article ul.wul li{margin:6px 0;font-size:15.5px}
.article blockquote.wq{margin:18px 0;padding:12px 16px;background:var(--panel);border-left:3px solid var(--brand);border-radius:10px;color:var(--muted);font-style:italic}
.article h3.wh3{font-size:17px;margin:22px 0 6px;color:var(--ink)}
/* Hình minh hoạ CV trong bài cẩm nang (_cv_layout_figure): 3 cột trong cột nội dung ~504px của
   desktop, tự rớt còn 2 trên mobile. Đáy 150px + gap 12px là số ĐO chứ không chọn cho đẹp: 3 cột
   phải lọt (504-24)/3 = 160px, mà 160px cũng là mức tối thiểu để vòng tròn chân dung 45px của
   _cv_mini vừa cột màu rộng 36% (trừ 2×7px padding) — hẹp hơn là nó tràn rồi bị overflow:hidden
   xén thành hình bán nguyệt. Đổi max-width của .article hay số đo trong _cv_mini thì tính lại.
   Dùng minmax(...,1fr) chứ không `1fr` trần: min của `1fr` là min-content của trang giấy A4 nên
   track nở quá khung, kéo cả bài cuộn ngang. */
.cvfig{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:16px 0 4px}
/* Reset cho MỌI khung hình CV, không lồng trong .cvfig: <figure> của trình duyệt có sẵn
   margin 40px hai bên, để nguyên thì trang giấy trong cột 190px chỉ còn 110px rồi bị
   overflow:hidden xén mất phần dưới (đã cắn đúng vậy ở hình thư xin việc). */
figure.cvfigi{margin:0;min-width:0}
.cvfig figcaption{font-size:12.5px;color:var(--muted);line-height:1.5;margin-top:8px}
.cvfig figcaption b{display:block;color:var(--ink);font-size:13.5px;margin-bottom:2px}
.cvfigend{font-size:13.5px;color:var(--faint)}
/* Biến thể 1 hình: trang giấy bên trái, chú thích bên phải (bài "mục tiêu nghề nghiệp" chỉ cần
   MỘT tấm, phóng to cho thấy rõ khối được tô). Cột ảnh cố định 190px chứ không 1fr — để 1fr thì
   trên desktop tấm giấy nở gấp đôi và chữ 6px bên trong loãng ra giữa mảng trắng. */
.cvfig1,.ltrfig{display:grid;grid-template-columns:190px minmax(0,1fr);gap:18px;align-items:start;margin:16px 0 4px}
.cvfig1 figcaption{font-size:14px;color:var(--muted);line-height:1.6;margin-top:0}
.cvfig1 figcaption b{display:block;color:var(--ink);font-size:15px;margin-bottom:4px}
.ltrfig ol.ltrleg{margin:0;padding-left:18px;font-size:14.5px;color:var(--muted);line-height:1.6}
.ltrfig ol.ltrleg li{margin:0 0 9px}.ltrfig ol.ltrleg b{color:var(--ink)}
@media(max-width:560px){.cvfig1,.ltrfig{grid-template-columns:minmax(0,1fr);gap:12px}
  .cvfig1 figure.cvfigi,.ltrfig figure.cvfigi{max-width:190px}}
/* Cụm /tra-cuu: mục lục chip + hình minh hoạ các bước + bảng so sánh xếp THẺ trên mobile.
   .wtbl có luật chung `td:nth-child(3){text-align:center;white-space:nowrap}` (hợp cho cột SỐ).
   Cột 3 bảng này là CHỮ ("Cần chuẩn bị") -> nowrap thổi min-content bảng lên >600px, kéo cả trang
   tràn ngang trên mobile. Trả lại wrap + canh trái.

   `wtxt3` = BẢN DÙNG CHUNG của đúng luật đó, cho MỌI bảng có cột 3 là văn xuôi (vd "Ghi chú").
   Tách tên riêng vì `tcmeth` còn kéo theo cả khối @media xếp thẻ bên dưới — khối đó đòi mỗi <td>
   có thuộc tính data-l để in nhãn, bảng không có data-l mà gắn tcmeth thì mobile ra thẻ MẤT NHÃN.
   Cần cột 3 xuống dòng thì dùng `wtxt3`; chỉ dùng `tcmeth` khi bảng thực sự có data-l.
   Triệu chứng khi quên: cột 3 dài (>~60 ký tự) không xuống dòng được nên nuốt hết bề ngang, cột 1
   bị ép về min-content và chữ rơi dọc mỗi dòng một chữ (đã cắn ở /lich-di-hoc-lai 11/08/2026). */
table.wtbl.wtxt3 td:nth-child(3),table.wtbl.tcmeth td:nth-child(3){text-align:left;white-space:normal;font-weight:400}
.tcnav{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 16px}
.tcnav a{font-size:13.5px;font-weight:600;text-decoration:none;color:var(--ink);background:var(--brand-wash,#EBFFC8);
  border:1px solid var(--line);border-radius:999px;padding:7px 13px}
.tcnav a:hover{background:var(--brand);color:var(--on-brand)}
.tcfig{margin:14px 0 6px}
.tcfig img{width:100%;height:auto;display:block;border:1px solid var(--line);border-radius:14px;background:#fff}
.tcfig figcaption{font-size:13px;color:var(--faint);margin-top:6px}
@media(max-width:560px){
  /* display:block cho cả table + tbody: chỉ đặt min-width:0 thì table vẫn shrink-to-fit theo
     min-content của ô -> chữ vẫn tràn khỏi khung 343px. */
  table.wtbl.tcmeth,.tcmeth tbody{display:block;width:100%;min-width:0}
  .tcmeth thead{display:none}
  .tcmeth tr{display:block;padding:11px 13px;border-bottom:1px solid var(--line)}
  .tcmeth tr:nth-child(even){background:var(--raised)}
  .tcmeth td{display:block;border:0;padding:2px 0;font-size:14px}
  .tcmeth td:first-child{font-size:15px;margin-bottom:3px}
  .tcmeth td[data-l]:before{content:attr(data-l) ": ";color:var(--faint)}
}
/* Bảng .wtbl dùng ĐỘC LẬP (không bắt buộc nằm trong .article) — trước đây scope .article khiến
   bảng ở trang hub /lich-nghi-le mất style, hiện thô xấu. */
.wtblwrap{overflow-x:auto;margin:16px 0;border:1px solid var(--line);border-radius:14px;background:var(--panel)}
table.wtbl{border-collapse:collapse;width:100%;min-width:460px;font-size:14.5px;background:var(--panel);border-radius:14px;overflow:hidden}
table.wtbl th,table.wtbl td{padding:11px 14px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
table.wtbl thead th{background:var(--brand-wash,#EBFFC8);font-weight:700;color:var(--ink);border-bottom:2px solid var(--line-strong);white-space:nowrap}
table.wtbl tbody tr:nth-child(even){background:var(--raised)}
table.wtbl tbody tr:last-child td{border-bottom:0}
table.wtbl tbody tr:hover{background:var(--brand-wash)}
table.wtbl td:nth-child(3){text-align:center;white-space:nowrap;font-weight:600}
table.wtbl td a{color:var(--ink);text-decoration:none;font-weight:600}table.wtbl td a:hover{text-decoration:underline}
/* Bài AI chuẩn GEO (topon.tech-style): hero tự-gen + mục lục + bảng so sánh + box CTA + H3 */
.aihero{width:100%;height:auto;display:block;border-radius:16px;border:1px solid var(--line);margin:6px 0 20px;aspect-ratio:1200/500}
.toc{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 18px;margin:0 0 22px}
.toc b{font-family:var(--disp);font-size:13px;color:var(--faint);text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:9px}
.toc ol{margin:0;padding-left:20px}.toc li{margin:5px 0;font-size:14.5px}.toc a{color:var(--ink);text-decoration:none;font-weight:500}.toc a:hover{text-decoration:underline}
h3.aih3{font-family:var(--disp);font-weight:600;font-size:16.5px;margin:22px 0 8px;color:var(--ink)}
.geotblwrap{overflow-x:auto;margin:16px 0 20px}
table.geotbl{border-collapse:collapse;width:100%;min-width:420px;font-size:14px;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden}
table.geotbl caption{caption-side:top;text-align:left;font-size:12.5px;color:var(--faint);padding:0 0 8px}
table.geotbl th,table.geotbl td{padding:10px 13px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
table.geotbl thead th{background:var(--raised);font-family:var(--disp);font-weight:600;color:var(--ink);white-space:nowrap}
table.geotbl tbody tr:last-child td{border-bottom:0}table.geotbl td:first-child{font-weight:600;color:var(--ink)}
/* Link TRONG bảng phải tự tô: sheet này KHÔNG có rule `a{color}` toàn cục, và luật gom
   `:where(main.main) :where(p,dd,…) a` cố ý không phủ ô bảng. Không có rule này thì mọi <a> trong
   geotbl rơi về mặc định trình duyệt — xanh #0000EE, TÍM #551A8B sau khi bấm, kèm gạch chân (thấy
   ở bảng so sánh /app-game/{slug}). Viết cho geotbl như một component, ĐỪNG nới luật gom sang
   `td a`: đo 143 trang thấy nó làm đậm 418 link bảng khác, gồm cả số ngày trên lưới lịch âm. */
table.geotbl td a{color:var(--ink);text-decoration:none;font-weight:600}
table.geotbl td a:hover{text-decoration:underline}
/* min-width:420px + padding 13px làm bảng LUÔN rộng hơn khung 343px của điện thoại -> cột cuối
   ("Trạng thái" ở lịch tuyển sinh, "Giá từ" ở giá token AI) bị cắt và không có dấu hiệu cuộn.
   Bỏ min-width + thu padding để bảng vừa màn hình; cột nào vẫn dài thì .geotblwrap cuộn ngang. */
@media(max-width:640px){table.geotbl{min-width:0;font-size:13.5px}table.geotbl th,table.geotbl td{padding:9px 9px}table.geotbl thead th{white-space:normal}}
.ctabox{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:14px;padding:16px 18px;margin:26px 0 8px}
.ctabox p{margin:0 0 12px;font-size:15px;color:var(--ink)}
@media(max-width:560px){h1{font-size:24px}.fmenu{gap:8px}.fdd,.fdd>summary{width:100%}.fdd>summary{justify-content:space-between}.fdd-pop{width:100%}}
/* Bài cẩm nang: nội dung + sidebar phải (việc làm). Mobile: xếp dọc. */
.artwrap{display:grid;grid-template-columns:1fr;gap:26px}
/* BẪY ĐÃ CẮN (01/08/2026): con của grid mặc định min-width:auto = KHÔNG co dưới min-content của
   nội dung. Chỉ cần bên trong có 1 bảng .wtbl (min-width:460px) là .artmain nở 626px -> layout
   viewport phình 642px, TOÀN TRANG tràn ngang trên mobile (chữ bị cắt mép phải), dù bảng đã nằm
   trong .wtblwrap overflow-x:auto. */
.artwrap>*{min-width:0}
@media(min-width:900px){.artwrap{grid-template-columns:minmax(0,1fr) 300px}}
.aside{align-self:start}
@media(min-width:900px){.aside{position:sticky;top:74px}}
.aside .box{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin-bottom:14px}
.aside .box h3{font-family:var(--disp);font-size:15px;margin:0 0 8px;color:var(--ink)}
.aside a.jb{display:block;padding:9px 0;border-bottom:1px solid var(--line);text-decoration:none;color:var(--ink);font-size:13.5px;font-weight:600;font-family:var(--disp)}
.aside a.jb:last-child{border-bottom:0;padding-bottom:0}
.aside a.jb:hover{color:var(--ink)}
.aside a.jb .m{display:block;color:var(--muted);font-size:12px;margin-top:2px;font-weight:400;font-family:'Inter',sans-serif}
/* Mức lương trên thẻ việc cột phải — dòng riêng, màu brand để quét mắt nhanh; <em> ("dự kiến" /
   "tham khảo") nhạt hơn để không đọc nhầm thành lương tin ghi. */
.aside a.jb .s{display:block;color:var(--ink);font-size:12.5px;margin-top:3px;font-weight:700;font-family:'Inter',sans-serif}
.aside a.jb .s em{color:var(--faint);font-weight:400;font-style:normal}
.aside .cta{display:block;text-align:center;background:var(--brand);color:var(--on-brand);text-decoration:none;font-weight:700;font-family:var(--disp);border-radius:999px;padding:11px 14px}
.aside .cta:hover{background:var(--brand-ink);color:#fff}
/* Lưới 3 cột (trang kỹ năng) — như thẻ việc app; xuống 2 cột tablet, 1 cột mobile */
/* 15/09/2026 tối (chủ site: "ở các trang danh sách chỉ để 2 cột"): lưới thẻ việc TỐI ĐA 2 cột trên mọi trang
   danh sách (hub, tỉnh/ngành/lương, danh mục, công ty…). Giữ tên class grid3 (nhiều chỗ dùng + test), chỉ đổi số cột. */
ul.jobs.grid3{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
ul.jobs.grid3 li.job{margin-bottom:0}
@media(max-width:620px){ul.jobs.grid3{grid-template-columns:1fr}}
/* Lưới 3 cột mà chỉ có 1–2 tin thì thẻ bị bóp còn 1/3 bề ngang: tiêu đề việc xuống dòng từng chữ
   ("Country / Marketing / Manager"), đọc rất xấu — thấy rõ ở trang chi tiết danh bạ giáo dục, nơi
   đơn vị thường chỉ có 1 tin. Số cột bám theo SỐ TIN (class n1/n2 do _job_list_html gắn).
   ⚠️ Bọc trong min-width:621px: nếu để trần, `.n2` (3 class) thắng media query mobile (2 class)
   -> điện thoại hiện 2 cột, thẻ tràn ngang. */
@media(min-width:621px){ul.jobs.grid3.n1{grid-template-columns:minmax(0,1fr)}ul.jobs.grid3.n2{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* Khối "việc liên quan" NHÚNG trong bài (.artmain) — cột nội dung đã bị trừ sidebar trái + rail
   300px nên chỉ còn ~660px; chia 3 cột thì mỗi thẻ ~205px, tên việc xuống 4–5 dòng từng chữ
   ("Trưởng / Phòng / Hành Chính / Nhân Sự"). Luôn 1 cột, đọc như danh sách.
   ⚠️ PHẢI đứng SAU rule .n1/.n2 ở trên: cùng specificity (0,3,1), thứ tự nguồn quyết định. */
.artmain ul.jobs.grid3{grid-template-columns:minmax(0,1fr)}
/* Nút chọn SỐ CỘT (1/2) — CSS thuần (radio ẩn + ~ selector), không JS -> hợp CSP. Chỉ áp ≥621px;
   mobile luôn 1 cột (media query trên thắng). Radio là SIBLING trước <ul.jobs.grid3> trong .main. */
input.colsw{position:absolute;width:0;height:0;opacity:0;pointer-events:none}
.colswbar{display:flex;gap:6px;align-items:center;justify-content:flex-end;margin:2px 0 12px;font-size:12.5px;color:var(--faint)}
.colswbar label{cursor:pointer;border:1px solid var(--line);border-radius:8px;padding:3px 11px;font-weight:700;color:var(--muted);background:var(--panel);line-height:1.5}
.colswbar label:hover{border-color:var(--line-strong)}
#jc1:checked~.colswbar label[for=jc1],#jc2:checked~.colswbar label[for=jc2]{background:var(--brand);color:var(--on-brand);border-color:var(--brand)}
@media(min-width:621px){#jc1:checked~ul.jobs.grid3{grid-template-columns:1fr}#jc2:checked~ul.jobs.grid3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.colswbar{display:none}}
.morewrap{text-align:center;margin:22px 0 4px}
.morebtn{background:var(--panel);border:1px solid var(--line-strong);border-radius:999px;padding:11px 26px;font-size:14px;font-weight:600;font-family:var(--disp);color:var(--ink);cursor:pointer}
.morebtn:hover{border-color:var(--brand-ink);background:var(--raised)}
.morebtn:disabled{opacity:.55;cursor:default}
/* ===== HEADER TRÊN ĐIỆN THOẠI ===== brand chỉ còn logo (chữ ẩn) để hàng icon nhóm có chỗ cuộn
   ngang ngay cạnh nó. (Các luật ô tìm/popup Lọc của bản cũ đã bỏ cùng ô tìm, 15/09 chiều.) */
@media(max-width:560px){
header .hd{padding:10px 12px;gap:10px}
header .brand{font-size:0;gap:0}
}

header .gnav{flex:1;min-width:0}
header .gnavin{display:flex;align-items:center;gap:4px}
header .gm{position:relative;flex:none;padding:5px 0}
header .gmb,header .gall{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 9px;
border:1px solid transparent;border-radius:999px;background:transparent;color:var(--muted);
cursor:pointer;font-size:13.5px;font-family:var(--disp);font-weight:500;text-decoration:none;white-space:nowrap}
header .gmb:hover,header .gall:hover{background:var(--raised);color:var(--ink)}
header .gm.on>.gmb{background:var(--brand-wash);color:var(--ink);border-color:var(--brand-ink);font-weight:600}
header .gmn{display:none}
header .gm.on>.gmb .gmn,header .gall .gmn{display:inline}
header .gmb .icn,header .gall .icn{width:18px;height:18px;vertical-align:-.2em}
header .gall{flex:none;margin:5px 0 5px auto;color:var(--faint)}
header .gmp{display:none;position:absolute;left:0;top:100%;z-index:70;
width:min(320px,92vw);max-height:min(70vh,520px);overflow-y:auto;padding:8px;
border:1px solid var(--line);border-radius:14px;background:var(--panel);box-shadow:0 14px 34px rgba(0,0,0,.14)}
header .gm:hover>.gmp,header .gm:focus-within>.gmp,header .gm.open>.gmp{display:block}
header .gmp .gmph{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--faint);
padding:6px 10px 8px;font-weight:600}
header .gmp a{display:block;padding:8px 10px;border-radius:9px;color:var(--ink);text-decoration:none;font-size:14px}
header .gmp a:hover{background:var(--raised)}
header .gmp a.on{background:var(--brand-wash);font-weight:600}
header .gmp .gtag{margin-left:6px;font-size:9.5px;font-weight:700;letter-spacing:.03em;color:#A63A24;
background:#FDECE8;border-radius:4px;padding:1px 5px;vertical-align:middle}
header .gmp .gtag.ghot{color:#8A5A00;background:#FFF2D6}
header .gmp .gmpall{margin-top:6px;border-top:1px solid var(--line);padding-top:10px;
font-weight:600;color:var(--brand-ink)}
header .gm:nth-last-child(-n+5)>.gmp{left:auto;right:0}
@media(max-width:1080px){
header .gnavin{overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
header .gnavin::-webkit-scrollbar{display:none}
header .gm{position:static}
header .gall{margin-left:4px}
header .gmp,header .gm:nth-last-child(-n+5)>.gmp{left:10px;right:10px;width:auto;top:100%}
}

/* MỘT CỘT từ 15/09/2026: menu 19 nhóm đã dời lên hàng icon trong <header> (group_nav.py),
   cột trái 312px không còn. Bề ngang hạ 1360 -> 1200 cùng lúc: bỏ menu mà giữ nguyên 1360 thì
   cột chữ rộng 1.328px, dài quá một dòng đọc được. Header (.hd, .gnavin) và thanh ứng tuyển
   dính đáy (.japplybar .jabg) phải cùng số này, nếu không logo/nút lệch khỏi mép nội dung. */
.shell{max-width:1200px;margin:0 auto;padding:20px 16px 64px;display:grid;grid-template-columns:minmax(0,1fr);align-items:start}
/* Trang TẬP TRUNG (_page(focus=True), hiện là cụm /cv-mau): hẹp hơn mặc định và KHÔNG có hàng
   icon nhóm (xem _gnav ở _page) — người vào đó đang chọn mẫu CV, mọi thứ trên màn đều rủ họ đi
   chỗ khác. Từ 15/09/2026 mọi trang đều một cột nên chỗ này chỉ còn khác ở max-width. */
.pgfocus .shell{grid-template-columns:minmax(0,1fr);max-width:1080px}
.main{min-width:0}
/* ===== CỘT PHẢI trong .main (khung 3 cột: menu trái · nội dung · rail) — xem _leaf(rail_fn=) =====
   minmax(0,1fr) chứ KHÔNG "1fr" trần: 1fr = minmax(auto,1fr), gặp bảng/khối rộng là cột nở theo
   và đẩy cả trang tràn ngang trên điện thoại.
   Dưới 1260px rail xuống DƯỚI nội dung (không ẩn): 300px nữa là cột nội dung còn quá hẹp cho
   lưới việc làm, nhưng nội dung rail vẫn đáng đọc nên giữ lại, chỉ đổi chỗ. */
.crow{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:24px;align-items:start}
.ccol{min-width:0}
.crail{position:sticky;top:74px;max-height:calc(100vh - 92px);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;display:grid;gap:14px;min-width:0}
.crail::-webkit-scrollbar{width:7px}.crail::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:999px}
.crbox{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:14px 16px}
.crbox h3{font-family:var(--disp);font-size:14.5px;font-weight:700;color:var(--ink);margin:0 0 10px;letter-spacing:-.01em}
.crbox .crrow{display:flex;gap:10px;justify-content:space-between;font-size:13px;padding:7px 0;border-top:1px solid var(--line)}
.crbox .crrow:first-of-type{border-top:0}
.crbox .crk{color:var(--muted);flex:none}
.crbox .crv{color:var(--ink);font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere}
.crbox .crv a,.crbox .crk a{color:var(--ink);text-decoration:none}
/* Chi nhánh: tên trên, ĐỊA CHỈ xuống dòng riêng — địa chỉ dài 60-90 ký tự, nhét chung cột phải
   kiểu crrow (nhãn trái/giá trị phải) là mỗi dòng gãy 4-5 khúc. */
.crbox .crbr{padding:8px 0;border-top:1px solid var(--line);font-size:13px}
.crbox .crbr:first-of-type{border-top:0}
.crbox .crbr b{display:block;color:var(--ink);font-weight:600}
.crbox .crbr span{display:block;color:var(--muted);margin-top:2px;overflow-wrap:anywhere}
.crbox .crbr span a{color:var(--ink);text-decoration:none}
.crbox a.crlink{display:flex;gap:8px;align-items:baseline;justify-content:space-between;padding:8px 0;border-top:1px solid var(--line);color:var(--ink);text-decoration:none;font-size:13.5px}
.crbox a.crlink:first-of-type{border-top:0}
.crbox a.crlink:hover{color:var(--ink)}
.crbox a.crlink .crn{flex:none;font-size:12px;color:var(--faint);font-family:var(--mono)}
.crbox .crsub{display:block;font-size:12px;line-height:1.4;color:var(--faint);padding:0 0 8px}
.crbox a.crjob{display:block;padding:9px 0;border-top:1px solid var(--line);text-decoration:none;color:var(--ink)}
.crbox a.crjob:first-of-type{border-top:0}
.crbox a.crjob b{display:block;font-size:13.5px;font-weight:600;line-height:1.4}
.crbox a.crjob:hover b{color:var(--ink)}
.crbox a.crjob small{display:block;color:var(--muted);font-size:12px;margin-top:2px}
.crbox a.crjob small.s{color:var(--ink);font-weight:600}
/* "· dự kiến" / "· tham khảo" do _sal_short sinh — nhạt hơn để không đọc nhầm là lương tin ghi */
.crbox a.crjob small.s em{color:var(--faint);font-weight:400;font-style:normal}
.crbox .faq details{margin:0;border:0;border-top:1px solid var(--line);border-radius:0;padding:8px 0;background:none}
.crbox .faq details:first-of-type{border-top:0}
.crbox .faq summary{font-size:13px;padding:0;font-weight:600}
.crbox .faq details>div{font-size:12.5px;margin:0;padding:6px 0 0}
/* Hộp AI ở cột phải (_ai_rail_box). Tiền tố `air` theo cụm — tên trần kiểu `.big`/`.bar` trong file
   33k dòng này là chờ va chạm (xem bài học def/selector trùng tên). */
.crbox .airbig{font-family:var(--disp);font-size:27px;font-weight:800;color:var(--ink);line-height:1.05;letter-spacing:-.02em}
.crbox .airsub{font-size:12.5px;color:var(--muted);margin:3px 0 11px;line-height:1.45}
.crbox .airsub b{color:var(--brand-ink)}
.crbox .airlbl{font-size:11px;font-weight:700;color:var(--faint);text-transform:uppercase;letter-spacing:.03em;margin-bottom:2px}
.crbox .airrow{display:grid;grid-template-columns:1fr auto;gap:4px 8px;align-items:baseline;
  padding:8px 0;border-top:1px solid var(--line);font-size:13px;color:var(--ink);text-decoration:none}
.crbox .airrow:first-of-type{border-top:0}
.crbox a.airrow:hover .nm{color:var(--ink)}
.crbox .airrow .pc{font-weight:700;color:var(--brand-ink);font-variant-numeric:tabular-nums}
.crbox .airrow .bar{grid-column:1/-1;height:4px;border-radius:999px;background:var(--brand);min-width:6px}
.crall{display:block;margin-top:10px;font-size:12.5px;font-weight:600;color:var(--ink);text-decoration:none}
.crail .cbrand{margin:0 0 12px;padding:14px}.crail .cstats .cstat{flex:1 1 calc(50% - 5px);min-width:0}.crail .cskills{margin:0 0 14px}
.crall:hover{text-decoration:underline}
@media(max-width:1260px){.crow{grid-template-columns:minmax(0,1fr)}.crail{position:static;max-height:none;overflow:visible}
  /* Hub /viec-lam: màn hẹp thì ĐƯA cột phải LÊN TRƯỚC. Rail xếp sau .ccol nghĩa là hộp AI nằm dưới
     8 bảng xếp hạng — trên điện thoại gần như không ai cuộn tới (đã cắn đúng bệnh này ở trang tỉnh,
     phải chuyển khối công ty lên cột chính). `order` trên grid item = đổi CHỖ HIỂN THỊ, DOM giữ
     nguyên nên không nhân đôi HTML và không đổi thứ tự đọc của máy tìm kiếm ở desktop.
     CHỈ áp cho .hubrow — trang ngành/công ty cố ý để rail (Lịch, FAQ, việc liên quan) xuống dưới. */
  .hubrow .crail{order:-1;margin-bottom:6px}}

.qtabs{margin-bottom:14px}
.qtabs>input{position:absolute;opacity:0;pointer-events:none}
.qtabs .qhead{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}
.qtabs .qhead label{cursor:pointer;border:1px solid var(--line);background:var(--panel);
  border-radius:999px;padding:6px 11px;font-size:12.5px;font-weight:600;color:var(--ink);line-height:1.2}
.qtabs .qpane{display:none}
/* color+text-decoration BẮT BUỘC: site không có rule `a{color}` toàn cục, mỗi khối tự tô link.
   Thiếu 2 thuộc tính này thì <a class=qrow> rơi về mặc định trình duyệt — xanh #0000EE, và TÍM
   #551A8B sau khi bấm — kèm gạch chân ăn xuống cả .qd/.qn/.qw (text-decoration của cha vẽ đè con
   dù con khai none). Cả khối Lịch trông như HTML thô. Đã cắn 04/08/2026 ở /viec-lam/nganh/*. */
.qtabs .qpane .qrow{display:flex;gap:9px;align-items:baseline;padding:7px 0;border-top:1px solid var(--line);
  color:var(--ink);text-decoration:none}
.qtabs .qpane .qrow:first-child{border-top:0}
.qtabs .qpane a.qrow:hover .qn{color:var(--ink)}
.qtabs .qd{font-size:12px;color:var(--muted);min-width:38px;font-weight:600}
.qtabs .qn{flex:1;min-width:0;font-size:13px;color:var(--ink)}
.qtabs .qn i{display:block;font-style:normal;font-size:11.5px;color:var(--muted)}
.qtabs .qw{font-size:11.5px;color:var(--muted);white-space:nowrap}
.qtabs .qbig{font-size:23px;font-weight:800;color:var(--ink);line-height:1.1}
.qtabs .qbars{display:flex;align-items:flex-end;gap:2px;height:46px;margin:10px 0 4px}
.qtabs .qbars span{flex:1;background:var(--brand);border-radius:2px;min-width:2px}
.qtabs .qbars span.cut{background:#D97706}
.qtabs .qmore{display:inline-block;margin-top:7px;font-size:12px;font-weight:600;
  color:var(--ink);text-decoration:none}
.qtabs .qmore:hover{text-decoration:underline}
/* Hai tab đầu CHỈ CÒN ICON (user chốt 09/08/2026, khớp app): mùa tuyển sinh hàng chip có 4 ô,
   để nguyên chữ là rớt xuống hai dòng. Nhãn chữ vẫn nằm trong `aria-label` cho trình đọc màn hình
   — bỏ hẳn thì cái nhãn còn mỗi emoji, mà emoji thì trình đọc đọc ra "mặt trời sau mây". */
.qtabs .qhead label.qico{padding:6px 9px;font-size:15px;line-height:1}
/* Tab ĐANG CHỌN: nền nhấn mờ --brand-wash + viền lime + chữ --brand-ink. CHỈ dùng token có khai ở
   :root của _page/brand.css — bản cũ viết --brand-soft/--brand-deep (bộ token của static/*.html,
   khác hệ) nên khai báo hỏng lúc tính giá trị: nền thành trong suốt, chữ rơi về màu cha, tab chọn
   nhìn y hệt tab tắt mà không có lỗi nào nổi lên. Lime KHÔNG được làm màu chữ (1,21:1). */
#qt-a:checked~.qhead label[for=qt-a],#qt-b:checked~.qhead label[for=qt-b],
#qt-c:checked~.qhead label[for=qt-c],#qt-d:checked~.qhead label[for=qt-d]{background:var(--brand-wash);border-color:var(--brand);color:var(--brand-ink)}
#qt-a:checked~.qp-a,#qt-b:checked~.qp-b,#qt-c:checked~.qp-c,#qt-d:checked~.qp-d{display:block}
.qtabs .qsc{font-size:12.5px;font-weight:700;color:var(--brand-ink);white-space:nowrap}

/* ── CHỮ LINK = ĐEN, có gạch chân (user chốt 10/08/2026) ─────────────────────────────────────
   Vì sao: màu link cũ là xanh lá đậm #3F6212. Nó ĐẠT chuẩn tương phản (7,1:1 trên nền trắng)
   nhưng ở cỡ chữ bảng thì đọc mệt, mà bảng điểm chuẩn có tới 218 link/trang — nguyên cột tên
   trường xanh lè. Đo trên trang đó: MỌI chữ xanh đều là <a>, không có <p>/<td> nào xanh, nên
   chỉ cần đụng link là xong, không phải sửa 334 chỗ khai màu rải rác.

   ⚠️ 11/08/2026 — USER CHỐT BỎ GẠCH CHÂN THƯỜNG TRỰC, CHỈ CÒN KHI RÊ CHUỘT. Trước đó (10/08)
   luật này gạch chân LUÔN, lý do ghi ngay dưới đây và vẫn đúng về mặt kỹ thuật — nhưng user
   nhìn bảng 232 trường gạch chân kín cột và quyết định đổi. Đây là ĐÁNH ĐỔI ĐÃ ĐƯỢC BIẾT, đừng
   "sửa lại cho đúng" khi thấy trang trơ:
     · Link ở đây `text-decoration:none` khắp nơi và MÀU đã bị ép đen (luật ngay dưới), nên khi
       không hover thì link KHÔNG còn dấu hiệu thị giác nào. Trên MOBILE không có hover ⇒ tên
       trường trong bảng là chữ đen trơn hoàn toàn.
     · Muốn trả lại dấu hiệu mà vẫn không gạch chân thì đường đúng là trả lại MÀU link (bỏ luật
       ép `--ink` bên dưới), chứ không phải bật lại gạch chân thường trực.

   `!important` vì màu link được khai ở ~334 luật theo COMPONENT (.tstbl a, nav.bc a, .vlart a…),
   mỗi luật một class nên đứng trên mọi selector chung mình viết được ở đây.

   Tiện thể vá luôn bẫy [[seo-link-color-default-trap]]: link nào KHÔNG được component nào khai
   màu thì trước đây rơi về XANH DƯƠNG mặc định của trình duyệt — đo được 4 cái ở trang điểm
   chuẩn, 8 cái ở /tuyen-sinh. Nay chúng cũng đen như phần còn lại.

   ⚠️ HAI LUẬT RIÊNG, ĐỪNG GỘP LẠI (vá 10/08/2026, user báo "text bị gạch chân hết rồi"):

   1) GẠCH CHÂN (nay CHỈ khi `:hover`) chỉ áp trong NGỮ CẢNH CHỮ (đoạn văn, ô bảng, mô tả) —
      KHÔNG áp cho cả `main a`.
      Bản gộp dùng `main a:not(…):not(…)` = specificity (0,3,2), đè luôn ~115 chỗ component cố ý
      khai `text-decoration:none` cho THẺ và NÚT: mỗi thẻ việc ở cột phải (.aside a.jb,
      .crbox a.crjob) là MỘT thẻ <a> bọc cả tên việc + tên công ty + lương, nên gạch chân ăn
      xuống từng dòng — cả cột phải thành gạch chân; chip, tab, nút cũng vậy.
      Chỗ CẦN gạch chân (khi hover) là tên trường trong bảng điểm chuẩn (218 link/trang, nằm
      trong <td>) và link trong câu văn (<p>). Nút/chip/thẻ đã có hộp riêng làm dấu hiệu nên
      không cần, gạch chân ở đó là lỗi — DANH SÁCH `:not()` dưới đây giữ nguyên vai trò đó kể cả
      khi chỉ còn hover.
      ⚠️ ĐỪNG hạ xuống `:where()` cho gọn: specificity 0 thì ~115 luật `text-decoration:none` kia
      thắng ngược, kể cả `table.wtbl td a` — hover cũng hết gạch chân, tức mất nốt dấu hiệu bấm
      được CUỐI CÙNG còn lại sau khi bỏ gạch chân thường trực. Phải `!important`.
      ⚠️ DANH SÁCH NGỮ CẢNH phải KHỚP luật MÀU bên dưới (nay là p,td,th,li,dd,figcaption,
      blockquote,nav.bc,.hsnote,.sub,.meta). Ngữ cảnh nào bị ép đen mà KHÔNG có trong luật hover
      này thì link ở đó vừa mất màu vừa không có gạch chân — chữ đen trơn tuyệt đối, kể cả khi rê
      chuột. Mở rộng một luật thì mở rộng luật kia cùng lúc.

   2) MÀU thì vẫn cần `!important` (để đè 334 luật khai xanh) nhưng phải TRỪ NÚT NỀN ĐẶC: .app,
      .cta, .cvopen đổi sang chữ TRẮNG khi hover trên nền xanh đậm, ép `--ink` là chữ đen trên
      nền đen — nút không đọc được (user báo "hover vào lỗi màu"). Thêm nút nền đặc mới thì
      thêm class vào đây. Các chỗ hover ra `var(--on-brand)` KHÔNG cần trừ: on-brand vốn đã tối. */
main :is(p,td,th,li,dd,figcaption,blockquote,nav.bc,.hsnote,.sub,.meta) a:not(.app):not(.cta):not(.cvopen):not(.chip):not(.rolechip):not(.tscard):not(.tsbtn):not(.hq):hover{
  text-decoration:underline !important;text-underline-offset:2px;
  text-decoration-thickness:2px;text-decoration-color:var(--ink)}
/* MÀU LINK — hai luật, cố ý KHÔNG dùng `main a` trần nữa.

   Vì sao đổi (10/08/2026, lần thứ HAI luật này làm hỏng nút): bản cũ là
   `main a:not(…):not(…){color:var(--ink) !important}` — ép đen MỌI link rồi chừa nút bằng một
   DANH SÁCH KHAI TAY. Danh sách đó không thể đủ: `.stbtn` (nút "Tải trên App Store", chữ #fff
   trên nền var(--ink)) không có trong danh sách nên thành CHỮ ĐEN TRÊN NỀN ĐEN — tương phản đo
   được 1.0, người dùng thấy một khối đen đặc ở trang /app-game/*. Trước đó `.app/.cta/.cvopen`
   cũng đã hỏng đúng kiểu này lúc hover.

   Cách mới KHÔNG cần biết trước có những nút nào — nó fail về phía an toàn:
     (1) `:where(main) a` specificity 0 -> CHỈ tô link mà KHÔNG component nào khai màu (đây đúng
         là nhóm từng rơi về xanh dương mặc định của trình duyệt). Component nào tự khai màu —
         mọi nút, thẻ, chip — đều thắng, nên không bao giờ bị ép đen nữa.
     (2) Ép `!important` CHỈ trong NGỮ CẢNH CHỮ (p/td/li/nav.bc/.hsnote…), đúng chỗ user kêu khó
         đọc (218 tên trường trong <td>, link trong câu văn). Nút nằm trong <div> nên không dính.
   Sót một loại container chữ thì hậu quả là link đó CÒN XANH — khó chịu nhưng đọc được; còn sót
   một loại nút thì nút biến mất. Chọn hướng sai ít hại hơn. */
:where(main) a{color:var(--ink)}
main :is(p,td,th,li,dd,figcaption,blockquote,nav.bc,.hsnote,.sub,.meta) a:not(.app):not(.cta):not(.cvopen):not(.chip):not(.rolechip):not(.tscard):not(.tsbtn):not(.hq):not(.stbtn){color:var(--ink) !important}
@media(max-width:900px){.shell{padding-top:14px}}

svg.icn{width:1.05em;height:1.05em;vertical-align:-.16em;display:inline-block;flex:none}.icc{display:inline-block;font:600 .68em/1.3 Inter,system-ui,sans-serif;letter-spacing:.03em;border:1px solid currentColor;border-radius:3px;padding:0 3px;vertical-align:.14em}.ice{filter:grayscale(1)}
.jhead{display:flex;gap:13px;align-items:center;margin:2px 0 12px}.jhead img,.jhead .jlogo{width:54px;height:54px;border-radius:14px;object-fit:cover;flex:0 0 auto;border:1px solid var(--line);background:var(--panel)}.jhead .jlogo{display:flex;align-items:center;justify-content:center;font-weight:700;font-size:22px;color:var(--ink);position:relative;overflow:hidden}.jhead .jlogo>img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;border-radius:inherit;border:0}.jco{font-weight:600;font-size:15.5px;color:var(--ink)}.jco a{color:inherit;text-decoration:none}.jco a:hover{text-decoration:underline}.jhead .m2{color:var(--muted);font-size:13px;margin-top:2px}.pills{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:14px 0 22px}.pill{display:inline-flex;align-items:center;gap:4px;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:7px 13px;font-size:13.5px;color:var(--ink)}.pill.sal{background:var(--brand-soft,rgba(182,255,60,.30));border-color:var(--brand);font-weight:700}.jexpired{margin:10px 0 2px;padding:11px 14px;border-radius:12px;font-size:14px;line-height:1.6;background:#FFF6E5;border:1px solid #F0D9A8;color:#6B4E12}.jexpired b{color:#5A3F08}@media(prefers-color-scheme:dark){.jexpired{background:#2C2415;border-color:#5A4A22;color:#F0DCB0}.jexpired b{color:#FFEBC2}}.jdesc a{color:var(--ink);font-weight:600;text-decoration:none;border-bottom:1px dotted var(--brand-ink)}.jdesc a:hover{border-bottom-style:solid}.jdesc p{margin:0 0 8px}.jdesc p.jdh{margin:16px 0 6px;font-weight:700}.jdesc p.jdh:first-child{margin-top:0}.jdesc ul{margin:0 0 10px;padding-left:22px}.jdesc li{margin:3px 0}.jdesc :where(pre,code,tt,kbd,samp){font:inherit;white-space:pre-wrap}.jdesc :where(span,font,big,small,u,center,div,td,th){font-family:inherit;font-size:inherit}.jshare{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:18px 0 0;padding:12px 15px;border:1px solid var(--line);border-radius:14px;background:var(--panel)}.jshare-t{flex:1 1 auto;min-width:150px;font-size:14px;color:var(--muted)}.jshare-b{display:inline-flex;align-items:center;gap:7px;background:transparent;border:1px solid var(--brand);border-radius:999px;padding:9px 18px;cursor:pointer;font-weight:700;font-family:var(--disp);font-size:14px;color:var(--ink)}.jshare-b:hover{background:var(--brand-soft,rgba(182,255,60,.30))}.jfoot2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:18px 0 0;align-items:stretch}@media(max-width:700px){.jfoot2{grid-template-columns:minmax(0,1fr)}}.jfoot2 .jshare{margin:0;height:100%}.jcvbox{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 15px;border:1px solid var(--line);border-radius:14px;background:var(--panel)}.jcv-t{flex:1 1 auto;min-width:110px;font-size:14px;color:var(--muted)}.jcv-b{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--brand);border-radius:999px;padding:9px 18px;font-weight:700;font-family:var(--disp);font-size:14px;color:var(--ink);text-decoration:none}.jcv-b:hover{background:var(--brand-soft,rgba(182,255,60,.30))}.applybtn{display:inline-flex;align-items:center;gap:6px;background:var(--brand);color:var(--on-brand);border-radius:999px;padding:13px 28px;font-weight:700;font-family:var(--disp);text-decoration:none;font-size:15px}.applybtn:hover{filter:brightness(.96)}.applybtn.out{background:transparent;color:var(--ink);border:1px solid var(--line-strong);font-weight:600}.applybtn.out:hover{border-color:var(--brand-ink);background:var(--raised);filter:none}.jcontact{margin:-8px 0 18px;font-size:14px;color:var(--ink)}.jcontact a{font-weight:600}.jhl{border:1px solid var(--brand);background:var(--brand-soft,rgba(182,255,60,.14));border-radius:14px;padding:13px 16px;margin:0 0 24px}.jhl-h{font-weight:700;font-family:var(--disp);font-size:15px;margin-bottom:9px;color:var(--ink)}.jhl ul{list-style:none;margin:0;padding:0;display:grid;gap:8px}.jhl li{display:flex;align-items:flex-start;gap:8px;font-size:14.5px;color:var(--ink);line-height:1.35}.jhl .hlic{flex:0 0 auto}.japplybar{position:fixed;left:0;right:0;bottom:0;z-index:40;pointer-events:none;transform:translateY(115%);transition:transform .22s ease}.japplybar.on{transform:translateY(0)}.japplybar .jabg{max-width:1200px;margin:0 auto;padding:0 16px;display:grid;grid-template-columns:minmax(0,1fr);gap:26px}.japplybar.hasaside .jabg{grid-template-columns:minmax(0,1fr) 300px}.japplybar .jab{grid-column:1;pointer-events:auto;display:flex;padding:10px 16px calc(10px + env(safe-area-inset-bottom,0px));align-items:center;gap:14px;background:rgba(255,255,255,.97);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--line);border-bottom:0;border-radius:14px 14px 0 0;box-shadow:0 -6px 22px rgba(10,15,13,.10)}@media(max-width:900px){.japplybar .jabg,.japplybar.hasaside .jabg{grid-template-columns:1fr;padding:0}.japplybar .jab{grid-column:1;border-left:0;border-right:0;border-radius:0}}.japplybar .jab-t{flex:1;min-width:0}.japplybar .jab-t b,.japplybar .jab-t span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.japplybar .jab-t b{font-family:var(--disp);font-size:14.5px;font-weight:700;color:var(--ink);line-height:1.3}.japplybar .jab-t span{font-size:12.5px;color:var(--muted)}.japplybar .jab-t i{font-style:normal}.japplybar .applybtn{flex:0 0 auto;padding:11px 22px;font-size:14.5px}@media(max-width:560px){.japplybar .jab{padding:9px 12px;gap:10px}.japplybar .jab-t b{font-size:13.5px}.japplybar .jab-t i{display:none}.japplybar .applybtn{padding:11px 17px;font-size:14px}}@media(prefers-reduced-motion:reduce){.japplybar{transition:none}}.jchead{display:flex;gap:10px;align-items:center;margin:0 0 10px}.jchead img,.jchead .jclogo{width:44px;height:44px;border-radius:11px;object-fit:cover;flex:0 0 auto;border:1px solid var(--line);background:var(--panel)}.jchead .jclogo{display:flex;align-items:center;justify-content:center;font-weight:700;font-size:19px;color:var(--ink)}.jchead a{font-weight:700;font-family:var(--disp);font-size:14.5px;color:var(--ink);text-decoration:none;line-height:1.3}.jchead a:hover{color:var(--ink)}.jcf{display:flex;gap:10px;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.jcf .k{flex:0 0 82px;color:var(--muted)}.jcf .v{flex:1;min-width:0;color:var(--ink);word-break:break-word}.jcf .v a{color:var(--ink);text-decoration:none}.jcf .v a:hover{text-decoration:underline}.jcn{color:var(--faint);font-size:12px}.jcweb{margin:10px 0 12px;font-size:13px}.jfin{width:100%;border-collapse:collapse;margin:8px 0 6px;font-size:14.5px}.jfin th,.jfin td{border:1px solid var(--line);padding:9px 11px;text-align:left}.jfin th{background:var(--panel);font-weight:600;font-family:var(--disp)}.jfin td.n,.jfin th.n{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.jfinm{margin-top:10px}.jfins{font-size:12px;color:var(--faint);margin:6px 0 10px;line-height:1.6}.jfins a{color:var(--muted);text-decoration:underline}.jfinl{margin:0 0 20px;font-size:13.5px}.jfinl a{color:var(--ink);font-weight:600;text-decoration:none}.jfinl a:hover{text-decoration:underline}@media(max-width:640px){.jfin{display:block;overflow-x:auto;font-size:13.5px}}.jskwrap{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 24px}.jsk{display:inline-flex;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:6px 13px;font-size:13.5px;color:var(--ink);text-decoration:none}.jsk:hover{border-color:var(--brand);background:var(--brand-soft,rgba(182,255,60,.18))}.jsb{border:1px solid var(--line);border-radius:14px;padding:15px 17px;margin:0 0 24px;background:var(--panel)}.jsbh{font-size:13.5px;color:var(--muted);margin-bottom:12px}.aside>h2{font-size:16px;margin:0 0 10px}.aside .jsb{margin:0 0 16px;padding:13px 14px}.aside .jsbc .v{font-size:17px}.aside .jsbrow{gap:6px}.jsbrow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;text-align:center}.jsbc{display:flex;flex-direction:column;gap:3px}.jsbc .k{font-size:12.5px;color:var(--muted)}.jsbc .v{font-weight:700;font-family:var(--disp);font-size:19px;color:var(--ink)}.jsbc.mid .v{color:var(--brand-ink,var(--ink))}.jsbmark{position:relative;height:8px;border-radius:999px;margin:15px 2px 0;background:linear-gradient(90deg,var(--line),var(--brand))}.jsbmark>span{position:absolute;top:50%;left:var(--p,50%);width:15px;height:15px;border-radius:50%;background:var(--ink);border:3px solid var(--panel);transform:translate(-50%,-50%)}.jsbnote{margin:11px 0 0;font-size:13.5px;color:var(--ink);line-height:1.55}
.jtabbar{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:22px 0 16px;overflow-x:auto;scrollbar-width:none}.jtabbar::-webkit-scrollbar{display:none}.jtb{border:0;background:transparent;font:inherit;font-family:var(--disp);font-weight:600;font-size:15px;color:var(--muted);padding:10px 14px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap}.jtb:hover{color:var(--ink)}.jtb.on{color:var(--ink);border-bottom-color:var(--brand-ink)}.jtabs.js .jtab:not(.on){display:none}.jtab>h2:first-child{margin-top:4px}.jtab .jcbox{max-width:640px;margin:4px 0 22px}
