/* =============================================================
   iAi Lắng Nghe — NỀN THIẾT KẾ DÙNG CHUNG
   Nguồn phong cách: IAI Inspires Design System v3.1
   (D:\DienBT\IAI Website\iai-website\src\app\globals.css)

   Bản v2 — sửa GỐC RỄ của bản cũ:
   1. Bề mặt nông: --color-bg-warm cũ gần như TRẮNG (oklch 99%) nên mọi
      tấm thẻ chìm vào nền, không có chiều sâu. Nay tách 3 tầng bề mặt rõ.
   2. Không có thang khoảng cách: số lẻ 18/22/26/28px rải rác. Nay 1 thang 4px.
   3. Không có khung portal: portal thiếu thanh bên + thanh trên + vùng cuộn.
   4. Không có công cụ vận hành: thiếu ô lọc, sắp xếp, chọn nhiều, trạng thái rỗng.
   5. Thiếu .an — lớp ẩn mà trang portal ĐANG dùng nhưng chưa từng định nghĩa.

   QUY ƯỚC ĐẶT TÊN: giữ tên tiếng Việt không dấu như bản cũ (the, bang, truong…)
   để không phải sửa lại hai trang đang dùng.
   ============================================================= */

@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@400;500;600;700;800&family=Playfair+Display:ital,wght@1,600;1,700&display=swap');

/* ═══════════════════════════════════════════════════════════
   1. TOKEN
   ═══════════════════════════════════════════════════════════ */
:root {
  /* — Màu: lấy từ IAI Inspires Design System v3.1, không tự bịa — */
  --color-bg: #f3f1fa;          /* nền trang — đủ sâu để thẻ trắng NỔI lên */
  --color-surface: #ffffff;     /* tầng 1: thẻ, bảng */
  --color-surface-2: #faf9fe;   /* tầng 2: đầu bảng, dải phụ */
  --color-surface-3: #f0edf9;   /* tầng 3: vùng lõm, ô chờ */
  --color-bg-warm: #f6f4fc;     /* dải ấm — nay có màu thật, không phải trắng */
  --color-border: #e5e0f2;      /* viền tầng 1 */
  --color-border-strong: #d5cdec; /* viền tầng 2 — cho ô nhập, nút */
  --color-fg: #1b183a;
  --color-fg-soft: #2f2b52;
  --color-muted: #5c5685;
  /* Chữ phụ nhạt nhất. SỐ ĐO WCAG THẬT (tự tính bằng công thức, KHÔNG chép báo cáo):
     mã cũ #7d78a3 chỉ đạt 4.13:1 trên trắng và 3.69:1 trên nền trang ⇒ KHÔNG ĐẠT AA.
     Mã nay #6b6690: 5.35:1 trên trắng · 5.10:1 trên #faf9fe · 4.78:1 trên nền trang
     · 4.63:1 trên vùng lõm #f0edf9 ⇒ ĐẠT AA ở cả 4 tầng bề mặt. */
  --color-muted-2: #6b6690;
  --color-accent: #4c1d95;
  --color-accent-hover: #642894;
  --color-accent-soft: rgba(76, 29, 149, 0.08);
  --color-accent-line: rgba(76, 29, 149, 0.16);
  --color-green: #10b981;
  --color-green-soft: rgba(16, 185, 129, 0.08);
  --color-gold: #d9a73d;
  --color-gold-soft: rgba(217, 167, 61, 0.08);
  --color-cyan: #0ea5e9;
  --color-cyan-soft: rgba(14, 165, 233, 0.08);
  --color-yellow: #eab308;
  --color-yellow-soft: rgba(234, 179, 8, 0.08);
  --color-success: #10b981;
  --color-success-soft: #f0fdf4;
  --color-warning: #f59e0b;
  --color-warning-soft: #fffbeb;
  --color-danger: #dc2626;
  --color-danger-soft: #fef2f2;
  --color-info: #2563eb;
  --color-info-soft: #eff6ff;

  /* — Chữ — */
  --font-primary: 'Be Vietnam Pro', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-serif: 'Playfair Display', Georgia, serif;
  --font-mono: ui-monospace, 'JetBrains Mono', Menlo, monospace;

  /* — Thang cỡ chữ (thay số lẻ rải rác) — */
  --fs-xs: 11.5px;   /* nhãn bảng, chữ phụ rất nhỏ */
  --fs-sm: 12.5px;   /* chú thích */
  --fs-base: 14px;   /* thân */
  --fs-md: 15px;     /* thân lớn, mô tả */
  --fs-lg: 16px;     /* tiêu đề thẻ */
  --fs-xl: 20px;     /* tiêu đề trang */
  --fs-2xl: 26px;    /* số liệu lớn */
  --fs-3xl: 34px;    /* số liệu anh hùng */

  /* — THANG KHOẢNG CÁCH 4px (mới — chống số lẻ tuỳ hứng) — */
  --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;
  --sp-6: 24px; --sp-7: 32px; --sp-8: 40px; --sp-9: 48px; --sp-10: 64px;

  /* — Bóng: 3 cấp, đủ khác biệt để đọc được tầng — */
  --shadow-sm: 0 1px 2px rgba(27, 24, 58, 0.05);
  --shadow-md: 0 2px 8px rgba(27, 24, 58, 0.06), 0 1px 2px rgba(27, 24, 58, 0.04);
  --shadow-lg: 0 8px 28px rgba(27, 24, 58, 0.09), 0 2px 6px rgba(27, 24, 58, 0.04);
  --shadow-xl: 0 20px 50px -12px rgba(18, 12, 44, 0.16), 0 8px 16px rgba(18, 12, 44, 0.05);
  --shadow-glow: 0 0 0 3px rgba(76, 29, 149, 0.18);

  --radius-xs: 4px;
  --radius-sm: 6px;
  --radius-md: 10px;
  --radius: 12px;
  --radius-lg: 16px;
  --radius-full: 999px;

  /* — Khung — */
  --cao-top: 58px;        /* thanh trên */
  --rong-side: 258px;     /* thanh bên portal */
  --chuyen: 0.18s cubic-bezier(0.4, 0, 0.2, 1);  /* 180ms — trong khoảng 150–300ms */
}

/* ═══════════════════════════════════════════════════════════
   2. NỀN TẢNG
   ═══════════════════════════════════════════════════════════ */
*, *::before, *::after { box-sizing: border-box; }
[hidden], .an { display: none !important; }   /* .an: lớp ẩn trang portal đang dùng */
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--color-bg); color: var(--color-fg);
  font-family: var(--font-primary); font-size: var(--fs-base); line-height: 1.6;
  -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden; word-break: break-word;
}
a { color: inherit; text-decoration: none; transition: color var(--chuyen); }
button { font: inherit; cursor: pointer; border: none; background: none; padding: 0; color: inherit; }
img, svg, video, canvas { max-width: 100%; height: auto; display: block; }
:focus-visible {
  outline: 2px solid var(--color-accent); outline-offset: 2px; border-radius: var(--radius-xs);
}
[role="button"], [data-clickable], summary { cursor: pointer; }
code, .mono { font-family: var(--font-mono); font-size: 0.92em; }
.so-lieu { font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; }

/* ═══════════════════════════════════════════════════════════
   3. BỐ CỤC TRANG (dùng cho landing công khai)
   ═══════════════════════════════════════════════════════════ */
/* ─── TRẦN BỀ NGANG VÙNG NỘI DUNG (Đợt 1 — 15/10/2026, lỗi L1) ─────────────────────────
   Trước: đóng băng 1240px ở MỌI màn ⇒ 1920 hở 332px mỗi bên (35% bề ngang chết), 2560 hở
   gần một nửa; 1366 và 1920 cho ra bố cục Y HỆT nhau (cao trang 3943px giống hệt).
   Nay: dùng ĐÚNG công thức đã có ở `.portal-than` (:570) — lề thở theo bề ngang, có TRẦN
   để dòng chữ không dài quá mức đọc được. Đo lại: 1920 → khung 1760 (lề 72/bên).
   Vì sao `100vw` an toàn ở đây: `max-width` chỉ CHẶN trên, `width: 100%` vẫn là trần thật
   ⇒ không sinh thanh cuộn ngang (đã đo 7 cỡ màn: tràn ngang = 0).
   Vì sao gom thành 1 biến: 3 nơi cùng một trần (khung nội dung · thanh trên · chân trang)
   — khai 3 lần là mầm lệch trần về sau. */
:root { --rong-trang: min(1760px, max(1240px, calc(100vw - 2 * max(var(--sp-5), 4vw)))); }
.container { width: 100%; max-width: var(--rong-trang); margin-inline: auto; padding-inline: var(--sp-5); }
@media (max-width: 768px) { .container { padding-inline: var(--sp-4); } }
.section { padding-block: var(--sp-8); }
@media (min-width: 769px) {
  /* Đợt 1 (15/10/2026) — lỗi L5: trước đây MỌI khối đều `--sp-10` (64px) và mục nào cũng
     như mục nào ⇒ trang phẳng, không có nhịp. Nay nhịp theo BỀ NGANG: 769px → 48px,
     1366px → 68px, 1920px → 80px. Đổi LUẬT của `.section` (KHÔNG đổi token), nên
     `.hero` vẫn theo `--sp-10` — tức công tắc mật độ của miền vẫn còn tác dụng.
     Màn ≤768px giữ nguyên (đã đúng ở bản trước, xem `:1093-1104`). */
  .section { padding-block: clamp(48px, 5vw, 80px); }
}

.grid-2 { display: grid; grid-template-columns: 1fr; gap: var(--sp-4); }
.grid-3 { display: grid; grid-template-columns: 1fr; gap: var(--sp-4); }
.grid-4 { display: grid; grid-template-columns: 1fr; gap: var(--sp-4); }
@media (min-width: 560px) {
  .grid-2, .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px)  { .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-5); } }
