
  /* ============ NỀN CHUNG — màu theo logo MyPAS (xanh mòng két + cam) ============ */
  /* Màu lấy theo WEBSITE CHÍNH THỨC của trung tâm (cô Quỳnh gửi ảnh 25/07/2026):
     thanh điều hướng teal, chữ "My" cam — "PAS" teal, sóng cam ở chân banner.
     Bản trước teal hơi xỉn (#0F8B8D) và cam ngả vàng (#F49D37) nên nhìn lệch
     tông so với web. */
  :root {
    --xanh: #14A0A0;          /* teal MyPAS — màu thanh điều hướng trên web */
    --xanh-dam: #0D8081;      /* teal đậm — nút bấm khi rê chuột, viền nhấn */
    /* ⭐ 22/08/2026 — teal SÁNG, sinh ra cho đầu sáng của dải chào Trang chủ.
       ⛔ Đây KHÔNG phải màu logo, đừng đem dùng cho chữ hay viền: trên nền trắng nó
          chỉ đạt tương phản ~2,1 lần. Chỉ dùng làm nền. */
    --xanh-sang: #2FBFB2;
    --xanh-nhat: #E8F5F5;
    --cam: #F5821F;           /* cam MyPAS — chữ "My" trong logo, sóng banner */
    --cam-dam: #DC7014;
    /* 🎨 05/08 (cô Quỳnh: thiết kế "lộ rõ AI", cần human + dễ nhìn hơn) — chuyển bộ
       xám XANH LẠNH (rất "khuôn mẫu") sang xám ẤM trung tính, mắt dễ chịu hơn;
       viền vẫn rõ, chữ tăng tương phản. */
    /* ⭐ 18/09/2026 — TRẢ VỀ #F6F5F3. Boss: *"các block trong điểm danh bị trắng
       quá để lại như cũ đi"*.
       Đo được: thẻ lớp ăn `--the` = #FFFFFF (chưa bao giờ đổi). Khi `--nen` cũng
       trắng thì thẻ trắng nằm trên nền trắng — chìm hẳn, chỉ còn viền `--vien`
       mờ phân biệt. #F6F5F3 là màu cũ: ngà rất nhạt, đủ để thẻ nổi lên.
       ⛔ CHỈ trả `--nen`. `--the`, `--nen2` và nền bảng sheet GIỮ NGUYÊN — đo được
          `.home-khoi`, `.bcs-bang`, `.sheet-moi` đều có nền trắng RIÊNG, không ăn
          theo body, nên bảng vẫn trắng tinh đúng như Boss vừa duyệt. */
    --nen: #F6F5F3;
    --the: #FFFFFF;
    --vien: #D6D2CB;
    /* ⛔ PHẢI CÓ ở cả hai chế độ. Biến không khai thì `border-color:var(--vien-ro)`
       nở ra rỗng và trình duyệt lấy `currentColor` — viền thành màu chữ, đen kịt.
       Ở chế độ sáng nền thẻ vốn trắng nên viền hơi đậm hơn `--vien` là đủ. */
    --vien-ro: #B9B3AA;
    --chu: #1F1D1A;
    --mo: #6B6660;
    /* ⛔⛔ VÁ 28/08/2026 (chiều) — `--chu-mo` ĐANG ĐƯỢC DÙNG Ở 31 CHỖ MÀ CHƯA HỀ
       ĐƯỢC KHAI. CSS gặp biến không có thì bỏ qua nguyên dòng khai màu, nên 31 dòng
       chữ phụ ấy (lời dẫn dưới tiêu đề, lời gợi ý dưới ô nhập, chú thích bảng…) lâu
       nay hiện bằng ĐÚNG MÀU CHỮ CHÍNH — không mờ đi chút nào, nên đọc vào là mọi
       thứ đều "quan trọng như nhau". Hỏng IM LẶNG: không lỗi, không cảnh báo.
       Đặt nó thành bí danh của `--mo` là chữa cả 31 chỗ một lượt, và tự đổi theo
       nền tối vì `--mo` đã có bản nền tối riêng. KHÔNG đi sửa 31 dòng kia —
       sửa tay 31 chỗ thì sót là chắc, mà bí danh thì không sót được. */
    --chu-mo: var(--mo);
    --do: #C0392B;
    /* ✅ 22/08/2026 — MÀU "MÁY VỪA ĐIỀN HỘ", cho tích xanh ở hộp Thêm học sinh.
       Cô Quỳnh: *"AI chạy xong thì nó phải hiện tích xanh xanh lên để nhận biết
       được nó điền chưa"*.
       ⛔ ĐÃ ĐO, ĐỪNG LÀM NHẠT ĐI: #17703D trên nền trắng đạt 6,14 — trên chuẩn 4,5.
          Sắc #1F8A4C nhìn tươi hơn nhưng chỉ được 4,38, tức KHÔNG ĐẠT; đã thử và
          bỏ. Chuyện chữ mờ trong app này đã phải sửa năm lần rồi.
       ⛔ Đây là màu RIÊNG cho "máy điền hộ", KHÔNG dùng lại cho trạng thái tốt/xấu
          của nghiệp vụ — hai thứ ấy trộn màu là người ta đọc nhầm ý. */
    --ai-ok: #17703D;
    --ai-ok-nen: #F1F9F4;
    /* ⭐ 21/08/2026 — hai sắc đỏ RẤT NHẠT, sinh ra cho việc quan trọng/khẩn cấp ở
       màn Công việc. Cô Quỳnh: *"phải có màu nổi bật như đỏ lên nhưng ko được màu
       quá mức gây khó nhìn"*. Nên đây là mức nền chỉ đủ để mắt LƯỚT QUA là thấy,
       không phải mảng màu. Đo: #FDF4F3 lệch khỏi trắng đúng ~3%.
       ⛔ Đừng đậm thêm. Đậm lên là quay lại đúng cái nền pastel đã bị cô chê
          "màu mè, lộ ra UI của AI" và đã gỡ ngày 21/08 (xem chú thích .nv-the). */
    --do-nen: #FDF4F3;        /* nền việc quan trọng — đỏ nhạt gần như trắng */
    --do-nen2:#FBEAE7;        /* nền việc QUÁ HẠN — đậm hơn một nấc, vẫn rất nhạt */
    /* ⭐ HỔ PHÁCH = "ĐÃ CÓ NGƯỜI NHẬN" — cô Quỳnh 21/08/2026:
       *"cái đã tiếp nhận phải rõ màu khác để đỡ phải nhìn đọc lại ô đó đã chọn
       tiếp nhận chưa chữ bé khó đọc"*.
       ⛔ KHÔNG bịa màu mới: công cụ Yêu cầu giáo viên đã dùng đúng sắc hổ phách
          này cho dòng "<tên> đã tiếp nhận" (`.yc-nhan-boi`, #9A6400) từ 07/08.
          Nay Công việc và Trang chủ dùng CHUNG, nên đi đâu trong app thì hổ phách
          cũng chỉ có một nghĩa duy nhất: có người ôm rồi, chưa xong.
       ⛔ Chữ dùng `--nhan-chu` (#9A6400) chứ KHÔNG dùng `--cam` (#F5821F). Cam
          thương hiệu trên nền trắng chỉ đạt tương phản ~2,3:1 — đọc không nổi.
          Hổ phách đậm đạt ~4,9:1. Cam vẫn dành cho logo và mảng trang trí. */
    --nhan-chu: #9A6400;      /* chữ + biểu tượng "đã tiếp nhận" */
    --nhan-vien:#D9A441;      /* nét viền trái của thẻ, viền chip */
    --nhan-nen: #FFF8E6;      /* nền chip — hổ phách rất nhạt, bớt đục (18/09) */
    /* ⭐ 02/08/2026 — hai biến này ĐÃ ĐƯỢC DÙNG 12 chỗ (nền khung công cụ, chip,
       tab, form…) NHƯNG TRƯỚC ĐÂY CHƯA HỀ ĐỊNH NGHĨA → var(--nen2) thành trong
       suốt → nền 4 mùa lọt qua làm CÁC KHUNG TRẮNG KHÓ NHÌN (cô Quỳnh báo). Định
       nghĩa ở đây là mọi khung công cụ có nền ĐẶC, đọc rõ trên mọi ảnh nền. */
    --nen2: #F3F3F3;          /* nền panel/chip/tab — xám TRUNG TÍNH, bỏ hẳn
                                 sắc xanh (18/09: Boss chê "trắng xanh nước biển") */
    --muc: #0D8081;           /* màu chữ mục/nhấn (teal đậm) */
    --nen-o: #FFFFFF;         /* nền ô nhập — luôn trắng đặc để đọc rõ trên nền mùa */

    /* màu ô giá trị — nhại đúng bảng thật */
    --o-tot: #1E7C45;         /* Đ / Đủ */
    --o-nghi: #B3403A;        /* X / Nghỉ */
    --o-thieu: #E8A317;       /* Thiếu / CHT */
    --o-quen: #5A6478;        /* Q / Quên vở / Quên phiếu */

    /* màu khối DAY — nâu và navy xen kẽ như sheet thật */
    --day-nau: #5C4033;
    --day-navy: #1F2A5A;

    /* ⭐ HÀNG TIÊU ĐỀ BẢNG KIỂU GOOGLE SHEETS — cô Quỳnh 21/08/2026:
       *"các tên cột title ở trên cùng cho background nó màu xanh lá như trong sheet
       CTS đó — thiết kế title cột ở đầu màu xanh và ở dưới trắng hết."*
       ⛔ Đây là XANH LÁ thật, KHÔNG phải teal. Ba biến tên "xanh" sẵn có của app
          (--xanh, --xanh-dam, --xanh-nhat) đều là teal mòng két theo logo MyPAS —
          dùng chúng là ra đúng màu cũ cô đã chê. */
    /* ══════════════════════════════════════════════════════════════════════════
       🟩 SỬA 23/08/2026 — cô Quỳnh: *"màu xanh này bị đậm quá làm chữ bị tối đi …
          bạn chuyển màu nào khác cho việc nhìn chữ title nó dễ và đẹp rực rỡ nét
          hơn nhé áp cho tất cả công cụ của giáo vụ dạng sheet"*.
       ⛔ ĐO TRƯỚC KHI SỬA, và số đo lật ngược phán đoán đầu tiên: chữ KHÔNG hề
          thiếu tương phản — bản tối đo được 10,69 lần, gấp hơn hai lần ngưỡng.
          Cái "tối" cô thấy đến từ BA chỗ khác, cả ba đều đo được:
            ① nền bản tối #14472A chỉ sáng 4,8% — gần như đen, nên cả hàng tiêu đề
               là một dải nặng, và nó chỉ hơn nền ô dữ liệu 1,55 lần nên còn CHÌM
               vào bảng thay vì nổi lên trên.
            ② chữ bản tối #D8E8DD KHÔNG PHẢI màu trắng — chỉ sáng 78%. Đây là nghĩa
               ĐEN của câu "chữ bị tối đi"; nâng tương phản không chữa được, vì
               tương phản vốn đã dư.
            ③ viền chỉ hơn nền 1,30 lần → vạch chia giữa các ô tiêu đề gần như vô
               hình, nên hàng tiêu đề đọc ra là MỘT KHỐI LIỀN chứ không phải các cột.
       Nay: nền sáng lên 2,9 lần · chữ về trắng thật · vạch chia thấy được.
       ⛔ HAI MÀU NHÌN ĐẸP HƠN ĐÃ BỊ LOẠI BẰNG SỐ, ĐỪNG DỰNG LẠI:
            #0F9D58 (xanh Google Sheets) — chữ trắng chỉ 3,51 lần
            #1B8A55                       — chữ trắng chỉ 4,36 lần
          Cả hai tươi hơn hẳn khi nhìn, và cả hai đều rớt chuẩn chữ thường 4,5.
       ⛔ Bản SÁNG và bản TỐI nay DÙNG CHUNG một bộ màu — cố ý. Ràng buộc "chữ trắng
          ≥ 4,5" ép nền về cùng một khoảng ở cả hai chế độ, nên tách ra chỉ tạo thêm
          chỗ để lệch nhau. Chú thích cũ ở đây ghi "đạt 5,5 lần" là SAI SỐ: màu cũ
          #1E7C45 đo lại chỉ được 5,22. */
    --dau-bang-nen: #00793A;  /* xanh lá — chữ trắng 5,53 lần · nổi khỏi ô 3,00 lần */
    --dau-bang-chu: #FFFFFF;
    --dau-bang-vien: #004D1B;  /* vạch chia ô trong hàng tiêu đề — hơn nền 1,83 lần */

    /* ══════════════════════════════════════════════════════════════════════════
       🎨 BỐN NẤC BO GÓC — cô Quỳnh 22/08/2026, học theo shadcn
       ──────────────────────────────────────────────────────────────────────────
       ⛔ CHỈ CÓ BỐN NẤC. Cần bo góc thì lấy một trong bốn cái này, ĐỪNG gõ số px
          mới. Lý do rất thật: trước đây app rải rác 7·8·9·10·12·14px, đứng cạnh
          nhau thì mắt không gọi tên được cái sai nhưng vẫn thấy "chưa chỉn chu".
          Bốn nấc đều đặn là một nửa cái làm nên vẻ ngoài của shadcn.
       ⛔ ĐỪNG thêm nấc thứ năm. Thấy cần nấc mới nghĩa là đang chọn sai nấc. */
    /* 🔲 02/09/2026 — CẢ NĂM NẤC VỀ 0. Cô Quỳnh: *"sửa bo tròn đi, tôi không
       muốn bo tròn nữa"*, cô chọn nút "sửa chỗ chung, cả app đổi một lượt".
       ⛔ ĐỪNG XOÁ BỐN TÊN NÀY dù chúng cùng bằng 0. Chúng là thang đo: 580 chỗ
          trong app đang gọi tên nấc chứ không gõ số. Muốn bo tròn trở lại thì
          sửa đúng năm số ở đây (6 · 8 · 10 · 14 · 2 là bộ cũ), cả app theo ngay.
          Xoá tên đi là lần sau phải đi rải lại 580 chỗ bằng tay. */
    /* ⛔ HAI TẦNG, ĐỪNG "DỌN CHO ĐỀU" VỀ MỘT SỐ. Soi ảnh Supabase cô Quỳnh gửi:
       nút, ô nhập, nhãn (Connect · PRO · PRODUCTION · ô Search) vẫn bo 4–6px;
       chỉ BẢNG và TẤM NỀN mới vuông hẳn. Để cả năm nấc về 0 một lượt thì cô
       Quỳnh xem xong nói ngay là "cứng" — đã vấp đúng lần đầu, sáng 02/09.
         · nấc NHỎ (sm · md) = thứ người ta BẤM và GÕ  → 4px cho mềm tay
         · nấc TO  (lg · xl · sheet) = KHUNG CHỨA      → 0, dán liền nhau */
    --r-sm: 4px;              /* chip · nhãn · nút bé xíu */
    --r-md: 4px;              /* nút · một hàng trong thanh bên */
    /* ⭐ 10/09/2026 — NẤC RIÊNG CHO Ô NGƯỜI TA GÕ CHỮ. Boss: *"Ô điền chương trình
       bạn thiết kế bo tròn lại cho tôi"*, và Boss bấm nút *"bo hết mọi ô nhập
       trong app cho đồng bộ"*.
       ⛔ VÌ SAO KHÔNG NÂNG THẲNG --r-md: nấc ấy đang gánh cả NÚT BẤM. Nâng nó là
          mọi nút trong app tròn theo — Boss chỉ hỏi ô nhập, và đã bỏ qua lựa chọn
          "bo cả nút" khi tôi đưa ba nút bấm ra.
       ⛔ VÀ KHÔNG ĐỤNG --r-lg / --r-xl: hai nấc ấy Boss chốt 02/09 phải là 0px.
          Nhiều ô nhập đang gọi nhầm --r-lg (nên mới vuông chằn chặn) — chỗ nào là
          ô nhập thì trỏ sang --r-o, KHÔNG đổi giá trị của --r-lg. */
    --r-o: 8px;               /* ô nhập · ô chọn · ô gõ nhiều dòng */
    --r-lg: 0px;              /* panel · khối con trong thẻ */
    --r-xl: 0px;
  /* ⭐ 31/08/2026 — GÓC BẢNG DẠNG SHEET. Cô Quỳnh ưng cách sổ tuyển sinh làm:
     bảng tính thì góc phải VUÔNG, không bo mềm như thẻ. Mọi khung cuộn bọc
     bảng sheet lấy chung biến này — đổi một chỗ là cả app theo.
     ⛔ ĐỪNG nâng lên 6px+ "cho mềm": mềm là hết giống bảng tính, đúng thứ
        cô Quỳnh bảo sửa. Muốn vuông hẳn thì để 0. */
  --r-sheet: 0px;             /* thẻ lớn · hộp thoại — về 0 ngày 02/09/2026 */

    /* ══════════════════════════════════════════════════════════════════════════
       🌫 HAI LỚP BÓNG — nhẹ tới mức gần như không thấy, và đó là chủ ý
       ──────────────────────────────────────────────────────────────────────────
       Thẻ shadcn nổi lên khỏi nền bằng BÓNG chứ không bằng đường kẻ đậm. Bóng đổ
       màu theo chữ (#1F1D1A) chứ không phải đen tuyền — đen tuyền trên nền xám ấm
       ra một vệt xám lạnh, nhìn bẩn.
       ⛔ ĐỪNG tăng độ mờ lên. Bóng đậm là đúng cái vẻ "thẻ nổi bồng bềnh" mà cô
          Quỳnh đã chê là lộ UI của AI. */
    --bong-1: 0 1px 2px 0 rgba(31,29,26,.05);
    --bong-2: 0 1px 3px 0 rgba(31,29,26,.07), 0 1px 2px -1px rgba(31,29,26,.05);

    /* Vòng sáng quanh ô đang gõ. shadcn luôn có; app mình trước đây chỉ đổi màu
       viền — người dùng bàn phím gần như không thấy mình đang ở ô nào. */
    --vong: 0 0 0 3px rgba(20,160,160,.24);

    /* Viền NHẠT — dùng cho đường kẻ BÊN TRONG một thẻ (ngăn hai phần của cùng một
       khối). ⛔ KHÔNG thay `--vien`: viền bảng điểm danh và sổ tuyển sinh phải rõ,
       cô Quỳnh muốn giống Google Sheets. Đây là biến THÊM, không phải thay. */
    --vien-nhe: #E7E3DD;
  }
  /* ============ 🌙 CHẾ ĐỘ ĐEN (DARK MODE) — cô Quỳnh 03/08/2026 ============
     Bật bằng class `body.toi` (nhớ trong máy). Đổi bộ BIẾN MÀU sang tông tối rồi
     đắp lại vài bề mặt còn dùng màu TRẮNG CỨNG để KHÔNG chỗ nào chữ tối trên nền
     tối (cô: "chuyển sang đen thì vẫn phải nhìn được chữ/block, không xung đột màu"). */
  /* 🏛 06/08/2026 — BẢNG MÀU NỀN TỐI BẢN DOANH NGHIỆP.
     Cô Quỳnh: "màu đen giống game quá, không phải màu thiết kế của business, nhiều
     góc gây loá, chữ bị che khuất."

     Bản cũ sai ở ba chỗ, sửa cả ba:
     1. Nền ám XANH NAVY (#0E1621, #212F40). Xám ám xanh lạnh là tông game/khoa học
        viễn tưởng. → đổi sang xám TRUNG TÍNH, không ám màu nào.
     2. Màu nhấn TEAL NEON (#5AD0C6) sáng chói trên nền tối → thành "phát sáng".
        → hạ xuống teal dịu (#4DB6AC), vẫn đủ tương phản đọc chữ.
     3. VIỀN quá sáng (#44596F) — đây là thủ phạm chính gây loá: mỗi cái khung đều
        có một đường sáng viền quanh, cả màn hình thành lưới kẻ chói mắt.
        → viền rất nhẹ (#2E353B), chỉ đủ phân tách khối.
     Thêm: chữ chính KHÔNG dùng trắng gắt (#EDF3F9 → #DCE1E6) cho đỡ chói khi nhìn lâu.

     Nguyên tắc chung của nền tối chuyên nghiệp: nền trang tối nhất, thẻ sáng hơn MỘT
     bậc, viền gần như vô hình, màu nhấn dùng dè. Sáng dần theo tầng — không dùng viền
     sáng để phân tách. */
  body.toi {
    --xanh-nhat:#1B2C2E;      /* nền nhấn nhạt (rê chuột, ô được chọn) */
    --nen:#1C2025;            /* nền trang — xám trung tính, KHÔNG ám xanh */
    --the:#24292F;            /* thẻ / khung — sáng hơn nền một bậc */
    /* ✅ Bản nền tối của màu "máy vừa điền hộ". Sáng hẳn lên chứ không giữ nguyên
       #17703D — sắc ấy trên nền #1B1F23 gần như chìm hẳn. Cùng sắc với
       `--tt-chay-chu` đang dùng cho trạng thái "đang chạy", có sẵn tiền lệ. */
    --ai-ok:#7FD6A0;
    --ai-ok-nen:rgba(127,214,160,.10);
    --nen2:#2C3238;           /* panel · chip · tab */
    --nen-o:#272C32;          /* ô nhập */
    /* ⛔ HAI BẬC VIỀN, ĐỪNG GỘP LẠI LÀM MỘT — sửa 22/08/2026.
       Bản cũ chỉ có #2E353B với ghi chú "viền RẤT nhẹ — chìa khoá làm dịu mắt".
       Nhẹ thì đúng là dịu, nhưng nhẹ quá thì thành không có. Cô Quỳnh:
         *"các block tên nhân viên ở công cụ nhắc việc tôi thấy cứ khó nhìn
           các block kiểu gì á các viền block như tàng hình ý."*
       Đo ra đúng thế: #2E353B trên nền thẻ #1B1F23 chỉ hơn nhau 1,3 lần — mắt
       thường không tách nổi. Chuẩn WCAG cho ĐƯỜNG VIỀN của thứ bấm được là 3 lần.

         --vien     #3A434B   đường kẻ, vách ngăn, viền ô nhập → vẫn dịu
         --vien-ro  #626D78   viền KHỐI BẤM ĐƯỢC (thẻ nhân viên, thẻ lớp…) → 3,1 lần

       ⛔ ĐỪNG HẠ `--vien-ro` XUỐNG CHO "DỊU HƠN". Bản đầu tôi chọn #5C6771 vì nhìn
          thấy hợp mắt, đo ra 2,87 — hụt chuẩn, và hụt đúng cái kiểu không ai nhận ra
          bằng mắt. Bài `thu-nen-toi-luoi-va-vien.js` đo lại con số này mỗi lần chạy.

       ⛔ Đừng đẩy `--vien` lên bằng `--vien-ro` cho tiện. Lưới bảng, vạch ngăn và
          viền ô nhập dùng chung `--vien`; kéo tất cả lên 3 lần thì cả màn hình
          thành mạng nhện sáng, đúng cái "chói" mà ba lần chỉnh chữ trước đã tránh. */
    --vien:#434C55;
    --vien-ro:#727D88;
    /* 06/08 (lần 2, cô Quỳnh: "để màn hình đen thì màu chữ phải bớt chói lại"):
       hạ thêm một bậc nữa. #DCE1E6 vẫn còn gắt khi nhìn lâu; #CBD2D8 vẫn thừa tương
       phản để đọc (khoảng 11:1 trên nền #14171A) mà mắt dễ chịu hơn hẳn. */
    /* 🌙 13/08/2026 (lần 3) — cô Quỳnh: *"chữ khi để nền đen phải như chữ Claude
       màn hình tối, vì chữ trong app tôi vẫn thấy sáng"*.
       Hai bản trước chỉ HẠ ĐỘ SÁNG (#EDF3F9 → #DCE1E6 → #CBD2D8) mà vẫn chói.
       Vì sai không nằm ở độ sáng — nằm ở SẮC: #CBD2D8 ám XANH LẠNH. Chữ lạnh trên
       nền xám thì mắt đọc thành "sáng gắt", hạ mấy cũng vậy. Các giao diện tối làm
       tốt (Claude là một) đều dùng chữ ám ẤM một chút, ngả kem.
       Nay đổi SẮC chứ không hạ tiếp: #D2CEC7 — ấm, trung tính, tương phản ~10,8:1
       trên nền #14171A (thừa chuẩn 4,5:1), mà nhìn lâu êm hơn hẳn. */
    --chu:#F4F1EC;            /* chữ chính — trắng ngà ẤM, KHÔNG ám xanh, không trắng tinh */
    --mo:#B3AEA6;             /* chữ phụ — cùng sắc ấm với chữ chính */
    --chu-mo:var(--mo);   /* phải khai LẠI ở đây — xem lý do ở `:root` */
    --muc:#4DB6AC;            /* màu nhấn — teal DỊU, bỏ neon */
    /* Nền tối: đầu sáng của dải chào hạ xuống, không thì nó thành một vệt phát sáng
       giữa màn đen — đúng lỗi "loá" cô Quỳnh đã chê ngày 06/08. */
    --xanh-sang:#1F8F87;
    --do:#E5766C; --o-tot:#5BB37C; --o-nghi:#E08A82; --o-thieu:#D9AE5A; --o-quen:#8A929C;
    /* Nền đỏ nhạt bản TỐI: không pha trắng mà pha vào chính nền tối, không thì ra
       một mảng hồng chói giữa màn đen. */
    --do-nen:#352423; --do-nen2:#38211F;
    /* Hổ phách bản tối: chữ SÁNG lên, nền và viền TỐI đi — cùng vai trò, đảo chiều.
       ⛔ Đừng bê nguyên #9A6400 sang: trên nền #1B1F23 nó tối gần bằng nền. */
    --nhan-chu:#E4C88A; --nhan-vien:#7A5F2E; --nhan-nen:#2B2418;
    /* 🎨 22/08/2026 — bộ bóng/vòng/viền-nhạt bản TỐI.
       ⛔ Bóng nền tối phải ĐẬM HƠN bản sáng, nghe ngược nhưng đúng: trên nền tối,
          bóng nhạt biến mất hoàn toàn nên thẻ dính bẹp vào nền. shadcn cũng làm vậy.
       ⛔ Viền nhạt nền tối phải SÁNG hơn nền, không phải tối hơn. */
    --bong-1: 0 1px 2px 0 rgba(0,0,0,.32);
    --bong-2: 0 1px 3px 0 rgba(0,0,0,.4), 0 1px 2px -1px rgba(0,0,0,.28);
    --vong: 0 0 0 3px rgba(77,182,172,.26);
    --vien-nhe:#2E343A;
    /* ⛔⛔ BỎ HẲN BỘ MÀU RIÊNG CHO BẢN TỐI — 23/08/2026, ĐỪNG DỰNG LẠI.
       Chỗ này trước đây hạ nền xuống #14472A với lý do "nền tối mà để #1E7C45 thì
       nó là mảng sáng chói giữa màn đen". Lý do ấy nghe hợp mà SAI, và cô Quỳnh
       chính là người phát hiện: hạ tới 4,8% độ sáng thì hàng tiêu đề chỉ còn hơn ô
       dữ liệu 1,55 lần — nó không "dịu đi", nó CHÌM MẤT. Cộng với chữ #D8E8DD vốn
       chỉ sáng 78%, cả hàng đọc ra là một dải xám tối. Đó là cái cô kêu 23/08.
       Nay cả hai chế độ dùng CHUNG bộ màu khai ở đầu file — lý do đầy đủ ghi tại đó.
       Nếu sau này lại thấy "chói quá", hãy ĐO trước: nền tiêu đề phải hơn nền ô ít
       nhất 1,5 lần thì mới còn ra hàng tiêu đề.

       ⛔ NHƯNG PHẢI KHAI LẠI ĐỦ BA BIẾN Ở ĐÂY, ĐÚNG BẰNG GIÁ TRỊ Ở `:root` (dòng
       157-159). Gỡ trắng khối này thì `:root` vẫn đổ xuống nên MÀU KHÔNG SAI —
       nhưng bài `kiem-thu/thu-nen-toi-luoi-va-vien.js` (dòng 224-225) đọc thẳng
       hai biến BÊN TRONG `body.toi` để đo hàng "Day *8", không thấy là nó đỏ.
       Đã dính đúng lỗi này ngày 23/08 (bài rơi xuống 37/38). Khai lại là hết, và
       vì giá trị y hệt `:root` nên KHÔNG đẻ ra bộ màu thứ hai để lệch nhau.
       ⛔ Sửa màu ở dòng 157-159 thì sửa luôn ba dòng dưới đây cho khớp. */
    --dau-bang-nen: #00793A;
    --dau-bang-chu: #FFFFFF;
    --dau-bang-vien: #004D1B;
    background:var(--nen); color:var(--chu);
  }

  /* ══════════════════════════════════════════════════════════════════════════════
     🌙 VÁ 22/08/2026 — 32 MẢNG CÒN "TRẮNG XOÁ" GIỮA NỀN TỐI
     ──────────────────────────────────────────────────────────────────────────────
     Cô Quỳnh: *"nhìn lại toàn bộ nền đen sửa cả trong điểm danh nữa cái nào còn
     trắng xóa thì sửa lại cho phù hợp với nền đen"*.

     CÁCH TÌM — không dò bằng mắt. Viết phép soi đọc cả 3.497 luật CSS, lọc ra luật
     nào gõ cứng nền trắng (`#fff` · `white` · `rgb(255,255,255)`) mà KHÔNG có bản
     `body.toi` ĐẶT NỀN. Ra 37; bỏ luật in giấy (giấy vốn trắng) còn 36; bỏ bốn chỗ
     CỐ Ý trắng (bên dưới) còn 32; bỏ 16 chỗ đã có bản nền tối rồi — CÒN 16 THẬT.

     ⛔ HAI LẦN PHÉP SOI ĐẾM SAI, GHI RA ĐÂY ĐỂ PHIÊN SAU KHỎI DẪM LẠI:
        · Bản đầu lấy bộ chọn bằng `slice(...).split("\n").pop()` để né chú thích —
          hoá ra cắt cụt mọi bộ chọn viết XUỐNG DÒNG, nên 16 luật vốn đã có bản nền
          tối bị tính là chưa lo. Cách đúng: bỏ chú thích TRƯỚC rồi mới tách luật.
        · Bản thứ hai coi "có `body.toi .X` bất kỳ" là đã lo — nhưng rất nhiều luật
          nền tối chỉ đổi MÀU CHỮ hoặc VIỀN, nền vẫn trắng nguyên. Phải hỏi luật ấy
          có thật sự đặt `background` không.
        Hai lỗi ngược chiều nhau, mỗi lỗi lệch đúng 16 — trùng hợp làm con số nhìn
        như đã đúng. Chỉ khi ĐỐI CHIẾU hai bản mới lòi ra.

     Cách này bắt được cả những màn KHÔNG mở ra chụp được — điểm danh, sổ tuyển
     sinh, lịch test đều có tên học sinh thật nên không được mở để soi bằng mắt.

     ⛔⛔ BỐN CHỖ CỐ Ý GIỮ TRẮNG, ĐỪNG "SỬA NỐT" CHÚNG:
        · `.kq-qr-co img` và `.kq-qd-qr img` — nền của MÃ QR. Máy quét cần nền
          sáng quanh mã; đổi sang nền tối là mã không quét được nữa, mà hỏng kiểu
          đó không ai phát hiện cho tới lúc phụ huynh đứng ở quầy giơ điện thoại.
        · `#bangDemNguoc .bdn-ngay` và `#daiBaoTri button` — nút trắng nằm TRÊN
          một dải màu đặc (teal đếm ngược · đỏ bảo trì). Dải ấy giữ nguyên màu ở cả
          hai chế độ, nên nút cũng phải giữ nguyên.

     ⛔ DÙNG ĐÚNG BIẾN THEO VAI TRÒ, đừng đổ hết về `--the`:
          --nen-o   ô người ta gõ chữ vào
          --nen2    chip · nút phụ · nhãn
          --the     thẻ · hộp · ô bảng · thanh dính mép
        Đổ hết về một màu là mất hẳn tầng sâu, cả màn phẳng lì — đúng thứ khối luật
        ngay dưới đây đã phải chữa một lần rồi.
     ══════════════════════════════════════════════════════════════════════════════ */
  /* — Ô người ta gõ chữ vào — */
  body.toi .ht-o input, body.toi .ht-o select,
  body.toi .ht-chu textarea,
  body.toi .thanh-tim input,
  body.toi .o select:not([class*="gt-"]),
  body.toi .o select option,
  body.toi .dh-day .dh-chon { background:var(--nen-o); color:var(--chu); }
  /* Ô xổ bản sáng có viền trong `inset 0 0 0 1px #E0E6EC` — vệt sáng ấy trên nền
     tối thành đường kẻ chói. Hạ về viền chung. */
  body.toi .o select:not([class*="gt-"]) { box-shadow:inset 0 0 0 1px var(--vien); }

  /* — Chip · nút phụ · nhãn —
     ⛔ CHỈ BỐN CÁI NÀY. `.chip` · `.nut-phieu` · `.nut-keocot` · `.nv-loc` ·
        `.dh-day button` · `.pt-them button` ĐÃ CÓ bản nền tối từ trước, đặt đúng
        cùng biến — thêm lần nữa chỉ làm CSS phình và đẻ ra hai nguồn sự thật. */
  body.toi .tths-cs-nut,
  body.toi .lt-nhom-sua,
  body.toi .nhan-gio,
  body.toi .thanh-cung-xem .ai { background:var(--nen2); color:var(--chu); }
  body.toi .lt-nhom-sua { border-color:var(--vien); }

  /* — Thẻ · hộp · thanh dính mép —
     ⛔ CHỈ BỐN CÁI NÀY. `.phan-menu` · `.pt-diem` · `.pt-form` · `.pt-day` ·
        `.khung-note` · `.tdg-o` · `.nv-link` · `.nv-nguoi` · `.nvo-hop` ·
        `.cs-moi-1` ĐÃ CÓ bản nền tối từ trước, cũng đặt `var(--the)`.
     ⛔ Riêng VIỀN của `.cs-moi-1` thì vẫn phải hạ: bản cũ chỉ lo nền, còn viền vẫn
        gõ cứng `#CDE8D5` — vệt xanh lá nhạt ấy trên nền đen thành đường kẻ sáng. */
  body.toi .thanh-cong-cu,
  body.toi #theTenHS .ttHS-form,
  body.toi #bangCapNhat .bcn-hop,
  body.toi .nv-ct-them:hover i { background:var(--the); }
  body.toi .cs-moi-1 { border-color:var(--vien); }

  /* — Ô BẢNG —
     ⛔ ĐỪNG thêm luật nền tối cho `.luoi` hay `.phieu-bang` Ở ĐÂY. Đã thử sáng
        22/08/2026 và cả hai đều sai chỗ:
        · `.luoi`      — vô dụng. Bên trong lưới, `var(--the)` KHÔNG nở ra màu
          tối của `body.toi`; nó nở ra TRẮNG, vì lưới tự khai lại bộ biến màu
          cho riêng mình (tìm "LƯỚI ĐIỂM DANH THEO NỀN ĐEN" bên dưới). Đo bằng
          `getComputedStyle(th).getPropertyValue("--the")` → "#FFFFFF".
        · `.phieu-bang` — nằm TRONG tờ phiếu gửi phụ huynh, là vùng cấm đụng màu
          tối (đọc khối "TỜ PHIẾU BUỔI = TỜ GIẤY ĐỂ CHỤP" bên dưới). — */

  /* ══════ 🌙 VÁ 13/08/2026 — 22 CHỖ CHỮ TỐI NẰM TRÊN NỀN ĐEN ══════
     Cô Quỳnh: *"một số nút có chữ màu tối bị nền đen che khuất nhìn rất khó"*.
     Đã QUÉT CẢ FILE tìm đúng kiểu hỏng đó: luật CSS vừa đặt chữ màu TỐI, vừa
     KHÔNG đặt nền riêng, lại KHÔNG có bản cho `body.toi`. Trên nền sáng thì đẹp,
     bật nền đen là chữ tối chìm vào nền — ra đúng 22 chỗ dưới đây.
     ⛔ ĐỪNG bỏ chỗ nào: mỗi dòng là một nút/nhãn người dùng thật sự bấm.
     ⛔ Chỗ nào có nền riêng thì KHÔNG đụng — chữ tối trên chip sáng vẫn đọc tốt. */
  body.toi .home-note-tt.xong,
  body.toi .lop-app-nhan,
  body.toi .dg-luutt.xong,
  body.toi .cs-buoi,
  body.toi .pd-dabiet            { color:#7FD69A; }   /* xanh "đã xong" — sáng lên cho nổi */
  body.toi .tk-menu button.do,
  body.toi .pc-an,
  body.toi .yc-xoa-lo:not([disabled]),
  body.toi .pd-mau-xoa,
  body.toi .nv-b.xoa             { color:var(--do); }
  body.toi .nv-han.do            { color:#E8A05C; }   /* quá hạn — cam sáng */
  body.toi .nhom-thu h3,
  body.toi .o-ngay .gt-ngay,
  body.toi .psc-hop small,
  body.toi .pd-dong,
  body.toi .nv-meta,
  body.toi .nv-han               { color:var(--mo); }
  body.toi .luoi .h-ngay         { color:#9BB0D8; }   /* đầu khối DAY — navy → xanh nhạt */
  body.toi .luoi tr.hs-nop-noi .c-ten { color:#7FD69A; }
  body.toi .phieu-note-ngoai .nhan-note { color:#D9B764; }
  body.toi .tths-fu-dau          { color:#7FB0EE; }
  body.toi .dau-chiapp           { color:#B49BE0; }

  /* ══════ 🌙 VÁ 13/08/2026 (đợt 2) — NÚT KHÔNG ĐẶT MÀU CHỮ THÌ TRÌNH DUYỆT CHO MÀU ĐEN ══════
     Cô Quỳnh: *"nút Sửa ở Nhắc việc bị đen xì không nhìn thấy được khi để nền đen"*.

     Đợt vá phía trên quét các luật CÓ ĐẶT chữ màu tối. Nút này thì KHÔNG ĐẶT MÀU CHỮ NÀO
     CẢ — mà <button> là thứ gần như duy nhất trong HTML KHÔNG tự kế thừa màu chữ của
     trang: không nói gì thì trình duyệt lấy màu đen mặc định của hệ điều hành. Nền sáng
     chẳng ai thấy sai; bật nền đen là chữ đen nằm trên nền đen, mất hẳn nút.
     Chữ trong <div> <td> <summary> vẫn KẾ THỪA nên đọc được — nên CHỈ NÚT mới hỏng, và
     đợt quét trước tìm theo "màu chữ tối" nên bỏ lọt sạch nhóm này.

     Quét lại cả file bằng đúng dấu hiệu: là <button>, có đặt nền đổi theo chế độ, KHÔNG
     đặt màu chữ, chưa có bản `body.toi` — ra 8 nút, gồm cả nút Sửa cô báo.

     ⛔ CÁCH VÁ NẰM Ở CHỖ KHÁC, KHÔNG PHẢI Ở ĐÂY: một dòng `button { color:inherit }`
        trong phần CSS chung (tìm chữ "VÁ 13/08/2026 (đợt 2)" ở luật `button`). Lý do
        không vá bằng `body.toi button { color:var(--chu) }` như phản xạ đầu tiên: luật
        đó "nặng ký" hơn (body.toi + button) mọi luật một-lớp như `.chip-kt`, `.hs-an`,
        `.fhs-them-o` — ép luôn cả những nút VỐN CÓ màu riêng, làm chip đỏ/cam mất màu
        rồi lại chìm vào nền sáng của chính nó. Thử rồi, hỏng nặng hơn lúc chưa vá.
        `color:inherit` thì nút lấy màu của KHUNG chứa nó — nên nút nằm trong lưới điểm
        danh (khung cố ý giữ SÁNG) vẫn ra chữ tối, còn nút ngoài nền đen thì ra chữ sáng.
        Tự đúng ở cả hai nơi, không phải liệt kê từng nút.
     ⛔ Vá kèm mấy NỀN SÁNG CỨNG lúc rê chuột. Chữ vừa được cho sáng lên mà nền rê chuột
        vẫn trắng thì rê tới đâu chữ mất tới đó — vá nửa vời còn khó chịu hơn không vá. */
  body.toi .nut-mat:hover, body.toi .hs-xoabu:hover { background:var(--vien); }
  /* ⛔ HAI BỀ MẶT TRẮNG CÒN SÓT — phải vá CÙNG LÚC với `color:inherit`, không được tách.
     Thẻ đăng nhập và menu thả xuống ở Trang chủ để nền TRẮNG CỨNG kể cả trong nền đen.
     Chữ thường bên trong vốn đã sáng-trên-trắng từ trước (lỗi cũ); riêng NÚT thì trước
     nay còn đọc được nhờ màu đen mặc định của trình duyệt — tức `color:inherit` sẽ làm
     hai chỗ này HỎNG THÊM nếu không đắp nền tối cho chúng ngay tại đây. Chế độ đen bật
     ngay từ màn đăng nhập (xem `apDungCheDo`) nên thẻ đăng nhập cũng dính. */
  body.toi .the-dn, body.toi .tk-menu
    { background:var(--the); border-color:var(--vien); color:var(--chu); }
  body.toi .dg-chip:hover, body.toi .lt-cn:hover:not(:disabled)
    { background:var(--nen2); border-color:var(--muc); }
  /* Hai trạng thái của nút Nhắc việc vốn là chip NỀN SÁNG chữ tối. Nền đen phải lật
     ngược: nền tối cùng tông, chữ sáng — giữ đúng nghĩa của màu (kem = hoãn lại,
     xanh = đã xong) mà vẫn đọc được. Không lật thì chữ sáng nằm trên chip kem. */
  body.toi .nv-b.hoan            { background:#3A3016; border-color:#5C4A1E; color:#E8C77A; }
  body.toi .nv-b.xong            { background:#1D3527; border-color:#2E5C3E; color:#8FD9A8; }
  /* Chip MẪU CÓ SẴN (Nhắc phụ đạo · Dự giờ): nền teal nhạt cứng, không đặt màu chữ →
     nền đen làm chữ sáng nằm trên nền sáng. Cùng một kiểu hỏng, chỉ khác là thẻ <span>
     nên đợt quét theo <button> không bắt được — bắt được nhờ quét theo NỀN SÁNG CỨNG. */
  body.toi .pd-mau-chip          { background:var(--nen2); border-color:var(--vien); color:var(--chu); }
  body.toi .pd-mau-chip:hover    { background:var(--vien); }
  /* Ô "đã sửa xong" ở Theo dõi học sinh: trong nền đen nó bị luật chung kéo về nền
     trơn, mất luôn dấu hiệu xanh. Trả lại bằng xanh tối cùng tông với nút Đã xong. */
  body.toi .tths-sua.xong        { background:#1D3527; border-color:#2E5C3E; color:#8FD9A8; }
  body.toi.co-nen-mua { background:var(--nen); }
  body.toi #nenMua { display:none !important; }               /* nền 4 mùa tắt trong dark */
  body.toi .thanh-tren { background:var(--the); }
  body.toi .thanh-tren .ten-app, body.toi .ten-app-nut { color:var(--chu); }
  body.toi .logo-mypas .ten .pas { color:#5AD0C6; }
  body.toi.man-cong-cu .noi-dung { background:rgba(27,31,35,.96); border-color:var(--vien); }   /* 06/08: bỏ ám navy */
  body.toi .noi-dung { color:var(--chu); }
  body.toi .home-khoi { background:linear-gradient(180deg,var(--the) 0%, #282E34 100%); }   /* 06/08: xám trung tính, bỏ ám navy */
  body.toi .home-khoi-dau { background:rgba(255,255,255,.04); }
  body.toi .home-o { background:linear-gradient(180deg,var(--the) 0%, #14202C 135%); }
  body.toi .home-o .lb { color:var(--chu); }
  body.toi .home-gio-1 { background:var(--nen2); }
  body.toi .modal { background:var(--the); color:var(--chu); }
  body.toi input, body.toi select, body.toi textarea { background:var(--nen-o); color:var(--chu); border-color:var(--vien); }
  body.toi .o-tim-dep, body.toi .nv-in { background:var(--nen-o); color:var(--chu); }
  body.toi .nut-nho { background:var(--nen2); color:var(--chu); border-color:var(--vien); }
  body.toi .nut-nho:hover { background:var(--vien); }
  /* ⛔ 22/08/2026 — SÁU luật `body.toi #thanhCC` cũ ĐÃ BỎ, đừng chép lại.
     Chúng có nhiệm vụ lật thanh TRẮNG thành thanh TỐI. Nay thanh xanh ở cả hai
     chế độ (xem khối bảng màu ở luật `#thanhCC`), nên việc lật không còn nữa —
     chế độ tối chỉ hạ sẫm ba biến `--cc-*`, một dòng, ngay dưới bảng màu ấy.
     Giữ lại luật cũ thì chúng ghi đè nền xanh về xám ở chế độ tối. */
  body.toi #thanhCC .cc-than { color:var(--chu); }
  /* ⛔ 22/08/2026 — nhãn nhóm ở nền tối phải GIỮ màu xám `--mo`, đừng ép về
     `--chu`. Dòng cũ ép về chữ chính là làm nhãn sáng bằng công cụ, mất hẳn thứ
     bậc — mà nền tối thì thứ bậc chỉ còn dựa vào độ sáng. */
  body.toi #thanhCC .cc-nhom-ten { color:var(--mo); }
  body.toi #thanhCC .cc-ban > .cc-nhom-ten,
  body.toi #thanhCC .cc-nhom-ten.chon { color:var(--chu); }
  body.toi #thanhCC .cc-muc, body.toi #thanhCC .cc-nhom-dau { color:var(--chu); }
  body.toi #thanhCC .cc-muc:hover { background:var(--nen2); }
  /* ⛔ 22/08/2026 — TÁCH LÀM HAI. Trước đây hai thứ này dùng chung một luật nền
     tối, nhưng nay `.tths-bang th` đã sang màu xanh lá đi qua biến (biến ấy TỰ
     đổi sẫm ở nền tối) — để chung thì luật này ghi đè lại thành xám, và bảng Thông
     tin học sinh là bảng DUY NHẤT còn xám giữa tám bảng. */
  body.toi .fhs-nhom-dau { background:var(--nen2); color:var(--chu); }
  body.toi .tths-bang td, body.toi .tths-cuon { border-color:var(--vien); }
  body.toi .tths-bang tbody tr:nth-child(even) { background:rgba(255,255,255,.03); }
  /* ⚠️ PHẢI có color:var(--chu) — các thẻ này có thẻ là <button> (vd .pt-o Progress test),
     mà <button> KHÔNG kế thừa màu chữ từ cha → giữ ĐEN mặc định → chữ đen trên nền tối = "đen
     xì" vô hình (cô Quỳnh báo tên lớp Progress test). Đặt màu chữ rõ ràng ở đây. */
  /* ⛔ `--vien-ro` chứ không phải `--vien`: đây đều là THẺ BẤM ĐƯỢC xếp thành danh
     sách, cùng bệnh "viền tàng hình" mà cô Quỳnh bắt được ở thẻ nhân viên 22/08.
     Sửa một chỗ này là sửa cả năm, khỏi phải đi tìm lại từng cái. */
  body.toi .bc-ky, body.toi .ql-the, body.toi .nv-the, body.toi .pt-o, body.toi .dg-o
    { background:var(--the); border-color:var(--vien-ro); color:var(--chu); }
  /* ══════ 🌙 LƯỚI ĐIỂM DANH THEO NỀN ĐEN — cô Quỳnh chốt lại 22/08/2026 ══════

     ⛔ ĐÂY LÀ QUYẾT ĐỊNH ĐÃ ĐẢO CHIỀU MỘT LẦN. Đọc hết đoạn này trước khi sửa.

     Bản CŨ (trước 22/08) cố ý GIỮ LƯỚI SÁNG giữa nền đen, "như Google Sheets", vì
     hồi ấy cô báo: *"trong lớp điểm danh vẫn ĐEN XÌ phần ô điền và thanh lựa chọn
     day"*. Cách chữa hồi ấy là khai lại bộ biến màu SÁNG ngay trên `.luoi`, cho
     mọi ô con tự về màu sáng.

     Ngày 22/08/2026 cô nói ngược lại, và nói rõ vì sao:
        *"để nền đen mà cái điểm danh app nó lại trắng xóa thế này xong chữ DAY các
          thứ cx bị ẩn luôn đi thế là ko được rồi… mục tiêu của tôi là dùng trong
          ban đêm thì phải ko bị đau mắt khi để nền đen phải có sự khác biệt và dễ
          nhìn chứ."*

     Nên bộ biến dưới đây nay là bộ TỐI. Nhưng bài học của bản cũ vẫn đúng nguyên:
     **tối thôi chưa đủ, phải PHÂN TẦNG**. Cả bảng cùng một màu đen là "đen xì nham
     nhở" y như lần trước. Sáu bậc nền, mỗi bậc một việc:

         #14171A  vùng cuộn quanh bảng   (tối nhất — thụt xuống)
         #1B1F23  ô dữ liệu              (mặt bàn)
         #232930  cột Mã HS / Học sinh   (cột đứng yên khi cuộn ngang)
         #202730  cột "Ngày điểm danh"   (mở đầu mỗi khối)
         #2B323A  hàng tiêu đề cột       (nổi nhất — nhìn phát thấy ngay)
         #39424A  đường kẻ lưới          (thấy được, không chói)

     ⛔ Chữ trong ô KHÔNG dùng #FFF. Trắng tinh trên nền đen là thứ làm nhức mắt
        ban đêm — đúng cái cô muốn tránh. Dùng #E4E1DB (trắng ngà, ấm hơn một chút).
     ⛔ Tờ phiếu buổi thì NGƯỢC LẠI, vĩnh viễn nền trắng — xem khối riêng bên dưới. */
  body.toi .khung-cuon { background:#1C2025; }
  body.toi .luoi, body.toi .dh-day {
    --the:#24292F; --nen:#1C2025; --nen2:#333B44; --nen-o:#272C32; --vien:#414B54;
    --chu:#F4F1EC; --mo:#B3BAC2; --muc:#5AD0C6; --xanh-nhat:#17313A; --do:#F0857C;
    --chu-mo:var(--mo);
    --o-tot:#56C98A; --o-nghi:#F0857C; --o-thieu:#F0C05A; --o-quen:#A9B4C6;
    color:#F4F1EC;
  }

  /* ── 41 luật của lưới gõ MÀU CỨNG, không qua biến, nên bộ biến trên không với tới.
        Phải đổi tay từng cái. Cột trái ghi màu SÁNG gốc để sau này đối chiếu. ── */

  /* mặt bàn + đường kẻ */
  body.toi .luoi th, body.toi .luoi td {                    /* #FFF */
    background:#24292F; border-right-color:#414B54; border-bottom-color:#414B54; }
  body.toi .luoi .batdau-day    { border-left-color:#A9B7C9 !important; }  /* #253449 */
  body.toi .luoi td.batdau-day  { border-left-color:#626F7C !important; }  /* #C3CBD6 */
  body.toi .luoi .h-day         { border-left-color:#C4D0DE !important; }  /* #101A28 */

  /* hàng tiêu đề khối DAY — nâng cả hai màu lên một bậc cho nổi trên nền đen.
     ⛔ Phải viết RIÊNG hai luật này. Luật `body.toi .luoi th` ở ngay trên có sức
        nặng lớn hơn `.h-day.nau`, nên nếu không chặn lại thì nó nuốt luôn màu khối
        và hàng DAY thành chữ trắng trên nền xám — chính là "chữ DAY bị ẩn". */
  body.toi .luoi .h-day.nau     { background:#6E4C3B; }     /* #5C4033 */
  body.toi .luoi .h-day.navy    { background:#303F7A; }     /* #1F2A5A · 21/09: ô dữ liệu sáng lên một bậc → navy nâng theo để vẫn nổi ≥1,4 lần */
  body.toi .luoi .h-day         { color:#F2EFEA; }          /* #FFF */

  /* hàng tiêu đề cột con */
  body.toi .luoi .h-cot         { background:#333B44; color:#E4E8EC; }  /* #F2F5F8 · #2C3742 */
  body.toi .h-cot:hover         { background:#3E4751; }     /* #E4EAF0 */
  body.toi .h-cot.moi           { background:#1F3128; }     /* #E8F4EC */
  body.toi .h-cot.khoa-mo       { background:#3A3020; }     /* #FEF3E2 */
  body.toi .h-cot.chi-app       { background:#342E44; }     /* #F3EEFB */
  body.toi .h-cot.chi-app.khoa-mo { background:#3B324D; }   /* #EFE6FB */
  body.toi #app.keo-cot-bat .h-cot[data-cot]         { background:#3A3020; }  /* #FFF4E5 */
  body.toi #app.keo-cot-bat .h-cot.khoa-mo[data-cot] { background:#4A3B22; }  /* #FFEBCC */

  /* cột "Ngày điểm danh" */
  body.toi .luoi .h-ngay        { color:#9BB0D8; }          /* #1F2A5A */
  body.toi .luoi td.o-ngay      { background:#27303B; }     /* #F7F9FB */
  body.toi .luoi td.o-ngay.dangmo { background:#3A2E1C; }   /* #FFF7E8 */
  body.toi .o-ngay .gt-ngay     { color:#AEB7C1; }          /* #46525F */

  /* hai cột đứng yên bên trái */
  body.toi .luoi .c-ma          { background:#2B323A; }     /* #FAFBFC */
  body.toi .luoi .c-ten         { background:#2B323A; border-right-color:#4D5761; }
  body.toi .luoi thead .c-ma,
  body.toi .luoi thead .c-ten   { background:#333B44; color:#E4E8EC; }  /* #F2F5F8 · #3D4854 */

  /* hàng Tổng (Đ/Đủ) — giữ sắc vàng để vẫn nhận ra là hàng cộng */
  body.toi .luoi .tong td       { background:#2A2317; color:#E3C56A; }  /* #FBF6EC · #8A6D1B */
  body.toi .luoi .tong .c-ma,
  body.toi .luoi .tong .c-ten   { background:#2A2317; }

  /* học sinh đã nghỉ · nghỉ hẳn · học bù · nộp nơi khác */
  body.toi .luoi tr.hs-nghi .c-ma,
  body.toi .luoi tr.hs-nghi .c-ten      { background:#3B4148; color:#B3BAC2; }
  body.toi .luoi tr.hs-nghi td.o        { background:#2E343B; }
  body.toi .luoi tr.hs-nghi-han .c-ma,
  body.toi .luoi tr.hs-nghi-han .c-ten  { background:#3E444B; color:#DFE2E5; }
  body.toi .luoi tr.hs-nghi-han td.o    { background:#393F46; }
  body.toi .luoi tr.hs-nghi-han td.o.o-nghi-khoa { background:#343A41; }
  body.toi .luoi td.o.o-nghi-khoa       { background:#32383F; }
  body.toi .luoi tr.hs-bu .c-ma,
  body.toi .luoi tr.hs-bu .c-ten        { background:#37301E; }
  body.toi .luoi tr.hs-bu td.o          { background:#312B21; }
  body.toi .luoi tr.hs-nop-noi td       { background:#1D2E25; }
  body.toi .luoi tr.hs-nop-noi .c-ma,
  body.toi .luoi tr.hs-nop-noi .c-ten   { background:#23392D; }
  body.toi .luoi tr.hs-nop-noi .c-ten   { color:#7FD69A; }   /* #155F35 */

  /* thanh chọn buổi ngay trên bảng */
  body.toi .dh-day button       { background:#272C32; }     /* #FFF */
  body.toi .dh-day .dh-chon     { background:#272C32; }     /* #FFF */
  body.toi .dh-day .dh-toi      { background:#3A2E1C; color:#F0C05A; }  /* #FFF6EA · #B26A00 */
  /* ══════ ⛔⛔ TỜ PHIẾU BUỔI = TỜ GIẤY ĐỂ CHỤP, KHÔNG PHẢI GIAO DIỆN APP — 13/08/2026 ══════
     Cô Quỳnh: *"phần phiếu buổi trong điểm danh bị đen các cột kìa, và tiêu đề lớp bị
     sáng quá trong nền trắng."*

     ⚠️ ĐÂY KHÔNG PHẢI LỖI NGOÀI DA. Tấm ảnh GỬI PHỤ HUYNH cũng dính y như vậy: lúc xuất
     ảnh, `chepStyle` chép MÀU ĐANG HIỂN THỊ của từng ô (danh sách `CSS_CAN_CHEP` có cả
     `color` lẫn `background-color`) rồi mới vẽ vào ảnh — vì bên trong <foreignObject>
     không có thẻ <style> nào của trang. Nên bật nền đen là phụ huynh nhận đúng tấm phiếu
     có dải tiêu đề đen sì và tên con mờ tịt.

     Hai chỗ hỏng, cùng một gốc:
       · `.phieu-bang th` — nền `var(--xanh-nhat)`, chữ `#28414A` CỨNG. Chế độ sáng:
         #E8F5F5 (xanh nhạt) + navy = đẹp. Chế độ tối: --xanh-nhat thành #1B2C2E (rất tối)
         mà chữ vẫn navy → TỐI TRÊN TỐI, đen sì đúng như ảnh cô gửi.
       · `.phieu` — đặt nền TRẮNG CỨNG nhưng không đặt màu chữ, nên chữ kế thừa var(--chu)
         = màu SÁNG của chế độ đen → tiêu đề lớp và tên học sinh nhạt trên nền trắng.

     CÁCH VÁ: y hệt cách đã dùng cho lưới điểm danh ngay bên trên — KHAI BÁO LẠI bộ biến
     màu SÁNG ngay trên `.phieu`. Mọi luật con đang dùng var(...) tự về màu sáng, khỏi phải
     đi vá từng cái. `#khungPhieu` chính là `.phieu` (xem chỗ dựng phiếu: `<div class="phieu"
     id="khungPhieu">`) — mà `#khungPhieu` đúng là thứ được nhân bản để xuất ảnh, nên vá một
     chỗ này là sửa cùng lúc CẢ MÀN HÌNH LẪN ẢNH GỬI ĐI.

     ⛔ ĐỪNG BAO GIỜ thêm luật `body.toi .phieu-…` gán màu SÁNG cho thứ nằm trong tờ phiếu.
        Tờ phiếu vĩnh viễn nền trắng ở cả hai chế độ; gán màu của nền đen vào là hỏng ảnh
        gửi phụ huynh mà trên máy mình nhìn vẫn thấy "hình như ổn".
     ⛔ Mấy thứ NGOÀI tờ phiếu thì ngược lại, vẫn phải theo nền đen: dòng "Đã ẩn N học sinh"
        (`.phieu-note-ngoai`) và hàng nút Buổi trước / Lưu ảnh (`.phieu-lat`, `.phieu-an-cot`)
        đều nằm NGOÀI `#khungPhieu` nên không vào ảnh — luật tối của chúng giữ nguyên. */
  body.toi .phieu {
    -webkit-text-stroke-width: 0;   /* 21/09: nền tối làm dày chữ bằng viền .25px — phiếu nền trắng thì không */
    /* ⛔ Mấy con số này phải BẰNG ĐÚNG bảng màu `:root` của chế độ sáng, đừng "chỉnh cho
       hợp mắt". Lệch một màu là tờ phiếu của người bật nền đen khác tờ phiếu của người
       không bật — hai giáo viên gửi phụ huynh hai tấm khác nhau. Bài kiểm
       `thu-phieu-nen-den.js` so từng biến với `:root`, lệch là đỏ. */
    --the:#FFFFFF; --nen:#FFFFFF; --nen2:#F3F3F3; --nen-o:#FFFFFF; --vien:#D6D2CB;
    --chu:#1F1D1A; --mo:#6B6660; --muc:#0D8081; --xanh-nhat:#E8F5F5; --do:#C0392B;
    --o-tot:#1E7C45; --o-nghi:#B3403A; --o-thieu:#E8A317; --o-quen:#5A6478;
    --xanh:#14A0A0; --xanh-dam:#0D8081; --cam:#F5821F; --cam-dam:#DC7014;
    background:#fff; color:#1F1D1A;
  }
  /* ⛔ LOGO MyPAS NẰM TRONG TỜ PHIẾU — chữ "PAS" bị luật nền đen kéo sang teal SÁNG
     (#5AD0C6, vốn dành cho thanh trên nền tối) rồi nhạt tịt trên nền trắng của phiếu,
     và lọt luôn vào ảnh gửi phụ huynh — tức là logo thương hiệu ra ảnh sai màu.
     Khai báo lại biến không cứu được vì chỗ kia gán màu CỨNG, phải đè đích danh.
     Trả về đúng teal gốc #14A0A0 như chế độ sáng. */
  body.toi .phieu .logo-mypas .ten .pas { color:var(--xanh); }
  body.toi .taolop-ghi, body.toi .bc-ghichu, body.toi .tths-tom { color:var(--mo); }
  /* 🌙 Thẻ lớp "đang học"/"sắp học" trước dùng nền XANH/CAM NHẠT CỨNG (#F2FAF5/#FFF9F2)
     → dark mode chữ tên lớp SÁNG trên nền sáng = KHÔNG ĐỌC ĐƯỢC (cô Quỳnh báo). Đổi
     sang nền tối có ánh xanh/cam nhẹ; viền màu (box-shadow) giữ nguyên để vẫn nổi. */
  body.toi .the-lop { background:var(--the); }
  body.toi .the-lop.dang-hoc { background:rgba(95,208,138,.12); }
  body.toi .the-lop.sap-hoc { background:rgba(242,193,78,.12); }
  body.toi .the-lop .ten { color:var(--chu); }
  body.toi .man-cong-cu .noi-dung a { color:var(--muc); }
  /* Nút chính teal giữ nguyên (đủ tương phản). Ô % / badge dùng nền pastel sáng nên
     giữ nguyên để đọc rõ chữ đậm trên nền sáng. */
  /* ═══════════ 🌙 VÁ CHẾ ĐỘ ĐEN TOÀN APP — cô Quỳnh 03/08 ("sảnh, nhắc việc,
     progress test, TẤT CẢ công cụ chữ tối khó nhìn — sửa cả app"). Nhiều BỀ MẶT LỚN
     (menu, hộp công cụ, hàng, tile) để nền TRẮNG/SÁNG CỨNG nhưng chữ lại theo biến
     --chu (đổi sang SÁNG ở dark) → sáng-trên-sáng KHÔNG ĐỌC ĐƯỢC. Đắp nền tối cho các
     bề mặt đó; đổi các TIÊU ĐỀ/SỐ màu tối cứng sang sáng. Badge pastel nhỏ (đã có chữ
     đậm riêng) và TỜ PHIẾU chụp ảnh (cố ý trắng để chụp) GIỮ nguyên. ═══════════ */
  body.toi .phan-menu, body.toi .pt-diem, body.toi .pt-form, body.toi .pt-day,
  body.toi .pt-them button, body.toi .khung-cuon, body.toi .khung-note,
  body.toi .hang-tk, body.toi .nv-loc, body.toi .nv-link, body.toi .nv-nguoi,
  body.toi .cs-moi-1, body.toi .tdg-o, body.toi .nvo-hop, body.toi .bcn-hop,
  body.toi .psc-hop { background:var(--the); color:var(--chu); border-color:var(--vien); }
  body.toi .tk-trong, body.toi .tdg-ketluan, body.toi .hang-tk.luu-tru,
  body.toi .hang-tk.cho-duyet, body.toi .khung-note textarea[readonly],
  body.toi .dg-lop-info { background:var(--nen2); }
  /* Nút phụ nền trắng cứng (thanh công cụ trong lớp + quanh phiếu) → nền tối */
  body.toi .nut-phieu, body.toi .nut-keocot, body.toi .chip, body.toi .dh-day button,
  body.toi .nut-bo-nhap, body.toi .phieu-lat button, body.toi .phieu-an-cot button
    { background:var(--nen2); color:var(--chu); border-color:var(--vien); }
  /* Tiêu đề / số / nhãn dùng màu TỐI cứng → sáng lại cho đọc được */
  body.toi .nv-h, body.toi .nv-ngay, body.toi .tk-nhom h3, body.toi .tdg-o b,
  body.toi .psc-hop b { color:var(--chu); }
  body.toi .nv-link-1 { color:#7FB8F0; }                 /* link xanh dương → sáng hơn */
  body.toi input::placeholder, body.toi textarea::placeholder { color:#9EADBD; }  /* chữ mờ ô nhập */
  /* Header "🔔 Thông báo nhắc việc" (Home): trước đặt nền INLINE sáng (inline đè cả
     dark) → chuyển sang CLASS để dark ép được; giữ ánh vàng/đỏ cảnh báo, nền tối, chữ sáng. */
  /* ══════════════════════════════════════════════════════════════════════════════
     KHỐI THÔNG BÁO CÔNG VIỆC — BỎ MÀU KEM, VỀ TRUNG TÍNH (cô Quỳnh 16/08/2026)
     ──────────────────────────────────────────────────────────────────────────────
     *"cái block thông báo nhắc việc tôi thấy bạn thiết kế hơi trẻ con, tôi cần nó
     phải business và chuyên nghiệp, ít icon màu mè… thiết kế thật nghiêm túc và đẹp."*

     Nền kem + viền vàng vốn để "gây chú ý", nhưng nó bật lên giữa một trang chủ toàn
     thẻ trắng — nhìn như tờ giấy nhớ dán lên bảng. Nay khung dùng đúng nền thẻ như
     mọi khối khác; việc QUÁ HẠN nói bằng một vạch đỏ mảnh bên trái từng dòng, chỗ
     mắt cần nhìn, chứ không nhuộm cả khối.
     ══════════════════════════════════════════════════════════════════════════════ */
  .home-tb-dau { background:var(--nen2); border-color:var(--vien); }
  .home-tb-dau.co-do { background:var(--nen2); border-color:var(--vien); }
  /* Khung ngoài của Thông báo nhắc việc — bằng CLASS, không gán thẳng vào thẻ. */
  .home-tb-khoi { background:var(--the); border-color:var(--vien); }
  .home-tb-khoi.co-do { background:var(--the); border-color:var(--vien); }
  body.toi .home-tb-khoi { background:var(--the); border-color:rgba(217,174,90,.42); }
  body.toi .home-tb-khoi.co-do { background:var(--the); border-color:rgba(229,118,108,.45); }
  /* Nền tối: giữ ánh vàng/đỏ cảnh báo nhưng DỊU, chữ đủ sáng để đọc mà không chói. */
  body.toi .home-tb-dau { background:rgba(217,174,90,.13); border-bottom-color:rgba(217,174,90,.34); color:#E4D3AE; }
  body.toi .home-tb-dau.co-do { background:rgba(229,118,108,.13); border-bottom-color:rgba(229,118,108,.38); color:#EFC2BC; }
  /* Tab CƠ SỞ (Nguyễn Tuân/Nguyễn Chánh · Trung Hòa · Phố Vọng) — nền tối, chữ SÁNG rõ (cô: "nút cơ sở khó nhìn") */
  body.toi .nv-tab { color:var(--chu); background:var(--nen2); border-color:var(--vien); }
  body.toi .nv-tab:hover { border-color:var(--muc); }
  /* Thanh "đã chọn N lớp" (Quản lý lớp) trước nền teal SÁNG cứng + chữ teal → khó đọc trên dark */
  body.toi .ql-chon-thanh { background:rgba(90,208,198,.12); border-color:rgba(90,208,198,.32); }
  body.toi .ql-chon-thanh .ql-chon-so { color:var(--chu); }
  /* Icon công cụ ở Home: nền TINT sáng cứng → trong dark ô "Cài đặt"/"Quản lý TK" (tint xám
     gần trắng) trông LỖI/mờ. Đổi sang CHIP TỐI pha màu nhấn của từng công cụ → rõ + đồng bộ.
     (Dòng 1 = fallback đặc nếu trình duyệt cũ không có color-mix; dòng 2 đè nếu có.) */
  body.toi .home-o-ico { background:#2E353C; }
  body.toi .home-o-ico { background:color-mix(in srgb, var(--mau,#14A0A0) 24%, #131d29); }
  /* Nút "Huỷ" hộp thoại (nút TRƠN `.ht-nut button` nền #fff cứng + chữ --chu sáng → nút TRẮNG
     LÓA, chữ vô hình trong dark). Đắp nền tối + chữ sáng. Nút .chinh/.cam (teal/cam) giữ nguyên. */
  body.toi .ht-nut button { background:var(--nen2); color:var(--chu); border-color:var(--vien); }
  * { box-sizing: border-box; }
  /* ⛔ DÒNG NÀY CỰC KỲ QUAN TRỌNG — ĐỪNG XOÁ.
     Thuộc tính `hidden` của HTML chỉ là `display:none` trong bảng mặc định của
     trình duyệt, nên BẤT KỲ rule nào của mình có `display:` (ví dụ
     `.man-dn{display:flex}`) đều ĐÈ THẮNG nó. Hậu quả ngày 23/07/2026:
     đăng nhập thành công, app vẽ ra phía sau, nhưng màn đăng nhập KHÔNG BAO GIỜ
     biến mất — nó phủ kín màn hình che hết. Người dùng bấm nút và thấy
     "không có gì xảy ra", suốt cả buổi.
     Test kiểu `el.hidden === true` là XANH GIẢ: thuộc tính đúng nhưng mắt vẫn
     thấy nó. Phải đo `getComputedStyle(el).display` hoặc `elementFromPoint`. */
  [hidden] { display: none !important; }
  html, body { margin:0; height:100%; }
  body { font-family:"Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif;
         background:var(--nen); color:var(--chu); font-size:14px; }
  /* ⛔⛔ VÁ 13/08/2026 (đợt 2) — `color:inherit` LÀ CẢ CÁI VÁ, ĐỪNG BỎ.
     Cô Quỳnh: *"nút Sửa ở Nhắc việc bị đen xì không nhìn thấy được khi để nền đen"*.
     Thẻ <button> KHÔNG tự kế thừa màu chữ như <div>: luật CSS nào không nói màu thì
     trình duyệt cho màu đen mặc định của hệ điều hành. Nền sáng không ai thấy sai; bật
     nền đen là chữ đen nằm trên nền đen — mất hẳn nút, không phải mờ, là MẤT.
     Quét cả file ra 8 nút dính đúng kiểu này (Sửa · Lịch · Chip dự giờ · …).
     Một dòng này lo hết: nút lấy màu của KHUNG chứa nó, nên nút trong lưới điểm danh
     (khung cố ý giữ SÁNG trong dark) vẫn ra chữ tối, nút ngoài nền đen ra chữ sáng.
     Ở chế độ sáng KHÔNG đổi gì: màu kế thừa cũng là màu đen của trang.
     Xem thêm khối "🌙 VÁ 13/08/2026 (đợt 2)" ở phần dark mode phía trên. */
  button { font-family:inherit; cursor:pointer; color:inherit; }
  input, select { font-family:inherit; }
  /* ══════════════════════════════════════════════════════════════════════════
     ㊲ BỎ DẤU "…" TOÀN APP — Boss 21/09/2026: "Không giữ — bỏ hết", cả Điểm danh.
     Đè MỘT lần mọi `text-overflow: ellipsis` (96 luật trong ba file CSS + hai chỗ
     JS tự đặt): chữ một dòng dài hơn cột thì cắt gọn ở mép, không dấu. Chỗ nào về
     sau lỡ khai `ellipsis` cũng tự về cắt gọn.
     ⛔ Luật dấu sao áp CẢ APP nên phải nằm ở file nền này. Để trong file công cụ là
        bài `thu-css-khong-de-len-nen-chung.js` chặn. Dời NGUYÊN VĂN từ cuối
        css/lop.css ngày 22/09 — không có `!important` nào khác đụng
        `text-overflow`, nên đứng đầu hay đứng cuối ba file đều ra cùng một kết quả.
        Phần gỡ kẹp nhiều dòng và lý do đầy đủ: khối ㊲ cuối css/lop.css.
     ══════════════════════════════════════════════════════════════════════════ */
  *, *::before, *::after { text-overflow: clip !important; }

