/* ============================================================================
   HAI NỀN: tối ↔ sáng. Mỗi section dùng BA màu nhấn phân bổ vào các thành phần
   khác nhau (nhãn · gạch chân · từng mục danh sách · hình · nút).
   Chữ vẫn chỉ 4 mã cố định cho cả trang.
   ============================================================================ */
:root{
  --n-toi:linear-gradient(165deg,#020b13 0%,#051b28 46%,#06272f 100%);
  --n-sang:linear-gradient(165deg,#ffffff 0%,#eef4f7 100%);

  /* chữ: CHỈ 4 mã, không hơn */
  --c-toi-1:#ffffff;  --c-toi-2:#d6e8f0;
  /* Chữ trên nền sáng: đã tăng độ đen thêm 30% (nhân RGB × 0.7)
     chính #0b2038 → #081627 · phụ #4a5a68 → #343f49 */
  --c-sang-1:#081627; --c-sang-2:#343f49;

  /* ---- MÀU THƯƠNG HIỆU CỐ ĐỊNH ----
     Mọi thứ nằm ở CỘT CHỮ (nhãn · gạch chân · chấm danh sách · nút) đều dùng
     đúng hai màu này, không đổi theo section. Màu riêng của từng section chỉ
     xuất hiện trong HÌNH. */
  --th-toi:#3fe0e8;   --th-toi-2:#5fe9b8;
  --th-sang:#12788a;  --th-sang-2:#0f7a5c;
  --th-toi-nen:#d9f4f7;

  /* ================= ĐƠN VỊ CHUẨN — gốc của mọi kích thước =================
     Mọi thứ (chữ · nút · khoảng cách · bo góc · lưới) đều tính từ --u, nên tỉ lệ
     giữa chúng KHOÁ CỨNG với nhau ở mọi khổ màn — không bao giờ lệch pha.

     min(vw, vh): lấy chiều nào NHỎ hơn. Nếu chỉ theo bề ngang thì màn rộng mà thấp
     (1920×600) sẽ có chữ to trong khung 85vh thấp tè → tràn. Lấy min là co theo cả
     hai chiều nên khối nội dung luôn giữ đúng tỉ lệ, không méo.
     clamp: sàn 12px cho màn nhỏ, trần 18px để màn 4K không phình quá cỡ.

     Quy chiếu ở 1440×760: --u ≈ 15.8px → nút 38px, header 57px, tiêu đề 47px.  */
  --u:clamp(12px, min(1.1vw, 2.2vh), 18px);

  --nut-cao:calc(var(--u) * 2.4);          /* 38px ở khổ chuẩn */
  --thanh-cao:calc(var(--nut-cao) * 1.5);  /* header/footer = 150% nút */
  --goc:calc(var(--u) * .63);              /* bo góc nút ~10px */
  --goc-to:calc(var(--u) * .88);           /* bo góc khối lớn ~14px */
  --luoi:calc(var(--u) * 3);               /* bước lưới kẻ ~48px */

  /* Thời gian hiệu ứng HOVER — để rất ngắn cho cảm giác gần như tức thì.
     Trên 150ms là người dùng bắt đầu thấy "đơ". 90ms vừa đủ để mắt thấy có chuyển
     tiếp chứ không phải nhảy cóc, mà vẫn phản hồi tức khắc. */
  --nhanh:.09s;

  /* ⚠️ KHÔNG DÙNG FONT ĐƠN CÁCH CHO NHÃN NỮA — đây là lỗi làm chữ nút trên điện
     thoại mảnh tới mức không đọc được.
     Lý do: Consolas chỉ có trên Windows. Android và iOS đều KHÔNG có Consolas lẫn
     Courier New nên rơi thẳng xuống `monospace` hệ thống — trên Android là Droid
     Sans Mono, nét cực mảnh VÀ chỉ có một nấc đậm, nên font-weight:600 không làm
     chữ đậm lên được chút nào. Trên máy Windows nhìn vẫn đẹp nên rất dễ bỏ sót.

     --nhan dùng cho MỌI nhãn phải đọc được: nút · overline · tab menu · logo.
     Toàn font chữ thường hệ thống — máy nào cũng có, và đều có đủ nấc đậm thật.
     Chất "công nghệ" giữ bằng IN HOA + giãn chữ, không cần đơn cách.

     --mono chỉ còn dùng cho SỐ và bảng công cụ đo — chỗ cần các chữ số thẳng cột,
     và nếu font có mảnh cũng không ảnh hưởng người mua hàng. */
  --nhan:system-ui,-apple-system,"Segoe UI",Roboto,"Noto Sans",Arial,sans-serif;
  --mono:Consolas,"SF Mono",Menlo,"Roboto Mono","Droid Sans Mono",
         "DejaVu Sans Mono","Courier New",monospace;
  --sans:"Segoe UI","Noto Sans",Arial,sans-serif;
}
*{box-sizing:border-box}
/* KHÔNG dùng scroll-behavior:smooth của trình duyệt — trang dài 10 màn nên nó cuộn
   theo quãng đường, đi từ section 1 xuống 8 mất rất lâu, nhìn như không phản hồi.
   Thay bằng hàm cuộn tự viết ở cuối file: thời gian CỐ ĐỊNH 600ms cho mọi quãng. */
html{scroll-behavior:auto;scroll-padding-top:var(--thanh-cao)}
body{margin:0;font-family:var(--sans);line-height:1.6;background:#051b28;
  -webkit-font-smoothing:antialiased}

/* ============================ KHUNG SECTION ============================ */
/* Nội dung chiếm 85% chiều cao section → đệm thở 7.5% mỗi bên.

   ⚠️ PHẢI TRỪ CHIỀU CAO HEADER khỏi phép tính. Header là thanh CỐ ĐỊNH đè lên đầu
   section, nên vùng thật sự nhìn thấy chỉ còn (100vh − chiều cao header).
   Trước đây lấy 7.5vh làm đệm trên: ở màn 900px là 67.5px, mà header đã chiếm 57px
   → chỉ còn 10px thở thật, nhãn overline gần như dính đáy thanh.
   Nay tính 85%/7.5% trên VÙNG CÒN LẠI rồi cộng đúng chiều cao header vào đệm trên.
   Cộng lại vẫn tròn 100vh, không dôi ra.

   Hệ quả quan trọng: đỉnh section trùng đỉnh khung nhìn là đã đúng vị trí, nên mọi
   lệnh cuộn tới section KHÔNG được trừ chiều cao header nữa (trừ hai lần). */
.sec{position:relative;min-height:100vh;display:flex;flex-direction:column;
  justify-content:center;overflow:hidden;
  --man-dung:calc(100vh - var(--thanh-cao));
  padding-top:calc(var(--thanh-cao) + var(--man-dung) * .075);
  padding-bottom:calc(var(--man-dung) * .075)}
.sec[data-nen="toi"] {background:var(--n-toi)}
.sec[data-nen="sang"]{background:var(--n-sang)}
.sec.chu{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .25);
  padding-bottom:calc(var(--man-dung) * .25)}

/* SECTION CUỐI thấp hơn các section khác đúng bằng chiều cao chân trang, để
   section cuối + chân trang cộng lại tròn một màn. Cuộn tới section cuối là thấy
   luôn cả chân trang, không phải cuộn thêm.
   Vùng dùng được của riêng nó phải trừ CẢ HAI thanh: header đè lên đầu và chân
   trang chiếm phần đáy. Cả hai đều cao var(--thanh-cao) nên trừ đúng 2 lần. */
.sec:last-child{
  --man-dung:calc(100vh - var(--thanh-cao) * 2);
  min-height:calc(100vh - var(--thanh-cao))}

/* LƯỚI KẺ — phải liền mạch xuyên suốt trang.
   Bước lưới BẰNG NHAU trên cả hai nền (48px) thì vạch DỌC mới trùng nhau ở ranh giới.
   Vạch NGANG được neo bằng background-position tính trong JS theo khoảng cách từ đỉnh
   trang, nếu không mỗi section lại bắt đầu đếm lại từ 0 và vạch ngang sẽ so le. */
.luoi{position:absolute;inset:0;pointer-events:none;z-index:0;
  background-size:var(--luoi) var(--luoi);

  /* Toàn bộ lớp lưới trong suốt thêm 20% — lưới là NỀN, không được tranh chú ý
     với nội dung. Hạ ở đây một chỗ thay vì sửa cả hai mã màu tối/sáng: chỉnh một
     con số là đổi cả trang, và không phá tỉ lệ đậm nhạt giữa hai nền.
     .luoi không có con nào định vị nên stacking context mới do opacity sinh ra
     không ảnh hưởng thứ tự lớp với .nd (z-index:2). */
  opacity:.8;

  /* LỚP CHE TOẢ TRÒN — mờ dần đều từ tâm ra lề, KHÔNG có vùng nào bị xoá trắng.
     Tâm còn 10% độ đậm, ra tới lề là 100%. Giữa màn vẫn thấy lưới, chỉ rất nhạt.

     · KHÔNG có mốc phẳng ở đầu. Bản trước để transparent suốt 0→30% rồi mới dâng
       lên, tạo một VÒNG THẤY RÕ ngay mốc 30% — đó là chỗ trông thiếu tự nhiên.
       Nay dâng ngay từ 0% nên không có ranh giới nào để mắt bắt.
     · Đường cong luỹ thừa 1.5 (alpha = .10 + .90 × t^1.5) chứ không tuyến tính.
       Diện tích hình tròn tăng theo r² nên ramp tuyến tính làm phần lớn màn hình
       rơi vào khoảng đậm, nhìn thành viền tối bao quanh. Luỹ thừa 1.5 bù lại,
       cho cảm giác đậm lên đều tay theo mắt chứ không theo con số.
     · ellipse closest-side: bán kính = nửa bề rộng · nửa chiều cao, nên mốc phần
       trăm đúng nghĩa "phần trăm màn hình" trên mọi khổ màn. Để mặc định
       farthest-corner thì vùng nhạt phình theo đường chéo, màn càng rộng càng sai.
     · Không đụng background-position nên phần neo lưới liền mạch giữa các section
       vẫn nguyên. Trình duyệt cũ không hiểu mask thì hiện lưới đầy đủ như trước. */
  -webkit-mask-image:radial-gradient(ellipse closest-side at 50% 50%,
    rgba(0,0,0,.10) 0%,  rgba(0,0,0,.15) 15%, rgba(0,0,0,.25) 30%,
    rgba(0,0,0,.37) 45%, rgba(0,0,0,.52) 60%, rgba(0,0,0,.69) 75%,
    rgba(0,0,0,.84) 88%, #000 100%);
          mask-image:radial-gradient(ellipse closest-side at 50% 50%,
    rgba(0,0,0,.10) 0%,  rgba(0,0,0,.15) 15%, rgba(0,0,0,.25) 30%,
    rgba(0,0,0,.37) 45%, rgba(0,0,0,.52) 60%, rgba(0,0,0,.69) 75%,
    rgba(0,0,0,.84) 88%, #000 100%)}
/* Độ đậm vạch nâng từ .055/.05 lên .09/.08 vì đã có lớp che ở trên.
   Trung bình lớp che tính theo DIỆN TÍCH (∫ alpha·2t dt, vì diện tích tăng theo r²)
   ra 0.61 → .055 ÷ .61 = .09 và .05 ÷ .61 = .08. Nhờ vậy tổng lượng lưới nhìn thấy
   trên cả màn giữ nguyên như trước, chỉ dồn lại: tâm nhạt hẳn, lề đậm lên.
   Giữ nguyên .055 thì nhân với lớp che sẽ mất hơn một phần ba lưới, trang trống trơn. */
.sec[data-nen="toi"] .luoi{
  background-image:linear-gradient(rgba(120,220,235,.09) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(120,220,235,.09) 1px,transparent 1px)}
.sec[data-nen="sang"] .luoi{
  background-image:linear-gradient(rgba(13,45,73,.08) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(13,45,73,.08) 1px,transparent 1px)}

/* ranh giới: vạch mảnh dùng các màu của HÌNH (không phải chữ), không phát sáng */
.sec::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;z-index:4;
  background:linear-gradient(90deg,transparent,var(--i1) 18%,var(--i3) 50%,var(--i5,var(--i2)) 82%,transparent);
  opacity:.5}

/* ============================ NỘI DUNG ============================ */
/* 85% và 50% tính trên VÙNG CÒN LẠI sau khi trừ header — khớp với đệm ở .sec */
.nd{position:relative;z-index:2;width:100%;max-width:1072px;margin:0 auto;padding:0 24px;
  height:calc(var(--man-dung) * .85);display:grid;grid-template-columns:60% 40%;
  gap:calc(var(--u) * 2.9);align-items:center}
.sec.chu .nd{height:calc(var(--man-dung) * .5);grid-template-columns:40% 60%}
.sec.chan .nd{direction:rtl}
.sec.chan .nd>*{direction:ltr}

/* ============================ FORM LIÊN HỆ ============================
   Section cuối thay hình minh hoạ bằng FORM ở CẢ MÁY TÍNH LẪN ĐIỆN THOẠI.
   Lý do: section cuối là chỗ chốt — người xem đọc xong chín section rồi, thứ họ cần
   là ô để điền, không phải thêm một hình minh hoạ nữa. Trên máy tính form nằm đúng
   cột 40% của khối hình, ngay cạnh cột chữ — nhìn là điền được luôn.

   Form dựng SẴN trong DOM cùng với hình, CSS quyết định bên nào hiện. Dựng lại khi
   đổi khổ màn sẽ mất chữ người dùng đang gõ dở lúc xoay máy.

   Ô nhập cao đúng bằng nút (var(--nut-cao)) nên form thẳng hàng với nút bên cạnh. */
.form-lh{display:none;flex-direction:column;width:100%;
  gap:calc(var(--u) * .72)}
/* Hiện form và giấu hình — áp cho mọi khổ màn */
.sec:last-child .khoi-hinh > svg{display:none}
.sec:last-child .form-lh{display:flex}
.form-lh input,.form-lh textarea{
  width:100%;box-sizing:border-box;font-family:var(--sans);font-size:15px;
  padding:0 calc(var(--u) * .82);border-radius:var(--goc);
  border:1px solid transparent;outline:none;transition:var(--nhanh)}
.form-lh input{height:calc(var(--nut-cao) + 3px)}
.form-lh textarea{padding-top:calc(var(--u) * .55);padding-bottom:calc(var(--u) * .55);
  line-height:1.5;resize:none}
/* 16px là ngưỡng của Safari trên iPhone: ô nhập nhỏ hơn 16px thì trình duyệt TỰ
   PHÓNG TO cả trang khi chạm vào ô, người dùng phải tự thu lại. Đặt 15px cho vừa
   thang chữ rồi bù bằng cỡ 16px riêng cho iOS. */
@supports (-webkit-touch-callout:none){
  .form-lh input,.form-lh textarea{font-size:16px}
}
/* Viền và chữ gợi ý đậm thêm 30% so với bản đầu — bản đầu nhìn mờ, ô nhập không
   rõ ranh giới nên không nhận ra là chỗ điền được.
   Nền TỐI thì "đậm hơn" nghĩa là SÁNG hơn: viền 30%→39%, chữ gợi ý #7fa4b3→#a6d6e9. */
.sec[data-nen="toi"] .form-lh input,
.sec[data-nen="toi"] .form-lh textarea{
  background:rgba(120,220,235,.07);color:var(--c-toi-1);
  border-color:color-mix(in srgb,var(--th-toi) 39%,transparent)}
.sec[data-nen="toi"] .form-lh input::placeholder,
.sec[data-nen="toi"] .form-lh textarea::placeholder{color:#a6d6e9}
.sec[data-nen="toi"] .form-lh input:focus,
.sec[data-nen="toi"] .form-lh textarea:focus{border-color:var(--th-toi)}

/* Nền SÁNG thì "đậm hơn" nghĩa là TỐI hơn: viền 28%→36%, chữ gợi ý #8194a1→#5a6771
   (nhân RGB × 0.7). Tương phản chữ gợi ý trên nền trắng lên 5.9, thừa ngưỡng 4.5. */
.sec[data-nen="sang"] .form-lh input,
.sec[data-nen="sang"] .form-lh textarea{
  background:#ffffff;color:var(--c-sang-1);
  border-color:color-mix(in srgb,#0e606e 36%,transparent)}
.sec[data-nen="sang"] .form-lh input::placeholder,
.sec[data-nen="sang"] .form-lh textarea::placeholder{color:#5a6771}
.sec[data-nen="sang"] .form-lh input:focus,
.sec[data-nen="sang"] .form-lh textarea:focus{border-color:#0e606e}

/* Ô nhập sai: viền đỏ cam, KHÔNG dùng đỏ tươi cho khỏi chói */
.form-lh .loi{border-color:#e2431a !important}
/* CHỪA SẴN chỗ cho dòng thông báo ngay cả khi đang trống. Ẩn lúc trống rồi hiện lúc
   có chữ sẽ làm cả form nhảy xuống đúng lúc người dùng vừa bấm — vừa giật vừa dễ
   bấm nhầm vào thứ khác vừa trồi lên. */
.form-lh-bao{margin:0;font-size:13px;line-height:1.4;min-height:1.4em}
.form-lh-bao.loi{color:#ff8a4c}
.form-lh-bao.xong{color:var(--th-toi)}
.sec[data-nen="sang"] .form-lh-bao.loi{color:#cf3f12}
.sec[data-nen="sang"] .form-lh-bao.xong{color:#0f7a5c}

.khoi-chu{min-width:0;display:flex;flex-direction:column;justify-content:center;
  gap:calc(var(--u) * .88)}
.khoi-hinh{min-width:0;display:flex;align-items:center;justify-content:center}
.khoi-hinh svg{width:100%;height:auto;max-height:70vh;display:block}

/* ============================ CHỮ ============================ */
/* nhãn: MÀU THƯƠNG HIỆU cố định — không đổi theo section */
/* Overline: font chữ thường + đậm 700. Trước dùng đơn cách + đậm 500 nên trên điện
   thoại mảnh như sợi chỉ. Giãn chữ hạ từ .16em xuống .12em: giãn quá rộng làm từng
   chữ cái đứng lẻ ra, mắt phải ghép lại nên càng khó đọc ở cỡ nhỏ. */
.ov{font-family:var(--nhan);font-size:calc(var(--u) * .78);letter-spacing:.12em;font-weight:700;
  display:inline-flex;align-items:center;gap:calc(var(--u) * .57);align-self:flex-start;
  padding:calc(var(--u) * .38) calc(var(--u) * .76);border-radius:calc(var(--goc) * .8)}
/* CHẤM BÁO HIỆU — phải nhìn ra ngay, đây là thứ báo "đang sống" của cả section.
   · Kích thước: trước để .38u, trên điện thoại --u chạm sàn 12px nên chấm chỉ còn
     4.55px — gần như không thấy. Nay tối thiểu 9px.
   · Màu: tách khỏi currentColor. Trước chấm cùng màu chữ nhãn (cyan/xanh) nên chìm
     hẳn vào nền chip. Nay dùng CAM — màu duy nhất trên trang không đụng bảng màu
     xanh, nên mắt bắt được ngay dù chấm nhỏ. */
.ov b{width:max(9px,calc(var(--u) * .54));height:max(9px,calc(var(--u) * .54));
  border-radius:50%;flex:0 0 auto;background:var(--cham)}
/* --cham: màu chấm báo hiệu. Mỗi nền một sắc cam riêng để đủ tương phản.
     nền tối  #ff8a4c trên nền #0a2530 → 6.9 (ngưỡng đồ hoạ là 3.0)
     nền sáng #cf3f12 trên chip #d9f4f7 → 4.6 */
.sec[data-nen="toi"]  .ov{color:var(--th-toi);--cham:#ff8a4c;
  background:color-mix(in srgb,var(--th-toi) 13%,transparent);
  border:1px solid color-mix(in srgb,var(--th-toi) 32%,transparent)}
/* Overline trên nền sáng: đậm thêm 20% (#12788a → #0e606e), cùng sắc với nút
   trong section nền sáng. Viền cũng đặc hơn cho cân với chữ đã đậm. */
.sec[data-nen="sang"] .ov{color:#0e606e;--cham:#cf3f12;background:var(--th-toi-nen);
  border:1px solid color-mix(in srgb,#0e606e 30%,transparent)}

/* Cỡ chữ tính theo --u nên co giãn đồng bộ với nút, header, khoảng cách. */
h1,h2{margin:0;font-weight:600;letter-spacing:-.028em;line-height:1.14}
h1{font-size:calc(var(--u) * 3)}      /* ~47px ở khổ chuẩn */
h2{font-size:calc(var(--u) * 2.55)}   /* ~40px */
/* Text mô tả: IN ĐẬM nhưng ở nấc MỎNG NHẤT mà Segoe UI có.
   Segoe UI có 5 nấc thật: 300 · 400 · 500=600 · 700 · 800=900.
   Nấc đậm mỏng nhất là 500 (trùng 600) — dày hơn chữ thường 36% mực nhưng vẫn nhẹ,
   không nặng như 700. Đặt 500 chứ không 600 để nếu sau này đổi sang phông có nhiều
   nấc hơn thì tự động lấy nấc mảnh hơn. */
.mo-ta{margin:0;font-size:calc(var(--u) * 1.07);line-height:1.72;max-width:52ch;
  font-weight:500}

/* ---- LUẬT SỐ DÒNG ----
   Sec chủ: tiêu đề LUÔN 2 dòng. Các sec còn lại: tiêu đề LUÔN 1 dòng.
   Gạch đầu dòng: LUÔN 1 dòng, không được rớt sang dòng thứ hai.
   Chốt cứng chiều cao để dù chữ có dài cũng không làm xô lệch bố cục — nhưng chữ
   dài thì phải VIẾT LẠI cho vừa, không để nó bị cắt. */
/* KHÔNG cắt chữ. Chữ dài thì phải VIẾT LẠI cho vừa, không được để dấu "..." nuốt mất chữ.
   Để overflow:visible nên nếu có câu nào quá dài thì nó tràn ra thấy ngay — lỗi lộ liền
   chứ không âm thầm bị cắt. */
.sec.chu h1{min-height:calc(2 * 1.14em)}
.sec:not(.chu) h2{white-space:nowrap;overflow:visible}
.ds li span{white-space:nowrap;overflow:visible;min-width:0}

.sec[data-nen="toi"]  h1,.sec[data-nen="toi"]  h2{color:var(--c-toi-1)}
.sec[data-nen="sang"] h1,.sec[data-nen="sang"] h2{color:var(--c-sang-1)}

/* ---- TIÊU ĐỀ GRADIENT TRÊN MỌI NỀN TỐI ----
   Dải màu: trắng → cyan → mint → hổ phách, đúng dải trang tramcongnghe đang dùng.
   30% đầu trắng đặc, rồi chuyển dần qua bậc cyan nhạt cho khỏi gãy khúc.

   PHẢI CHIA HAI GÓC vì số dòng khác nhau:
     · Sec chủ  — tiêu đề 2 dòng → góc 168deg (chéo xuống) để dòng 2 nối tiếp dòng 1.
     · Sec khác — tiêu đề 1 dòng → góc 100deg (gần ngang) để màu chạy dọc theo chữ.
   Dùng nhầm góc dựng đứng cho tiêu đề 1 dòng thì cả dòng thành một mảng phẳng lì,
   vì không có chiều cao để dải màu trải ra.

   Khai màu đặc TRƯỚC rồi mới cắt nền theo chữ: trình duyệt nào không hiểu
   background-clip:text vẫn còn chữ trắng để đọc, không mất chữ. */
.sec[data-nen="toi"] h1,
.sec[data-nen="toi"] h2{
  background:linear-gradient(100deg,
    #ffffff 0%, #ffffff 30%,
    #cdf3f6 46%,
    #3fe0e8 64%, #7ef0d0 82%, #ffd166 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
  /* ⚠️ CHỖ NÀY HAY CẮT MẤT ĐUÔI CHỮ.
     background-clip:text chỉ tô màu trong PHẠM VI HỘP của thẻ. Chữ Việt có đuôi thò
     xuống (g, y, ạ, ụ) và dấu nặng nằm dưới đường cơ sở; nếu hộp không đủ sâu thì
     phần thò ra không được tô → chữ "g" cụt thành "q", nhìn như font lỗi.
     Đo thật ở 30px: đuôi chữ chạm tới 30.9px tính từ đỉnh hộp, mà vùng tô chỉ cao
     31.7px — dư 0.8px, sát tới mức máy nào làm tròn khác đi một chút là cắt.
     .22em (6.6px ở cỡ 30px) cho dư hẳn, không bao giờ chạm mép nữa.
     Không dùng overflow:visible được: quy tắc cắt theo hộp là của chính
     background-clip, overflow không can thiệp vào đó. */
  padding-bottom:.22em}

.sec.chu h1{
  /* 30% đầu TRẮNG hoàn toàn, rồi chuyển DẦN sang gradient.
     Mấu chốt để không đột ngột: chèn một bậc trung gian màu cyan rất nhạt (#cdf3f6)
     ở 46%. Nhảy thẳng từ trắng sang cyan đậm là mắt bắt được ngay chỗ đổi; đi qua
     một sắc nhạt ở giữa thì mắt đọc thành một dải liền mạch. Quãng chuyển kéo dài
     từ 30% tới 64% — hơn một phần ba chiều dài chữ. */
  /* GÓC 168deg — tính ra chứ không chọn cảm tính.
     Góc ngang (100deg) làm hai dòng lấy CÙNG một khoảng màu → mỗi dòng lại chạy lại
     từ trắng sang vàng, nhìn thành hai dải rời rạc.
     Với khung tiêu đề tỉ lệ ~3.7:1 và 2 dòng, góc 168deg cho:
       dòng 1 → lấy khoảng 14–58% của dải màu (trắng → cyan nhạt)
       dòng 2 → lấy khoảng 42–86% (cyan nhạt → mint → hổ phách)
     Hai dòng NỐI TIẾP nhau, chỉ chồng nhẹ ở vùng cyan nhạt nên mối nối không lộ.
     Gradient chạy một mạch từ chữ đầu tới chữ cuối theo đúng thứ tự đọc, mà trong
     từng dòng vẫn có chuyển màu chứ không bị phẳng lì như góc dựng đứng. */
  background:linear-gradient(168deg,
    #ffffff 0%, #ffffff 30%,
    #cdf3f6 46%,
    #3fe0e8 64%, #7ef0d0 82%, #ffd166 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
  /* chữ gradient hay bị cắt cụt phần dấu tiếng Việt và đuôi chữ thò xuống */
  /* ⚠️ CHỖ NÀY HAY CẮT MẤT ĐUÔI CHỮ.
     background-clip:text chỉ tô màu trong PHẠM VI HỘP của thẻ. Chữ Việt có đuôi thò
     xuống (g, y, ạ, ụ) và dấu nặng nằm dưới đường cơ sở; nếu hộp không đủ sâu thì
     phần thò ra không được tô → chữ "g" cụt thành "q", nhìn như font lỗi.
     Đo thật ở 30px: đuôi chữ chạm tới 30.9px tính từ đỉnh hộp, mà vùng tô chỉ cao
     31.7px — dư 0.8px, sát tới mức máy nào làm tròn khác đi một chút là cắt.
     .22em (6.6px ở cỡ 30px) cho dư hẳn, không bao giờ chạm mép nữa.
     Không dùng overflow:visible được: quy tắc cắt theo hộp là của chính
     background-clip, overflow không can thiệp vào đó. */
  padding-bottom:.22em}
.sec[data-nen="toi"]  .mo-ta{color:var(--c-toi-2)}
.sec[data-nen="sang"] .mo-ta{color:var(--c-sang-2)}

/* gạch chân: MÀU THƯƠNG HIỆU cố định */
.gach{width:calc(var(--u) * 4.9);height:calc(var(--u) * .19);border-radius:99px;flex:0 0 auto}
.sec[data-nen="toi"]  .gach{background:linear-gradient(90deg,var(--th-toi),var(--th-toi-2))}
.sec[data-nen="sang"] .gach{background:linear-gradient(90deg,var(--th-sang),var(--th-sang-2))}

/* danh sách: chấm tick cũng MÀU THƯƠNG HIỆU — cột chữ giữ yên tĩnh */
/* ---- CHỈ HIỆN 3 GẠCH ĐẦU DÒNG, BỎ DÒNG THỨ 4 ----
   Áp cho MỌI khổ màn để hai bản giống nhau, không phải mỗi bên một số dòng.
   Bốn dòng đọc thành một khối dày, mắt lướt qua chứ không đọc; ba dòng vẫn đủ ý mà
   nhẹ hơn hẳn, phần chỗ trống thu được dồn cho HÌNH.
   Dòng thứ 4 vẫn nằm nguyên trong DOM — xoá đúng dòng CSS này là nó hiện lại, không
   phải đi sửa dữ liệu của mười section. */
.ds li:nth-child(n+4){display:none}

.ds{list-style:none;margin:calc(var(--u) * .25) 0 0;padding:0;display:grid;
  gap:calc(var(--u) * .57)}
.ds li{display:flex;align-items:flex-start;gap:calc(var(--u) * .63);
  font-size:calc(var(--u) * .98);line-height:1.55}
.ds li i{flex:0 0 auto;width:calc(var(--u) * 1.2);height:calc(var(--u) * 1.2);
  border-radius:calc(var(--u) * .38);margin-top:calc(var(--u) * .13);
  display:grid;place-items:center}
.ds li i svg{width:calc(var(--u) * .7);height:calc(var(--u) * .7);fill:none;stroke-width:3;
  stroke-linecap:round;stroke-linejoin:round}
.sec[data-nen="toi"]  .ds li{color:var(--c-toi-2)}
.sec[data-nen="sang"] .ds li{color:var(--c-sang-2)}
.sec[data-nen="toi"]  .ds li i{background:color-mix(in srgb,var(--th-toi) 16%,transparent)}
.sec[data-nen="toi"]  .ds li i svg{stroke:var(--th-toi)}
.sec[data-nen="sang"] .ds li i{background:var(--th-toi-nen)}
.sec[data-nen="sang"] .ds li i svg{stroke:var(--th-sang)}

/* ============================ NÚT ============================ */
/* Khoảng cách từ gạch đầu dòng cuối xuống hàng nút: gấp đôi cho thoáng.
   Cột chữ có gap 14px, cộng margin-top 6px là 20px → nay 40px (gap 14 + margin 26). */
.hang-nut{display:flex;flex-wrap:wrap;gap:calc(var(--u) * .63);margin-top:calc(var(--u) * 1.64)}
/* Nút TRONG SECTION rộng hơn nút header 20%: đệm ngang 1.14u so với 0.95u. */
.sec .nut{padding-left:calc(var(--u) * 1.37);padding-right:calc(var(--u) * 1.37)}
.nut{height:var(--nut-cao);line-height:1;padding:0 calc(var(--u) * 1.14);
  border-radius:var(--goc);border:1px solid transparent;cursor:pointer;
  /* Nhãn nút: font chữ thường + đậm 700 + to hơn 6%. Đây là chỗ hỏng nặng nhất khi
     còn dùng đơn cách — chữ trên nút là thứ khách phải đọc để biết bấm cái gì.
     Giãn chữ .06em → .045em cho các chữ cái dính lại thành từ, dễ đọc hơn ở cỡ nhỏ.
     Chiều cao nút do var(--nut-cao) quyết định nên tăng cỡ chữ KHÔNG làm nút cao lên,
     chỉ rộng thêm chút — nút vốn đã tự co theo chữ. */
  font-family:var(--nhan);font-size:calc(var(--u) * .84);font-weight:700;letter-spacing:.045em;
  text-transform:uppercase;display:inline-flex;align-items:center;justify-content:center;
  white-space:nowrap;transition:var(--nhanh);box-sizing:border-box}
/* Nút dựng bằng thẻ <a> (nút dẫn ra ngoài, xem s.lk trong JS). Thẻ <a> mặc định có
   gạch chân và màu liên kết riêng — phải khử, nếu không nút hiện ra có gạch chân
   dưới chữ. Ba dòng dưới là TẤT CẢ những gì <a> cần để trông y hệt <button>: cỡ
   chữ, nền, viền... đều đã lấy từ .nut / .nut-chinh / .nut-phu dùng chung. */
.nut-lk{text-decoration:none;color:inherit}

/* Nút CHỈ 2 MÀU cho cả trang: một cho nền tối, một cho nền sáng.
   KHÔNG đổ bóng sáng — bóng phát sáng làm nhoè mép nút và gây lóa.
   Ưu tiên nền đặc + tương phản cao để chữ trên nút thật rõ. */
.nut-chinh{border:0}
.sec[data-nen="toi"]  .nut-chinh{background:var(--th-toi);  color:#04202b}
.sec[data-nen="toi"]  .nut-chinh:hover{background:#6cebf1}
/* Nút trên NỀN SÁNG: đậm thêm 20% so với màu thương hiệu (#12788a → #0e606e),
   hover đậm thêm 20% nữa so với hover cũ (#0d5f6e → #0a4c58).
   Chỉ áp trong section — nút ở header giữ nguyên #12788a. */
.sec[data-nen="sang"] .nut-chinh{background:#0e606e; color:#ffffff}
.sec[data-nen="sang"] .nut-chinh:hover{background:#0a4c58}

.nut-phu{background:transparent}
.sec[data-nen="toi"]  .nut-phu{color:var(--th-toi);
  border-color:color-mix(in srgb,var(--th-toi) 55%,transparent)}
.sec[data-nen="sang"] .nut-phu{color:#0e606e;
  border-color:color-mix(in srgb,#0e606e 62%,transparent)}
.sec[data-nen="toi"]  .nut-phu:hover{background:color-mix(in srgb,var(--th-toi) 14%,transparent);
  border-color:var(--th-toi)}
.sec[data-nen="sang"] .nut-phu:hover{background:#cfeaef;border-color:#0a4c58;color:#0a4c58}

/* ============================ ĐIỆN THOẠI ============================ */
/* THỨ TỰ ĐỌC TRÊN ĐIỆN THOẠI — khác desktop, và có chủ đích:
     overline → tiêu đề → mô tả → HÌNH → gạch đầu dòng → nút

   Vì sao chèn hình vào GIỮA chứ không để cuối:
   1. Hình là thứ bắt mắt nhất. Để cuối thì phải đọc hết chữ mới thấy — sai thứ tự
      tự nhiên "nói điều gì → cho xem → kể chi tiết → mời hành động".
   2. Quan trọng hơn: nút cầu nối phải là thứ CUỐI CÙNG của section thì mới nối
      sang section kế được. Để hình sau nút thì nút nằm lửng giữa section,
      bấm xong vẫn còn một khối hình chắn ngang — cầu nối không nối đi đâu cả.
   3. Đo thật ở 375×812: cách cũ hình bắt đầu ở 401px (phải cuộn mới thấy);
      cách mới hình bắt đầu ở ~219px, lọt ngay màn đầu.

   Cách làm: .khoi-chu dùng display:contents để 6 phần tử chữ trở thành con trực
   tiếp của .nd, rồi xếp lại bằng order. KHÔNG đụng HTML nên desktop giữ nguyên. */
@media(max-width:900px){
  /* ---- THANG KÍCH THƯỚC RIÊNG CHO ĐIỆN THOẠI ----
     Ở 375px thì min(1.1vw, 2.2vh) = 4.1px, chạm SÀN 12px của clamp → cả thang chữ
     bị nén về mức sàn, mọi thứ nhỏ hơn mức cầm trên tay đọc được.

     Chỉ cần nâng --nut-cao ở đây là kéo theo cả loạt, không phải sửa từng chỗ:
       --nut-cao  2.4u → 2.76u  (+15%)  = 33.1px
       --thanh-cao = nut-cao × 1.5      = 49.7px  → header cũng +15%
       nút ba vạch, ô logo, nút cuộn lên đều lấy var(--nut-cao) → +15% theo. */
  :root{--nut-cao:calc(var(--u) * 2.76)}

  /* ---- NỘI DUNG LUÔN CHIẾM ĐÚNG 85% MÀN, MỌI KHỔ MÀN ----
     Trước để min-height:auto → section cao theo NỘI DUNG chứ không theo màn hình.
     Máy màn ngắn (hoặc lúc thanh địa chỉ đang hiện) thì nội dung tràn xuống dưới,
     nút bị dính sát đáy, phải kéo thêm mới thấy hết. Nay ép lại đúng luật của
     bản máy tính: section cao đúng một màn, khối nội dung 85%, thở 7.5% mỗi bên.

     svh = chiều cao màn LÚC THANH ĐỊA CHỈ ĐANG HIỆN (small viewport height).
     vh trên điện thoại là chiều cao lúc thanh ĐÃ ẨN, lớn hơn vùng thấy thật
     60–90px — lấy svh thì lúc nào cũng vừa, thanh hiện hay ẩn cũng không đổi.
     Khai vh trước làm bản dự phòng cho trình duyệt cũ.

     ⚠️ PHẢI TRỪ CHIỀU CAO HEADER. Header là thanh CỐ ĐỊNH nằm đè lên đầu section,
     nên vùng thật sự nhìn thấy chỉ còn (100svh − chiều cao header). Lấy 7.5svh làm
     đệm trên thì đúng bằng chiều cao header — nhãn overline dính sát đáy thanh,
     mất sạch khoảng thở. Nay tính 85%/7.5% trên VÙNG CÒN LẠI, rồi cộng thêm đúng
     chiều cao header vào đệm trên. Cộng lại vẫn tròn 100svh, không dôi ra. */
  .sec{
    --man-dung:calc(100svh - var(--thanh-cao));
    min-height:100vh;min-height:100svh;
    padding-top:calc(var(--thanh-cao) + var(--man-dung) * .075);
    padding-bottom:calc(var(--man-dung) * .075)}
  .sec.chu{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .075);
    padding-bottom:calc(var(--man-dung) * .075)}
  /* Bản svh của luật "section cuối thấp hơn đúng bằng chân trang" */
  .sec:last-child{
    --man-dung:calc(100svh - var(--thanh-cao) * 2);
    min-height:calc(100vh - var(--thanh-cao));
    min-height:calc(100svh - var(--thanh-cao))}
  /* align-items:stretch BẮT BUỘC phải khai lại. Bản desktop của .nd là grid và có
     align-items:center — ở grid nghĩa là căn giữa theo chiều DỌC, nhưng khi đổi sang
     flex cột thì đúng dòng đó lại căn giữa theo chiều NGANG, làm gạch đầu dòng,
     hàng nút và gạch chân bị đẩy vào giữa, lệch lề trái với text mô tả. */
  /* 85% của VÙNG CÒN LẠI sau khi trừ header, khớp với đệm 7.5% ở trên và dưới */
  .nd,.sec.chu .nd{height:calc(var(--man-dung) * .85);
    display:flex;flex-direction:column;
    align-items:stretch;gap:calc(var(--u) * .88);padding:0 20px}
  .khoi-chu{display:contents}
  /* Chữ và nút GIỮ NGUYÊN cỡ — đây là cỡ đã chốt để đọc được, không cho co.
     Cỡ chữ mà co theo màn thì màn nhỏ lại về đúng chỗ không đọc được ban đầu. */
  .nd > *{flex:0 0 auto}
  .sec.chan .nd{direction:ltr}

  .nd .ov       {order:1}
  .nd h1,.nd h2 {order:2}
  .nd .gach     {order:3}
  .nd .mo-ta    {order:4}
  .nd .khoi-hinh{order:5}
  .nd .ds       {order:6}
  .nd .hang-nut {order:7}

  /* Hình cần thở rộng hơn khoảng cách giữa hai dòng chữ. Cộng với gap 14px của
     .nd thành ~32px mỗi bên — bằng khoảng tách 30px của bố cục cũ. */
  .khoi-hinh{margin:calc(var(--u) * 1.14) 0}
  /* ---- HÌNH LÀ PHẦN CO GIÃN ----
     Chữ và nút đã chốt cứng theo px để luôn đọc được, nên phần bù chênh lệch giữa
     các khổ màn phải dồn vào HÌNH. flex:1 cho hình ăn hết chỗ còn thừa trong khung
     85%; min-height:0 bắt buộc phải có, thiếu nó thì flex item không co xuống dưới
     kích thước nội dung và hình vẫn đẩy section tràn ra như cũ.
     Kết quả: màn cao thì hình to, màn thấp thì hình nhỏ lại, nhưng KHUNG NỘI DUNG
     luôn đúng 85% màn và nút luôn nằm trong tầm nhìn. */
  /* Hình chiếm TỈ LỆ CỐ ĐỊNH 32% khung nội dung, không phải "phần còn thừa".
     Để flex:1 ăn phần thừa thì mỗi section một cỡ hình khác nhau (đo được 94–127px)
     vì độ dài chữ khác nhau — nhìn xuống cả trang thấy hình nhảy to nhỏ, mất đều.
     Chốt 32% thì mười section một cỡ. Sec chủ giữ flex:1 vì nó không có gạch đầu
     dòng nên dư nhiều chỗ, hình được to hẳn — đó là chủ đích, section đầu phải mạnh. */
  .nd > .khoi-hinh{flex:0 0 25%;min-height:0;display:flex;
    align-items:center;justify-content:center;overflow:hidden}
  .sec.chu .nd > .khoi-hinh{flex:1 1 auto}

  /* ---- SEC 6 (HƯỚNG DẪN SỬ DỤNG): ẨN GẠCH ĐẦU DÒNG, HÌNH ĂN HẾT CHỖ TRỐNG ----
     Hình ở section này không phải minh hoạ tĩnh — nó là khung bấm qua lại xem từng
     bước, tự đã mang đủ thông tin ("ảnh chụp thật", "bấm lùi tới xem lại") mà ba gạch
     đầu dòng chỉ lặp lại bằng chữ. Ẩn ba dòng đó, dùng ĐÚNG kỹ thuật đã có sẵn cho sec
     chủ ở dòng trên: bỏ gạch đầu dòng thì đổi flex-basis cố định 25% sang flex:1 1 auto
     để hình chiếm hết khoảng trống vừa giải phóng — không cần con số mới.
     Vì khung nội dung cố định bề ngang (cột chữ), hình vừa có thêm chiều cao vừa giữ
     viewBox 480:300 nên tự giãn theo BỀ NGANG trước, kết quả là một hình chữ nhật nằm
     ngang chiếm trọn cột chữ, đúng dạng khối ảnh + mũi tên + chấm trang đã note. */
  .sec.anh-that .ds{display:none}
  .sec.anh-that .nd > .khoi-hinh{flex:1 1 auto}
  .khoi-hinh svg,.khoi-hinh img{max-height:100%;max-width:100%;width:auto;height:auto}
  .khoi-hinh .slide{max-height:100%;min-height:0}
  .khoi-hinh .slide-khung{min-height:0;display:flex;align-items:center;justify-content:center}

  /* ⚠️ BẪY ĐÃ SỤP — ĐỌC HẾT TRƯỚC KHI SỬA GÌ Ở ĐÂY.
     .nd là flex cột với display:contents ở .khoi-chu (mục 7.4), kết hợp
     flex:1 1 auto trên .khoi-hinh, tạo ra một khoản tràn ~11px ở ĐUÔI khối trên
     điện thoại — CÓ THẬT (đo bằng getBoundingClientRect, .hang-nut lấn qua mép
     dưới .nd), nhưng KHÔNG PHẢI hằng số theo px: đo ở 360×600 thì "ngân sách" bù
     là 247px, đo ở 375×812 lại cần khoảng 289px — hai số không tỉ lệ theo bất kỳ
     công thức đơn giản nào (đã thử trừ px cố định, trừ theo %, cả hai đều SAI ở
     khổ còn lại). Nặng hơn nữa: max-height dạng PHẦN TRĂM trên .khoi-hinh — dù
     viết thẳng "95%" hay trong calc() — KHÔNG ĐƯỢC TRÌNH DUYỆT PHÂN GIẢI trên
     phần tử flex-grow này (kiểm bằng getComputedStyle: maxHeight trả về nguyên
     văn "95%", nghĩa là bị bỏ qua, không quy ra px) — cả .nd lẫn .khoi-hinh nhìn
     bề ngoài đều có "chiều cao xác định" nhưng theo cách nào đó trình duyệt vẫn
     không cho percentage-height chạy trên .khoi-hinh. Đây là lý do KHÔNG dùng
     max-height ở CSS thuần cho khối này.
     → GIẢI PHÁP THẬT nằm ở JS: hàm gioiHanHinhSec6() (cuối file, cạnh apDungKho)
     TỰ ĐO phần tràn thật bằng nd.scrollHeight − nd.clientHeight rồi mới gán
     max-height bằng SỐ PX CỤ THỂ qua style — bỏ qua hoàn toàn nhu cầu hiểu vì
     sao percentage không chạy, tự đúng ở MỌI khổ màn vì đo trực tiếp trên DOM
     thật thay vì đoán công thức. Chạy lại mỗi khi đổi khổ màn (resize) và mỗi
     khi đổi bước ảnh (ảnh đổi kích thước là layout đổi theo). */
  /* .hang-nut đã có margin-top 1.64u; ở đây nó đứng ngay sau gạch đầu dòng
     nên giữ nguyên khoảng đó là vừa. */

  /* ---- NHÃN PHẢI TO NGANG TEXT MÔ TẢ ----
     Ở 375px thì min(1.1vw, 2.2vh) = 4.1px, chạm SÀN 12px của clamp → cả thang chữ
     mobile bị nén hết về mức sàn. Lúc đó nhãn nút .84u chỉ còn 10.08px trong khi
     text mô tả 12.84px — nhỏ hơn 21%, lại IN HOA và có giãn chữ nên càng khó đọc.
     Nâng riêng ở đây để nhãn ngang cỡ text mô tả. Không nâng --u vì làm vậy sẽ
     phóng to cả tiêu đề lẫn hình, vỡ bố cục 85% màn. */
  /* Cỡ chữ chốt cứng theo px cho điện thoại — không tính theo --u nữa vì --u đã
     chạm sàn, nhân hệ số ra số lẻ khó kiểm soát. Đây là con số cầm trên tay đọc được. */
  .mo-ta{font-size:15.5px}                        /* 16.5 − 1 */
  .ds li,.ds li span{font-size:14.5px}            /* 15 − 0.5 */
  .nut{font-size:13.9px}                          /* 12.6px + 10% */
  /* Nút TRONG SECTION cao thêm 3px so với nút header/hamburger — nút section là nơi
     bấm mua, cần vùng chạm rộng hơn. Header giữ nguyên để thanh không dày lên. */
  .sec .nut{height:calc(var(--nut-cao) + 3px)}

  /* Nút "Tư vấn ngay" trên header điện thoại chuyển sang dạng KHÔNG NỀN, viền mảnh
     — giống nút cầu nối. Lý do: thanh header hẹp mà có tới ba khối đặc cạnh nhau
     (ô logo, nút CTA, nút ba vạch), nhìn nặng và rối. Bỏ nền nút CTA thì chỉ còn
     ô logo là khối đặc, thanh nhẹ hẳn mà chữ vẫn rõ.
     Nút CTA TRONG bảng menu vẫn giữ nền đặc — chỗ đó mới là nơi cần bấm. */
  /* Phải dùng .thanh.thanh-toi (3 lớp) mới đè được .thanh-toi .thanh-nut (2 lớp)
     khai ở phần dưới file — cùng độ ưu tiên thì rule đứng sau thắng. */
  .thanh.thanh-toi  > .thanh-nut,
  .thanh.thanh-sang > .thanh-nut{background:transparent;border-width:1px;border-style:solid}
  .thanh.thanh-toi  > .thanh-nut{color:var(--th-toi);
    border-color:color-mix(in srgb,var(--th-toi) 55%,transparent)}
  .thanh.thanh-sang > .thanh-nut{color:#0e606e;
    border-color:color-mix(in srgb,#0e606e 62%,transparent)}
  .thanh.thanh-toi  > .thanh-nut:hover{background:color-mix(in srgb,var(--th-toi) 14%,transparent)}
  .thanh.thanh-sang > .thanh-nut:hover{background:#cfeaef}
  /* Tiêu đề 32px cho cả sec chủ lẫn các sec khác — cùng một cỡ nên nhìn xuống là
     đều tăm tắp. Trên máy tính vẫn giữ hai cỡ khác nhau (h1 3u, h2 2.55u).

     KÉO SÁT GẠCH CHÂN: hộp chữ của tiêu đề cao hơn phần mực thật khá nhiều —
     line-height 1.14 cộng chỗ chừa cho đuôi chữ thò xuống (g, y, ạ) và padding
     .08em chống cắt dấu tiếng Việt. Cộng lại thành một dải trống ~10px dưới dòng
     cuối, làm gạch chân trông rớt hẳn ra xa. Kéo lên bằng margin âm để KHOẢNG
     TRỐNG NHÌN THẤY bằng đúng khoảng giữa gạch chân và text mô tả.
     Chỉ kéo tiêu đề, KHÔNG kéo overline: overline có nền chip nên mép hộp chính là
     mép nhìn thấy, không dư khoảng nào để bù. */
  /* KHÔNG kéo tiêu đề xuống nữa. Thủ phạm làm gạch chân trông rớt xa là min-height
     2 dòng (gỡ ở dòng dưới), không phải khoảng cách. Kéo margin âm thì gạch chân
     CẮT NGANG đuôi chữ thò xuống (g, y, ạ) — mất nét chữ.
     Ngược lại, giãn khoảng cách tiêu đề → gạch chân lên 2.5 lần gap thường
     (10.56 × 2.5 ≈ 26px) để đuôi chữ có chỗ thở hẳn ra. */
  .sec h1,.sec h2{font-size:30px;margin-bottom:calc(var(--u) * .88 * 1.5)}
  /* ⚠️ BỎ min-height 2 dòng của tiêu đề sec chủ. Luật "tiêu đề sec chủ luôn 2 dòng"
     là luật của bản MÁY TÍNH; trên điện thoại tiêu đề đã được cắt ngắn trong kho
     nội dung riêng nên thường chỉ còn 1 dòng. Giữ min-height thì hộp tiêu đề vẫn
     cao bằng 2 dòng, để lại một dải trống ~36px ngay dưới chữ — nhìn ra thành gạch
     chân bị rớt xa hẳn khỏi tiêu đề. */
  .sec.chu h1{min-height:0}

  /* ---- HAI NÚT XẾP DỌC, RỘNG BẰNG NHAU ----
     Nhãn to lên thì nút rộng ra. Đo ở 375px: sec 1 vừa khít, nhưng sec 4 thừa 6px,
     sec 9 thừa 3px, sec 8 thừa tới 41px → ba section rớt xuống hai hàng còn bảy
     section một hàng. Nhìn cả trang thành so le, đúng thứ phải tránh.

     Thu đệm ngang chỉ cứu được sec 4 và 9, sec 8 thì chịu — mà có cứu được hôm nay
     thì mai đổi một chữ trong nhãn là hỏng lại. Nên chốt: trên điện thoại LUÔN xếp
     dọc, hai nút RỘNG BẰNG NHAU và bằng cột chữ.
       · Đều tuyệt đối ở cả 10 section, không phụ thuộc nhãn dài ngắn.
       · Vùng bấm rộng hết cột — dễ bấm hơn hẳn hai nút bé cạnh nhau.
       · Nút chính vẫn nằm trên, nút cầu nối nằm dưới, đúng thứ tự đọc. */
  /* Khoảng cách giữa hai nút gấp đôi (.72u → 1.44u ≈ 17px): xếp dọc mà sát nhau thì
     hai nút đọc thành một khối, dễ bấm nhầm nút cầu nối khi định bấm nút mua. */
  /* Hai nút CANH GIỮA cột: nút cầu nối chỉ rộng 70% nên nếu canh trái thì nó lệch
     hẳn về một bên, nhìn mất cân. Canh giữa thì hai nút chung một trục dọc. */
  /* Khoảng cách hai nút và khoảng cách từ gạch đầu dòng xuống nút thu lại một chút
     (1.44u→1.1u và 1.64u→1.15u) để nhường thêm ~13px cho hình. Vẫn đủ tách bạch. */
  .hang-nut{flex-direction:column;align-items:center;gap:calc(var(--u) * 1.1);
    margin-top:calc(var(--u) * 1.15)}
  /* Nút hành động rộng hết cột; nút cầu nối chỉ 70% — nhìn là biết ngay cái nào là
     việc chính, cái nào chỉ để đi tiếp. */
  .hang-nut .nut-chinh{width:100%}
  .hang-nut .nut-phu{width:70%}
  .ov{font-size:calc(var(--u) * .92);letter-spacing:.1em}
  .hieu{font-size:calc(var(--u) * 1.12)}
  /* .menu-mb a khai ở phần dưới file nên cùng độ ưu tiên mà đứng sau → nó thắng.
     Thêm .menu-mb vào trước cho đủ mạnh, không phải dùng !important. */
  .menu-mb.menu-mb a{font-size:calc(var(--u) * 1.02)}

  /* ---- VÙNG BẤM TỐI THIỂU 44px MÀ KHÔNG PHÌNH KÍCH THƯỚC NHÌN THẤY ----
     Nút ba vạch, nút cuộn lên đầu và nút trên header đều cao 33px theo thang chữ đã
     chốt. Ngón tay cần tối thiểu 44px mới bấm trúng ổn định, nhưng phóng to nút thật
     sẽ làm header dày lên và phá tỉ lệ header/nút = 1.5.
     Giải: nới vùng chạm bằng phần tử giả trong suốt trải rộng ra ngoài. Nút nhìn vẫn
     33px, vùng bấm thành 44px. ::after chứ không phải padding vì padding làm hộp to
     thật, kéo theo cả bố cục.

     ⚠️ CHỈ đặt position:relative cho phần tử đang là static. #len-dau vốn là
     position:fixed — ghi đè thành relative là nó rơi khỏi vị trí cố định, văng về
     góc trái theo dòng chảy trang. Phần tử đã định vị sẵn (fixed/absolute) thì
     ::after đã neo đúng vào nó rồi, không cần khai gì thêm. */
  .nut-menu,.thanh > .nut,.slide-nut,.pt-nut button{position:relative}
  .nut-menu::after,#len-dau::after,.thanh > .nut::after,
  .slide-nut::after,.pt-nut button::after{
    content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
    width:max(100%,44px);height:max(100%,44px)}

  /* ---- SECTION CUỐI TRÊN ĐIỆN THOẠI: BỎ HÌNH, THAY BẰNG FORM ----
     Bỏ luôn gạch đầu dòng thứ 3 và 4 để lấy chỗ cho form. Section cuối vẫn cao đúng
     một màn trừ chân trang, mà form chiếm nhiều chỗ hơn hình, nên phải nhường lại.
     Hai dòng còn lại đủ nói ý; hai dòng bỏ đi vẫn nằm nguyên trong DOM nên bản máy
     tính không mất gì, và chỉ cần bỏ dòng CSS này là chúng hiện lại. */
  /* Section cuối trên điện thoại bỏ THÊM dòng thứ 3 nữa (chỉ còn 2), vì form chiếm
     nhiều chỗ hơn hình. Luật bỏ dòng 4 nằm ở phần chung phía trên. */
  .sec:last-child .ds li:nth-child(n+3){display:none}
  /* (form hiện ở MỌI khổ màn — luật nằm ở phần FORM LIÊN HỆ phía trên) */
  /* Khối hình của section cuối KHÔNG co giãn và KHÔNG cắt: form có kích thước riêng
     của nó (ô nhập + ô nội dung + dòng thông báo), ép co lại thì dòng thông báo bị
     overflow:hidden cắt mất, mà đó lại là chỗ báo lỗi cho người đang điền.
     Đổi sang flex:0 0 auto để form giữ đúng chiều cao thật; phần dư của khung 85%
     dồn cho khoảng giãn giữa các khối, không lấy vào form. */
  /* margin-top = đúng một hàng (1.75u ≈ 21px), cộng với gap .88u sẵn có của .nd
     thành ~31px — gấp đôi khoảng cách giữa các khối chữ. Text mô tả là phần ĐỌC,
     form là phần ĐIỀN; tách rõ ra thì mắt biết ngay chỗ nào làm gì. */
  .sec:last-child .khoi-hinh{flex:0 0 auto;overflow:visible;
    margin:calc(var(--u) * 1.75) 0 0}
  /* PHÂN BỔ KHOẢNG CÁCH TRONG SECTION CUỐI — ba khoảng, tổng phải vừa khung.
     Trên form thoáng nhất (tách phần ĐỌC khỏi phần ĐIỀN), dưới form hẹp lại dần:
       mô tả → form            ~31px   (rộng gấp đôi khoảng thường, do margin 1.75u)
       form  → gạch đầu dòng   ~29px   (giảm 30% so với 42px trước đó)
       gạch đầu dòng → nút     ~21px
     Nhịp rộng-dần-hẹp này dẫn mắt đi xuống, không phải ba khoảng bằng nhau đều đều. */
  .sec:last-child .ds{margin-top:calc(var(--u) * .67)}
  .sec:last-child .hang-nut{margin-top:calc(var(--u) * .9)}

  /* ĐỆM THỞ RIÊNG cho section cuối: 3.5% thay vì 7.5%, khối nội dung 93% thay vì 85%.
     Section cuối trên điện thoại chứa form (ô mail + ô nội dung 4 hàng + dòng thông
     báo = 177px) — cao hơn hẳn hình minh hoạ của các section khác. Giữ nguyên 85% thì
     nội dung vượt khung và nút bị chân trang đè lên.
     Đây là ngoại lệ CÓ CHỦ ĐÍCH và chỉ của riêng section cuối trên điện thoại: bản
     thân section vẫn cao đúng một màn trừ chân trang, nhìn từ ngoài không lệch nhịp
     với chín section kia. Cộng lại vẫn tròn: 3.5 + 93 + 3.5 = 100. */
  .sec:last-child{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .035);
    padding-bottom:calc(var(--man-dung) * .035)}
  .sec:last-child .nd{height:calc(var(--man-dung) * .93)}

  /* ---- TIÊU ĐỀ PHẢI ĐƯỢC XUỐNG DÒNG TRÊN ĐIỆN THOẠI ----
     Luật "tiêu đề 1 dòng" là luật của MÀN RỘNG. Ở 375px, một dòng chỉ chứa
     khoảng 22 ký tự — không tiêu đề nào có nghĩa mà ngắn được đến vậy.
     Giữ white-space:nowrap thì chữ không xuống dòng, tràn ra ngoài, rồi bị
     .sec{overflow:hidden} CẮT CỤT ÂM THẦM (đo thật: 4 tiêu đề tràn 9–21px
     mỗi bên). Chú thích "để overflow:visible cho lỗi lộ liền" không đúng ở
     đây vì section cha đã cắt mất phần tràn rồi. */
  .sec:not(.chu) h2{white-space:normal}

  /* Đã xuống 2 dòng thì BẮT BUỘC đổi góc gradient, y như tiêu đề sec chủ.
     Giữ 100deg thì mỗi dòng lại chạy lại từ trắng sang vàng → hai dải rời rạc.
     Tính lại cho khung điện thoại: khung rộng ~335px, mỗi dòng cao ~35px
     → góc vuông góc = 180° − arctan(35/335) = 174°; lùi ~5° để trong từng
     dòng vẫn còn chuyển màu → 168deg, trùng luôn góc của sec chủ. */
  .sec[data-nen="toi"] h2{
    background-image:linear-gradient(168deg,
      #ffffff 0%, #ffffff 30%,
      #cdf3f6 46%,
      #3fe0e8 64%, #7ef0d0 82%, #ffd166 100%)}
}

/* ============================ HEADER · FOOTER ============================
   Cao đúng 150% chiều cao nút = 57px. Nút bên trong vẫn 38px, lề đều 9.5px.
   Làm CẢ HAI phiên bản nền tối và nền sáng để so sánh.                      */
.thanh{position:fixed;left:0;right:0;top:0;z-index:60;height:var(--thanh-cao);
  display:flex;align-items:center;gap:calc(var(--u) * 1.39);padding:0 calc(var(--u) * 1.64)}
.thanh-toi{background:#04141d;border-bottom:1px solid rgba(120,220,235,.16)}
.thanh-sang{background:#f4f8fa;border-bottom:1px solid rgba(13,45,73,.12)}

/* Ô nhận diện CAO BẰNG NÚT (38px) — logo, tab và nút CTA cùng một chiều cao,
   mọi thứ trong header nằm trên cùng một đường. Lề trên dưới 9.5px như nút. */
.hieu{display:flex;align-items:center;gap:calc(var(--u) * .63);flex:0 0 auto;
  font-size:calc(var(--u) * 1.01);font-weight:600;letter-spacing:-.012em}
/* ---- LOGO: SVG NỘI TUYẾN, KHÔNG PHẢI ẢNH PNG ----
   ⚠️ KHÔNG quay lại dùng assets/logo.png. File đó có kênh alpha nhưng KHÔNG có
   pixel trong suốt nào (đã giải mã kiểm: 0/101120 pixel trong suốt, bốn góc đều
   là trắng đặc 255,255,255) — đặt lên header nền tối là hiện nguyên một khối
   trắng. Tẩy trắng khỏi PNG cũng không cứu được vì viền chữ đã khử răng cưa
   SẴN trên nền trắng, tẩy đi sẽ để lại rìa xám lởm chởm.
   Vẽ lại bằng SVG nên: không nền, nét sắc ở mọi độ phân giải, và ĐỔI MÀU ĐƯỢC
   theo nền sáng/tối — thứ ảnh PNG một bản không làm được.
   Giữ đúng nhận diện cũ: chữ "T" ghép từ các ô vuông bo góc, ô sáng nhất có tia
   lấp lánh, ô cuối có hai chấm. Thêm CAM ở ô cuối làm điểm nhấn, cùng hệ cam đã
   dùng cho quầng quét viền và chấm overline (mục 5.3a) nên không lạc màu. */
.hieu-mark{width:var(--nut-cao);height:var(--nut-cao);flex:0 0 auto;display:block}
/* Bộ màu logo theo nền header. Nền tối phải dùng tông SÁNG hơn hẳn — bản navy
   đậm của logo cũ (#0d2d49) gần như chìm vào nền #04141d, đó là lý do bản PNG
   buộc phải có nền trắng mới nhìn ra hình. */
/* --lgm = màu tia lấp lánh và hai chấm, tức các dấu NẰM TRÊN ô sáng nhất và ô cam.
   Phải đảo ngược theo nền: nền tối dùng bộ ô SÁNG (#3fe0e8, #ff8a4c) nên dấu phải
   ĐẬM mới nổi; nền sáng dùng bộ ô đậm hơn nên dấu phải TRẮNG. Để chung một màu cho
   cả hai nền là một trong hai bên dấu chìm mất, gần như biến khỏi logo. */
.thanh-toi  .hieu-mark{--lg1:#1d8fa3;--lg2:#2aa9b8;--lg3:#3fe0e8;--lg4:#ff8a4c;--lgm:#06323d}
/* ⚠️ --lg3 nền sáng là #0c8fa1 chứ KHÔNG phải #0fa0b4. Sắc sáng hơn đo được chỉ
   2.93 trên nền header #f4f8fa — rớt ngưỡng 3.0 của đồ hoạ nhỏ, ô cyan sẽ nhạt
   nhoà gần như biến mất. #0c8fa1 đo được 3.60 (và dấu trắng trên nó 3.85). */
.thanh-sang .hieu-mark{--lg1:#0d2d49;--lg2:#12788a;--lg3:#0c8fa1;--lg4:#d94f1a;--lgm:#ffffff}
.thanh-toi  .hieu{color:#fff}
.thanh-sang .hieu{color:var(--c-sang-1)}

/* Dãy tab dồn sang PHẢI, nằm sát nút "Tư vấn ngay".
   margin-left:auto đẩy cả cụm sang phải; khoảng cách tới nút do gap của .thanh quyết định. */
.tab{display:flex;align-items:center;gap:calc(var(--u) * .25);flex:0 1 auto;min-width:0;
  margin-left:auto}
/* Nền highlight của tab đang chọn cao 80% chiều cao nút = 30.4px.
   Tab vẫn căn giữa theo trục ngang chung của header nên không lệch hàng. */
.tab a{font-family:var(--nhan);font-size:calc(var(--u) * .81);letter-spacing:.035em;
  text-transform:uppercase;text-decoration:none;padding:0 calc(var(--u) * .82);
  height:calc(var(--nut-cao) * .8);display:inline-flex;align-items:center;
  border-radius:calc(var(--goc) * .8);white-space:nowrap;transition:var(--nhanh);font-weight:600}
.thanh-toi  .tab a{color:var(--c-toi-2)}
.thanh-toi  .tab a:hover,.thanh-toi  .tab a.dang{color:var(--th-toi);
  background:color-mix(in srgb,var(--th-toi) 12%,transparent)}
.thanh-sang .tab a{color:var(--c-sang-2)}
.thanh-sang .tab a:hover,.thanh-sang .tab a.dang{color:var(--th-sang);
  background:var(--th-toi-nen)}

.thanh .nut{flex:0 0 auto}
.thanh-toi  .thanh-nut{background:var(--th-toi);color:#04202b;border:0}
.thanh-sang .thanh-nut{background:var(--th-sang);color:#fff;border:0}

/* Chân trang — cùng chiều cao, cùng nhịp. Thông tin bản quyền CANH GIỮA.
   ⚠️ Tên class phải là .chan-trang, KHÔNG dùng .chan: .chan đã là class đánh dấu
   section CHẴN (để đảo trái–phải). Đặt trùng thì rule height:57px của chân trang
   sẽ bóp mọi section chẵn xuống còn 57px. */
.chan-trang{position:relative;z-index:5;height:var(--thanh-cao);display:flex;
  align-items:center;justify-content:center;gap:calc(var(--u) * .88);
  padding:0 calc(var(--u) * 1.64);font-size:calc(var(--u) * .82);text-align:center}
.chan-trang-toi{background:#04141d;border-top:1px solid rgba(120,220,235,.16);
  color:var(--c-toi-2)}
.chan-trang-sang{background:#f4f8fa;border-top:1px solid rgba(13,45,73,.12);
  color:var(--c-sang-2)}
.chan-trang b{font-weight:600}
.chan-trang-toi b{color:#fff} .chan-trang-sang b{color:var(--c-sang-1)}

/* NÚT BÍ MẬT ĐO LƯỜNG — góc trái chân trang.
   Mờ .12 nên gần như vô hình, không viền, không nền; khách không nhận ra là nút.
   Rê chuột lên mới hơi rõ (.34) để người biết còn tìm thấy.
   Đặt position:absolute nên KHÔNG chiếm chỗ trong flex → dòng bản quyền vẫn
   canh giữa tuyệt đối như cũ. */
.nut-do{position:absolute;left:calc(var(--u) * 1.64);top:50%;transform:translateY(-50%);
  width:var(--nut-cao);height:var(--nut-cao);display:grid;place-items:center;
  background:none;border:0;padding:0;cursor:default;opacity:.12;
  transition:opacity var(--nhanh)}
.nut-do:hover{opacity:.34}
.nut-do svg{width:calc(var(--u) * 1.1);height:calc(var(--u) * 1.1);
  fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}
.chan-trang-toi  .nut-do{color:var(--c-toi-2)}
.chan-trang-sang .nut-do{color:var(--c-sang-2)}
/* Đang bật thì sáng hẳn lên bằng màu thương hiệu để biết lớp nhãn đang hiện */
.nut-do.dang{opacity:1}
.chan-trang-toi  .nut-do.dang{color:var(--th-toi)}
.chan-trang-sang .nut-do.dang{color:#0e606e}

/* Hai liên kết trong dòng bản quyền. KHÔNG gạch chân — thay bằng màu thương hiệu,
   đúng màu overline của nền tương ứng, để nhìn ra là bấm được mà không rối mắt.
   Nền sáng phải dùng bản đậm #0e606e: màu cyan #3fe0e8 đặt trên nền #f4f8fa chỉ
   đạt tương phản 1.45 — không đọc được. */
.chan-trang .lk{text-decoration:none;cursor:pointer;transition:var(--nhanh)}
.chan-trang .lk b{color:inherit}
.chan-trang-toi  .lk{color:var(--th-toi)}
.chan-trang-toi  .lk:hover{color:#6cebf1}
.chan-trang-sang .lk{color:#0e606e}
.chan-trang-sang .lk:hover{color:#0a4c58}

/* ---- NÚT CUỘN LÊN ĐẦU — treo cố định góc phải, LUÔN hiện ----
   Tự đảo màu theo nền của section đang nằm sau nó: nền tối → nút sáng,
   nền sáng → nút tối. Dùng đúng 2 màu nút đã chốt, không sinh màu mới. */
/* bottom = (chiều cao thanh − chiều cao nút)/2 = (57−38)/2 = 9.5px
   → tâm nút nằm ĐÚNG một trục ngang với dòng bản quyền khi cuộn tới chân trang,
   và trùng luôn con số lề 9.5px của nút bên trong header. right = 26px = đệm chân trang. */
.len-dau{position:fixed;right:calc(var(--u) * 1.64);z-index:70;
  bottom:calc((var(--thanh-cao) - var(--nut-cao)) / 2);
  width:var(--nut-cao);height:var(--nut-cao);border:0;border-radius:var(--goc);cursor:pointer;
  display:grid;place-items:center}
.len-dau svg{width:calc(var(--u) * 1.07);height:calc(var(--u) * 1.07);fill:none;
  stroke:currentColor;stroke-width:2.4;
  stroke-linecap:round;stroke-linejoin:round}
/* mặc định: đang ở trên nền TỐI → nút SÁNG */
.len-dau{background:var(--th-toi);color:#04202b}
/* đang ở trên nền SÁNG → nút TỐI */
.len-dau.tren-sang{background:var(--th-sang);color:#ffffff}
/* Mờ nhẹ: hiện ở 80% độ đục để nút không át nội dung. Rê chuột vào thì rõ hẳn.
   Hover (transform + opacity) chạy tức thì; riêng đổi màu theo nền là do CUỘN
   chứ không phải hover, giữ .2s cho êm khi vượt ranh giới section. */
/* ẨN cho tới khi cuộn tới section 4 — ba section đầu người xem còn đang đi xuống,
   chưa cần quay lại, hiện sớm chỉ che mất nội dung.
   Dùng visibility + opacity chứ KHÔNG dùng display:none: display:none làm
   getBoundingClientRect() trả về 0, mà JS đang lấy tâm nút từ đó để biết nút đang
   nằm trên nền tối hay sáng — nút sẽ hiện ra sai màu ở lần đầu. */
.len-dau{opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px);
  transition:background .2s,color .2s,transform .22s ease,opacity .22s ease,visibility .22s}
.len-dau.hien{opacity:.8;visibility:visible;pointer-events:auto;transform:none}
.len-dau.hien:hover{opacity:1;transform:translateY(-2px)}

/* ==================== CÔNG TẮC 3 CÔNG CỤ XEM THỬ ====================
   Ba nút "Header: nền tối" · "Nhãn text" · "Kiểm tra" chỉ để dựng trang, KHÔNG
   được hiện với khách. Mặc định ẨN. Muốn bật lại: mở js/giaodien.js, đổi
   HIEN_CONG_CU thành true (tìm ở ngay đầu file).
   Chỉ ẩn bằng display:none, không xoá rule gốc — bật lại là nguyên như cũ. */
html:not(.hien-cong-cu) .doi-thanh,
html:not(.hien-cong-cu) .nut-nhan,
html:not(.hien-cong-cu) .nut-kt,
html:not(.hien-cong-cu) .chu-giai,
html:not(.hien-cong-cu) .kt{display:none !important}

/* nút chuyển thử nền header/footer — công cụ xem thử, dồn sang trái */
.doi-thanh{position:fixed;left:16px;bottom:16px;z-index:92;height:var(--nut-cao);
  padding:11px 18px;border-radius:10px;cursor:pointer;line-height:16px;
  background:rgba(3,14,22,.94);color:#7ce8e0;border:1px solid rgba(150,215,232,.3);
  font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;backdrop-filter:blur(8px)}

/* ============================ MENU ĐIỆN THOẠI ============================
   Dưới 900px dãy tab bị ẩn, thay bằng nút menu mở bảng danh sách section.
   Không có nó thì trên điện thoại người dùng không có đường điều hướng nào. */
.nut-menu{display:none;width:var(--nut-cao);height:var(--nut-cao);flex:0 0 auto;
  border-radius:var(--goc);border:1px solid;cursor:pointer;background:transparent;
  padding:0;position:relative;transition:var(--nhanh)}
.thanh-toi  .nut-menu{border-color:color-mix(in srgb,var(--th-toi) 42%,transparent)}
.thanh-sang .nut-menu{border-color:color-mix(in srgb,var(--th-sang) 42%,transparent)}
.nut-menu i{position:absolute;left:26%;right:26%;height:2px;border-radius:2px;
  transition:transform var(--nhanh),opacity var(--nhanh)}
.thanh-toi  .nut-menu i{background:var(--th-toi)}
.thanh-sang .nut-menu i{background:var(--th-sang)}
.nut-menu i:nth-child(1){top:34%}
.nut-menu i:nth-child(2){top:50%}
.nut-menu i:nth-child(3){top:66%}
/* mở ra thì ba vạch gập thành dấu X */
.nut-menu.mo i:nth-child(1){transform:translateY(4.5px) rotate(45deg)}
.nut-menu.mo i:nth-child(2){opacity:0}
.nut-menu.mo i:nth-child(3){transform:translateY(-4.5px) rotate(-45deg)}

.man-che{position:fixed;inset:0;z-index:55;background:rgba(2,10,17,.6);
  opacity:0;pointer-events:none;transition:opacity .16s ease}
.man-che.mo{opacity:1;pointer-events:auto}

.menu-mb{position:fixed;left:0;right:0;top:var(--thanh-cao);z-index:58;
  display:flex;flex-direction:column;gap:calc(var(--u) * .25);
  padding:calc(var(--u) * .88) calc(var(--u) * 1.14) calc(var(--u) * 1.14);
  transform:translateY(-12px);opacity:0;pointer-events:none;
  transition:transform .18s cubic-bezier(.2,.7,.3,1),opacity .18s ease}
.menu-mb.mo{transform:none;opacity:1;pointer-events:auto}
.thanh-toi  ~ .menu-mb{background:#04141d;border-bottom:1px solid rgba(120,220,235,.16)}
.thanh-sang ~ .menu-mb{background:#f4f8fa;border-bottom:1px solid rgba(13,45,73,.12)}
.menu-mb a{display:flex;align-items:center;height:var(--nut-cao);
  padding:0 calc(var(--u) * .88);border-radius:var(--goc);text-decoration:none;
  font-family:var(--nhan);font-size:calc(var(--u) * .86);letter-spacing:.035em;
  text-transform:uppercase;font-weight:700;transition:var(--nhanh)}
.thanh-toi  ~ .menu-mb a{color:var(--c-toi-2)}
.thanh-toi  ~ .menu-mb a.dang{color:var(--th-toi);
  background:color-mix(in srgb,var(--th-toi) 12%,transparent)}
.thanh-sang ~ .menu-mb a{color:var(--c-sang-2)}
.thanh-sang ~ .menu-mb a.dang{color:var(--th-sang);background:var(--th-toi-nen)}
.menu-mb .nut{width:100%;justify-content:center;margin-top:calc(var(--u) * .5)}
.thanh-toi  ~ .menu-mb .nut{background:var(--th-toi);color:#04202b;border:0}
.thanh-sang ~ .menu-mb .nut{background:var(--th-sang);color:#fff;border:0}

@media(max-width:900px){
  .thanh{gap:12px;padding:0 16px}
  .tab{display:none}
  .nut-menu{display:block}
  /* Dãy tab ẩn nên nút CTA phải tự đẩy sang phải. Thứ tự trên thanh:
     [logo] ....... [Tư vấn ngay] [menu] */
  .thanh > .nut{margin-left:auto}
  /* Nút CTA có Ở CẢ HAI CHỖ: trên thanh (bấm nhanh) và cuối bảng menu (khi người dùng
     đã mở menu xem hết mục thì có sẵn nút hành động ngay đó, không phải đóng menu). */
  .chan-trang{padding:0 16px;font-size:12px}
}

/* ============================ HIỆU ỨNG ĐỘNG ============================
   Nguyên tắc chung: CHỈ động `transform` và `opacity`. Hai thứ này chạy trên card đồ
   hoạ, không bắt trình duyệt tính lại layout hay vẽ lại pixel — đó là lý do thêm chừng
   này hiệu ứng mà trang vẫn nhẹ. Mọi thứ dùng IntersectionObserver, chạy MỘT LẦN rồi
   ngắt quan sát, không nghe sự kiện cuộn.                                            */

/* ---- NHỊP HIỆN RA ----
   Ba con số quyết định người xem có kịp thấy hiệu ứng không:
     · CHỜ ĐẦU 80ms  — để nhịp cuộn lắng xuống rồi mới bắt đầu, không chạy ngay khi
       section vừa chạm vạch bắn.
     · LỆCH NHỊP 75ms mỗi phần tử — cũ để 60ms, sáu dòng chạy hết trong 300ms nên nhìn
       như tất cả hiện cùng lúc. 75ms kéo thành 375ms, mắt đọc được từng dòng nối nhau.
     · THỜI GIAN CHẠY .5s giữ nguyên — dài hơn nữa thành lờ đờ.
   Tổng một section: 80 + 5×75 + 500 ≈ 955ms. Đủ chậm để thấy trọn, chưa tới mức sốt ruột.
   Đi kèm điểm bắn ở 55% chiều cao màn (xem rootMargin trong giaodien.js) — chỉnh một mình
   con số nào cũng không đủ. */
.khoi-chu > *{opacity:0;transform:translateY(calc(var(--u) * .88));
  transition:opacity .5s cubic-bezier(.2,.7,.3,1),transform .5s cubic-bezier(.2,.7,.3,1);
  transition-delay:calc(80ms + var(--i,0) * 75ms)}
.sec.vao .khoi-chu > *{opacity:1;transform:none}
.ds li{opacity:0;transform:translateY(calc(var(--u) * .63));
  transition:opacity .45s cubic-bezier(.2,.7,.3,1),transform .45s cubic-bezier(.2,.7,.3,1);
  transition-delay:calc(80ms + var(--i,0) * 75ms)}
.sec.vao .ds li{opacity:1;transform:none}

/* ---- 2. Gạch chân tiêu đề vẽ từ trái sang ---- */
.khoi-chu > .gach{transform-origin:left center;transform:scaleX(0)}
.sec.vao .khoi-chu > .gach{transform:scaleX(1)}

/* ---- 3. Các khối trong hình hiện lệch nhịp ----
   ⚠️ Phải trả về ĐÚNG độ mờ gốc của từng khối (--op), không phải về 1. Mỗi hình có
   nhiều lớp mờ .12/.4/.7 chồng nhau để tạo chiều sâu; kéo tất cả về 1 là hình thành
   mảng đặc, bệt màu, mất hết lớp lang. JS đọc thuộc tính opacity gốc rồi ghi vào --op. */
/* Hình có nhiều khối hơn cột chữ nên lệch nhịp phải nhỏ hơn: 28ms (cũ 22ms).
   Cùng chờ đầu 80ms như cột chữ để hai bên khởi động cùng lúc, không so le. */
.khoi-hinh svg > *{opacity:0;transition:opacity .45s ease;
  transition-delay:calc(80ms + var(--i,0) * 28ms)}
.sec.vao .khoi-hinh svg > *{opacity:var(--op,1)}

/* ---- 3b. HIỆU ỨNG SỐNG BÊN TRONG KHUNG HÌNH — CHU KỲ CHUNG 12 GIÂY ----
   Trước đây trong khung hình chỉ có mấy chấm tín hiệu chạy trên đường nối, còn
   bản thân nội dung đứng im — nhìn ra một bức tranh tĩnh. Nay các chi tiết chính
   (nhân vật, quà tặng, dòng bình luận, cửa sổ mã…) có nhịp sống riêng.

   ⚠️ PHẢI BỌC TRONG <g> — ĐỪNG GẮN THẲNG VÀO CON TRỰC TIẾP CỦA <svg>.
   Hiệu ứng hiện ra (mục 3 ngay trên) dùng transition trên opacity của
   `.khoi-hinh svg > *`. CSS animation LUÔN thắng transition trên cùng một thuộc
   tính, nên gắn thẳng animation có opacity vào con trực tiếp là hiệu ứng hiện ra
   chết ngay, khối đó bật ra phựt thay vì mờ dần.
   Cách đúng: <g> ngoài cùng là con trực tiếp của svg → nhận hiệu ứng hiện ra;
   các phần tử BÊN TRONG <g> mang lớp .hh → chạy hiệu ứng sống. Hai lớp opacity
   nhân với nhau nên vừa mờ dần lúc vào, vừa sống động sau đó.

   transform-box:fill-box là BẮT BUỘC với SVG: mặc định transform-origin của phần
   tử SVG tính theo gốc toạ độ của cả khung vẽ chứ không phải tâm phần tử, thiếu
   dòng này thì scale() văng phần tử ra tận góc. */
@keyframes hh-nhun{
  0%,100%{transform:translateY(0)}
  6%  {transform:translateY(-4px)}
  12% {transform:translateY(0)}
  18% {transform:translateY(-2px)}
  24% {transform:translateY(0)}
  56% {transform:translateY(0)}
  62% {transform:translateY(-4px)}
  68% {transform:translateY(0)}
}
@keyframes hh-bay{
  0%  {transform:translateY(4px) scale(.7);opacity:0}
  8%  {opacity:1}
  30% {transform:translateY(-26px) scale(1.12);opacity:0}
  100%{transform:translateY(-26px) scale(1);opacity:0}
}
@keyframes hh-troi{
  0%  {transform:translateX(-16px);opacity:0}
  6%  {opacity:1}
  40% {transform:translateX(0);opacity:1}
  90% {transform:translateX(0);opacity:1}
  100%{transform:translateX(0);opacity:0}
}
/* Nhấp nháy chậm — dùng cho con trỏ gõ chữ, đèn báo đang chạy */
@keyframes hh-nhay{
  0%,44%,100%{opacity:1}
  22%,66%{opacity:.15}
}
/* PHÁO HOA. Mẹo: các hạt được vẽ SẴN thành một vòng tròn quanh tâm nhóm, rồi phóng
   to cả nhóm — thế là mọi hạt tự bay ra xa tâm theo đúng hướng của nó. Làm cách này
   chỉ tốn MỘT animation cho cả chùm, thay vì mỗi hạt một animation riêng với góc
   riêng (10 hạt × 3 chùm = 30 animation, vừa dài dòng vừa nặng).
   ⚠️ Bắt buộc transform-box:fill-box (đã đặt ở .hh) — thiếu nó thì gốc phóng to là
   góc khung vẽ chứ không phải tâm chùm, pháo hoa sẽ bay lệch hẳn ra một góc. */
@keyframes hh-no{
  0%  {transform:scale(.15);opacity:0}
  6%  {opacity:1}
  14% {transform:scale(.75);opacity:1}
  30% {transform:scale(1.2);opacity:0}
  100%{transform:scale(1.2);opacity:0}
}
/* Lấp lánh: hạt sáng nhỏ nở ra rồi tắt, dùng rải rác cho "lung linh" */
@keyframes hh-lap{
  0%,100%{transform:scale(0);opacity:0}
  8%     {transform:scale(1);opacity:1}
  18%    {transform:scale(0);opacity:0}
  54%    {transform:scale(0);opacity:0}
  62%    {transform:scale(1);opacity:.9}
  72%    {transform:scale(0);opacity:0}
}
.khoi-hinh svg .hh{animation-duration:12s;animation-iteration-count:infinite;
  animation-fill-mode:backwards;transform-box:fill-box;transform-origin:center}
.khoi-hinh svg .hh-nhun{animation-name:hh-nhun;animation-timing-function:ease-in-out}
.khoi-hinh svg .hh-bay {animation-name:hh-bay; animation-timing-function:ease-out}
.khoi-hinh svg .hh-troi{animation-name:hh-troi;animation-timing-function:ease-out}
.khoi-hinh svg .hh-nhay{animation-name:hh-nhay;animation-timing-function:steps(1,end)}
.khoi-hinh svg .hh-no  {animation-name:hh-no;  animation-timing-function:cubic-bezier(.15,.7,.3,1)}
.khoi-hinh svg .hh-lap {animation-name:hh-lap; animation-timing-function:ease-out}

/* ---- HẠT SÁNG CHẠY VÒNG VÔ CỰC (section giá — ý "dùng trọn đời") ----
   Đã BỎ đồng hồ kim quay: mặt đồng hồ nói lên "thời gian đang trôi / sắp hết giờ",
   ngược hẳn thông điệp "không hết hạn" (xem ghi chú đầy đủ ở hàm giaTien trong JS).

   KHÔNG dùng chu kỳ 12 giây chung như các hiệu ứng .hh khác: những hiệu ứng kia có
   quãng nghỉ trong chu kỳ, còn hạt này mà dừng dù một nhịp là mất sạch nghĩa "mãi
   mãi". Vì vậy linear, vô hạn, không nghỉ.

   ⚠️ CHUỖI ĐƯỜNG DƯỚI ĐÂY PHẢI GIỐNG HỆT chuỗi DVC trong hàm giaTien (js). Hạt
   chạy theo BẢN SAO này chứ không bám vào thẻ <path> đã vẽ, nên lệch một ký tự là
   hạt chạy trượt ra ngoài nét. Sửa đường thì sửa cả hai chỗ.

   ⚠️ Bọc trong @supports: trình duyệt không hỗ trợ offset-path sẽ bỏ qua cả khối,
   và hạt giữ display:none. Thiếu lớp bảo vệ này thì ở trình duyệt cũ hai hạt nằm
   chết dí ở toạ độ 0,0 — tức góc trên trái khung vẽ, thành hai chấm lạc lõng. */
.khoi-hinh svg .vc-hat{display:none}
@supports (offset-path: path("M0 0")){
  @keyframes vc-chay{to{offset-distance:100%}}
  .khoi-hinh svg .vc-hat{
    display:inline;
    offset-path:path("M258.7,180 C258.7,158.7 290.7,158.7 312,180 C333.3,201.3 365.3,201.3 365.3,180 C365.3,158.7 333.3,158.7 312,180 C290.7,201.3 258.7,201.3 258.7,180 Z");
    offset-rotate:0deg;
    animation:vc-chay 9s linear infinite}
  /* hạt thứ hai chạy chậm hơn và xuất phát lệch nửa vòng, để lúc nào cũng có hạt
     ở phần nhìn thấy rõ nhất của nét, không bị khoảng trống dài */
  .khoi-hinh svg .vc-hat-2{animation-duration:13s;animation-delay:-6.5s}
}

/* ---- 7. Nét viền trong hình tự vẽ ----
   Chờ 200ms rồi mới vẽ: để khối nền hiện ra trước đã, nét viền vẽ chồng lên sau thì
   mới thấy được nét đang chạy. Vẽ cùng lúc với lúc khối còn đang mờ là phí. */
.khoi-hinh svg .ve-net{stroke-dasharray:var(--dai);stroke-dashoffset:var(--dai);
  transition:stroke-dashoffset .9s ease;transition-delay:calc(200ms + var(--i,0) * 28ms)}
.sec.vao .khoi-hinh svg .ve-net{stroke-dashoffset:0}

/* ---- 4. Mũi tên trượt trong nút cầu nối ---- */
.nut-phu .mt{display:inline-block;margin-left:calc(var(--u) * .44);
  transition:transform var(--nhanh)}
.nut-phu:hover .mt{transform:translateX(calc(var(--u) * .28))}

/* ---- 5. Chấm trạng thái trên overline thở nhẹ ---- */
/* NHÁY SÁNG kiểu đèn báo: chấm sáng lên rồi toả một vòng sóng ra ngoài và tan.
   Trước chỉ mờ đi + co lại — ở cỡ 4.5px trên điện thoại thì gần như không nhận ra
   có gì đang động. Vòng sóng làm vùng thay đổi rộng gấp ba lần chính cái chấm nên
   nhìn thấy được cả khi liếc qua.
   1.9s một nhịp = 0.53 lần/giây, xa ngưỡng gây co giật (3 lần/giây) rất nhiều. */
@keyframes tho{
  0%  {opacity:1;   transform:scale(1);   box-shadow:0 0 0 0 var(--cham)}
  55% {opacity:.42; transform:scale(.86); box-shadow:0 0 0 calc(var(--u) * .5) transparent}
  100%{opacity:1;   transform:scale(1);   box-shadow:0 0 0 0 transparent}
}
/* Bản CHỈ NHÁY SÁNG, không co giãn, không toả sóng — dùng khi máy bật giảm chuyển
   động. Đổi độ sáng thì không dời pixel nào nên vẫn an toàn cho người nhạy cảm
   tiền đình, mà chấm vẫn báo được là trang đang sống. */
@keyframes tho-mo{0%,100%{opacity:1}50%{opacity:.38}}

/* ---- 10. QUẦNG SÁNG XOAY QUANH VIỀN NÚT ----
   Một vệt sáng xoay quanh viền hai nút KHÔNG NỀN (viền mảnh nên dễ bị lướt qua):
     · nút cầu nối — chỉ chạy ở SECTION ĐANG XEM, liền 12 giây rồi dừng
     · nút "Tư vấn ngay" trên header — xoay lặp, mỗi 9 giây nghỉ một nhịp

   ⚠️ DÙNG CONIC-GRADIENT XOAY, KHÔNG PHẢI ĐIỂM SÁNG CHẠY THEO CHU VI.
   Bản trước cho tâm radial-gradient chạy theo bốn cạnh bằng --gx/--gy theo phần
   trăm. Bốn cạnh chia thời gian BẰNG NHAU trong khi độ dài khác nhau rất xa (nút
   rộng 250px, cao 38px) → vệt sáng bò ở cạnh ngắn rồi phóng ở cạnh dài, và đổi
   hướng đột ngột ở bốn góc. Đó là chỗ nhìn ra giật cục.
   Conic-gradient xoay quanh tâm với tốc độ GÓC đều, không có điểm gãy nào, nên
   chuyển động liền một mạch.

   Vẫn thuần CSS, không requestAnimationFrame: bản gốc ở C:VGT gọi
   getBoundingClientRect() mỗi khung hình để đo chu vi — với 10 nút là 600 lần đọc
   layout mỗi giây, phá sạch con số 0 lần đọc đã đạt. @property cho trình duyệt tự
   nội suy góc trên card đồ hoạ, không đọc layout lần nào.

   mask-composite:exclude khoét rỗng ruột nên chỉ còn lại VIỀN. */
@property --gx{syntax:'<percentage>';inherits:false;initial-value:0%}
@property --gy{syntax:'<percentage>';inherits:false;initial-value:0%}

.nut-phu,.thanh > .thanh-nut{position:relative}
.nut-phu::before,.thanh > .thanh-nut::before{
  content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1.7px;
  background:radial-gradient(circle calc(var(--u) * 2.6) at var(--gx) var(--gy),
    var(--quang,currentColor) 0%,
    color-mix(in srgb,var(--quang,currentColor) 45%,transparent) 45%,
    transparent 75%);
  -webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);
          mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
  pointer-events:none;opacity:0}

/* ---- KHÔNG CHẠY VÒNG QUANH — QUÉT LUÂN PHIÊN TRÊN RỒI DƯỚI ----
   Nút rất dẹt (250×38 máy tính, 335×36 điện thoại). Chạy hết chu vi thì hai cạnh
   ngắn chỉ dài 38px, vệt sáng vừa vào đã ra — nhìn thành hai cái giật ở hai đầu,
   sửa kiểu gì cũng không hết vì đó là hình dạng của nút.

   Nay bỏ hẳn hai cạnh ngắn. Vệt sáng quét 80% CẠNH TRÊN (từ 10% đến 90% bề rộng)
   rồi tắt, hiện lại ở đầu CẠNH DƯỚI quét tiếp 80%, cứ thế luân phiên.
   Chỉ còn chuyển động thẳng một chiều — không có góc nào để giật, và mắt bám theo
   được dễ hơn hẳn so với đuổi quanh viền.

   Chừa 10% mỗi đầu để vệt sáng không đâm vào góc bo tròn. Lúc nhảy từ cuối cạnh
   trên xuống đầu cạnh dưới thì opacity đang bằng 0 nên không thấy chỗ nhảy. */
/* ⚠️ CẠNH DƯỚI CHẠY NGƯỢC CHIỀU CẠNH TRÊN — đó mới là chiều kim đồng hồ.
   Đi vòng theo kim đồng hồ quanh một hình chữ nhật thì: cạnh trên trái→phải,
   cạnh dưới PHẢI→TRÁI. Cho cả hai cùng chạy trái→phải là hai vệt song song cùng
   hướng, nhìn thành hai thứ rời nhau chứ không phải một vòng.
   Nhảy từ cuối cạnh trên (90%) xuống đầu cạnh dưới cũng ở 90% — giữ nguyên toạ độ
   ngang, chỉ đổi toạ độ dọc, đúng như đi qua cạnh phải mà không vẽ ra. */
@keyframes quet-vien{
  0%   {--gx:10%; --gy:0%;   opacity:0}
  5%   {opacity:1}
  40%  {opacity:1}
  46%  {--gx:90%; --gy:0%;   opacity:0}   /* hết cạnh trên ở mép phải */
  50%  {--gx:90%; --gy:100%; opacity:0}   /* tụt xuống cạnh dưới, VẪN ở mép phải */
  55%  {opacity:1}
  90%  {opacity:1}
  96%  {--gx:10%; --gy:100%; opacity:0}   /* chạy ngược về mép trái */
  100% {--gx:10%; --gy:100%; opacity:0}
}
/* Bản cho nút HEADER: quét trên + dưới hết trong 38% chu kỳ rồi im phần còn lại.
   Với chu kỳ 11s là quét 4.2 giây rồi nghỉ 6.8 giây. Quét liên tục ngay cạnh logo
   sẽ thành đèn nhấp nháy, vừa rối vừa mỏi mắt. */
@keyframes quet-vien-lap{
  0%   {--gx:10%; --gy:0%;   opacity:0}
  2%   {opacity:1}
  16%  {opacity:1}
  18%  {--gx:90%; --gy:0%;   opacity:0}   /* hết cạnh trên ở mép phải */
  20%  {--gx:90%; --gy:100%; opacity:0}   /* tụt xuống cạnh dưới, VẪN ở mép phải */
  22%  {opacity:1}
  36%  {opacity:1}
  38%  {--gx:10%; --gy:100%; opacity:0}   /* chạy ngược về mép trái */
  100% {--gx:10%; --gy:100%; opacity:0}
}

/* CHỈ SECTION ĐANG XEM mới chạy, và chạy LIÊN TỤC suốt thời gian người xem còn ở
   section đó — không giới hạn số giây nữa.
   Cuộn sang section khác → class .dang-xem bị gỡ → dừng ngay lập tức.
   Quay lại section cũ → class gắn lại → chạy lại từ đầu.

   ⚠️ KHÔNG chồng thêm animation thứ hai để cắt thời gian. Cả hai sẽ cùng ghi
   opacity, cái khai sau thắng và đè mất phần tắt/hiện của từng lượt quét — đó là
   lỗi đã gặp khi còn giới hạn 12 giây. Một animation duy nhất, lặp vô hạn. */
/* Tốc độ tăng 20%: một chu kỳ (trên + dưới) 3.3s thay vì 4s. */
.sec.dang-xem .nut-phu::before{animation:quet-vien 3.3s linear .4s infinite}
/* Nút header không thuộc section nào nên chạy lặp mãi. Tăng 20% cùng nhịp với nút
   cầu nối: 9.2s thay vì 11s — hai nút phải cùng một tốc độ quét, nếu không nhìn
   ra ngay là hai thứ khác nhau. */
.thanh > .thanh-nut::before{animation:quet-vien-lap 9.2s linear 1.2s infinite}
/* ---- MÀU QUẦNG: CAM, KHÔNG PHẢI MÀU THƯƠNG HIỆU ----
   Màu thương hiệu là cyan/xanh — đặt lên viền nút vốn đã cyan thì vệt sáng chìm
   nghỉm vào chính cái viền, phải nhìn kỹ mới thấy. Cam là màu duy nhất trên trang
   không đụng bảng màu xanh nên bật hẳn lên, cùng màu với chấm báo hiệu ở overline
   nên vẫn nằm trong hệ màu chứ không lạc lõng.
     nền tối  #ff8a4c — tương phản 6.8 trên #0a2530
     nền sáng #d94f1a — đậm hơn để không bị nền trắng nuốt */
.sec[data-nen="toi"]  .nut-phu{--quang:#ff8a4c}
.sec[data-nen="sang"] .nut-phu{--quang:#d94f1a}
.thanh-toi  > .thanh-nut{--quang:#ff8a4c}
.thanh-sang > .thanh-nut{--quang:#d94f1a}
.ov b{animation:tho 1.9s ease-in-out infinite}

/* ---- 6. Đổi ảnh slide có mờ–hiện ---- */
/* svg: hình mô phỏng ở các slide khác (nếu còn dùng kiểu cũ) — img: ảnh chụp thật
   của section Hướng dẫn. Gộp chung selector để hai kiểu ảnh cùng hưởng một hiệu
   ứng mờ–hiện, không viết hai bộ transition riêng. */
.slide-khung svg,.slide-khung img{transition:opacity .16s ease,transform .16s ease}
.slide-khung.doi svg,.slide-khung.doi img{opacity:0;transform:translateY(calc(var(--u) * .25))}

/* ---- 8. Chấm sáng chạy dọc đường nối ba bước ---- */
@keyframes chay-doc{
  0%{opacity:0;transform:translateY(0)}
  18%{opacity:1}
  82%{opacity:1}
  100%{opacity:0;transform:translateY(var(--xa,10px))}
}
.khoi-hinh svg .tin-hieu{animation:chay-doc 1.9s ease-in-out infinite}
.khoi-hinh svg .tin-hieu.tre{animation-delay:.7s}
/* Bản chạy NGANG cho các đường nối nằm ngang. Cùng nhịp 1.9s để cả trang thở
   chung một nhịp, không mỗi chỗ một kiểu. */
@keyframes chay-ngang{
  0%{opacity:0;transform:translateX(0)}
  18%{opacity:1}
  82%{opacity:1}
  100%{opacity:0;transform:translateX(var(--xa,10px))}
}
.khoi-hinh svg .tin-hieu.ngang{animation-name:chay-ngang}

/* ---- CHẠY THÀNH VÒNG BA BƯỚC, MỖI LÚC CHỈ MỘT CHẤM (hình section đầu) ----
   Ba đường nối khép thành vòng 1→2→3→1. Yêu cầu: chấm chạy hết chặng thì TẮT,
   xong mới tới chặng sau, tuyệt đối không hai chấm chạy cùng lúc.
   Cách làm: cả ba chấm dùng CHUNG một chu kỳ 5.7s = 3 × 1.9s, mỗi chấm chỉ hoạt
   động trong 1/3 đầu của chu kỳ rồi nằm im tàng hình 2/3 còn lại; lệch nhau bằng
   animation-delay 0 / 1.9s / 3.8s nên ba khoảng hoạt động nối đuôi nhau khít, không
   chồng lấn một khung hình nào.
   ⚠️ Chốt 33.33% chính là 1.9/5.7. Đổi số chặng hay đổi nhịp thì phải sửa CẢ BA:
   thời lượng 5.7s, mốc 33.33%, và ba mức delay.
   Từ 33.34% tới 100% chấm đứng yên ở cuối đường VÀ opacity 0, nên lúc quay về mốc
   0% (nhảy ngược về đầu đường) mắt không thấy giật — nó đang tàng hình.
   Tách riêng lớp .vong thay vì sửa thẳng chay-doc/chay-ngang, vì hai keyframes gốc
   còn dùng cho chấm ở các section khác — sửa gốc là các hình kia tắt mất 2/3 thời
   gian. Selector phải đủ nặng để thắng .khoi-hinh svg .tin-hieu ở trên. */
@keyframes chay-doc-vong{
  0%     {opacity:0;transform:translateY(0)}
  6%     {opacity:1}
  27%    {opacity:1}
  33.33% {opacity:0;transform:translateY(var(--xa,10px))}
  100%   {opacity:0;transform:translateY(var(--xa,10px))}
}
@keyframes chay-ngang-vong{
  0%     {opacity:0;transform:translateX(0)}
  6%     {opacity:1}
  27%    {opacity:1}
  33.33% {opacity:0;transform:translateX(var(--xa,10px))}
  100%   {opacity:0;transform:translateX(var(--xa,10px))}
}
/* ⚠️ animation-fill-mode:backwards LÀ BẮT BUỘC, KHÔNG PHẢI TÙY CHỌN.
   Trong lúc chờ hết animation-delay, phần tử vẫn hiển thị theo style GỐC của nó —
   mà mặc định của <circle> là hiện rõ. Nên lúc mới mở trang, chấm v2 (chờ 1.9s) và
   v3 (chờ 3.8s) đứng phơi ra cùng lúc với v1: ba chấm hiện một lượt, đúng cái mà
   luật "mỗi lúc một chấm" phải tránh. backwards bắt phần tử lấy trước giá trị của
   mốc 0% (opacity:0) ngay trong khoảng chờ, nên hai chấm kia tàng hình cho tới
   lượt mình. Lỗi này chỉ lộ ở chu kỳ ĐẦU nên rất dễ bỏ sót khi xem lâu. */
/* Chốt chu kỳ 3.5s. Ba mốc delay chia đều đúng 1/3 chu kỳ (0 / 1.1667 / 2.3333s)
   — không phải trừ đều một số cố định, nếu không ba chặng chạy lệch nhịp nhau,
   chặng nhanh chặng chậm không đều. Đổi con số 3.5s thì PHẢI tính lại cả hai mốc
   delay theo đúng công thức chu-kỳ/3, không chỉ đổi mỗi animation-duration. */
.khoi-hinh svg .tin-hieu.vong{animation-name:chay-doc-vong;animation-duration:3.5s;
  animation-fill-mode:backwards}
.khoi-hinh svg .tin-hieu.vong.ngang{animation-name:chay-ngang-vong}
.khoi-hinh svg .tin-hieu.vong.v1{animation-delay:0s}
.khoi-hinh svg .tin-hieu.vong.v2{animation-delay:1.1667s}
.khoi-hinh svg .tin-hieu.vong.v3{animation-delay:2.3333s}

/* ---- BA MÀU CHO BA BƯỚC: XANH → TÍM → ĐỎ ----
   Mỗi bước một màu thì người xem nhận ra ngay đang ở chặng nào của vòng, thay vì
   thấy một chấm chung chung chạy đi chạy lại.
   Khai bằng biến trên .khoi-hinh và tách hai bộ theo nền: chấm chỉ 3.4 đơn vị nên
   là chi tiết đồ hoạ nhỏ, cần ≥3:1 mới thấy rõ. Bộ màu nền tối bị nền sáng nuốt
   (xanh #22d3ee chỉ được 1.6:1 trên nền sáng) nên nền sáng phải dùng bản đậm hơn.
   Đo trên nền tối #0a2530:  xanh 14:1 · tím 5.9:1 · đỏ 6.0:1
   Đo trên nền sáng #f4f8f9: xanh 3.5:1 · tím 5.3:1 · đỏ 4.4:1
   CSS fill thắng thuộc tính fill viết thẳng trong thẻ, nhưng ở đây đã bỏ hẳn
   thuộc tính đó trong SVG cho khỏi rối. */
.sec[data-nen="toi"]  .khoi-hinh{--cv1:#22d3ee;--cv2:#a78bfa;--cv3:#fb7185}
.sec[data-nen="sang"] .khoi-hinh{--cv1:#0891b2;--cv2:#7c3aed;--cv3:#e11d48}
.khoi-hinh svg .tin-hieu.v1{fill:var(--cv1,#22d3ee)}
.khoi-hinh svg .tin-hieu.v2{fill:var(--cv2,#a78bfa)}
.khoi-hinh svg .tin-hieu.v3{fill:var(--cv3,#fb7185)}

/* ---- TẮT HẾT khi người dùng bật giảm chuyển động trong hệ điều hành ---- */
/* ============================================================================
   KHÔNG CHẶN HIỆU ỨNG THEO CÀI ĐẶT MÁY — QUYẾT ĐỊNH CÓ CHỦ ĐÍCH
   ============================================================================
   Trước đây ở đây có khối @media(prefers-reduced-motion:reduce) khoá bớt hiệu ứng
   khi máy người xem bật "giảm chuyển động". ĐÃ GỠ HẲN.

   Lý do: đây là website bán CÔNG CỤ CÔNG NGHỆ, hiệu ứng động là một phần của thông
   điệp sản phẩm chứ không phải trang trí thêm. Thực tế đo được: rất nhiều máy Windows
   tắt sẵn "Hiệu ứng hoạt ảnh" trong Trợ năng, nên tôn trọng cài đặt đó đồng nghĩa
   phần lớn người xem mở trang lên thấy một trang đứng im — mất trắng thứ đáng giá
   nhất của trang.

   ⚠️ ĐỪNG TỰ Ý KHÔI PHỤC. Đây là lựa chọn của chủ dự án sau khi đã cân nhắc, không
   phải chỗ bị bỏ sót. Ai sửa file này về sau mà thấy "thiếu" khối prefers-reduced-
   motion thì đọc dòng này trước.

   Đánh đổi đã biết: người nhạy cảm tiền đình (chóng mặt khi thấy chuyển động lớn) sẽ
   không được giảm bớt. Đã hạn chế rủi ro bằng cách giữ mọi hiệu ứng ở quy mô NHỎ và
   NGẮN: không parallax, không trượt cả khối, không phóng to màn hình, quãng dịch lớn
   nhất chỉ 14px, nhịp lặp chậm nhất 0.53 lần/giây — xa ngưỡng gây co giật (3 lần/giây).

   Tham số ?hieuung=1 vẫn còn nhưng nay không còn tác dụng gì: mọi hiệu ứng đã luôn
   chạy sẵn. Giữ lại để link cũ không hỏng.                                        */


/* ============================ SLIDE HƯỚNG DẪN ============================
   Hai nút lùi/tới nằm DƯỚI ảnh, cùng hàng với dãy chấm — không đè lên ảnh nữa.
   Bấm vào ảnh thì phóng to: ảnh chiếm 80% màn, 20% còn lại là nút chuyển + chú thích. */
.slide{display:flex;flex-direction:column;gap:calc(var(--u) * .88);width:100%}
.slide-khung{position:relative;border-radius:var(--goc-to);overflow:hidden;cursor:zoom-in;
  border:1.5px solid;transition:var(--nhanh)}
.sec[data-nen="toi"]  .slide-khung{border-color:rgba(120,220,235,.3);background:rgba(255,255,255,.03)}
.sec[data-nen="sang"] .slide-khung{border-color:rgba(13,45,73,.16);background:rgba(255,255,255,.6)}
.slide-khung:hover{transform:translateY(-2px)}
.slide-khung svg,.slide-khung img{width:100%;height:auto;display:block}
.slide-khung .phong{position:absolute;right:calc(var(--u) * .63);bottom:calc(var(--u) * .63);
  width:calc(var(--u) * 1.9);height:calc(var(--u) * 1.9);
  border-radius:calc(var(--goc) * .8);display:grid;place-items:center;pointer-events:none;
  background:rgba(4,20,29,.62)}
.slide-khung .phong svg{width:calc(var(--u) * .95);height:calc(var(--u) * .95);fill:none;
  stroke:#fff;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}

/* hàng điều khiển DƯỚI ảnh: [lùi] [chấm] [tới] */
.slide-dk{display:flex;align-items:center;justify-content:center;gap:calc(var(--u) * .88)}
/* Vùng bấm tối thiểu 44px — chuẩn ngón tay. Trước để 2u: trên điện thoại --u chạm
   sàn 12px nên nút chỉ 24px, bấm mười lần trượt ba bốn lần. */
.slide-nut{width:max(44px,calc(var(--u) * 2.5));height:max(44px,calc(var(--u) * 2.5));
  border-radius:calc(var(--goc) * .9);
  border:0;cursor:pointer;flex:0 0 auto;display:grid;place-items:center;transition:var(--nhanh)}
.slide-nut svg{width:max(18px,calc(var(--u) * 1.15));height:max(18px,calc(var(--u) * 1.15));fill:none;
  stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.sec[data-nen="toi"]  .slide-nut{background:rgba(63,224,232,.16);color:var(--th-toi)}
.sec[data-nen="toi"]  .slide-nut:hover{background:var(--th-toi);color:#04202b}
.sec[data-nen="sang"] .slide-nut{background:#d9eef2;color:#0e606e}
.sec[data-nen="sang"] .slide-nut:hover{background:#0e606e;color:#fff}
.slide-nut:disabled{opacity:.35;cursor:not-allowed}
/* Bộ đếm "k / 22" thay cho dải chấm cũ (xem lý do ở hàm dungSlide trong JS) —
   khoá đơn cách + min-width để số 1 chữ số và 2 chữ số không làm hai nút mũi tên
   nhảy khoảng cách khi chuyển bước, giữ đúng khuôn của .pt-nut span bên lightbox. */
.slide-dem{font-family:var(--mono);font-size:calc(var(--u) * .82);font-weight:700;
  min-width:calc(var(--u) * 3.3);text-align:center}
.sec[data-nen="toi"]  .slide-dem{color:#8fb0be}
.sec[data-nen="sang"] .slide-dem{color:#6b7f8c}

/* Chú thích từng bước, hiện NGAY trong khung chính — không cần bấm phóng to mới
   đọc được. Cùng khuôn cỡ chữ/theo nền với .mo-ta để đồng bộ với phần chữ cạnh nó. */
.slide-chu{margin:0;font-size:calc(var(--u) * .96);line-height:1.6;text-align:center}
.sec[data-nen="toi"]  .slide-chu{color:var(--c-toi-2)}
.sec[data-nen="sang"] .slide-chu{color:var(--c-sang-2)}

/* ---- lightbox phóng to: ảnh 80% màn, 20% còn lại là nút + chú thích ---- */
.phong-to{position:fixed;inset:0;z-index:200;display:none;flex-direction:column;
  background:rgba(2,10,17,.94)}
.phong-to.mo{display:flex}
/* place-items:END center — ảnh nằm SÁT ĐÁY dải 80%, không canh giữa dải.
   Ảnh hướng dẫn thường thấp hơn dải 80% nên canh giữa sẽ để lại một khoảng trống
   ngay dưới ảnh; lúc đó chú thích tuy đã ở đầu dải 20% nhưng vẫn cách đáy ảnh xa
   hơn cách hàng nút (đo được 128px so với 108px) → đọc lên thành chú thích của
   mấy cái nút. Đẩy ảnh xuống đáy dải thì chú thích dính ngay dưới ảnh. */
.pt-hinh{height:80vh;display:grid;place-items:end center;min-height:0;
  padding:calc(var(--u) * 1.01) calc(var(--u) * 1.52) 0}
/* ⚠️ Thiếu "img" ở đây là nguyên nhân lỗi "zoom quá mức, không thấy trọn ảnh":
   quy tắc CŨ chỉ khoanh svg (hình vẽ mô phỏng), lúc đổi sang ảnh chụp thật
   (thẻ img) thì ảnh KHÔNG còn quy tắc max-width/max-height nào cả, trình duyệt
   hiện đúng kích thước gốc — ảnh gốc 2880×1800px thật thì tràn khỏi màn hình
   nhiều lần, lightbox chỉ thấy được một góc nhỏ phóng to hết cỡ. */
.pt-hinh svg,.pt-hinh img{max-width:min(1100px,94vw);max-height:100%;width:auto;height:auto;
  border-radius:var(--goc-to);border:1.5px solid rgba(120,220,235,.28);background:#07202b}
/* Thứ tự trong 20% dưới: CHÚ THÍCH TRƯỚC, hàng nút chuyển hình SAU.
   Đọc xong mới bấm sang hình kế — nút nằm dưới cũng gần ngón cái hơn trên điện thoại.
   Dùng order thay vì đổi thứ tự HTML để phần đọc màn hình vẫn nghe đúng mạch.

   ⚠️ justify-content PHẢI LÀ space-between, KHÔNG PHẢI center.
   Để center thì cả cụm chú thích + nút bị dồn vào giữa dải 20%, chú thích rớt xa
   khỏi hình và dính sát hàng nút — đọc lên thành "chú thích của mấy cái nút" chứ
   không phải của tấm hình. space-between đẩy chú thích lên SÁT ĐÁY HÌNH (đúng nơi
   nó thuộc về) và đẩy hàng nút xuống đáy màn. */
.pt-duoi{height:20vh;display:flex;flex-direction:column;align-items:center;
  justify-content:space-between;gap:calc(var(--u) * .76);
  padding:calc(var(--u) * .76) calc(var(--u) * 1.52) calc(var(--u) * 1.01)}
.pt-chu{order:1;margin-top:0}
.pt-nut{order:2;margin-top:auto}

.pt-nut{display:flex;align-items:center;gap:calc(var(--u) * 1.01)}
/* Vùng bấm 2.9u ≈ 52px ở khổ chuẩn, và không bao giờ nhỏ hơn 46px — ngón tay cần
   tối thiểu 44px mới bấm trúng. Trước đây dùng var(--nut-cao): trên điện thoại
   --u chạm sàn 12px nên nút chỉ còn 28.8px, bấm hay trượt. */
.pt-nut button{width:max(46px,calc(var(--u) * 2.9));height:max(46px,calc(var(--u) * 2.9));
  border-radius:var(--goc);border:0;
  cursor:pointer;background:rgba(63,224,232,.16);color:var(--th-toi);display:grid;
  place-items:center;transition:var(--nhanh)}
.pt-nut button:hover{background:var(--th-toi);color:#04202b}
.pt-nut button:disabled{opacity:.3;cursor:not-allowed}
.pt-nut button svg{width:max(20px,calc(var(--u) * 1.3));height:max(20px,calc(var(--u) * 1.3));
  fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
/* "1 / 5" — giữ đơn cách để chữ số thẳng cột, nhưng đậm 700 cho khỏi mảnh.
   Chỗ này chỉ là số đếm nên dù font hệ thống có khác nhau cũng không hại gì. */
.pt-nut span{font-family:var(--mono);font-size:calc(var(--u) * .82);color:#8fb0be;
  font-weight:700;min-width:calc(var(--u) * 3.3);text-align:center}
.pt-chu{margin:0;font-size:calc(var(--u) * 1.01);line-height:1.6;color:#d6e8f0;
  text-align:center;max-width:60ch}
.pt-dong{position:absolute;top:calc(var(--u) * 1.01);right:calc(var(--u) * 1.26);
  width:var(--nut-cao);height:var(--nut-cao);border-radius:var(--goc);
  border:1px solid rgba(150,215,232,.3);background:rgba(255,255,255,.06);color:#d6e8f0;
  cursor:pointer;font-size:calc(var(--u) * 1.07);line-height:1;display:grid;place-items:center}
.pt-dong{transition:var(--nhanh)}
.pt-dong:hover{background:rgba(255,255,255,.14);color:#fff}
/* các nút công cụ xem thử — cũng dùng chung nhịp nhanh */
.nut-kt,.doi-thanh,.nut-nhan{transition:var(--nhanh)}
.nut-kt:hover,.doi-thanh:hover{background:rgba(255,255,255,.14);color:#fff}
@media(max-width:900px){
  .pt-hinh{height:70vh;height:70svh} .pt-duoi{height:30vh;height:30svh}
  .pt-chu{font-size:14.5px}
}

/* ============================ NHÃN PHÂN LOẠI TEXT ============================
   Bật/tắt bằng nút "Nhãn text". Khoanh từng loại chữ và ghi tên + cỡ hiện tại,
   để gọi đúng tên khi cần tăng giảm kích thước.                                */
body.hien-nhan [data-nhan]{outline:1.5px dashed var(--nhan-mau);outline-offset:5px;
  position:relative}
body.hien-nhan [data-nhan]::after{content:attr(data-nhan);position:absolute;
  left:-5px;top:-9px;transform:translateY(-100%);z-index:80;
  background:var(--nhan-mau);color:#04202b;font-family:var(--mono);font-size:10.5px;
  font-weight:700;letter-spacing:.03em;padding:3px 8px;border-radius:6px;white-space:nowrap;
  pointer-events:none;box-shadow:0 3px 10px rgba(0,0,0,.4)}

.nut-nhan{position:fixed;left:16px;bottom:112px;z-index:92;height:var(--nut-cao);
  padding:11px 18px;border-radius:10px;cursor:pointer;line-height:16px;
  background:rgba(3,14,22,.94);color:#f2cf63;border:1px solid rgba(242,207,99,.4);
  font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;backdrop-filter:blur(8px)}
.nut-nhan.dang{background:linear-gradient(120deg,#f2cf63,#f79372);color:#04202b;
  border-color:transparent}

/* bảng chú giải các loại text */
.chu-giai{position:fixed;left:16px;bottom:160px;z-index:92;width:min(310px,calc(100vw - 32px));
  border-radius:12px;background:rgba(3,14,22,.97);border:1px solid rgba(150,215,232,.28);
  padding:13px 15px;font-family:var(--mono);font-size:11px;display:none;
  box-shadow:0 16px 44px rgba(0,0,0,.6);backdrop-filter:blur(10px)}
body.hien-nhan .chu-giai{display:block}
.chu-giai b.tieu{display:block;color:#f2cf63;font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;margin-bottom:9px;padding-bottom:6px;
  border-bottom:1px solid rgba(150,215,232,.18)}
.chu-giai div{display:flex;align-items:center;gap:8px;padding:3px 0;color:#8fb0be}
.chu-giai i{width:11px;height:11px;border-radius:3px;flex:0 0 auto}
.chu-giai span{flex:1;color:#dbeef5}
.chu-giai em{font-style:normal;color:#8ff5cd;font-weight:700}

/* ============================ BẢNG KIỂM TRA ============================ */
.kt{position:fixed;right:16px;bottom:16px;z-index:90;width:min(400px,calc(100vw - 32px));
  max-height:74vh;overflow:auto;border-radius:14px;font-family:var(--mono);font-size:11px;
  background:rgba(3,14,22,.97);border:1px solid rgba(150,215,232,.3);color:#dbeef5;
  box-shadow:0 20px 60px rgba(0,0,0,.65);backdrop-filter:blur(10px);display:none}
.kt.mo{display:block}
.kt-dau{position:sticky;top:0;padding:13px 15px;background:rgba(3,14,22,.99);
  border-bottom:1px solid rgba(150,215,232,.22);display:flex;justify-content:space-between;
  align-items:center;font-size:11px;letter-spacing:.1em;text-transform:uppercase;
  color:#7ce8e0;font-weight:500}
.kt-dau button{background:none;border:0;color:#8fb0be;cursor:pointer;font-size:16px;padding:0 3px}
.kt-than{padding:12px 15px 16px}
.kt-nhom{margin-bottom:13px}
.kt-nhom>b{display:flex;justify-content:space-between;gap:8px;padding-bottom:5px;
  margin-bottom:6px;border-bottom:1px solid rgba(150,215,232,.16);color:#fff;font-size:11.5px}
.kt-d{display:flex;justify-content:space-between;gap:9px;padding:2px 0;color:#8fb0be;
  font-size:10.5px}
.kt-d span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kt-d i{font-style:normal;flex:0 0 auto}
.o-mau{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;
  vertical-align:-1px}
.ok{color:#8ff5cd} .xau{color:#ff6b6b}
.nut-kt{position:fixed;left:16px;bottom:64px;z-index:89;height:38px;padding:11px 18px;
  border-radius:10px;border:1px solid rgba(150,215,232,.3);cursor:pointer;line-height:16px;
  background:rgba(3,14,22,.94);color:#7ce8e0;font-family:var(--mono);font-size:12.5px;
  font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  box-shadow:0 10px 30px rgba(0,0,0,.5);backdrop-filter:blur(8px)}

/* ============================================================================
   MÀN NHỎ — điện thoại đời cũ / màn thấp (iPhone SE 320×568, Galaxy A 360×640)
   ============================================================================
   Thang chữ mobile chốt cứng theo px được tính cho màn 375×660. Xuống 320×568 thì
   vừa hẹp hơn 55px vừa thấp hơn 92px: đo thật thấy 8 section tràn khung 7–93px và
   2 tiêu đề rớt xuống 2 dòng.

   Bậc này KHÔNG đổi cấu trúc, chỉ hạ đều thang chữ và khoảng cách. Điều kiện dùng
   HOẶC: hẹp dưới 360px, HOẶC thấp dưới 620px — hai trục gây tràn theo hai kiểu khác
   nhau (hẹp làm tiêu đề rớt dòng, thấp làm cả cột tràn đáy) nên bắt cả hai.        */
@media(max-width:900px) and (max-height:620px),
       (max-width:360px){
  /* Lề ngang 16px thay 20px → cột chữ rộng thêm 8px, đủ cho tiêu đề khỏi rớt dòng */
  .nd,.sec.chu .nd{padding:0 16px;gap:calc(var(--u) * .6)}

  .sec h1,.sec h2{font-size:26px;margin-bottom:calc(var(--u) * .88)}
  .mo-ta{font-size:14px}
  .ds li,.ds li span{font-size:13px}
  .nut{font-size:12.8px}
  .ov{font-size:10.5px;letter-spacing:.08em}

  /* Nút về đúng chiều cao gốc, bỏ phần cộng thêm 3px của khổ màn thường */
  .sec .nut{height:var(--nut-cao)}
  .hang-nut{gap:calc(var(--u) * .9);margin-top:calc(var(--u) * 1.0)}
  .ds{margin-top:0}

  /* Đệm thở 4% thay 7.5%, khối nội dung 92% thay 85%. Màn thấp thì mỗi phần trăm
     đáng giá hơn hẳn — 3.5% của 518px là 18px mỗi bên, đủ cứu phần lớn chỗ tràn. */
  .sec{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .04);
    padding-bottom:calc(var(--man-dung) * .04)}
  .sec.chu{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .04);
    padding-bottom:calc(var(--man-dung) * .04)}
  .nd,.sec.chu .nd{height:calc(var(--man-dung) * .92)}

  /* Section cuối chứa form: ô nội dung xuống 3 hàng, đệm còn 2.5% */
  .form-lh{gap:calc(var(--u) * .5)}
  .form-lh textarea{height:calc(var(--nut-cao) * 2.1)}
  .sec:last-child{padding-top:calc(var(--thanh-cao) + var(--man-dung) * .025);
    padding-bottom:calc(var(--man-dung) * .025)}
  .sec:last-child .nd{height:calc(var(--man-dung) * .95)}
  .sec:last-child .khoi-hinh{margin-top:calc(var(--u) * .9)}
}

/* ============================================================================
   KHUNG THANH TOÁN — hiện ngay trong cột chữ của section mua
   ============================================================================
   Bấm nút thanh toán thì cả cột chữ nhường chỗ cho khung này. Cố ý thay TẠI CHỖ
   chứ không mở hộp thoại đè lên hay đẩy sang trang khác: khách đang đọc lý do mua
   ở đúng chỗ đó, giữ nguyên vị trí thì không đứt mạch.

   Ba màn con, chỉ một cái hiện — điều khiển bằng data-man trên .khoi-tt:
     cho  · xong · loi
   Dựng sẵn cả ba trong DOM để đổi trạng thái không phải dựng lại HTML, tránh mất
   dữ liệu đơn hàng đang giữ.                                                    */
.khoi-tt{display:none}
/* Giấu phần chữ thường khi đang thanh toán — chừa lại chính khung thanh toán */
.sec.dang-tra .khoi-chu > *:not(.khoi-tt){display:none}

/* ---- BA MÀN CON CHỒNG LÊN NHAU TRONG MỘT Ô LƯỚI (chỉ bản máy tính) ----
   ⚠️ Đây là cách sửa GỐC cho lỗi: tiêu đề màn "thanh toán thành công" nằm NGANG
   hông hình minh hoạ thay vì nằm TRÊN như màn chờ.
   Nguyên nhân: .nd canh giữa theo chiều dọc (align-items:center), mà ba màn con
   cao rất khác nhau — màn chờ 534px (có mã QR), màn xong chỉ 210px. Canh giữa hai
   khối cao khác nhau thì mép trên của chúng lệch nhau 162px, nên cùng một cái tiêu
   đề lúc thì ở trên hình 74px, lúc thì tụt xuống dưới mép hình 88px.
   Cách sửa: cho cả ba màn nằm CHỒNG trong cùng một ô lưới (grid-area:1/1) và ẩn
   bằng visibility chứ không phải display. Khung thanh toán khi đó luôn cao bằng
   màn cao nhất, không co lại theo từng màn, nên MỌI màn đều bắt đầu ở cùng một
   độ cao — tiêu đề đứng yên một chỗ khi đổi trạng thái.
   Dùng visibility:hidden chứ không phải opacity:0 vì visibility loại luôn khỏi
   thứ tự Tab và khỏi trình đọc màn hình — màn đang ẩn có nút bấm, không được để
   bấm nhầm bằng bàn phím.
   ⚠️ Trên điện thoại PHẢI trả về display (xem khối mobile): ở đó section gò đúng
   một màn, giữ chiều cao của màn chờ thì màn xong hụt mất chỗ. */
.sec.dang-tra .khoi-tt{display:grid;align-items:start}
.tt-man{grid-area:1 / 1;display:flex;flex-direction:column;
  gap:calc(var(--u) * .72);visibility:hidden}
.khoi-tt[data-man="cho"]  .tt-cho,
.khoi-tt[data-man="xong"] .tt-xong,
.khoi-tt[data-man="loi"]  .tt-loi{visibility:visible}

/* ---- TIÊU ĐỀ KHUNG THANH TOÁN ----
   Canh giữa, không phải space-between. Nút ✕ tách ra định vị tuyệt đối ở góc phải
   nên nó KHÔNG chiếm chỗ trong hàng — để nó nằm trong dòng chảy thì chữ bị đẩy
   lệch trái đúng bằng nửa bề rộng nút. (Bản điện thoại đã dùng cách này từ trước,
   nay đưa lên thành luật chung cho cả hai bản.)

   Cỡ chữ 1.03u thay .78u — tăng 2 nấc theo đúng thang của dự án (1 nấc ≈ ×1.15,
   2 nấc ≈ ×1.32; cùng thang với "14.5px thay 11px" ở bản điện thoại). Đây là dòng
   nói cho khách biết đang ở bước nào nên không được nhỏ hơn chữ thường quanh nó.

   margin-top 1.6u đẩy tiêu đề xuống một hàng cho thoáng đầu khung. Chỉ áp ở bản
   máy tính — bản điện thoại khai lại về 0 vì màn thanh toán ở đó chỉ dư ~17px trên
   máy 600px, thêm một hàng là tràn. */
/* ⚠️ margin-left ÂM để canh giữa THẬT trên bản máy tính.
   Khung thanh toán nằm trong cột chữ, mà cột chữ chỉ chiếm 60% bề ngang — nên
   justify-content:center chỉ canh giữa CỘT CHỮ, tiêu đề bị lệch hẳn sang phải so
   với cả khối (hình minh hoạ + mã QR + thông tin). Nới hộp tiêu đề sang trái đúng
   bằng phần .nd còn lại thì tâm hộp trùng tâm cả khối.
   -66.67% = phần còn lại của .nd quy ra % bề rộng cột chữ: (100/60 − 1) = 2/3.
   Dùng % nên tự đúng ở mọi khổ màn, không phải con số px đo ở một cỡ.
   Nút ✕ không bị ảnh hưởng: nó absolute right:0, mà mép phải hộp không đổi.
   ⚠️ Nếu đổi tỉ lệ cột của .nd (đang 60/40) thì PHẢI tính lại số này. */
.tt-dau{position:relative;display:flex;align-items:center;justify-content:center;
  gap:var(--u);margin-top:calc(var(--u) * 1.6);margin-bottom:calc(var(--u) * .55);
  margin-left:-66.67%}
.tt-nhan{position:relative;font-family:var(--nhan);font-size:calc(var(--u) * 1.03);
  font-weight:700;letter-spacing:.12em;text-transform:uppercase;line-height:1.6}

/* Đường kẻ mảnh dưới tiêu đề — CHUNG cho cả máy tính lẫn điện thoại.
   · dài hơn chữ 30%: width:130% ăn theo bề rộng THẬT của chữ (thẻ span co theo nội
     dung), nên ba tiêu đề dài ngắn khác nhau đều có đường kẻ thừa ra đúng 30%, tự
     đúng ở mọi cỡ màn — không đặt con số px cố định
   · dày 2px, màu cam cùng tông với hiệu ứng chạy viền nút, mờ 65%

   ⚠️ CÁCH CHỮ 6px — ĐO TỪ CHÂN CHỮ, KHÔNG PHẢI TỪ ĐÁY HỘP CHỮ.
   Đây là cái bẫy: top:calc(100% + 6px) nghe thì đúng nhưng 100% là đáy HỘP DÒNG,
   mà hộp dòng cao hơn chữ. Với line-height 1.6 thì dưới chân chữ còn thừa
   (1.6 − 1.104 − 0.245)/2 + 0.245 = 0.371em đệm rỗng, nên nhìn bằng mắt khoảng cách
   thành 10px chứ không phải 6px. Trừ đi đúng 0.371em thì mới ra 6px thật.
   Dùng em chứ không dùng px để trừ: đệm này tỉ lệ với cỡ chữ, mà cỡ chữ bản máy
   tính co giãn theo --u — trừ bằng px thì chỉ đúng ở đúng một khổ màn.
   Nếu đổi line-height của .tt-nhan thì PHẢI tính lại số 0.371em này.

   Đặt absolute nên KHÔNG chiếm chỗ: đường kẻ nằm lọt trong khoảng cách sẵn có bên
   dưới .tt-dau, không đẩy nội dung xuống, không đụng chiều cao section. */
.tt-nhan::after{content:"";position:absolute;left:50%;
  top:calc(100% + 6px - .371em);
  transform:translateX(-50%);width:130%;height:2px;
  background:var(--ke-nhan,currentColor);opacity:.65;pointer-events:none}
.sec[data-nen="toi"]  .tt-nhan{--ke-nhan:#ff8a4c}
.sec[data-nen="sang"] .tt-nhan{--ke-nhan:#d94f1a}

.tt-dong{position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:var(--nut-cao);height:var(--nut-cao);border:0;background:none;
  cursor:pointer;font-size:calc(var(--u) * 1.1);line-height:1;border-radius:var(--goc);
  transition:var(--nhanh)}

.tt-than{display:flex;gap:calc(var(--u) * 1.5);align-items:center}

/* ---- QR CAO ĐÚNG BẰNG HÌNH MINH HOẠ BÊN TRÁI ----
   Không đặt con số ước lượng — có một quan hệ TÍNH RA ĐƯỢC:
     · hình bên trái nằm trong cột 40%, khung vẽ tỉ lệ 4:3 → cao = 0.75 × bề rộng cột
     · cột chữ (chứa QR) là cột 60%
     → chiều cao hình = 0.75 × (40/60) × bề rộng cột chữ = ĐÚNG 50% bề rộng cột chữ
   Nên width:50% cho ra QR cao bằng hình, và tự đúng ở mọi khổ màn chứ không chỉ
   đúng ở một cỡ. Kiểm ở 1440px: hình 410×307, cột chữ 614 → QR 307. Khớp.
   aspect-ratio:1 giữ QR luôn vuông, không cần khai chiều cao riêng. */
.tt-qr{flex:0 0 auto;width:50%;aspect-ratio:1;
  border-radius:var(--goc-to);display:grid;place-items:center;overflow:hidden;
  background:#fff;padding:calc(var(--u) * .5);box-sizing:border-box}
.tt-qr img{width:100%;height:100%;object-fit:contain;display:block}
.tt-qr img:not([src]){display:none}
.tt-cho-qr{position:absolute;font-size:calc(var(--u) * .78);color:#5a6771}
.tt-qr{position:relative}

/* Cột chứa mã QR và link tải ảnh QR nằm ngay dưới nó.
   42% bề rộng cột chữ = 258px ở khổ chuẩn (40% + 5%).
   margin-top 50px đẩy QR xuống cho ngang tầm hình minh hoạ bên trái — khung thanh
   toán có dòng tiêu đề nằm trên nên nếu không đẩy, QR bị lệch cao hơn hình. Dùng
   margin chứ không phải position:relative để khối bên dưới cũng dịch theo, không
   bị QR đè lên. */
.tt-qr-cot{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;
  gap:calc(var(--u) * .5);width:42%;margin-top:75px}
.tt-qr-cot .tt-qr{width:100%}
/* Link tải QR CHỈ CÓ NGHĨA TRÊN ĐIỆN THOẠI — máy tính thì quét bằng điện thoại
   khác, không cần tải về. Giấu ở khổ máy tính. */
.tt-tai-qr{display:none}

/* ---- BẢNG THÔNG TIN DÙNG CHUNG MỘT LƯỚI ----
   ⚠️ Trước đây MỖI DÒNG là một lưới riêng với cột nhãn rộng cố định 6em. Hai vấn đề:
     · 6em = 96px không đủ cho "Chủ tài khoản" (~100px) → nhãn rớt xuống hai dòng
     · nới rộng cố định thì lại cướp chỗ của giá trị, số tài khoản 17 chữ số rớt dòng
   Nay cả bảng là MỘT lưới: mỗi dòng dùng display:contents nên dt/dd trở thành ô
   trực tiếp của lưới chung. Cột nhãn để max-content → rộng đúng bằng nhãn dài nhất,
   không thừa không thiếu, và bốn nhãn lẫn bốn giá trị đều thẳng hàng.
   white-space:nowrap chốt lại: nhãn không bao giờ được phép xuống dòng. */
.tt-tin{margin:0;display:grid;grid-template-columns:max-content 1fr;
  column-gap:calc(var(--u) * .8);row-gap:calc(var(--u) * .62);
  align-items:baseline;min-width:0;flex:1 1 auto}
.tt-tin > div{display:contents}
.tt-tin dt{font-family:var(--sans);font-size:calc(var(--u) * .98);font-weight:500;
  letter-spacing:0;text-transform:none;opacity:.8;white-space:nowrap}
.tt-tin dd{margin:0;font-size:calc(var(--u) * .98);font-weight:700;
  overflow-wrap:anywhere}

/* Dòng hướng dẫn: dùng MÀU THƯƠNG HIỆU chứ không phải màu chữ phụ, và tách hẳn ra
   một hàng so với khối thông tin bên trên. Đây là câu bảo khách phải làm gì tiếp —
   để cùng màu xám với mấy dòng số tài khoản thì nó chìm vào đám thông tin, khách
   đọc lướt qua rồi ngồi chờ không biết chờ gì. */
.tt-bao{margin:calc(var(--u) * 1.1) 0 0;font-size:calc(var(--u) * .92);
  line-height:1.55;font-weight:600}
.tt-loi-chuc{margin:0;font-size:calc(var(--u) * 1.02);line-height:1.6}

/* ---- HẠ PHẦN THÂN XUỐNG NGANG MÉP TRÊN HÌNH MINH HOẠ (chỉ bản máy tính) ----
   Tiêu đề nằm TRÊN hình, còn phần thân phải bắt đầu ĐÚNG ở mép trên hình thì hai
   cột mới đọc thành một hàng ngang. Suy ra khoảng phải hạ:
     (chiều cao khung thanh toán − chiều cao hình) / 2 − chiều cao khối tiêu đề
     = (534 − 307) / 2 − 85.5 = 28px  (đo ở 1440×900)
   Không áp cho màn chờ: thân màn đó là hàng chứa mã QR, mà mã QR đã có riêng
   margin-top 75px để tự canh với hình rồi — cộng thêm là tụt quá.
   ⚠️ 28px co giãn không hoàn toàn tuyến tính theo khổ màn (chiều cao khung phụ
   thuộc nội dung màn chờ, chiều cao hình phụ thuộc bề rộng cột). Đã đo thật:
   1280 lệch +2px · 1440 lệch 0 · 1920 lệch −2px — sai số 2px thì mắt không thấy
   nên để một con số. Đổi nội dung màn chờ nhiều thì phải đo lại. */
.tt-loi > .tt-bao{margin-top:28px}

/* ---- MÀN XONG: CẢ CỤM THÂN CANH THEO TRỤC NGANG CỦA HÌNH ----
   ⚠️ Phải đẩy ở .tt-loi-chuc — phần tử ĐẦU của cụm — chứ không phải ở phần tử
   giữa. Đẩy từ giữa thì đoạn chữ đứng lại một mình phía trên, cụm bị xé làm đôi.
   Hai thứ (đoạn chữ + hàng nút) là một khối, phải đi liền nhau.

   ⚠️ CON SỐ NÀY PHỤ THUỘC CHIỀU CAO CỤM — BỎ/THÊM MỘT KHỐI LÀ PHẢI ĐO LẠI.
   Đã sụp đúng bẫy này một lần: lúc bỏ ô "Khoá kích hoạt", cụm co từ 164px xuống
   107px mà con số vẫn để nguyên 100px → tâm cụm lệch khỏi trục hình 28px.
   Đo lại ở 1440×900: cụm cao 107px, trục ngang hình ở 358 (tính từ mép trên .nd),
   mép trên cụm khi không có margin ở 228 → muốn tâm cụm trùng trục hình thì mép
   trên phải ở 358 − 107/2 = 304.5, tức margin-top = 128px.
   Màn lỗi vẫn giữ 28px vì nó chỉ có một dòng báo lỗi, không thành cụm. */
.tt-xong .tt-loi-chuc{margin-top:128px}
.tt-hang-nut{display:flex;flex-wrap:wrap;gap:calc(var(--u) * .63);
  margin-top:calc(var(--u) * .4)}
.tt-hang-nut .nut{text-decoration:none}

/* ⚠️ ĐÃ XOÁ toàn bộ rule .tt-khoa và .tt-chep (ô "Khoá kích hoạt" + nút "Chép").
   Không còn phần tử nào mang hai lớp đó — bản tải về dùng được ngay, khoá do chủ
   dự án tự cấp riêng cho khách, không đi qua website. Xoá hẳn thay vì để lại làm
   mã chết: lần sau đọc file thấy rule mà không thấy phần tử là mất công dò.
   Muốn khôi phục thì xem hằng KHUNG_THANH_TOAN trong js/giaodien.js — chỗ đó có
   ghi rõ phải bật lại CẢ HAI ĐẦU (giao diện và máy chủ). */
/* ✅ Đã xoá rule .tt-gia-lap cùng với nút giả lập "xxx" (2026-08-16) — thanh toán
   nay chạy thật nên không còn nút nào mang lớp đó. */

/* ---- MÀU THEO NỀN ---- */
.sec[data-nen="sang"] .tt-nhan{color:#0e606e}
.sec[data-nen="sang"] .tt-nhan-xong{color:#0f7a5c}
.sec[data-nen="sang"] .tt-nhan-loi{color:#cf3f12}
.sec[data-nen="sang"] .tt-dong{color:var(--c-sang-2)}
.sec[data-nen="sang"] .tt-dong:hover{background:#dfeef1}
.sec[data-nen="sang"] .tt-qr{border:1px solid color-mix(in srgb,#0e606e 25%,transparent)}
.sec[data-nen="sang"] .tt-tin dt{color:var(--c-sang-2)}
.sec[data-nen="sang"] .tt-tin dd{color:var(--c-sang-1)}
.sec[data-nen="sang"] .tt-bao{color:#0e606e}
.sec[data-nen="sang"] .tt-loi-chuc{color:var(--c-sang-1)}

.sec[data-nen="toi"] .tt-nhan{color:var(--th-toi)}
.sec[data-nen="toi"] .tt-nhan-xong{color:var(--th-toi-2)}
.sec[data-nen="toi"] .tt-nhan-loi{color:#ff8a4c}
.sec[data-nen="toi"] .tt-dong{color:var(--c-toi-2)}
.sec[data-nen="toi"] .tt-dong:hover{background:rgba(120,220,235,.14)}
.sec[data-nen="toi"] .tt-qr{border:1px solid rgba(120,220,235,.3)}
.sec[data-nen="toi"] .tt-tin dt{color:var(--c-toi-2)}
.sec[data-nen="toi"] .tt-tin dd{color:var(--c-toi-1)}
.sec[data-nen="toi"] .tt-bao{color:var(--th-toi)}
.sec[data-nen="toi"] .tt-loi-chuc{color:var(--c-toi-1)}

/* ---- ĐIỆN THOẠI: QR xuống dòng riêng cho đỡ chật ---- */
@media(max-width:900px){
  /* Khoảng cách từ QR xuống khối thông tin gấp 3 lần: .8u → 2.4u (≈29px).
     Trước đó bốn dòng số dính sát mép dưới mã QR, đọc lên thành một khối liền. */
  .tt-than{flex-direction:column;align-items:center;gap:calc(var(--u) * 2.4)}

  /* Canh giữa và nút ✕ định vị tuyệt đối nay là luật CHUNG (xem khối .tt-dau ở
     phần máy tính), ở đây chỉ còn khai lại khoảng cách và cỡ chữ.
     margin-top:0 — bản máy tính đẩy tiêu đề xuống một hàng cho thoáng, ở đây KHÔNG
     được phép: màn thanh toán trên máy 360×600 chỉ còn dư 17px, thêm một hàng là
     nội dung tràn khỏi màn.
     margin-bottom một hàng (1.6u ≈ 19px) để tiêu đề tách hẳn khỏi mã QR, trước đó
     hai thứ dính sát nhau. Đường kẻ mảnh nằm lọt trong khoảng này (6px + 1px) nên
     không cần chừa thêm chỗ. Cỡ chữ 13px thay 9.4px — tăng 3 nấc, đây là dòng bảo
     khách phải làm gì nên không được nhỏ hơn chữ thường. */
  /* Trả ba màn con về xếp thường, KHÔNG chồng lên nhau như bản máy tính. Ở đó ba
     màn chồng trong một ô lưới để tiêu đề không nhảy chỗ; ở đây section phải gò
     vừa đúng một màn hình nên khung thanh toán buộc phải co theo màn đang hiện —
     giữ chiều cao của màn chờ (có mã QR) thì màn xong dôi ra cả trăm px trống. */
  .sec.dang-tra .khoi-tt{display:block}
  .tt-man{display:none;visibility:visible}
  .khoi-tt[data-man="cho"]  .tt-cho,
  .khoi-tt[data-man="xong"] .tt-xong,
  .khoi-tt[data-man="loi"]  .tt-loi{display:flex}

  /* margin-left:0 — khử cái nới âm của bản máy tính. Ở đây khối hình đã bị ẩn,
     khung thanh toán chiếm trọn bề ngang nên canh giữa là đã đúng sẵn; giữ margin
     âm thì tiêu đề văng hẳn ra ngoài lề trái. */
  .tt-dau{margin-top:0;margin-bottom:calc(var(--u) * 1.6);margin-left:0}
  .tt-nhan{font-size:13px}

  /* Nút ✕ trên điện thoại: to hơn và NHẤC LÊN KHỎI HÀNG TIÊU ĐỀ.
     · 44×44px là ngưỡng vùng chạm tối thiểu — bản chung lấy theo --nut-cao chỉ ra
       ~33px, đủ nhìn nhưng hụt tay. Dấu ✕ phóng lên 1.8u (~22px) thay 1.1u (~13px).
     · đẩy lên 42px = đúng 2 hàng chữ tiêu đề (13px × line-height 1.6 = 20.8px/hàng)
       để nó tách hẳn khỏi dòng "QUÉT MÃ ĐỂ THANH TOÁN", không còn dính vào chữ.
     Dùng px chứ không dùng --u: cỡ chữ tiêu đề trên điện thoại là 13px CỐ ĐỊNH nên
     một hàng luôn là 20.8px, quy ra --u lại sai khi --u đổi. */
  .tt-dong{width:44px;height:44px;font-size:calc(var(--u) * 1.8);
    top:calc(50% - 42px)}

  /* ---- RIÊNG MÀN "THANH TOÁN THÀNH CÔNG" ----
     Đây là màn ít nội dung nhất nên có chỗ để thở, nới ra cho dễ đọc.

     · tiêu đề nhấc lên 8px bằng margin-top âm (margin âm kéo theo cả khối lên,
       khác transform chỉ dời hình mà không dời chỗ)
     · giãn khoảng cách giữa các thành phần lên GẤP 3: gap của .tt-man từ .72u
       (8.64px) lên 2.16u (25.92px). Màn này chỉ có 4 thành phần trong khi còn dư
       155px chỗ trống nên giãn ra được mà không tràn màn.
       Hàng nút lấy CÙNG một con số 2.16u chứ không nhân 3 từ .63u của riêng nó
       (ra 22.68px), và phải xoá luôn margin-top .4u sẵn có của .tt-hang-nut —
       nếu không thì ba khoảng hở lần lượt là 26 / 31 / 23px, chênh nhau thấy rõ.
       Đã giãn cho thoáng thì ba khoảng phải bằng nhau, mắt mới thấy là một nhịp.
     · khoảng cách tiêu đề → đoạn chữ = 60px, ĐO TỪ CHÂN CHỮ giống như đường kẻ.
       Suy ra margin-bottom: 60 − 4.82 (chân chữ tới đáy hộp dòng, = .371em của
       cỡ 13px) − 25.92 (gap mới của .tt-man) = 29.3px.
       Ghi số đã tính sẵn thay vì để calc lồng nhau: trên điện thoại --u luôn
       bằng 12px (clamp chặn dưới, 1.1vw chỉ vượt 12px khi màn rộng >1091px, mà
       khối này chỉ áp ở ≤900px) và cỡ chữ tiêu đề cố định 13px, nên hai con số
       trên là hằng số thật chứ không phải ước lượng.
       ⚠️ Đổi cỡ chữ tiêu đề hoặc gap của .tt-man thì phải tính lại 29.3px.
     · chữ "Bạn đã thanh toán..." 15.25px thay 12.24px — tăng 3px. Cố ý để lớn
       hơn cả chữ thường 14.5px: đây là câu báo tin đã trả tiền xong, dòng quan
       trọng nhất của cả trang. */
  .tt-xong{gap:calc(var(--u) * 2.16)}
  .tt-xong .tt-hang-nut{gap:calc(var(--u) * 2.16);margin-top:0}
  .tt-xong .tt-dau{margin-top:-8px;margin-bottom:29.3px}
  /* Khử cái hạ 28px của bản máy tính: ở đó nó dùng để canh với hình minh hoạ, mà
     ở đây hình đã bị ẩn, không còn gì để canh. */
  .tt-xong .tt-loi-chuc,
  .tt-loi > .tt-bao{margin-top:0}
  .tt-loi-chuc{font-size:15.25px}

  /* QR to thêm 50%: 11u → 16.5u. Trên điện thoại QR là thứ phải quét được từ máy
     khác nên càng lớn càng dễ bắt nét. */
  /* QR trên điện thoại: 62% bề rộng cột (giảm 20% từ 78%). Khai lại width vì bản
     máy tính để 50% — ở đó QR nằm cạnh cột thông tin, còn ở đây nó một mình một hàng. */
  /* Khai lại: bản máy tính để 40% và đẩy xuống 50px, ở đây QR một mình một hàng
     nên không cần đẩy gì cả. */
  .tt-qr-cot{width:62%;margin-top:0}
  .tt-qr{width:100%;aspect-ratio:1}
  /* Link tải ảnh QR về máy — chỉ hiện ở đây, xem lý do ở khối .tt-tai-qr phía trên */
  /* Cao 27px = 70% của 38px, rộng bằng đúng mã QR (100% cột chứa QR).
     Rộng bằng QR thì hai khối xếp thành một cột thẳng, không bị so le mép. */
  .tt-tai-qr{display:flex;align-items:center;justify-content:center;
    width:100%;min-height:27px;padding:0 calc(var(--u) * .8);text-decoration:none;
    font-family:var(--nhan);font-size:13px;font-weight:700;letter-spacing:.04em;
    border-radius:var(--goc);border:1px dashed;white-space:nowrap;box-sizing:border-box}
  /* Chữ và viền màu CAM, cùng tông với đường kẻ dưới tiêu đề — nút này là lối
     thoát cho người đang cầm chính cái máy hiện mã QR, cho nó nổi khỏi nền xanh.
     ⚠️ Nền sáng KHÔNG dùng #d94f1a như đường kẻ: chữ 13px không thuộc diện "chữ
     lớn" nên phải đạt 4.5:1, mà #d94f1a chỉ được 4.1:1 trên nền sáng. #c2410c đậm
     hơn một nấc, đo được 4.8:1 — vẫn là cam, vẫn nổi, mà đọc được.
     Nền tối thì #ff8a4c đạt 7.0:1, dùng thẳng. Đường kẻ trang trí không chịu luật
     này nên vẫn giữ #d94f1a. */
  .sec[data-nen="sang"] .tt-tai-qr{color:#c2410c;
    border-color:color-mix(in srgb,#c2410c 45%,transparent)}
  .sec[data-nen="sang"] .tt-tai-qr:active{background:#fbe4d8}
  .sec[data-nen="toi"] .tt-tai-qr{color:#ff8a4c;
    border-color:color-mix(in srgb,#ff8a4c 45%,transparent)}
  .sec[data-nen="toi"] .tt-tai-qr:active{background:rgba(255,138,76,.16)}

  /* ---- BỐN DÒNG THÔNG TIN THEO ĐÚNG KHUÔN GẠCH ĐẦU DÒNG ----
     Trước đây nhãn và giá trị hai cỡ khác nhau (0.72u in hoa nhỏ vs 0.92u đậm),
     giá trị canh phải nên mỗi dòng bắt đầu một chỗ — nhìn rời rạc.
     Nay cả hai CÙNG 14.5px như gạch đầu dòng, và cột nhãn rộng cố định 7.2em nên
     bốn giá trị thẳng hàng nhau, đọc lướt xuống là bắt được ngay. */
  /* Vẫn một lưới chung như bản máy tính, chỉ đổi cỡ chữ và khoảng cách */
  /* Thụt cả khối bốn dòng vào 20px. Dùng padding + box-sizing chứ KHÔNG dùng
     margin-left: khối đang là width:100%, cộng thêm margin là tổng vượt quá bề
     rộng cột và đẩy ngang cả trang. padding ăn vào trong nên bề rộng giữ nguyên. */
  .tt-tin{width:100%;box-sizing:border-box;padding-left:20px;
    column-gap:calc(var(--u) * .7);row-gap:calc(var(--u) * .62)}
  .tt-tin dt{font-family:var(--sans);font-size:14.5px;font-weight:500;
    letter-spacing:0;text-transform:none;opacity:.8;white-space:nowrap}
  .tt-tin dd{font-size:14.5px;font-weight:700;text-align:left}

  /* Dòng hướng dẫn màu xanh: 14.5px thay 11px — tăng 2 nấc, bằng cỡ gạch đầu dòng.
     Đây là câu chốt bảo khách làm gì tiếp nên phải đọc được ngay, không thể nhỏ
     hơn mấy dòng số tài khoản ngay trên nó. */
  .tt-bao{font-size:14.5px}
  /* Chỗ ngắt dòng cố ý của bản máy tính không dùng được ở đây: cột hẹp hơn nhiều
     nên chữ đã tự xuống dòng, ép thêm sẽ ra một dòng cụt lơ lửng. */
  .ngat-may-tinh{display:none}

  .tt-hang-nut{flex-direction:column;align-items:stretch}
  /* Khi đang thanh toán thì khối hình nhường hết chỗ cho khung thanh toán */
  .sec.dang-tra .khoi-hinh{display:none}
  /* Khi đang thanh toán, section này KHÔNG gò trong một màn nữa: khung thanh toán
     cao hơn khối chữ thường (mã QR + bốn dòng + nút tải + nút xxx). Cho section tự
     cao theo nội dung và cuộn bình thường — ép vừa một màn thì hoặc phải thu nhỏ
     mã QR tới mức khó quét, hoặc cắt mất dòng hướng dẫn.
     Chỉ áp lúc .dang-tra; thoát ra là section trở lại đúng một màn như cũ.
     ⚠️ height:auto phải ĐI KÈM sàn min-height một màn. Trước đây đặt min-height:0
     nên màn "thanh toán thành công" — vốn ít nội dung hơn hẳn màn chờ (không còn
     mã QR, không còn bốn dòng thông tin) — làm section co lại còn ~40% màn hình,
     hở hai mảng nền tối của section trên và dưới. Giữ sàn 100svh: nội dung ít thì
     section vẫn tròn một màn, nội dung nhiều thì vẫn được phép cao thêm. */
  .sec.dang-tra{height:auto;
    min-height:100vh;min-height:100svh;
    padding-top:calc(var(--thanh-cao) + var(--man-dung) * .05);
    padding-bottom:calc(var(--man-dung) * .05)}
  .sec.dang-tra .nd{height:auto;justify-content:center}
}