@media (min-width: 1024px) {
  .grid-2 { gap: var(--sp-7); } .grid-3 { gap: var(--sp-5); } .grid-4 { gap: var(--sp-5); }
}
@media (min-width: 1200px) { .grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* ═══════════════════════════════════════════════════════════
   MÀN 3 NGĂN (đợt C 06/10/2026) — bảng ở trái, chi tiết đối tượng ở phải.
   Vì sao thêm lớp riêng thay vì dùng `.grid-2`: `.grid-2` chia ĐÔI đều ⇒ bảng bị bóp hẹp
   trong khi ngăn chi tiết chỉ cần ~360px. Lớp này giữ bảng rộng và CỐ ĐỊNH bề rộng ngăn phải.
   Dưới 1100px thì xếp DỌC (bảng trước, chi tiết sau) — màn hẹp mà ép 2 cột là bảng không đọc được.
   ═══════════════════════════════════════════════════════════ */
.man-3-ngan { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
/* Dòng đang mở ở ngăn phải — người dùng phải thấy NGAY mình đang xem dòng nào. */
.bang tr.dang-xem td { background: var(--color-accent-soft); }
@media (min-width: 1100px) {
  .man-3-ngan.co-phai { grid-template-columns: minmax(0, 1fr) 360px; align-items: start; }
  .man-3-ngan.co-phai > .the { position: sticky; top: var(--sp-4); }
  /* CẦN THÊM (D5 Pha 1 · 07/10/2026): khuôn 3 NGĂN THẬT cây · bảng · chi tiết.
     `.co-phai` chỉ có 2 cột nên không đội lốt được; lớp mới KHÔNG sửa `.co-phai`.
     Dùng lại điểm gãy 1100 đang có — KHÔNG thêm điểm gãy mới. Hẹp hơn ⇒ thoái hoá về 1 cột
     (`minmax(0,1fr)` của `.man-3-ngan` nền): cây đưa vào `.loc-drawer` đã có, chi tiết rơi xuống dưới bảng. */
  .man-3-ngan.co-trai { grid-template-columns: 240px minmax(0, 1fr) minmax(520px, 45vw); align-items: start; }
  .man-3-ngan.co-trai > .the:last-child { position: sticky; top: var(--sp-4); }
}

/* CẦN THÊM (D5 2.4): ngăn cây phân nhánh — `.cay` khung · `.cay-nut` 1 mục · `.cay-nut.dang` mục đang chọn.
   Cùng ngôn ngữ thị giác với `.muc-nav` (thanh bên) để cây và menu đọc như một hệ. */
.cay { display: flex; flex-direction: column; gap: 2px; overflow-y: auto; }
.cay-nut {
  display: flex; align-items: center; gap: var(--sp-2); width: 100%;
  padding: 8px var(--sp-3); min-height: 36px; border-radius: var(--radius-sm);
  font-size: var(--fs-sm); font-weight: 600; color: var(--color-muted);
  text-align: left; transition: background var(--chuyen), color var(--chuyen);
}
.cay-nut:hover { background: var(--color-surface-2); color: var(--color-fg); }
.cay-nut.dang { background: var(--color-accent-soft); color: var(--color-accent); }


/* ═══════════════════════════════════════════════════════════
   4. CHỮ
   ═══════════════════════════════════════════════════════════ */
h1, h2, h3, h4 { color: var(--color-fg); }
h1 { font-size: var(--fs-xl); font-weight: 700; letter-spacing: -0.4px; line-height: 1.3; margin: 0 0 var(--sp-2); }
h2 { font-size: var(--fs-lg); font-weight: 700; letter-spacing: -0.2px; line-height: 1.35; margin: 0 0 var(--sp-3); }
h3 { font-size: var(--fs-base); font-weight: 700; margin: 0 0 var(--sp-1); }
h4 { font-size: var(--fs-sm); font-weight: 700; margin: 0 0 var(--sp-1); }
.hero h1 { font-size: clamp(28px, 4.4vw, 50px); font-weight: 800; letter-spacing: -1.6px; line-height: 1.12; }
.hero h1 em { font-family: var(--font-serif); font-style: italic; font-weight: 600; color: var(--color-accent-ink, var(--color-accent)); }
.phu { color: var(--color-muted); font-size: var(--fs-md); line-height: 1.7; margin: 0 0 var(--sp-5); max-width: 70ch; }
/* NHẤN ĐOẠN QUAN TRỌNG trong lời giới thiệu (Sếp chốt 17/10/2026): người đọc quét 3 giây phải
   thấy ngay "bí mật", "ai đọc", "ai trả lời". Cấu hình đánh dấu bằng **…** trong chuỗi `phu`. */
.phu .nhan-manh {
  /* Nhấn bằng ĐẬM + MÀU THƯƠNG HIỆU, KHÔNG đóng hộp: cụm dài rớt dòng thì hộp bị vụn thành
     2 viên thuốc rời (đo thật 17/10/2026). Chữ đậm + màu accent-ink đạt 6,15:1 trên trắng. */
  font-weight: 700; color: var(--color-accent-ink, var(--color-accent));
}
.de { color: var(--color-muted); font-size: var(--fs-sm); line-height: 1.6; }
.de-nhat { color: var(--color-muted-2); font-size: var(--fs-xs); }
.nhan-nhom {
  font-size: var(--fs-xs); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.09em; color: var(--color-muted-2); margin: 0 0 var(--sp-2);
}

/* ═══════════════════════════════════════════════════════════
   5. TẤM THẺ — 3 tầng bề mặt
   ═══════════════════════════════════════════════════════════ */
.the {
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius); box-shadow: var(--shadow-sm);
  overflow: hidden; position: relative;
}
.the + .the { margin-top: var(--sp-5); }
.the > .dau {
  padding: var(--sp-4) var(--sp-5); border-bottom: 1px solid var(--color-border);
  background: var(--color-surface); display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; min-height: 56px;
}
.the > .dau h2, .the > .dau h3 { margin: 0; }
.the > .than { padding: var(--sp-5); }
.the > .chan { padding: var(--sp-3) var(--sp-5); border-top: 1px solid var(--color-border); background: var(--color-surface-2); }
.the.nen { background: var(--color-surface-2); }
/* Đợt 2 (15/10/2026) — thẻ BIỂU MẪU. Bản cũ: `style="max-width:840px"` mà KHÔNG căn giữa ⇒
   thẻ nằm SÁT LỀ TRÁI khung 1760px, hở 920px bên phải, lệch trục so với mọi khối khác (lỗi
   "canh lề" Sếp thấy). Nay: căn giữa + trần đọc được 1120px. Bên trong xếp 2–3 cột cho các
   nhóm ô ngắn (loại phản hồi, thông tin liên hệ) nên trang ngắn lại mà dòng không quá dài. */
.the-doc { max-width: 1120px; margin-inline: auto; }

/* Đợt 2b (15/10/2026) — TỐI ƯU 2 CỘT. Trước: thẻ hở 2 bên 320px ở màn 1920, thân biểu mẫu
   cao 1638px vì mọi thứ xếp dọc. Nay ≥1100px chia 2 cột (trái = phần người gửi viết, phải =
   liên hệ + minh chứng; trái = hai câu hỏi, phải = cách điền), trang ngắn đi ~1/3 mà dòng
   trong mỗi cột vẫn trong ngưỡng đọc được. Dưới 1100px tự về 1 cột như cũ. */
.luoi-2 { display: block; }
@media (min-width: 1100px) {
  .luoi-2 { display: grid; grid-template-columns: minmax(0, 1.12fr) minmax(0, 1fr);
            gap: var(--sp-7); align-items: start; }
  .luoi-2 > .cot-2 { min-width: 0; }
  .luoi-2 > .cot-2 > * + * { margin-top: var(--sp-5); }
}
.the.lom { background: var(--color-surface-3); box-shadow: none; }
.the-cach { margin-left: auto; }
@media (max-width: 768px) {
  .the > .dau { padding: var(--sp-3) var(--sp-4); }
  .the > .than { padding: var(--sp-4); }
  .the + .the { margin-top: var(--sp-4); }
}

/* Đầu mục trang (dùng cho portal) */
.dau-trang {
  display: flex; align-items: flex-start; gap: var(--sp-4);
  flex-wrap: wrap; margin-bottom: var(--sp-5);
}
.dau-trang .trai { min-width: 0; flex: 1 1 auto; }
.dau-trang .phai { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; }
.dau-trang h1 { margin: 0 0 var(--sp-1); }
.dau-trang .duoi-td { color: var(--color-muted); font-size: var(--fs-sm); margin: 0; }

/* ═══════════════════════════════════════════════════════════
   6. NÚT
   ═══════════════════════════════════════════════════════════ */
/* VÙNG CHẠM: luật dự án đòi ≥44×44px; Design System v3.1 chỉ nâng tới 36px từ 769px.
   Lấy 44px làm gốc, CHỈ hạ về 40px từ 769px (con trỏ chuột chính xác hơn ngón tay) —
   vẫn cao hơn v3.1. Đây là CHỦ Ý: tiếp cận thắng mật độ hiển thị. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
  font-weight: 600; font-size: var(--fs-sm); height: 44px; padding: 0 var(--sp-4);
  border-radius: var(--radius-sm); border: 1px solid transparent;
  transition: background var(--chuyen), border-color var(--chuyen), color var(--chuyen), box-shadow var(--chuyen);
  white-space: nowrap; flex-shrink: 0; line-height: 1;
}
.btn svg { width: 15px; height: 15px; flex-shrink: 0; }
.btn-primary { background: var(--color-accent); color: var(--color-on-primary, #fff); box-shadow: var(--shadow-sm); }
.btn-primary:hover:not(:disabled) { background: var(--color-accent-hover); }
.btn-success { background: var(--color-green); color: #fff; }
.btn-success:hover:not(:disabled) { opacity: 0.92; }
.btn-nguy { background: var(--color-danger); color: #fff; }
.btn-nguy:hover:not(:disabled) { opacity: 0.92; }
.btn-outline { border-color: var(--color-border-strong); background: var(--color-surface); color: var(--color-fg-soft); }
.btn-outline:hover:not(:disabled) { border-color: var(--color-accent); color: var(--color-accent); background: var(--color-accent-soft); }
.btn-mem { background: var(--color-surface-3); color: var(--color-fg-soft); }
.btn-mem:hover:not(:disabled) { background: var(--color-accent-soft); color: var(--color-accent); }
/* Nút chữ: màu accent thường (2,88:1 trên nền trắng) KHÔNG đạt WCAG AA ⇒ dùng accent-ink (6,15:1). */
.btn-chu { color: var(--color-accent-ink, var(--color-accent)); padding: 0 var(--sp-2); height: 44px; }
.btn-chu:hover:not(:disabled) { background: var(--color-accent-soft); }
.btn-lg { height: 48px; font-size: var(--fs-base); padding: 0 var(--sp-6); }
.btn-sm { height: 40px; font-size: var(--fs-sm); padding: 0 var(--sp-3); border-radius: var(--radius-sm); }
.btn-icon { width: 44px; padding: 0; }
.btn-icon.btn-sm { width: 40px; }
/* Thanh công cụ chuẩn (D5 Pha 2): trong thanh, ô tìm/ô lọc cao ĐÚNG bằng nút (40px)
   — trước đây 44px so với nút 40px nên hàng lệch nhau 2px trên mọi màn. */
@media (min-width: 769px) {
  .btn { height: 40px; } .btn-chu { height: 40px; }
  .thanh-cu input[type=search], .thanh-cu input[type=text], .thanh-cu select, .thanh-cu .loc-chon select { height: 40px; min-height: 40px; }
}
.btn:disabled, .btn[aria-disabled="true"] { opacity: 0.45; cursor: not-allowed; }
.hang { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; }
.hang-cach { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; justify-content: space-between; }
@media (max-width: 560px) { .hang .btn { flex: 1 1 auto; } }

/* ═══════════════════════════════════════════════════════════
   7. NHÃN TRẠNG THÁI
   ═══════════════════════════════════════════════════════════ */
.badge {
  display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-xs);
  font-weight: 600; padding: 3px var(--sp-2); border-radius: var(--radius-full);
  line-height: 1.35; white-space: nowrap; border: 1px solid transparent;
}
.badge .cham { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
.badge-purple { background: var(--color-accent-soft); color: var(--color-accent); }
.badge-green  { background: var(--color-success-soft); color: #047857; }
.badge-gold   { background: var(--color-gold-soft); color: #8a6a1f; }
.badge-cyan   { background: var(--color-cyan-soft); color: #0369a1; }
.badge-yellow { background: var(--color-warning-soft); color: #92400e; }
.badge-info   { background: var(--color-info-soft); color: #1d4ed8; }
.badge-danger { background: var(--color-danger-soft); color: #b91c1c; }
.badge-grey   { background: var(--color-surface-3); color: var(--color-muted); }
.badge-vien   { border-color: var(--color-border-strong); background: var(--color-surface); color: var(--color-fg-soft); }

/* ═══════════════════════════════════════════════════════════
   8. Ô SỐ LIỆU
   ═══════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════
   8b. NGĂN KÉO CHI TIẾT MỘT DÒNG (18/10/2026)
   Vì sao cần: ô trong bảng phải vắn tắt mới đọc được, nhưng người dùng vẫn cần xem ĐẦY ĐỦ
   một hạng mục (email đã gửi cho ai, mã thiết bị đầy đủ, giá trị trước/sau của một thay đổi).
   Trước đây mỗi màn tự dựng một kiểu — 3 kiểu lệch nhau. Nay MỘT khuôn: nhãn bên trái,
   giá trị bên phải, xuống dòng khi dài. Dùng trong ngăn kéo `moNganKeo`.
   ═══════════════════════════════════════════════════════════ */
.ct-ds { display: flex; flex-direction: column; gap: 0; margin: 0 0 var(--sp-3); }
.ct-dong {
  display: grid; grid-template-columns: minmax(96px, 34%) 1fr; gap: var(--sp-3);
  padding: 9px 0; border-bottom: 1px solid var(--color-border);
  font-size: var(--fs-sm); align-items: start;
}
.ct-dong:last-child { border-bottom: 0; }
.ct-nhan { color: var(--color-muted); font-weight: 600; line-height: 1.4; }
.ct-gia { min-width: 0; overflow-wrap: anywhere; line-height: 1.5; }
.ct-gia code { font-size: 12px; overflow-wrap: anywhere; }
@media (max-width: 560px) {
  .ct-dong { grid-template-columns: 1fr; gap: 2px; padding: 8px 0; }
  .ct-nhan { font-size: var(--fs-xs); }
}
.ct-khoi {
  border: 1px solid var(--color-border); border-radius: var(--radius-sm);
  background: var(--color-surface-2); padding: var(--sp-3); margin-bottom: var(--sp-3);
  font-size: var(--fs-sm); line-height: 1.55; overflow-wrap: anywhere;
}
.ct-khoi > h3 { font-size: var(--fs-sm); margin: 0 0 6px; }

.o_cam {
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius); padding: var(--sp-4) var(--sp-5); box-shadow: var(--shadow-sm);
  display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0;
}
.o_cam .ten { font-size: var(--fs-sm); color: var(--color-muted); font-weight: 500; order: -1; }
.o_cam .so {
  font-size: var(--fs-2xl); font-weight: 800; color: var(--color-fg);
  line-height: 1.1; letter-spacing: -0.8px;
}
.o_cam .so.nhan-manh { color: var(--color-accent); }
.o_cam .so.canh-bao { color: var(--color-danger); }
.o_cam .so.tot { color: #047857; }
.o_cam .xu-huong { display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-xs); font-weight: 600; }
/* Tên lớp "hướng" có TIỀN TỐ `xh-`: `.len`/`.xuong` trần trùng lớp bố cục của
   iai-ds.css (`.xuong` = khung lưới `min-height:100dvh`) ⇒ thẻ KPI bị kéo cao 860px,
   cả màn Báo cáo dãn 3.618px (đo thật 19/10/2026). Đổi tên là hết, không đụng iai-ds.css. */
.xu-huong.xh-len { color: #047857; } .xu-huong.xh-xuong { color: #b91c1c; }
.xu-huong.xh-phang { color: var(--color-muted-2); }

/* 🔴 MOBILE (≤560px): 4 thẻ số liệu xếp 1 cột thành 4 khối cao nối nhau, mỗi thẻ chỉ có
   1 nhãn + 1 số + 1 dòng xu hướng ⇒ phải cuộn gần hết màn mới thấy đủ 4 con số.
   Đo 17/10/2026 (390px): 4 thẻ ăn 470px chiều cao. Chia 2 cột, thu padding, giảm cỡ số 1 bậc
   để vẫn đọc rõ mà không cắt chữ. `.grid-2` GIỮ 1 cột: nó bọc biểu đồ/bảng lớn, chia đôi là hỏng.
   ⚠️ Khối này PHẢI nằm SAU các luật `.o_cam` ở trên: cùng độ ưu tiên nên luật sau thắng
   (bài học 17/10/2026: khai media trước luật gốc ⇒ media bị vô hiệu, không báo lỗi gì). */
@media (max-width: 560px) {
  .grid-3, .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
  .o_cam { padding: var(--sp-3) var(--sp-3); }
  .o_cam .ten { font-size: var(--fs-xs); line-height: 1.25; }
  .o_cam .so { font-size: var(--fs-xl); letter-spacing: -0.4px; }
  .o_cam .xu-huong { font-size: 11px; line-height: 1.3; align-items: flex-start; }
}

/* ═══════════════════════════════════════════════════════════
   9. BẢNG — kèm công cụ vận hành thật
   ═══════════════════════════════════════════════════════════ */
.thanh-cu {
  display: flex; gap: var(--sp-2); align-items: center; flex-wrap: wrap;
  padding: var(--sp-3) var(--sp-4); background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
}
.o-tim { position: relative; flex: 1 1 220px; min-width: 0; max-width: 320px; }
.o-tim input { padding-left: 36px; height: 44px; }
/* 🔴 Cùng luật nhưng ĐỘ ƯU TIÊN CAO HƠN (0,1,2) so với luật chung `input[type=search]` khai ở
   DƯỚI trong tệp: trước 17/10/2026 luật chung thắng ⇒ padding-left về 12px ⇒ kính lúp ĐÈ chữ
   đầu tiên của ô tìm (đo DOM thật trên mobile: kính hết x=76, chữ bắt đầu x=61). */
.o-tim input[type=search], .o-tim input[type=text] { padding-left: 36px; }
.o-tim .kinh {
  position: absolute; left: var(--sp-3); top: 50%; transform: translateY(-50%);
  width: 15px; height: 15px; color: var(--color-muted-2); pointer-events: none;
}
.loc-chon { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; min-width: 0; }
.loc-chon select { height: 44px; padding: 0 30px 0 var(--sp-3); font-size: var(--fs-sm); width: auto; min-width: 130px; }
.thanh-cu .dem { margin-left: auto; color: var(--color-muted); font-size: var(--fs-sm); white-space: nowrap; }

/* ── THANH CÔNG CỤ CHUẨN DÙNG CHUNG (D5 Pha 2 · 07/10/2026) ────────────────
   KHUÔN DUY NHẤT cho tầng 2 của MỌI màn danh sách — CẤM đặt tên lớp mới:
     <div class="thanh-cu">
       <div class="o-tim">…ô tìm…</div>
       <div class="loc-chon">…ô lọc…</div>
       <span class="chip-loc">…chip lọc đang bật…</span>
       <span class="dem">12 kết quả</span>
       <button class="btn btn-primary btn-sm">+ Thêm mới</button>
     </div>
   Luật đẩy nút "+" sang phải là CẦN: `.o-tim` có `flex: 1 1 220px` nhưng kèm trần
   `max-width` nên KHÔNG nở hết chỗ trống — đo DOM thật 1920/1366, khuôn có ô tìm
   + lọc + nút mà KHÔNG có `.dem`: khe hở phải 1065.6px / 512px nếu thiếu luật;
   có luật ⇒ 0px. `.dem` vẫn giữ `margin-left: auto` (dòng 331) nên khuôn CÓ `.dem`
   cũng ra 0px, không cần luật riêng.
   Kiểm hồi quy màn "Sản phẩm & khoá" (tự chèn `<div style="flex:1 1 auto">` giữa các
   nút, web/portal/index.html:1411): cao thanh 160.8px ở CẢ hai trạng thái có/không
   luật ⇒ luật này TRUNG TÍNH về số hàng, không đẩy thêm hàng.
   Sàn chiều cao CHỈ áp cho thanh CÓ ô tìm: hàng chip thuần cũng dùng chung lớp
   .thanh-cu (web/portal/index.html:547,940) nên không được kéo cao theo.
   Không lặp lại `row-gap`: `.thanh-cu` đã có `gap: var(--sp-2)` (đo thật: 8px). */
.thanh-cu:has(.o-tim) { min-height: calc(var(--sp-3) * 2 + 40px); }
.thanh-cu > .btn:last-child, .thanh-cu > .hang:last-child { margin-left: auto; }
.thanh-cu .dem ~ .btn:last-child, .thanh-cu .dem ~ .hang:last-child { margin-left: 0; }

@media (max-width: 768px) {
  .thanh-cu { padding: var(--sp-3); }
  /* Vùng chạm ≤768 luật hệ là 44px: nút .btn-sm trong thanh phải cao bằng ô tìm
     (nền .btn-sm = 40px ⇒ lệch 4px). Chỉ áp TRONG thanh, không đổi nghĩa .btn-sm. */
  .thanh-cu .btn-sm { height: 44px; }
  .o-tim { max-width: none; flex: 1 1 100%; }
  .loc-chon { width: 100%; }
  .loc-chon select { flex: 1 1 auto; min-width: 0; }
  .thanh-cu .dem { margin-left: 0; }
}

/* Thanh thao tác hàng loạt — chỉ hiện khi có dòng được chọn */
.thanh-hang-loat {
  display: flex; gap: var(--sp-3); align-items: center; flex-wrap: wrap;
  padding: var(--sp-2) var(--sp-4); background: var(--color-accent-soft);
  border-bottom: 1px solid var(--color-accent-line); font-size: var(--fs-sm); font-weight: 600;
  color: var(--color-accent);
}
.thanh-hang-loat .hang { margin-left: auto; }

.khung_bang { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.bang { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--fs-base); }
.bang th, .bang td {
  text-align: left; padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--color-border); vertical-align: middle;
}
.bang th {
  background: var(--color-surface-2); color: var(--color-muted);
  font-weight: 700; font-size: var(--fs-xs); text-transform: uppercase;
  letter-spacing: 0.06em; white-space: nowrap; position: sticky; top: 0; z-index: 2;
  border-bottom: 1px solid var(--color-border-strong);
}
.bang th.sap-xep { cursor: pointer; user-select: none; }
.bang th.sap-xep:hover { color: var(--color-accent); }
.bang th .mui {
  display: inline-block; margin-left: var(--sp-1); opacity: 0.35;
  font-size: 9px; vertical-align: middle;
}
.bang th[aria-sort="ascending"] .mui, .bang th[aria-sort="descending"] .mui { opacity: 1; color: var(--color-accent); }
.bang tbody tr { height: 56px; }
.bang tbody tr:last-child td { border-bottom: none; }
.bang tbody tr:hover td { background: var(--color-accent-soft); }
.bang tbody tr[data-ma],
/* Bảng Báo cáo: dòng bấm mở phiếu. Thiếu 2 selector này thì bấm được mà không có dấu hiệu
   (con trỏ + nền), người dùng không biết bấm được — Sếp soi 18/10/2026. */
.bang tbody tr[data-bc-mo],
.bang tbody tr[data-bcld-mo] { cursor: pointer; }
.bang tbody tr[data-bc-mo]:hover td,
.bang tbody tr[data-bcld-mo]:hover td { background: var(--color-surface-2); }
.bang tbody tr[data-ma]:focus-visible { outline: 2px solid var(--color-accent); outline-offset: -2px; }
.bang tbody tr.dang-chon td { background: var(--color-accent-soft); }
.bang .cot-chon { width: 44px; padding-right: 0; }
.bang .cot-so { text-align: right; white-space: nowrap; }
.bang .o-chinh { font-weight: 600; color: var(--color-fg); }
.bang .phu-trong-o { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bang td .de { display: block; }
/* Mốc bề rộng theo ĐÚNG 3 tầng của Design System v3.1: <769px · 769–1099px · ≥1100px.
   Bản trước thu thanh bên ở 1024px ⇒ dải 1024–1099px (máy tính bảng theo chuẩn) hiện
   layout máy tính để bàn với thanh bên 258px — lệch chuẩn. Nay khớp 1100. */
@media (max-width: 1099px) { .bang thead th { position: static; } }
@media (max-width: 768px) {
  .bang { font-size: var(--fs-sm); }
  .bang th, .bang td { padding: var(--sp-3); }
  .bang tbody tr { height: 48px; }
}

/* ĐIỆN THOẠI (≤640px): cột phụ ẩn khỏi hàng, giá trị vẫn còn trong nút "Chi tiết".
   Nguyên nhân gốc: 7 cột nằm trong khung 348px ⇒ hàng cao 227px, mỗi chữ xuống 1 dòng.
   Ẩn cột chỉ là XẾP LẠI — dữ liệu đầy đủ vẫn ở ngăn kéo Chi tiết, không mất thông tin. */
@media (max-width: 640px) {
  .bang .an-hep { display: none; }
  .chi-hep { display: inline; }
  /* Nút thao tác trong ô: cấm gãy hàng dọc (chữ "Người nhận" từng vỡ thành 2 dòng). */
  .hang-nut { white-space: nowrap; }
  .hang-nut .btn { white-space: nowrap; }
  .bang th.an-hep, .bang td.an-hep { display: none; }
  /* Nút trong ô cuối ("Chi tiết") từng vỡ thành "Chi / tiết" ở 390px. */
  .bang td.cot .btn, .bang .cot .btn { white-space: nowrap; }
  /* Ô chứa mốc thời gian: cấm bẻ giữa số ("20/10/202" + "6 09:12"). */
  .bang .ngay-dong, .bang .de.ngay-dong { white-space: nowrap; }
  /* Giờ xuống dòng dưới ngày — xuống ĐÚNG chỗ thay vì bẻ giữa số năm. */
  .bang .gio { display: block; }
  /* Cấm bẻ GIỮA TỪ ("Nguy/ễn") — chỉ ngắt ở khoảng trắng; từ dài hơn ô mới được bẻ. */
  .bang th, .bang td { word-break: normal; overflow-wrap: break-word; }
}
/* Màn rộng: `.chi-hep` đã nằm trong cột thật ⇒ giấu bản chép trong ô Nội dung. */
@media (min-width: 641px) { .chi-hep { display: none; } }

/* ═══════════════════════════════════════════════════════════
   10. Ô NHẬP
   ═══════════════════════════════════════════════════════════ */
.truong { margin-bottom: var(--sp-5); }
.truong:last-child { margin-bottom: 0; }
label { display: block; font-weight: 600; margin: 0 0 var(--sp-2); font-size: var(--fs-sm); color: var(--color-fg-soft); }
label .bb { color: var(--color-danger); margin-left: 2px; }
label .de { font-weight: 400; display: inline; }
/* 🔴 Thứ tự trong tệp này: luật `.o-tim input` ở TRÊN, luật chung `input[type=search]` ở DƯỚI
   ⇒ cùng độ ưu tiên (0,1,1) nên luật DƯỚI thắng, `padding-left:36px` bị ghi đè thành 12px.
   Đo DOM thật 17/10/2026 (390px): kính lúp kết thúc ở x=76, chữ bắt đầu ở x=61 ⇒ icon ĐÈ chữ
   đầu tiên của ô tìm trên mobile. Vá bằng ĐỘ ƯU TIÊN (0,1,2) để không phụ thuộc thứ tự khai. */
input[type=text], input[type=email], input[type=password], input[type=search],
input[type=tel], input[type=url], select, textarea {
  width: 100%; padding: 10px var(--sp-3); border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm); font: inherit; font-size: var(--fs-base);
  background: var(--color-surface); color: var(--color-fg); min-height: 44px;
  transition: border-color var(--chuyen), box-shadow var(--chuyen);
}
input::placeholder, textarea::placeholder { color: var(--color-muted-2); }
input:focus, select:focus, textarea:focus {
  outline: none; border-color: var(--color-accent); box-shadow: var(--shadow-glow);
}
input:disabled, select:disabled, textarea:disabled { background: var(--color-surface-3); color: var(--color-muted-2); cursor: not-allowed; }
select {
  cursor: pointer; padding-right: 34px; appearance: none; -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--color-muted) 50%),
                    linear-gradient(135deg, var(--color-muted) 50%, transparent 50%);
  background-position: calc(100% - 17px) calc(50% + 1px), calc(100% - 12px) calc(50% + 1px);
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
}
textarea { min-height: 118px; resize: vertical; line-height: 1.65; }
input[type=file] { padding: var(--sp-3); border-style: dashed; background: var(--color-surface-2); cursor: pointer; font-size: var(--fs-sm); width: 100%; max-width: 100%; }
input[type=checkbox], input[type=radio] { width: 20px; height: 20px; accent-color: var(--color-accent); cursor: pointer; flex-shrink: 0; }
/* Ô tích/ô chọn nằm trong nhãn bấm được: nới vùng chạm của NHÃN lên ≥44px mà không đổi hình. */
.o-kiem { display: flex; align-items: flex-start; gap: var(--sp-2); font-size: var(--fs-sm); min-height: 44px; cursor: pointer; }
.goi_y { font-size: var(--fs-xs); color: var(--color-muted); margin: var(--sp-2) 0 0; line-height: 1.6; }

/* Khối LỢI ÍCH ở câu hỏi định danh (MỤC 6, 15/10/2026): hộp nhấn NHẸ — nội dung là lợi ích của
   việc để lại thông tin, nên dùng tông dịu của hệ, KHÔNG dùng tông đỏ của `.loi` (tông đỏ là
   dành cho việc chưa làm được, dùng ở đây là hù dọa người gửi). */
.the-loi-ich {
  background: var(--color-accent-soft); border: 1px solid var(--color-accent-line);
  border-radius: var(--radius-sm); padding: var(--sp-4); margin-top: var(--sp-3);
  font-size: var(--fs-sm); line-height: 1.65;
}
.the-loi-ich .nhan-manh { display: block; margin-bottom: var(--sp-1); }
/* BA Ô THÔNG TIN LIÊN HỆ xếp 3 cột (Sếp 17/10/2026): nhãn mỗi ô dài ngắn khác nhau nên ô nhập
   bị so le. Dùng SUBGRID: mỗi ô là lưới con 3 hàng (nhãn · ô nhập · phần dưới), cả 3 ô dùng chung
   hàng của lưới cha ⇒ nhãn cao bao nhiêu thì ô nhập vẫn nằm CHUNG một đường kẻ ngang.
   Trình duyệt không có subgrid thì rơi về bố cục cũ (không vỡ gì, chỉ là không thẳng). */
@media (min-width: 900px) {
  /* Cột: KHÔNG ép 3 cột khi vùng chứa hẹp (khối này nằm trong cột phải ~430px ⇒ 3 cột chỉ còn
     139px, nhãn gãy 3 dòng, placeholder bị cắt). auto-fit + sàn 190px ⇒ hẹp ra 2 cột, rộng ra 3. */
  .grid-3.nhom-tt { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
                    grid-template-rows: auto auto auto; row-gap: 0; align-items: start; }
  .nhom-tt > .truong { display: grid; grid-row: span 3; grid-template-rows: subgrid; margin-bottom: 0; }
  .nhom-tt > .truong > label { align-self: end; }
  /* Email xuống hàng riêng và chiếm TRỌN bề ngang: địa chỉ dài cần chỗ, và 3 ô lẻ hàng 2 cột
     thì ô thứ ba đứng trơ một mình trông như lỗi. */
  .nhom-tt > .truong:nth-child(3) { grid-column: 1 / -1; }
}
.cot-nhap { display: grid; grid-template-columns: 1fr; gap: var(--sp-5); }
@media (min-width: 769px) { .cot-nhap { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* ═══════════════════════════════════════════════════════════
   11. TRẠNG THÁI RỖNG / CHỜ / LỖI (thay vì hiện lỗi hệ thống ra UI)
   ═══════════════════════════════════════════════════════════ */
.trong {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--sp-2); padding: var(--sp-9) var(--sp-5); text-align: center;
}
.trong .bieu {
  width: 40px; height: 40px; color: var(--color-muted-2); opacity: 0.6; margin-bottom: var(--sp-1);
}
.trong .td { font-weight: 700; font-size: var(--fs-md); color: var(--color-fg-soft); }
.trong .mt { color: var(--color-muted); font-size: var(--fs-sm); max-width: 46ch; }
.trong .hang { margin-top: var(--sp-3); }
@media (max-width: 768px) { .trong { padding: var(--sp-7) var(--sp-4); } }

.cho { border-radius: var(--radius-sm); background: var(--color-surface-3); position: relative; overflow: hidden; }
.cho::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.7), transparent);
  animation: truot 1.4s infinite;
}
@keyframes truot { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }
.cho-dong { height: 14px; margin-bottom: var(--sp-2); }

.loi {
  background: var(--color-danger-soft); border: 1px solid #fecaca; border-left: 3px solid var(--color-danger);
  border-radius: var(--radius-sm); padding: var(--sp-3) var(--sp-4); color: #991b1b;
  margin: var(--sp-4) 0; font-size: var(--fs-sm); line-height: 1.6;
}
.loi ul { margin: var(--sp-2) 0 0; padding-left: var(--sp-5); }
.loi strong { display: block; margin-bottom: var(--sp-1); }
.loi-truong { color: var(--color-danger); font-size: var(--fs-xs); font-weight: 600; margin: var(--sp-1) 0 0; }
.lech {
  background: var(--color-warning-soft); border: 1px solid #fde68a; border-left: 3px solid var(--color-warning);
  border-radius: var(--radius-sm); padding: var(--sp-3) var(--sp-4); margin: var(--sp-4) 0;
}
.lech .vi { font-weight: 600; color: #92400e; margin: 0 0 var(--sp-1); font-size: var(--fs-sm); line-height: 1.6; }
.lech .dl { font-size: var(--fs-xs); color: #92400e; margin: 0; }
.hop_ket { background: var(--color-success-soft); border: 1px solid #a7f3d0; border-radius: var(--radius); padding: var(--sp-5); margin: var(--sp-4) 0 0; }

/* Băng báo trạng thái phiên (chỉ dùng cho điều hướng gọn, KHÔNG hiện lỗi kỹ thuật) */
.bang-nhac {
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  padding: var(--sp-3) var(--sp-4); border-radius: var(--radius-sm);
  background: var(--color-surface-3); color: var(--color-fg-soft);
  font-size: var(--fs-sm); border: 1px solid var(--color-border);
}
.bang-nhac.cam { background: var(--color-warning-soft); border-color: #fde68a; color: #92400e; }
.bang-nhac b, .bang-nhac .nhan-manh { font-weight: 700; }

/* ═══════════════════════════════════════════════════════════
   12. KHUNG PORTAL (thanh bên · thanh trên · vùng cuộn)
   ═══════════════════════════════════════════════════════════ */
.portal { display: grid; grid-template-columns: var(--rong-side) minmax(0, 1fr); min-height: 100vh; min-width: 0; }

.portal-side {
  background: var(--color-surface); border-right: 1px solid var(--color-border);
  display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh;
  overflow-y: auto; z-index: 40;
}
.portal-side .dau-side {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-4) var(--sp-5); border-bottom: 1px solid var(--color-border);
  min-height: var(--cao-top); flex-shrink: 0;
}
.portal-side .nhom { padding: var(--sp-4) var(--sp-3) var(--sp-6); }
.portal-side .nhan-nhom { padding-inline: var(--sp-2); }
.muc-nav {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  padding: 9px var(--sp-3); min-height: 44px; border-radius: var(--radius-sm); margin-bottom: 2px;
  font-size: var(--fs-sm); font-weight: 600; color: var(--color-muted);
  position: relative; transition: background var(--chuyen), color var(--chuyen);
  text-align: left;
}
.muc-nav svg { width: 16px; height: 16px; flex-shrink: 0; }
.muc-nav .dem-so {
  margin-left: auto; font-size: var(--fs-xs); font-weight: 700;
  background: var(--color-surface-3); color: var(--color-muted);
  border-radius: var(--radius-full); padding: 1px 7px; min-width: 20px; text-align: center;
}
.muc-nav:hover { background: var(--color-surface-2); color: var(--color-fg); }
.muc-nav.dang { background: var(--color-accent-soft); color: var(--color-accent); }
.muc-nav.dang::before {
  content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 3px; height: 20px; border-radius: 0 3px 3px 0; background: var(--color-accent);
}
.muc-nav.dang .dem-so { background: var(--color-surface); color: var(--color-accent); }
.portal-side .cuoi-side { margin-top: auto; padding: var(--sp-4) var(--sp-3); border-top: 1px solid var(--color-border); }

.portal-main { min-width: 0; display: flex; flex-direction: column; }
.portal-top {
  position: sticky; top: 0; z-index: 30; background: rgba(255,255,255,0.92);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--color-border);
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-6); min-height: var(--cao-top);
}
.portal-top .duong-dan { display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-sm); color: var(--color-muted); min-width: 0; }
.portal-top .duong-dan .tach { opacity: 0.5; }
.portal-top .duong-dan .hien-tai { color: var(--color-fg); font-weight: 600; }
.portal-top .phai { margin-left: auto; display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
/* VÁ (26/09/2026): thiếu `width: 100%` ⇒ trên `.portal-main` (flex-direction: column)
   `margin-inline: auto` khiến khối CO THEO NỘI DUNG (auto margin ở trục ngang chặn giãn),
   ở 1920px chỉ còn 687px và bỏ trống 2 bên. Thêm `width: 100%` để giãn hết rồi `max-width` mới cắt trần. */
/* VÁ (07/10/2026 · D5 Pha 1): trần cứng 1560px làm màn 1920/2560 PHÍ bề rộng.
   Nới trần theo bề rộng khả dụng bằng `max()` — thuần CSS, KHÔNG JS đo rồi gán style,
   KHÔNG thêm điểm gãy (dưới 1818px thì `100vw − 258` < 1560 nên trần vẫn là 1560px). */
.portal-than { padding: var(--sp-6); flex: 1 1 auto; width: 100%; max-width: max(1560px, calc(100vw - var(--rong-side))); margin-inline: auto; }
@media (max-width: 1099px) { .portal-than { padding: var(--sp-5); } }
@media (max-width: 768px)  { .portal-than { padding: var(--sp-4); } .portal-top { padding: var(--sp-3) var(--sp-4); } }

/* ── THANH BÊN ĐIỀU HƯỚNG THEO 3 CẤP MÀN HÌNH (Sếp duyệt 21/10/2026) ──
   1. Màn rộng (≥1100px): thanh bên 258px đầy đủ chữ + nhóm, thường trực bên trái.
   2. Tablet ngang (900px–1099px): thu gọn thành dải icon 68px thường trực (1 chạm đổi màn thay vì 2, không cần hamburger).
   3. Mobile & tablet dọc (<900px): thanh bên thành ngăn kéo trượt, ẩn sau nút mở thanh bên. */
.nut-mo-side { display: none; }

@media (min-width: 900px) and (max-width: 1099px) {
  .portal { grid-template-columns: 68px minmax(0, 1fr); }
  .nut-mo-side { display: none !important; }
  .portal-side {
    position: sticky; top: 0; left: 0; height: 100vh; width: 68px;
    transform: none !important; box-shadow: none; z-index: 40;
    overflow-x: hidden; padding: 0;
  }
  .portal-side .dau-side {
    padding: var(--sp-3) var(--sp-2); justify-content: center;
  }
  .portal-side .dau-side > div > div:nth-child(2),
  .portal-side #nut-dong-side { display: none !important; }
  .portal-side .nhan-nhom { display: none !important; }
  .portal-side .muc-nav {
    justify-content: center; padding: 10px 0; width: 44px; margin: 4px auto;
    position: relative;
  }
  .portal-side .muc-nav span:not(.dem-so) { display: none !important; }
  .portal-side .muc-nav .dem-so {
    position: absolute; top: 2px; right: 2px; padding: 1px 4px;
    font-size: 10px; line-height: 1; min-width: 14px;
  }
  .portal-side .cuoi-side { padding: var(--sp-2); border-top: 1px solid var(--color-border); }
  .portal-side .o_nguoi { justify-content: center; padding: 4px 0; }
  .portal-side .o_nguoi > div { display: none !important; }
  .scrim { display: none !important; }
}

@media (max-width: 899px) {
  .portal { grid-template-columns: minmax(0, 1fr); }
  .nut-mo-side { display: inline-flex; }
  .portal-side {
    position: fixed; top: 0; left: 0; height: 100vh; width: min(300px, 84vw);
    transform: translateX(-100%); transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1);
    box-shadow: var(--shadow-xl); z-index: 60;
  }
  .portal-side.mo { transform: translateX(0); }
  .scrim {
    position: fixed; inset: 0; background: rgba(27, 24, 58, 0.4); z-index: 55;
    opacity: 0; pointer-events: none; transition: opacity 0.24s;
  }
  .scrim.mo { opacity: 1; pointer-events: auto; }
}
@media (min-width: 900px) { .scrim { display: none; } }

/* ═══════════════════════════════════════════════════════════
   13. ĐIỀU HƯỚNG CÔNG KHAI (thanh trên landing)
   ═══════════════════════════════════════════════════════════ */
.topnav {
  position: sticky; top: 0; z-index: 50; width: 100%;
  background: rgba(255,255,255,0.9); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--color-border);
}
/* Đợt 1 — cùng trần với khung nội dung (lỗi L7 phần a): thanh trên hở 600px giữa ở màn rộng. */
.topnav-inner {
  max-width: var(--rong-trang); margin-inline: auto; padding: var(--sp-3) var(--sp-5);
  display: flex; align-items: center; gap: var(--sp-5); min-height: var(--cao-top);
}
.logo-wrapper { display: flex; align-items: center; gap: var(--sp-3); flex-shrink: 0; }
.logo-dot {
  width: 30px; height: 30px; border-radius: 9px; background: var(--color-accent);
  display: grid; place-items: center; color: #fff; font-weight: 800; font-size: 14px;
  box-shadow: 0 2px 8px rgba(76, 29, 149, 0.3); flex-shrink: 0;
}
/* Logo THẬT (ảnh của trường): BỎ KHUNG — nền, bo góc, bóng đều về 0 để logo đứng trơn,
   thanh thoát. Khung chỉ dành cho logo chữ 1–2 ký tự. tien-ich.js gắn lớp .logo-anh. */
.logo-dot.logo-anh { width: auto; height: auto; background: none; box-shadow: none; border-radius: 0; }
.logo-dot.logo-anh img { height: 34px; width: auto; }
.logo-text { font-weight: 800; color: var(--color-fg); font-size: var(--fs-md); letter-spacing: -0.3px; white-space: nowrap; }
/* Màn hẹp: tên trường dài + cụm nút ⇒ chữ bị bóp còn 1 ký tự mỗi dòng (đo thật 390px). Cho phép
   co lại nhưng KHÔNG bẻ từng chữ; hết chỗ thì cắt bằng dấu ba chấm. */
.logo-text { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.logo-text em { font-family: var(--font-serif); font-style: italic; color: var(--color-accent-ink, var(--color-accent)); font-weight: 600; }
.nav-links { display: flex; align-items: center; gap: var(--sp-1); overflow-x: auto; scrollbar-width: none; min-width: 0; }
.nav-links::-webkit-scrollbar { display: none; }
.nav-links a {
  font-size: var(--fs-sm); font-weight: 600; color: var(--color-muted);
  padding: var(--sp-2) var(--sp-3); border-radius: var(--radius-sm); white-space: nowrap;
  /* W4.8: đo 19/10 thấy 38px — dưới chuẩn chạm 44px. */
  min-height: 44px; display: inline-flex; align-items: center;
}
.nav-links a:hover { color: var(--color-accent); background: var(--color-accent-soft); }
.nav-links a.dang { color: var(--color-accent); background: var(--color-accent-soft); }
.topnav .phai { margin-left: auto; display: flex; align-items: center; gap: var(--sp-2); }
@media (max-width: 768px) {
  .topnav-inner { padding: var(--sp-3) var(--sp-4); gap: var(--sp-3); flex-wrap: wrap; }
  /* W4.8 (D-06): TRƯỚC ĐÂY ẨN HẲN ⇒ điện thoại không có lối vào kênh nào, phải gõ tham số tay.
     Nay thành DẢI CUỘN NGANG dưới thanh trên: vẫn 1 hàng, không đẩy logo/nút xuống, chạm được. */
  .nav-links {
    display: flex; order: 10; width: 100%; overflow-x: auto;
    -webkit-overflow-scrolling: touch; padding-block: 2px;
    border-top: 1px solid var(--color-line); margin-top: 2px;
  }
  .nav-links a { min-height: 44px; display: inline-flex; align-items: center; }
}
/* ── ĐIỆN THOẠI: THANH TRÊN GỌN 1 HÀNG + Ô CHỌN GỌN + NEO KHÔNG BỊ CHE (Sếp 15/10/2026) ──
   Đo TRƯỚC khi sửa (390px): thanh trên cao **155px / 3 HÀNG** — (1) logo + tên trường,
   (2) ô chọn ngôn ngữ chiếm TRỌN một hàng (rộng 358px), (3) nút "Gửi phản hồi".
   Gốc: `.loc-chon select` có `min-width: 130px`, nhãn "Tiếng Việt" dài ⇒ không chen được
   vào hàng logo, `.phai` buộc phải xuống dòng (bản vá sáng nay chữa ca ĐÈ NHAU ở 240–430px
   bằng cách cho xuống dòng: hết đè nhưng thành 3 hàng).
   Chữa ở GỐC LẦN NÀY: màn ≤768px BỎ `<select>`, thay bằng NÚT BIỂU TƯỢNG (địa cầu + mã
   ngôn ngữ, 40×~62px) do `dungNutNgonNgu()` dựng ngay cạnh khung cũ ⇒ không còn gì để chen
   hàng, giữ đúng 1 hàng và KHÔNG còn khả năng đè lên nhau. */
.nut-ngon-ngu {
  display: none; align-items: center; gap: 6px; height: 40px; padding: 0 var(--sp-3);
  border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm);
  background: var(--color-surface); color: var(--color-fg); font: inherit;
  font-size: var(--fs-sm); font-weight: 700; letter-spacing: .02em; cursor: pointer; flex-shrink: 0;
}
.nut-ngon-ngu:hover { background: var(--color-surface-2); border-color: var(--color-accent-line); }
.nut-ngon-ngu svg { width: 16px; height: 16px; flex-shrink: 0; }

@media (max-width: 768px) {
  .topnav-inner { flex-wrap: nowrap; row-gap: 0; }
  /* 🔴 GỐC "control chờm lên chữ" (Sếp 15/10/2026): `.topnav` nền `rgba(255,255,255,.9)` +
     `backdrop-filter: blur(12px)`. Thanh này `position: sticky` nên khi cuộn, CHỮ của trang
     chạy XUYÊN QUA nền mờ ⇒ nhìn như control đè lên chữ. Màn hẹp thanh chỉ còn 65px nên
     hiện tượng lộ rõ. Chữa 1 dòng: nền ĐẶC (không alpha) ở màn ≤768px; giữ nguyên mờ ở màn
     lớn vì thanh cao 58px và chữ chạy ngang hiếm khi lọt qua. */
  .topnav { background: var(--color-surface); backdrop-filter: none; -webkit-backdrop-filter: none; }
  /* 🔴 GỐC TRÀN NGANG 114–164px ở 280–430px: luật gốc `.logo-wrapper { flex-shrink: 0 }`
     khoá cứng bề rộng 243px nên tên trường KHÔNG co được ⇒ logo + nút ngôn ngữ + nút gửi
     đẩy trang tràn phải. `min-width: 0` một mình VÔ HIỆU khi còn `flex-shrink: 0`.
     Nay: logo được co, tên trường cắt "…"; `.phai` giữ `flex: 0 0 auto` để nút không bị bóp. */
  .topnav .logo-wrapper { min-width: 0; flex-shrink: 1; }
    .topnav .logo-text {
    /* Màn hẹp: chỉ còn logo + nút. Đo 390px: tên trường bị bóp còn 0px, hoặc vỡ cột dọc nếu
       cho xuống dòng ⇒ ẨN HẲN tên, giữ logo (Sếp chốt 17/10/2026). */
    display: none;
  }
  .topnav-inner .phai { width: auto; margin-left: auto; flex: 0 0 auto; flex-wrap: nowrap; row-gap: 0; }
    /* Ẩn ĐÚNG <select>, KHÔNG ẩn cả khung .loc-chon: khung này còn chứa nút biểu tượng
     ngôn ngữ; ẩn cả khung thì màn hẹp mất luôn nút đổi ngôn ngữ (Sếp báo 17/10/2026). */
  .topnav-inner .phai .loc-chon > select { display: none; }
  .topnav-inner .phai .btn { flex: 0 0 auto; }
  /* 390px: logo (wordmark) + 3 control không đủ chỗ ⇒ nút "Đăng nhập" bị bóp còn 37px, chữ
     rớt thành cột dọc. Bó đệm + thu logo + CẤM co nút (đo thật 17/10/2026). */
  .topnav-inner { gap: var(--sp-2); padding-inline: var(--sp-3); }
  .topnav .phai { gap: var(--sp-1); }
  .topnav .phai .btn { padding-inline: 10px; white-space: nowrap; }
  .topnav .logo-anh img { height: 24px; }
  .topnav .nut-ngon-ngu { padding-inline: 6px; }
  /* CÙNG MỘT HÀNG THÌ CÙNG MỘT CHIỀU CAO (Sếp 17/10/2026: "control không thẳng hàng, cái cao
     cái thấp"). Đo trên 390px trước khi sửa: nút "Gửi phản hồi" 40px, nút ngôn ngữ 44px ⇒
     hai nút lệch nhau 2px theo trục dọc dù `.phai` đã canh giữa. */
  .topnav-inner .phai .btn-sm,
  .topnav-inner .phai .nut-ngon-ngu { height: auto; min-height: 44px; }
  .nut-ngon-ngu { display: inline-flex; }
}

/* Ô CHỌN NHIỀU MỤC MỘT HÀNG. Đo TRƯỚC (390px): "LOẠI PHẢN HỒI" 5 mục × 1 cột = **344px**;
   nhóm thông tin liên hệ 3 ô × 1 cột = **334px** — mỗi mục chiếm trọn một hàng, trang dài
   mà nửa phải bỏ trống. `minmax(150px, 1fr)` ⇒ 2 mục/hàng ở 325px lòng thẻ, tự về 1 cột khi
   hẹp hơn 140px. CHỈ áp cho lưới có gắn `.luoi-gon` (biểu mẫu công khai) — CẤM đổi `.grid-3`
   toàn hệ vì bảng quản trị nội bộ dùng chung lớp này. */
@media (max-width: 559px) {
  .luoi-gon { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: var(--sp-3); }
  .luoi-gon .chon-o { padding: var(--sp-3) var(--sp-3) var(--sp-3) calc(var(--sp-3) + 24px); min-height: 60px; }
  .luoi-gon .chon-o::before { left: var(--sp-3); top: calc(var(--sp-3) + 3px); }
}

/* NHẢY TỚI NEO KHÔNG BỊ THANH TRÊN CHE (Sếp 15/10/2026: "control chờm lên chữ").
   Thanh trên `position: sticky` cao 58–155px; bấm liên kết neo (vd "Gửi phản hồi" →
   `#gui-phan-hoi`) thì tiêu đề khối nằm ĐÚNG DƯỚI thanh ⇒ chữ bị che.
   Đo TRƯỚC: KHÔNG có `scroll-margin-top` ở đâu trong hệ. `scroll-margin-top` vô hại với
   phần tử không bao giờ được cuộn tới ⇒ một luật cho MỌI `[id]` là chữa ở gốc, che cả
   đường nhảy neo của trình duyệt lẫn `scrollIntoView()` trong JS. */
[id] { scroll-margin-top: calc(var(--cao-top) + var(--sp-4)); }


/* ═══════════════════════════════════════════════════════════
   14. DẢI ANH HÙNG + KHỐI LANDING
   ═══════════════════════════════════════════════════════════ */
.hero { padding-block: var(--sp-9) var(--sp-8); position: relative; }
@media (min-width: 769px) { .hero { padding-block: var(--sp-10); } }
.hero-cot { display: grid; grid-template-columns: 1fr; gap: var(--sp-8); align-items: center; }
@media (min-width: 900px) { .hero-cot { grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: var(--sp-9); } }
.nhan-hero {
  display: inline-flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-xs); font-weight: 700;
  background: var(--color-surface); border: 1px solid var(--color-border-strong);
  color: var(--color-accent); padding: 5px var(--sp-3); border-radius: var(--radius-full);
  margin-bottom: var(--sp-5); box-shadow: var(--shadow-sm);
}
.nhan-hero .cham { width: 7px; height: 7px; border-radius: 50%; background: var(--color-green); }
/* Đợt 1 (15/10/2026) — lỗi L3: bản cũ khai `repeat(auto-fit, minmax(120px, 1fr))`. Miền Đại Nam
   chỉ có 2 ô số liệu ⇒ lưới sinh 8 rãnh, 6 rãnh rỗng, 2 rãnh còn lại bị kéo thành 590px MỖI ô
   (đo thật: 1920 → lưới `590px 590px 0×6`; "4 đơn vị" ở x=352, "48 giờ" ở x=962 ⇒ hai số cách
   nhau 610px, nhìn như lỗi chứ không như thiết kế).
   Nay: ô CO THEO CHỮ và xếp sát nhau theo một nhịp cố định ⇒ hết khoảng chết, vẫn tự xuống
   dòng khi hẹp (280px: 2 ô xuống 2 hàng, không tràn). Nhịp dùng token nên tự co theo màn. */
.dai-so {
  display: flex; flex-wrap: wrap; align-items: flex-start;
  gap: var(--sp-2) var(--sp-8); padding-top: var(--sp-6); border-top: 1px solid var(--color-border);
}
.dai-so .o b { display: block; font-size: var(--fs-2xl); font-weight: 800; color: var(--color-accent); letter-spacing: -0.8px; }
.dai-so .o span { font-size: var(--fs-sm); color: var(--color-muted); }
/* Dải số liệu ở ĐỈNH trang (khối `dinh`) — giữ đúng khoảng cách cũ. */
.dinh-dai { margin-top: var(--sp-9); }
/* Đợt 2 (15/10/2026) — dải số liệu nằm CẠNH khối "Quy trình tiếp nhận" (cột phải của lưới):
   xếp DỌC và bỏ đường kẻ trên (đường kẻ đó chỉ hợp khi nó là dải ngang dưới đỉnh trang).
   Nhờ vậy quy trình (trái) + số liệu (phải) cùng 1 hàng, hết hở 844px bên phải. */
.dai-doc { flex-direction: row; flex-wrap: wrap; justify-content: center; gap: var(--sp-6); padding-top: 0; border-top: 0; }
/* Thẻ số liệu trong khối quy trình: cao bằng cột bước, số liệu căn giữa cả 2 chiều */
.the-dai { display: flex; }
.the-dai > .than { display: flex; flex-direction: column; justify-content: center; width: 100%; }

/* Thẻ TRA CỨU: dùng chung trần bề ngang với thẻ biểu mẫu; bên trong 2 cột — TRÁI ô nhập mã
   + nút tra cứu, PHẢI trợ giúp (câu hỏi thường gặp · quên mã), kết quả tra hiện bên dưới. */
.the-tra-cuu { max-width: 1120px; margin-inline: auto; }

.the-tinh-nang {
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius); padding: var(--sp-5); box-shadow: var(--shadow-sm);
  display: flex; flex-direction: column; gap: var(--sp-2); height: 100%;
  transition: border-color var(--chuyen), box-shadow var(--chuyen);
}
.the-tinh-nang:hover { border-color: var(--color-accent-line); box-shadow: var(--shadow-md); }
.the-tinh-nang .bieu {
  width: 38px; height: 38px; border-radius: var(--radius-md); background: var(--color-accent-soft);
  color: var(--color-accent); display: grid; place-items: center; margin-bottom: var(--sp-2);
}
.the-tinh-nang .bieu svg { width: 19px; height: 19px; }
.the-tinh-nang h3 { font-size: var(--fs-md); }
.the-tinh-nang p { margin: 0; color: var(--color-muted); font-size: var(--fs-sm); line-height: 1.65; }

.buoc { display: flex; flex-direction: column; gap: var(--sp-3); position: relative; }
.buoc .so-buoc {
  width: 30px; height: 30px; border-radius: var(--radius-sm); background: var(--color-accent); color: #fff;
  display: grid; place-items: center; font-weight: 700; font-size: var(--fs-sm); flex-shrink: 0;
}
.buoc .than-buoc { display: flex; gap: var(--sp-3); align-items: flex-start; }
.buoc h3 { font-size: var(--fs-base); margin: 3px 0 var(--sp-1); }
/* 17/10/2026 — Sếp: 3 bước "Quy trình tiếp nhận" xếp DỌC chiếm 3 dòng, nửa phải trống, kéo dài
   trang vô ích. Nay rải NGANG thành 3 thẻ cùng hàng, cao bằng nhau.
   Trải qua cả 3 cột của lưới ngoài nên không cần đổi cấu trúc DOM. */
.buoc-ngang { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); }
.buoc-ngang .than-buoc {
  gap: var(--sp-3); padding: var(--sp-4); height: 100%;
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
}
.buoc-ngang h3 { margin-top: 2px; }
.buoc-ngang p { margin: 0; }
/* Mũi tên nối 1 → 2 → 3 (Sếp 17/10/2026: "thêm cũng được"). Thuần CSS, không thêm DOM.
   Nằm ở khe giữa (gutter 16px) nên không đè chữ. Màn hẹp xuống 1 cột ⇒ bỏ mũi tên. */
.buoc-ngang .than-buoc { position: relative; }
.buoc-ngang .than-buoc:not(:last-child)::after {
  content: "";
  position: absolute; right: calc(var(--sp-4) / -2 - 5px); top: 50%;
  width: 10px; height: 10px; margin-top: -5px;
  border-top: 2px solid var(--color-accent); border-right: 2px solid var(--color-accent); opacity: .45;
  transform: rotate(45deg);
}
@media (max-width: 768px) {
  .buoc-ngang { grid-template-columns: 1fr; gap: var(--sp-3); }
  .buoc-ngang .than-buoc:not(:last-child)::after { display: none; }
}


.cau-hoi { border-bottom: 1px solid var(--color-border); }
.cau-hoi:last-child { border-bottom: none; }
.cau-hoi summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
  padding: var(--sp-4) 0; min-height: 44px; font-weight: 600; font-size: var(--fs-md); list-style: none;
}
.cau-hoi summary::-webkit-details-marker { display: none; }
.cau-hoi summary::after { content: '+'; font-size: 20px; color: var(--color-muted); font-weight: 400; flex-shrink: 0; }
.cau-hoi[open] summary::after { content: '−'; color: var(--color-accent); }
.cau-hoi .tra-loi { color: var(--color-muted); font-size: var(--fs-sm); line-height: 1.75; padding: 0 0 var(--sp-4); max-width: 80ch; }

.khoi-moi {
  background: linear-gradient(135deg, #3b1a75, var(--color-accent));
  border-radius: var(--radius-lg); padding: var(--sp-8) var(--sp-6); text-align: center;
  color: #fff; box-shadow: var(--shadow-lg);
}
.khoi-moi h2 { color: #fff; font-size: var(--fs-2xl); margin-bottom: var(--sp-3); letter-spacing: -0.6px; }
.khoi-moi p { color: rgba(255,255,255,0.85); margin: 0 auto var(--sp-6); max-width: 56ch; font-size: var(--fs-md); }
.khoi-moi .btn-trang { background: #fff; color: var(--color-accent); }
.khoi-moi .btn-trang:hover { background: #f4f2fb; }
.khoi-moi .btn-vien-trang { border-color: rgba(255,255,255,0.4); color: #fff; }
.khoi-moi .btn-vien-trang:hover { background: rgba(255,255,255,0.12); border-color: #fff; }

.chung-nhan {
  display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4);
  background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius);
  font-size: var(--fs-sm); color: var(--color-muted); box-shadow: var(--shadow-sm);
}
.chung-nhan svg { width: 17px; height: 17px; color: var(--color-green); flex-shrink: 0; }

/* ═══════════════════════════════════════════════════════════
   15. MÃ THEO DÕI · DÒNG THỜI GIAN · THẺ CHỌN
   ═══════════════════════════════════════════════════════════ */
.ma_ticket {
  font-family: var(--font-mono); font-size: var(--fs-2xl); font-weight: 700;
  color: var(--color-accent); letter-spacing: 0.08em; background: var(--color-accent-soft);
  padding: var(--sp-4) var(--sp-5); border-radius: var(--radius); display: inline-block;
  border: 1px dashed var(--color-accent-line); word-break: break-all;
}
.dong_thoi_gian { border-left: 2px solid var(--color-border); padding-left: var(--sp-5); margin-top: var(--sp-4); }
.moc_tg { position: relative; padding-bottom: var(--sp-4); }
.moc_tg:last-child { padding-bottom: 0; }
.moc_tg::before {
  content: ''; position: absolute; left: -26px; top: 5px; width: 11px; height: 11px;
  border-radius: 50%; background: var(--color-border-strong); border: 2px solid var(--color-surface);
  box-shadow: 0 0 0 2px var(--color-border);
}
.moc_tg.xong::before { background: var(--color-green); box-shadow: 0 0 0 2px var(--color-green-soft); }
.moc_tg.dang::before { background: var(--color-warning); box-shadow: 0 0 0 2px var(--color-warning-soft); }
.moc_tg .viec { font-weight: 600; font-size: var(--fs-sm); }

.chon-o {
  border: 1px solid var(--color-border-strong); border-radius: var(--radius-md);
  /* 🔴 LỖI "ICON ĐÈ CHỮ" (Sếp báo 17/10/2026, đo trên 390px): lề trái cũ ăn theo --sp-9,
     mà thang khoảng cách CO LẠI ở màn hẹp (≤360px: --sp-9 = 28px) trong khi vòng tròn là
     kích thước CỐ ĐỊNH 16px đặt tại left 16px ⇒ chữ bắt đầu ở 22–28px, NẰM DƯỚI vòng tròn.
     Nay lề trái tính từ CHÍNH vòng tròn: left(16) + 16 (đường kính) + 8 (khe) = 40px. */
  padding: var(--sp-4) var(--sp-4) var(--sp-4) calc(var(--sp-4) + 24px);
  cursor: pointer;
  background: var(--color-surface); position: relative; transition: all var(--chuyen); user-select: none;
  /* Cùng một lưới thì các ô phải CAO BẰNG NHAU và chữ canh giữa — trước đây ô 1 dòng thấp
     hơn ô 2 dòng, nhìn như "cái cao cái thấp". */
  display: flex; flex-direction: column; justify-content: center;
  min-height: 56px; min-width: 0;
}
.chon-o:hover { border-color: var(--color-accent-line); background: var(--color-surface-2); }
.chon-o::before {
  content: ''; position: absolute; left: var(--sp-4); top: calc(var(--sp-4) + 3px); width: 16px; height: 16px;
  border-radius: 50%; border: 2px solid var(--color-border-strong); background: var(--color-surface);
  transition: all var(--chuyen);
}
.chon-o.dang { border-color: var(--color-accent); background: var(--color-accent-soft); box-shadow: 0 0 0 1px var(--color-accent); }
.chon-o.dang::before { border-color: var(--color-accent); background: var(--color-accent); box-shadow: inset 0 0 0 3px #fff; }
/* LỰA CHỌN ĐƯỢC KHUYÊN DÙNG: khi đang chọn thì TÔ NỀN đậm, không chỉ viền
   (Sếp báo 17/10/2026: nút đăng nhập không nổi bật bằng màu nền). Trắng trên nền
   accent đạt tương phản > 7:1. */
.chon-o.dang.chon-o--chinh {
  background: var(--color-accent); border-color: var(--color-accent); box-shadow: none;
}
.chon-o.dang.chon-o--chinh .t { color: #fff; }
.chon-o.dang.chon-o--chinh .d { color: rgba(255, 255, 255, .92); }
.chon-o.dang.chon-o--chinh::before { border-color: #fff; background: #fff; box-shadow: inset 0 0 0 3px var(--color-accent); }
.chon-o .t { font-weight: 700; font-size: var(--fs-base); display: block; }
.chon-o .d { font-size: var(--fs-sm); color: var(--color-muted); line-height: 1.5; display: block; }
.chon-o input { position: absolute; opacity: 0; pointer-events: none; }

.pill {
  padding: 7px var(--sp-3); border-radius: var(--radius-sm); font-size: var(--fs-sm); font-weight: 600;
  color: var(--color-muted); border: 1px solid var(--color-border-strong); background: var(--color-surface);
  cursor: pointer; transition: all var(--chuyen); white-space: nowrap;
}
.pill:hover:not(.dang) { border-color: var(--color-accent); color: var(--color-accent); }
.pill.dang { background: var(--color-accent); border-color: var(--color-accent); color: #fff; }

/* ═══════════════════════════════════════════════════════════
   16. MÀN CHẶN ĐĂNG NHẬP (portal nội bộ)
   ═══════════════════════════════════════════════════════════ */
.chan_dang_nhap {
  position: fixed; inset: 0; z-index: 2000; background: var(--color-bg);
  display: flex; align-items: center; justify-content: center;
  padding: var(--sp-5); overflow-y: auto;
}
.the-dang-nhap {
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-xl);
  width: 100%; max-width: 404px; overflow: hidden;
}
.the-dang-nhap .dau-dn { padding: var(--sp-7) var(--sp-7) var(--sp-5); text-align: center; }
.the-dang-nhap .bieu-dn {
  width: 46px; height: 46px; border-radius: var(--radius); background: var(--color-accent);
  display: grid; place-items: center; color: #fff; margin: 0 auto var(--sp-4);
  box-shadow: 0 4px 14px rgba(76, 29, 149, 0.3);
}
.the-dang-nhap .bieu-dn svg { width: 22px; height: 22px; }
.the-dang-nhap h1 { font-size: var(--fs-xl); margin-bottom: var(--sp-2); }
.the-dang-nhap .than-dn { padding: 0 var(--sp-7) var(--sp-7); }
.the-dang-nhap .chan-dn { padding: var(--sp-4) var(--sp-7); background: var(--color-surface-2); border-top: 1px solid var(--color-border); text-align: center; }
@media (max-width: 430px) {
  .chan_dang_nhap { padding: var(--sp-4) var(--sp-3); align-items: flex-start; }
  .the-dang-nhap .dau-dn { padding: var(--sp-5) var(--sp-5) var(--sp-4); }
  .the-dang-nhap .than-dn { padding: 0 var(--sp-5) var(--sp-5); }
  .the-dang-nhap .chan-dn { padding: var(--sp-4) var(--sp-5); }
}

/* ═══════════════════════════════════════════════════════════
   17. CHÂN TRANG
   ═══════════════════════════════════════════════════════════ */
footer.duoi {
  border-top: 1px solid var(--color-border); background: var(--color-surface);
  padding: var(--sp-7) var(--sp-5); color: var(--color-muted); font-size: var(--fs-sm); line-height: 1.9;
}
/* 🔴 TÊN LỚP PHẢI RIÊNG: bản cũ dùng `<div class="trong">` — ĐỤNG TÊN với KHỐI TRẠNG THÁI RỖNG
   ở mục 11 (`.trong { flex-direction: column; align-items: center; justify-content: center;
   text-align: center; padding: 48px 20px }`). Hệ quả đo thật 15/10/2026 (1366px): khối chân trang
   bị co theo nội dung rồi CĂN GIỮA ⇒ nội dung chỉ chiếm 837/1139px, hở 302px bên phải, dòng cuối
   "trôi" vào giữa (453→898 thay vì bám lề 76) ⇒ Sếp thấy "rất xấu, không cân đối".
   Đổi tên thành `.chan-trong` để hết đụng; KHÔNG sửa `.trong` vì nó là khối dùng chung. */
footer.duoi .chan-trong { max-width: var(--rong-trang); margin-inline: auto; }
footer.duoi .cot { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-6); }
/* 2 cột khớp ĐÚNG 2 nhóm nội dung. Bản cũ khai `1.4fr 1fr 1fr` mà chỉ có 2 con ⇒ cột thứ ba
   RỖNG 309px, nội dung dồn hết sang trái. */
@media (min-width: 769px) { footer.duoi .cot { grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); } }
footer.duoi strong { color: var(--color-fg); }
footer.duoi a:hover { color: var(--color-accent); }
/* W5.3 (FPC-100) — VÙNG CHẠM: 2 link chân trang đo được 76x16 và 120x16, dưới ngưỡng 44 px.
   Đệm dọc 14 px + lề âm 14 px ⇒ cao 44 px mà bố cục chân trang KHÔNG đổi (lề âm bù đúng phần
   đệm). Không dùng `min-height` vì như vậy đẩy dòng chữ ký xuống. */
footer.duoi a { display: inline-block; padding-block: 14px; margin-block: -14px; }
.duoi-cung { margin-top: var(--sp-6); padding-top: var(--sp-5); border-top: 1px solid var(--color-border); font-size: var(--fs-xs);
  /* Bám 2 lề: cụm chữ ký ở lề trái (thẳng trục cột 1), cụm giờ ở lề phải (thẳng trục cột 2).
     Trước 15/10/2026 dòng này trôi vào GIỮA ở màn rộng vì `.duoi-cung` là flex mà không có
     `justify-content`, lại nằm trong khối cha bị co theo nội dung. */
  justify-content: space-between; }

/* ═══════════════════════════════════════════════════════════
   19. BỔ SUNG ĐỢT B — nhãn nguồn dữ liệu · mã QR · cam kết · ngăn kéo trợ giúp · bản in
   ═══════════════════════════════════════════════════════════ */

/* Nhãn NGUỒN dữ liệu của từng khối. Màn chưa nối máy chủ thì phải nói rõ nguồn,
   cấm để số liệu mẫu đứng cạnh số liệu thật mà không ai biết cái nào là cái nào. */
.nhan-nguon {
  display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-xs);
  font-weight: 600; color: var(--color-muted); background: var(--color-surface-3);
  border: 1px solid var(--color-border); border-radius: var(--radius-full);
  padding: 3px var(--sp-2); white-space: nowrap;
}
.nhan-nguon.that { background: var(--color-success-soft); border-color: #a7f3d0; color: #065f46; }

/* Mã QR + khối mã theo dõi.
   Vì sao QR nằm trong NỀN DÙNG CHUNG: landing, biên nhận in và SDK đều cần; viết 3 lần là
   3 chỗ lệch nhau. QR sinh NGAY TRÊN MÁY NGƯỜI DÙNG từ tệp chung/qrcode.js (đọc cục bộ). */
.qr {
  width: 148px; height: 148px; padding: var(--sp-2); background: #fff;
  border: 1px solid var(--color-border); border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm); flex-shrink: 0;
}
.qr svg { width: 100%; height: 100%; display: block; shape-rendering: crispEdges; }
.qr-rong { display: grid; place-items: center; text-align: center; font-size: var(--fs-xs);
  color: var(--color-muted); width: 148px; height: 148px; border: 1px dashed var(--color-border-strong);
  border-radius: var(--radius-md); background: var(--color-surface-2); padding: var(--sp-3); }
.hop-ma-qr { display: flex; gap: var(--sp-5); align-items: center; flex-wrap: wrap; }
@media (max-width: 480px) { .qr, .qr-rong { width: 118px; height: 118px; } }

/* Khối CAM KẾT (loại C): chữ to, viền vàng — nói thẳng "bạn sẽ không nhận được thông báo". */
.cam-ket-nb {
  border: 2px solid var(--color-gold); background: var(--color-warning-soft);
  border-radius: var(--radius); padding: var(--sp-5); margin: var(--sp-4) 0 0;
}
.cam-ket-nb .td { font-weight: 700; font-size: var(--fs-md); color: #7c2d12; line-height: 1.5; }
.cam-ket-nb .mt { font-size: var(--fs-sm); color: #78350f; margin: var(--sp-2) 0 0; max-width: 68ch; }
/* Ô tích trong khối cảnh báo: chữ chạy hết bề rộng khung, không chia cột. */
.cam-ket-nb .o-kiem-rong { align-items: center; font-size: var(--fs-md); color: #5d4037; }
.cam-ket-nb .o-kiem-rong input { flex: 0 0 auto; width: 20px; height: 20px; }

/* Ngăn kéo TRỢ GIÚP trong sản phẩm (UI-05). Trượt từ phải, không che nội dung đang làm. */
.ngan-keo {
  position: fixed; top: 0; right: 0; height: 100vh; width: min(420px, 92vw);
  background: var(--color-surface); border-left: 1px solid var(--color-border);
  box-shadow: var(--shadow-xl); z-index: 80; display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1);
}
.ngan-keo.mo { transform: translateX(0); }
.ngan-keo .dau-keo {
  display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--color-border); min-height: 60px;
}
.ngan-keo .dau-keo h2 { margin: 0; font-size: var(--fs-md); flex: 1 1 auto; }
.ngan-keo .than-keo { padding: var(--sp-4); overflow-y: auto; flex: 1 1 auto; }
.ngan-keo .cham-nen { position: fixed; inset: 0; background: rgba(27,24,58,0.4); z-index: 79; }
.phim-tat { display: flex; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-sm); padding: var(--sp-2) 0; border-bottom: 1px dashed var(--color-border); }
.phim-tat kbd {
  font-family: var(--font-mono); font-size: var(--fs-xs); background: var(--color-surface-3);
  border: 1px solid var(--color-border-strong); border-bottom-width: 2px; border-radius: var(--radius-xs);
  padding: 2px 6px; color: var(--color-fg-soft);
}

/* Nút "?" trợ giúp — cùng cỡ vùng chạm với nút biểu tượng khác */
.nut-hoi { width: 44px; height: 44px; border-radius: var(--radius-full); border: 1px solid var(--color-border-strong);
  background: var(--color-surface); color: var(--color-muted); font-weight: 700; flex-shrink: 0; }
.nut-hoi:hover { border-color: var(--color-accent); color: var(--color-accent); }

/* Bản in biên nhận (UI-15). Chỉ hiện khi in; trên màn hình là bản xem trước A5. */
.phieu-in {
  background: #fff; border: 1px solid var(--color-border-strong); border-radius: var(--radius);
  padding: var(--sp-6); max-width: 210mm; margin: var(--sp-5) auto 0;
}
.phieu-in .dau-in { display: flex; justify-content: space-between; gap: var(--sp-4); border-bottom: 2px solid var(--color-fg); padding-bottom: var(--sp-3); }
.phieu-in .o-ghi-tay { border: 1px dashed var(--color-border-strong); border-radius: var(--radius-sm); height: 56px; margin-top: var(--sp-5); padding: var(--sp-2); font-size: var(--fs-xs); color: var(--color-muted); }
@media print {
  /* Chỉ in tờ biên nhận: ẩn điều hướng, nút, mọi thứ không thuộc tờ giấy. */
  body { background: #fff; }
  .topnav, .portal-side, .portal-top, .duoi, .khong-in, .ngan-keo, .cham-nen { display: none !important; }
  .phieu-in { border: none; box-shadow: none; margin: 0; padding: 0; max-width: none; page-break-inside: avoid; }
  .in-kho { display: block !important; }
  a[href]::after { content: ""; }
}
.in-kho { display: none; }

/* Thanh trên portal: hẹp thì nhãn phải xuống hàng được.
   Bản trước .badge có white-space:nowrap nên ở 280px nhóm .phai tràn 111px và bị
   body{overflow-x:hidden} che mất ⇒ nội dung bị CẮT mà không ai thấy. */
@media (max-width: 560px) {
  .portal-top { flex-wrap: wrap; row-gap: var(--sp-2); }
  .portal-top .duong-dan { order: 3; width: 100%; }
  .portal-top .phai { margin-left: 0; width: 100%; }
  .portal-top .phai .badge { white-space: normal; }
}
@media (max-width: 480px) {
  .badge { white-space: normal; }
  .hang > .btn { min-width: 0; }
}

/* Ô nhập trong bảng/hàng đợi trên màn hẹp: giữ được vùng chạm mà không tràn ngang */
@media (max-width: 430px) {
  .thanh-cu, .loc-chon { flex-wrap: wrap; }
  .loc-chon select { width: 100%; min-width: 0; }
  .o-tim { max-width: none; }
}

/* ═══════════════════════════════════════════════════════════
   18. CP-17 → CP-24 — NÂNG TỪ PORTAL + THÊM MỚI (ĐỢT C)
   ═══════════════════════════════════════════════════════════ */

/* CP-17 — Chip lọc đang bật. Bí danh .chip_loc đã gỡ (L-07). */
.chip-loc {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 600;
  padding: 4px 10px; border-radius: var(--radius-full); background: var(--color-accent-soft);
  color: var(--color-accent);
}
.chip-loc button { color: inherit; opacity: .7; font-size: 14px; line-height: 1; }
.chip-loc button:hover { opacity: 1; }

/* CP-18 — Công tắc bật/tắt. Bí danh .cong_tac đã gỡ (L-07). */
.cong-tac {
  width: 40px; height: 22px; border-radius: 99px; background: var(--color-border-strong);
  position: relative; transition: background .18s; flex-shrink: 0;
}
.cong-tac::after {
  content: ''; position: absolute; left: 3px; top: 3px; width: 16px; height: 16px;
  border-radius: 50%; background: var(--color-surface); transition: transform .18s;
  box-shadow: 0 1px 3px rgba(0,0,0,.2);
}
.cong-tac.bat { background: var(--color-green); }
.cong-tac.bat::after { transform: translateX(18px); }

/* CP-19 — Phân trang. Bí danh .phan_trang / .nut_trang đã gỡ (L-07). */
.phan-trang {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 12px 20px; border-top: 1px solid var(--color-border); background: var(--color-surface);
}
.phan-trang .giua { margin-left: auto; display: flex; gap: 4px; align-items: center; }
.nut-trang {
  min-width: 30px; height: 30px; border-radius: var(--radius-xs); font-size: 13px;
  font-weight: 600; color: var(--color-muted); border: 1px solid transparent; padding: 0 7px;
}
.nut-trang:hover { background: var(--color-surface-3); color: var(--color-fg); }
.nut-trang.dang { background: var(--color-accent); color: var(--color-surface); }
/* Dấu "…" trong dãy số trang: chỉ là dấu, không bấm được. */
.nut-trang.trong { border: 0; background: none; color: var(--color-muted-2); cursor: default; }

/* CP-19b (18/10/2026) — GRID CAO HẾT KHUNG NHÌN.
   Sếp soi: bảng ít dòng mà dưới bảng còn trống cả màn, chân bảng (phân trang) lơ lửng.
   Nay khung portal bị CHẶN đúng 1 màn hình, thẻ chứa bảng giãn hết phần còn lại, vùng bảng tự
   cuộn ⇒ chân bảng LUÔN sát mép dưới. Đo bằng 4 bộ chọn `>` (con trực tiếp) nên màn không có
   bảng, hoặc bảng nằm trong tab, KHÔNG bị đổi bố cục. */
.portal:has(> .portal-main > .portal-than > .the.bang-cao) { height: 100dvh; }
.portal-main:has(> .portal-than > .the.bang-cao) { min-height: 0; }
.portal-than:has(> .the.bang-cao) { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; }
.the.bang-cao { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.the.bang-cao > .khung_bang { flex: 1 1 auto; min-height: 0; overflow: auto; }
.the.bang-cao > .phan-trang { margin-top: auto; }

/* CP-20 — Thanh tiến độ + biểu đồ cột. Bí danh .thanh_tien / .bien_do giữ tương thích. */
.thanh-tien, .thanh_tien { height: 7px; border-radius: 99px; background: var(--color-surface-3); overflow: hidden; }
.thanh-tien i, .thanh_tien i { display: block; height: 100%; background: var(--color-accent); border-radius: 99px; }
.thanh-tien.cam i, .thanh_tien.cam i { background: var(--color-warning); }
.thanh-tien.do i, .thanh_tien.do i { background: var(--color-danger); }

.bien-do, .bien_do { display: flex; align-items: flex-end; gap: 7px; height: 118px; padding-top: 8px; }
.bien-do .cot, .bien_do .cot {
  flex: 1 1 0; display: flex; flex-direction: column; justify-content: flex-end;
  align-items: center; gap: 6px; min-width: 0;
}
.bien-do .cot i, .bien_do .cot i {
  width: 100%; max-width: 42px; background: var(--color-accent); border-radius: 4px 4px 0 0;
  min-height: 3px; transition: height .3s;
}
.bien-do .cot.cam i, .bien_do .cot.cam i { background: var(--color-warning); }
.bien-do .cot.do i, .bien_do .cot.do i { background: var(--color-danger); }
.bien-do .cot span, .bien_do .cot span { font-size: 11px; color: var(--color-muted); white-space: nowrap; }
.bien-do .cot b, .bien_do .cot b { font-size: 12px; font-weight: 700; }

/* Lớp phụ nâng từ portal — avatar · ô công tắc · thẻ minh chứng · băng xem trước */

/* Avatar người dùng (28px, kèm biến thể xám). */
.avatar {
  width: 28px; height: 28px; border-radius: 50%; background: var(--color-accent-soft);
  color: var(--color-accent); display: grid; place-items: center; font-size: 11px;
  font-weight: 700; flex-shrink: 0;
}
.avatar.xam { background: var(--color-surface-3); color: var(--color-muted); }

/* Ô chứa công tắc (một dòng bật/tắt trong danh sách). Bí danh .o_cong_tac giữ tương thích. */
.o-cong-tac, .o_cong_tac {
  display: flex; align-items: center; gap: 12px; padding: 13px 16px;
  border-bottom: 1px solid var(--color-border);
}
.o-cong-tac:last-child, .o_cong_tac:last-child { border-bottom: none; }

/* Thẻ minh chứng (lưới thẻ nhỏ tự giãn). Bí danh .the_minh_chung giữ tương thích. */
.the-minh-chung, .the_minh_chung { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 10px; }
.the-minh-chung .mc, .the_minh_chung .mc {
  border: 1px solid var(--color-border); border-radius: var(--radius-sm);
  padding: 12px 10px; text-align: center; font-size: 11.5px; color: var(--color-muted);
  background: var(--color-surface-2); word-break: break-all;
}
.the-minh-chung .mc svg, .the_minh_chung .mc svg { width: 20px; height: 20px; margin: 0 auto 6px; color: var(--color-muted-2); }

/* Băng-rôn XEM TRƯỚC — màu TH-03 (dữ liệu cũ/xem trước). Dùng biến sẵn có, không mã màu thô. */
.bang-xem-truoc, .bang_xem_truoc {
  padding: 11px 20px; background: var(--color-warning-soft); color: var(--color-fg-soft);
  border-bottom: 2px solid var(--color-gold); font-size: 13px; font-weight: 700;
}

/* CP-21 — Toast toàn cục: tự ẩn 5 giây, đóng được, đặt role="status". Bốn biến thể màu theo TH-. */
.toast {
  position: fixed; left: 50%; bottom: var(--sp-6); transform: translateX(-50%);
  display: flex; align-items: center; gap: var(--sp-3); max-width: min(420px, 92vw);
  padding: var(--sp-3) var(--sp-4); border-radius: var(--radius-md);
  background: var(--color-surface); border: 1px solid var(--color-border);
  box-shadow: var(--shadow-lg); font-size: var(--fs-sm); font-weight: 600;
  color: var(--color-fg); z-index: 2100;
}
.toast--thanh-cong { background: var(--color-success-soft); border-color: var(--color-green); }
.toast--loi        { background: var(--color-danger-soft);  border-color: var(--color-danger); }
.toast--canh-bao   { background: var(--color-warning-soft); border-color: var(--color-warning); }
.toast--thong-tin  { background: var(--color-info-soft);    border-color: var(--color-info); }

/* CP-22 — Nhãn "AI gợi ý — cần xác nhận": luôn kèm chữ, không chỉ icon. */
.nhan-ai {
  display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-xs);
  font-weight: 600; color: var(--color-accent); background: var(--color-accent-soft);
  border: 1px solid var(--color-accent-line); border-radius: var(--radius-full);
  padding: 3px var(--sp-2); white-space: nowrap;
}

/* CP-23 — Bộ lọc nhiều tầng dạng ngăn kéo: nền che + đóng bằng Esc. */
.loc-drawer {
  position: fixed; top: 0; right: 0; height: 100vh; width: min(720px, 95vw);
  background: var(--color-surface); border-left: 1px solid var(--color-border);
  box-shadow: var(--shadow-xl); z-index: 90; display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform 0.24s cubic-bezier(0.16, 1, 0.3, 1);
}
.loc-drawer.mo { transform: translateX(0); }
/* Ngăn kéo CHI TIẾT phản hồi: nội dung + máy đọc + form xử lý phải nằm cùng một chỗ nhìn thấy
   (Sếp chốt 19/10/2026: bấm dòng trong bảng thì mở hộp TO ngay trên màn, không đẩy nội dung
   xuống đáy bảng bắt người dùng cuộn lên xuống). Bề rộng rộng gấp ~3 lần ngăn kéo bộ lọc. */
.loc-drawer.rong { width: min(1800px, 98vw); }
@media (max-width: 640px) { .loc-drawer.rong { width: 100vw; } }
.loc-nen {
  position: fixed; inset: 0; background: rgba(27, 24, 58, 0.4); z-index: 89;
  opacity: 0; pointer-events: none; transition: opacity 0.24s;
}
.loc-nen.mo { opacity: 1; pointer-events: auto; }

/* CP-24 — Màn "không có quyền" (403): đặt giữa màn, kèm chữ rõ + nút về trang chủ. */
.man-403 {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--sp-3); padding: var(--sp-9) var(--sp-5); text-align: center; min-height: 60vh;
}
.man-403 .bieu {
  width: 46px; height: 46px; border-radius: var(--radius-full);
  background: var(--color-danger-soft); color: var(--color-danger);
  display: grid; place-items: center; margin-bottom: var(--sp-1);
}
.man-403 .bieu svg { width: 22px; height: 22px; }
.man-403 .td { font-weight: 700; font-size: var(--fs-lg); color: var(--color-fg); }
.man-403 .mt { color: var(--color-muted); font-size: var(--fs-sm); max-width: 46ch; }
.man-403 .hang { margin-top: var(--sp-3); }

/* ═══════════════════════════════════════════════════════════
   20. TÔN TRỌNG GIẢM CHUYỂN ĐỘNG (đặt CUỐI tệp để luôn thắng)
   ═══════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important; transition-duration: 0.01ms !important;
    animation-iteration-count: 1 !important; scroll-behavior: auto !important;
  }
}

/* ═══════════════════════════════════════════════════════════
   21. MÀN HẸP — ĐIỆN THOẠI · TABLET · MÁY GẬP (Sếp yêu cầu 15/10/2026)
   Đo DOM THẬT trước lớp này (feedback.dainam.edu.vn, 320→1366px):
     · nút "Quên mã? Tra cứu bằng email hoặc số điện thoại" rộng 326px trong khung 320px ⇒
       TRÀN 39px ra ngoài thẻ chứa nó (`.the`: cần 342px, có 286px)
     · ô chọn ngôn ngữ ĐÈ lên nút "Gửi phản hồi" ở 240–430px (đã chữa ở mục 13)
     · 22/22 ô nhập cỡ chữ 14px < 16px ⇒ iOS tự phóng to khi chạm ô, bố cục nhảy khỏi vùng nhìn
   Ba luật dưới đây chữa ở ĐÚNG lớp dùng chung — không vá riêng từng màn.
   ═══════════════════════════════════════════════════════════ */

/* (1) CHỮ KHÔNG TRÀN RA NGOÀI KHUNG: cho phép xuống dòng, cao tự do, vẫn đủ ngón tay (≥40px).
   `.btn` vốn `white-space: nowrap; flex-shrink: 0` — cố ý cho thanh công cụ máy rộng; máy hẹp
   thì nhãn dài là thứ DUY NHẤT không co được ⇒ đổi luật theo bề ngang. */
@media (max-width: 560px) {
  .btn { white-space: normal; height: auto; padding-block: var(--sp-2);
         flex-shrink: 1; min-width: 0; text-align: center; }
  .btn { min-height: 44px; }
  .btn-sm { min-height: 40px; }
  .btn-lg { min-height: 48px; }
  .badge { white-space: normal; }
  .o, .the, .truong, .the-tinh-nang, .than-buoc, .thanh-cu, .hop-ma-qr, .loc-chon { min-width: 0; }
}

/* (2) THANG CHỮ CO THEO BỀ NGANG — đổi BIẾN, không sửa từng lớp, nên mọi thành phần ăn theo
   cùng một nhịp và vẫn đủ nội dung trong vùng nhìn thấy. Ba nấc: tablet · điện thoại · máy gập. */
@media (max-width: 768px) {
  :root { --fs-3xl: 30px; --fs-2xl: 23px; --fs-xl: 19px; --fs-lg: 15.5px;
          --sp-10: 48px; --sp-9: 40px; --sp-8: 32px; }
}
@media (max-width: 430px) {
  :root { --fs-3xl: 28px; --fs-2xl: 22px; --fs-xl: 18px; --fs-lg: 15px;
          --sp-10: 40px; --sp-9: 32px; --sp-8: 22px; }
}
@media (max-width: 360px) {
  :root { --fs-3xl: 25px; --fs-2xl: 20px; --fs-xl: 17px; --fs-lg: 14.5px; --fs-md: 13.5px;
          --sp-10: 32px; --sp-9: 28px; --sp-8: 20px; --sp-7: 20px; }
}

/* (3) Ô NHẬP ≥ 16px TRÊN THIẾT BỊ CẢM ỨNG: nhỏ hơn là iOS tự phóng to khi chạm ô ⇒ bố cục nhảy.
   Chặn ở gốc, KHÔNG khoá zoom của người dùng (không dùng user-scalable=no).
   `!important` là CỐ Ý: nhiều luật cũ ghim cỡ chữ theo LỚP (`.loc-chon select` = 12.5px) nên
   một luật theo THẺ sẽ thua; đây là bất biến thiết bị, không phải chuyện thẩm mỹ. */
@media (pointer: coarse) {
  input:not([type=hidden]):not([type=checkbox]):not([type=radio]),
  select, textarea { font-size: 16px !important; }
}

/* ── V-20 (16/10/2026): nén mật độ biểu mẫu ở máy hẹp để hạ chiều cao trang 390 về ≤4300px.
   Chỉ bớt khoảng trắng dọc (margin/padding), KHÔNG cắt chữ, KHÔNG đổi bố cục cột. */
@media (max-width: 560px) {
  .truong { margin-bottom: 4px; }
  .the > .than { padding: 6px; }
  .goi_y { margin-top: 2px; }
  .the-doc .than .hang-cach { padding-bottom: var(--sp-1); margin-bottom: 4px; }
  .section { padding-block: 4px; }
  .hero { padding-block: var(--sp-2); }
  .hero-cot { gap: var(--sp-2); }
  .nhan-hero { margin-bottom: 4px; }
  .nhan-nhom { margin-bottom: 3px; }
  .luoi-gon { gap: 4px; }
  .duoi { padding-block: var(--sp-3); }
  .the-loi-ich { padding: var(--sp-2); }
  .the-doc p, .the-doc .goi_y, .the-doc .nhan-nhom, .the-doc li { line-height: 1.4; }
}

/* ═══════════════════════════════════════════════════════════
   NÚT CHỌN TỆP — tiếng Việt, cùng khuôn với nút khác
   Vì sao không dùng `::file-selector-button`: chữ trên nút đó do TRÌNH DUYỆT quyết
   ("Choose File"), CSS không đổi được chữ ⇒ muốn tiếng Việt thì phải có nút của mình.
   Nhãn (label) làm nút, input gốc ẩn khỏi mắt nhưng VẪN Tab tới và VẪN mở hộp chọn
   (hành vi native của `<label for>`) — 0 dòng JavaScript.
   ═══════════════════════════════════════════════════════════ */
.nhan-tep {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: 44px; padding: 0 var(--sp-4);
  border: 1px solid var(--color-border-strong); border-radius: 8px;
  background: var(--color-surface); color: var(--color-fg);
  font-size: var(--fs-sm); font-weight: 600; letter-spacing: 0; text-transform: none;
  margin: 0; cursor: pointer;
}
.nhan-tep:hover { border-color: var(--color-accent); color: var(--color-accent); }
/* `input[type=file].tep-an` chứ không phải `.tep-an`: luật `input[type=file]` ở mục 5 có độ ưu tiên cao hơn
   một lớp trần, để nguyên là ô chọn tệp mặc định vẫn hiện ra thêm một lần nữa. */
input[type=file].tep-an {
  position: absolute; width: 1px; min-width: 0; height: 1px; min-height: 0;
  padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; border: 0; background: none;
  /* `iai-ds.css` đặt sàn chạm 44×44 cho MỌI input (đúng luật trợ năng của nó) nên 1×1 không thắng
     được. Ẩn bằng độ trong suốt: hộp vẫn ở đó, vẫn Tab tới được, vẫn mở hộp chọn qua `<label for>`. */
  opacity: 0;
}
/* Bàn phím: Tab vào input (đang ẩn) thì viền sáng nút — dùng :has, Chrome/Safari/Firefox ≥ 121 */
.nhan-tep:has(+ .tep-an:focus-visible) { outline: 3px solid var(--color-accent); outline-offset: 2px; }

/* ═══════════════════════════════════════════════════════════
   KHU NGƯỜI DÙNG Ở THANH TRÊN (17/10/2026)
   Chưa đăng nhập: nút Đăng nhập. Đã đăng nhập: avatar chữ cái đầu + tên + Đăng xuất.
   Vì sao avatar là CHỮ chứ không phải ảnh: miền chưa có ảnh đại diện từ Cổng định danh,
   bịa ảnh là bịa dữ liệu. Chữ cái đầu là thật, luôn có.
   ═══════════════════════════════════════════════════════════ */
.khu-nd { display: inline-flex; align-items: center; gap: var(--sp-2); min-width: 0; position: relative; }
.khu-nd .ava {
  width: 32px; height: 32px; flex: 0 0 32px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--color-accent); color: #fff;
  font-size: var(--fs-sm); font-weight: 700; text-transform: uppercase;
}
/* Avatar là NÚT: nút thật (bấm được, có :focus-visible) chứ không phải trang trí. */
.khu-nd button.ava { border: 0; padding: 0; cursor: pointer; font-family: inherit; }
.khu-nd button.ava:hover { background: var(--color-accent-hover); }
.khu-nd button.ava:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }
/* MENU ẨN SAU AVATAR (Sếp chốt 17/10/2026): "Đăng xuất" nằm trong đây, không bày ra thanh trên. */
.menu-nd {
  position: absolute; top: calc(100% + 8px); left: 0; z-index: 70;
  min-width: 210px; max-width: 78vw; padding: var(--sp-1);
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-sm); box-shadow: 0 12px 28px rgba(20, 20, 28, 0.16);
}
.menu-nd[hidden] { display: none; }
.menu-nd .ten-menu {
  padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--color-border);
  margin-bottom: var(--sp-1); font-size: var(--fs-xs); color: var(--color-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.menu-nd button {
  width: 100%; text-align: left; padding: var(--sp-2) var(--sp-3);
  background: none; border: 0; border-radius: var(--radius-xs); cursor: pointer;
  font-family: inherit; font-size: var(--fs-sm); font-weight: 600; color: var(--color-fg);
}
.menu-nd button:hover { background: var(--color-surface-3); }
/* Avatar đứng ở mép phải thanh trên (Sếp chốt 20/10/2026) ⇒ menu phải bung sang TRÁI,
   nếu vẫn neo `left: 0` thì menu tràn ra ngoài màn hình. */
.phai .menu-nd { left: auto; right: 0; }
/* Điện thoại: thu bề rộng menu để không tràn mép trái. */
@media (max-width: 480px) { .menu-nd { min-width: 190px; } }
.khu-nd .ten-nd {
  max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: var(--fs-sm); font-weight: 600; color: var(--color-fg);
}
/* Màn hẹp: avatar + nút thoát là đủ; tên dài chiếm chỗ của nút "Gửi phản hồi". */
@media (max-width: 720px) {
  .khu-nd .ten-nd { display: none; }
  .khu-nd .ava { width: 28px; height: 28px; flex-basis: 28px; }
}

/* ═══════════════════════════════════════════════════════════
   VÁ 320px KHI ĐÃ ĐĂNG NHẬP + VÙNG CHẠM 44px (17/10/2026)
   Đo thật trên prod: 320px, đã đăng nhập ⇒ `.phai` rộng 307px (trái 28, phải 335) ⇒ tràn 15px.
   Thủ phạm là 4 thứ nằm ngang: avatar, nút Đăng xuất, nút Gửi phản hồi, nút ngôn ngữ. Giữ ĐỦ
   chức năng, chỉ siết khoảng cách + đệm ngang ⇒ không phải bỏ nút nào.
   Nút "Tra cứu tiến độ" đo được 43px ở 320px, dưới luật chạm 44px ⇒ nâng .btn-sm lên 44px
   trong khung hẹp (đã có tiền lệ `.thanh-cu .btn-sm { height: 44px }`).
   ═══════════════════════════════════════════════════════════ */
@media (max-width: 400px) {
  .topnav-inner .phai { gap: var(--sp-1); }
  .topnav-inner .phai .btn-sm { padding: 0 var(--sp-2); }
  .topnav-inner .khu-nd { gap: var(--sp-1); }
}
@media (max-width: 768px) {
  .btn-sm { height: 44px; }
}

/* BÁO CÁO (17/10/2026) — một dòng nhóm vấn đề: tên bên trái, số việc bên phải. */
.dong-nhom { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding-block: 8px; border-bottom: 1px solid var(--color-border, #E5E7EB); }
.dong-nhom:last-child { border-bottom: 0; }

/* ══════════ BÁO CÁO ĐIỀU HÀNH 7 LỚP (NBH-300 P5b · 18/10/2026) ══════════
   Chỉ 6 lớp cần cho khối mới; mọi thứ còn lại dùng lại `.ct-khoi` / `.bang` / `.o_cam` có sẵn. */
.cau-ket-luan { margin: 0 0 var(--sp-3); font-size: var(--fs-lg); line-height: 1.45;
  color: var(--color-fg); font-weight: 600; }
.thanh-loc { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-top: var(--sp-3); }
.thanh-loc select { height: 40px; min-width: 132px; padding: 0 var(--sp-3); border-radius: var(--radius-sm);
  border: 1px solid var(--color-border-strong); background: var(--color-surface); color: var(--color-fg);
  font-size: var(--fs-base); }
.ds-gon { margin: 0; padding-left: 18px; display: grid; gap: var(--sp-2); }
.ds-gon li { font-size: var(--fs-base); line-height: 1.5; }
.ds-gon li strong { font-weight: 600; }
.bang-cuon { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.hang-nut { display: flex; gap: var(--sp-2); flex-wrap: wrap; margin-top: var(--sp-3); }
/* Ô sửa luật dạng JSON: đủ rộng, chữ đều, không co lại theo nội dung. */
.o-sua-json { width: 100%; min-height: 168px; padding: var(--sp-3); margin-top: var(--sp-2);
  border-radius: var(--radius-sm); border: 1px solid var(--color-border-strong);
  background: var(--color-surface-2, #F8FAFC); color: var(--color-fg);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: var(--fs-sm);
  line-height: 1.55; resize: vertical; tab-size: 2; }
.o-sua-json:focus { outline: 2px solid var(--color-accent); outline-offset: 1px; }
@media (max-width: 720px) {
  .cau-ket-luan { font-size: var(--fs-base); }
  .thanh-loc select { width: 100%; }
  .o-sua-json { font-size: var(--fs-xs); min-height: 200px; }
}

/* ── W5.1 + W5.2 (FPC-100, D-09 = B) — CHỈ TRANG TIẾP NHẬN CÔNG KHAI ─────────────────────────────
   VÌ SAO CỤC BỘ: token ở `:root` dùng chung cho portal và sản phẩm khác; nâng ở đó là phải đo lại
   toàn bộ nơi dùng. Phạm vi dưới đây chỉ chạm `body.trang-cong-khai` (2 tệp index.html của landing).
   SỐ ĐO: 62 tới 64 đoạn chữ dưới 14 px; `.goi_y` 11.5 px; viền nút `#d5cdec` trên nền trắng 1.52:1.
   SAU: `--fs-xs` 13 px (ngưỡng chữ mang nghĩa ≥12.5), `.goi_y` 14 px, viền `#8f7eb5` = 3.61:1. */
.trang-cong-khai {
  --fs-xs: 13px;
  --fs-sm: 14px;
  --color-border-strong: #8f7eb5;
}
.trang-cong-khai .goi_y { font-size: 14px; }

/* ── W4.8 nav mobile override — đặt CUỐI tệp để thắng khối điện thoại phía trên (đo 19/10:
   390px thì `.topnav-inner` vẫn `flex-wrap: nowrap` ⇒ dải nav bị bóp còn 114px). ───────────── */
@media (max-width: 768px) {
  .topnav-inner { flex-wrap: wrap; }
  .nav-links { flex: 1 0 100%; width: 100%; order: 10; }
}

/* ── FBC-600 (21/10/2026): HÀNG ĐỢI 3 NGĂN (≥1440px) ──────────────────────────
   Cây đơn vị bên trái · Bảng phản ánh ở giữa · Chi tiết bên phải.
   Ở màn hẹp (<1440px): tự động co về 1 cột, chi tiết mở qua ngăn kéo trượt. */
.hd-3-ngan { display: block; }
.hd-ngan-trai { display: none; }
.hd-ngan-phai { display: none; }

@media (min-width: 1440px) {
  .hd-3-ngan {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(480px, 35vw);
    gap: var(--sp-4);
    align-items: start;
  }
  .hd-ngan-trai {
    display: none !important;
  }
  .hd-ngan-giua { min-width: 0; }
  .hd-ngan-phai {
    display: block !important;
    position: sticky; top: var(--sp-4);
  }
}
@media (min-width: 1100px) and (max-width: 1439px) {
  .hd-3-ngan {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(440px, 40vw);
    gap: var(--sp-4);
    align-items: start;
  }
  .hd-ngan-trai { display: none !important; }
  .hd-ngan-giua { min-width: 0; }
  .hd-ngan-phai { display: block !important; position: sticky; top: var(--sp-4); }
}
    display: flex; flex-direction: column;
    position: sticky; top: var(--sp-4);
    max-height: calc(100vh - 80px); overflow-y: auto;
  }
}

/* Dòng phản ánh đang xem chi tiết ở ngăn phải */
.bang tr.dang-xem td { background: var(--color-accent-soft) !important; }

/* ── FBC-600 (21/10/2026): KHỐI BÁO CÁO 4 CỘT DESKTOP / 2 CỘT TABLET ───────── */
@media (min-width: 1200px) {
  .grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 640px) and (max-width: 1199px) {
  .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.bc-khoi-nhom {
  display: grid;
  gap: var(--sp-4);
}
@media (min-width: 1100px) {
  .bc-khoi-nhom.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .bc-khoi-nhom.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 640px) and (max-width: 1099px) {
  .bc-khoi-nhom.grid-3, .bc-khoi-nhom.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 639px) {
  .bc-khoi-nhom.grid-3, .bc-khoi-nhom.grid-2 { grid-template-columns: 1fr; }
}

/* 🔴 ẨN TOÀN BỘ LOGO, NGÔN NGỮ, ĐĂNG NHẬP, AVATAR Ở MOBILE MODE (Sếp chốt 21/10/2026) */
body.app-webview .logo-wrapper,
body.app-webview .phai .loc-chon,
body.app-webview .phai #chon-ngon-ngu-hop,
body.app-webview .phai #khu-dang-nhap,
body.app-webview .phai #khu-nguoi-dung,
body.app-webview .phai .btn-primary {
  display: none !important;
}

/* 🔴 ẨN GÓP Ý CHUNG VÀ CÁC KÊNH KHÁC TRÊN NAV KHI Ở MOBILE APP (Sếp chốt 21/10/2026) */
body.app-webview .nav-links a:not([href*="software"]):not([href*="tra-cuu"]) {
  display: none !important;
}

/* 🔴 ÉP HIỂN THỊ THANH NAV TRÊN MOBILE APP (Sếp chốt 21/10/2026) */
@media (max-width: 768px) {
  body.app-webview .topnav-inner {
    display: flex !important;
    flex-wrap: wrap !important;
  }
  body.app-webview .nav-links {
    display: flex !important;
    width: 100% !important;
    order: 10 !important;
    background: var(--color-surface) !important;
    padding: 6px 12px !important;
    gap: 8px !important;
    border-top: 1px solid var(--color-line) !important;
  }
  body.app-webview .nav-links a {
    display: inline-flex !important;
    padding: 6px 14px !important;
    background: var(--color-surface-2) !important;
    border-radius: 6px !important;
    font-weight: 600 !important;
  }
  body.app-webview .nav-links a.dang {
    background: var(--color-accent-soft) !important;
    color: var(--color-accent) !important;
  }
}

/* 🔴 ĐẢM BẢO NAV-LINKS LUÔN HIỆN VÀ CÓ KÍCH THƯỚC (Sếp chốt 21/10/2026) */
.nav-links {
  display: flex !important;
  visibility: visible !important;
  opacity: 1 !important;
}
@media (max-width: 768px) {
  body.app-webview .topnav-inner {
    flex-wrap: wrap !important;
  }
  body.app-webview .topnav .nav-links {
    display: flex !important;
    width: 100% !important;
    order: 5 !important;
    flex: 1 0 100% !important;
    background: #f8fafc !important;
    padding: 8px 16px !important;
    gap: 12px !important;
    border-top: 1px solid #e2e8f0 !important;
    margin-top: 6px !important;
  }
  body.app-webview .topnav .nav-links a {
    display: inline-flex !important;
    padding: 6px 14px !important;
    background: #fff !important;
    border: 1px solid #cbd5e1 !important;
    border-radius: 6px !important;
    font-weight: 600 !important;
    color: #334155 !important;
  }
  body.app-webview .topnav .nav-links a.dang {
    background: #ede9fe !important;
    color: #7c3aed !important;
    border-color: #8b5cf6 !important;
  }
}
