/* ============================================================
   Shieldix — CSS trang dịch vụ (multi-page)
   Nguồn: Shieldix_Website_HTML_v2_20260803/style.css
   Đã đổi: font Be Vietnam Pro -> Inter + Space Grotesk (khớp site
   hiện tại), --blue -> #1A73E8. Token nền/cyan/green/text giữ
   nguyên vì vốn đã trùng site.
   Không ảnh hưởng blog và các trang pháp lý (dùng CSS riêng).
   ============================================================ */
:root {
  --bg: #050B14;
  --bg-alt: #081221;
  --surface: #0D1B2A;
  --line: #1A2D47;
  --line-strong: #2A415C;
  --text: #E2E8F0;
  --muted: #94A3B8;  /* giữ, blog dùng #64748b cho chữ phụ nhỏ */
  --cyan: #00D4FF;
  --blue: #1A73E8;   /* đồng bộ với site hiện tại */
  --teal: #5FC5C5;
  --green: #00FF88;
  --grad: linear-gradient(100deg, #00D4FF 0%, #3BA3DB 55%, #5FC5C5 100%);
  --radius: 10px;
  --shadow: 0 4px 18px rgba(0, 0, 0, .35);
  --shadow-lg: 0 10px 34px rgba(0, 0, 0, .5);
  --maxw: 1280px;   /* khớp max-w-7xl của index.html và blog; 1120px của bản v2
                       gốc trông hẹp hẳn so với phần còn lại của site */
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation: none !important; transition: none !important; }
}
body {
  font-family: 'Inter', 'Segoe UI', Arial, sans-serif;
  background: var(--bg); color: var(--text);
  font-size: 16px; line-height: 1.65;
}
img { max-width: 100%; display: block; }
a { color: var(--cyan); text-decoration: none; }
a:hover { text-decoration: underline; }
a:focus-visible, button:focus-visible, .btn:focus-visible {
  outline: 3px solid var(--cyan); outline-offset: 2px; border-radius: 4px;
}

/* Tailwind CDN chèn <style> vào cuối <head>, sau <link> của file này. Utility
   .container của Tailwind (max-width theo breakpoint, tới 1280px) cùng
   specificity nên thắng. Thêm `body` để nâng specificity lên 0,1,1. */
body .container { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }
section { padding: 72px 0; }
section.tight { padding: 48px 0; }
.section-alt { background: rgba(8,18,33,.72); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
.section-navy { background: rgba(13,27,42,.72); color: var(--text); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
.section-navy h2, .section-navy h3 { color: #fff; }
.section-navy p { color: var(--muted); }

/* ---------- Typography ---------- */
h1, h2, h3, h4 { font-family: 'Space Grotesk', 'Inter', sans-serif; }
h1 { font-size: clamp(30px, 4.2vw, 44px); line-height: 1.2; font-weight: 800; letter-spacing: -.5px; color: #fff; }
h2 { font-size: clamp(24px, 3vw, 32px); line-height: 1.25; font-weight: 700; margin-bottom: 14px; letter-spacing: -.3px; color: #fff; }
h3 { font-size: 18.5px; font-weight: 700; line-height: 1.35; margin-bottom: 10px; color: #fff; letter-spacing: -.1px; }
p  { color: var(--muted); }

/* Chống ngắt dòng xấu. Tiếng Việt nhiều từ 1-2 chữ cái ("ý:", "ra", "về") nên rất
   hay rơi một mình xuống dòng cuối, nhìn như câu bị đứt.
   - balance: chia đều số chữ cho các dòng, dùng cho tiêu đề và đoạn dẫn ngắn
     (Chrome chỉ áp dụng cho khối <= 6 dòng, đoạn dài hơn tự bỏ qua nên vô hại).
   - pretty: giữ đoạn dài nguyên cách ngắt nhưng tránh dòng cuối trơ một từ. */
h1, h2, h3, h4, p, li, dd, dt, blockquote, label, figcaption,
.lead, .sub, .eyebrow, .badge, .more, .stat span, .stat-strip span { text-wrap: balance; }
/* Khổ hẹp: đoạn văn dài quá 6 dòng nên balance bị bỏ qua, dùng pretty để ít
   nhất không còn dòng cuối trơ một từ. */
@media (max-width: 640px) {
  p, li, dd, dt, blockquote, label { text-wrap: pretty; }
}

/* Vạch nhấn dưới heading canh giữa của mỗi section */
.center > h2 { position: relative; padding-bottom: 18px; margin-bottom: 0; }
.center > h2::after {
  content: ""; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%);
  width: 64px; height: 4px; border-radius: 99px; background: var(--grad);
}
.center > h2 + .sub, .center > h2 + p { margin-top: 16px; }

/* Heading trong khối 2 cột: thêm vạch nhấn phía trên để tách khỏi phần thân */
.split h2 { position: relative; padding-top: 20px; }
.split h2::before {
  content: ""; position: absolute; top: 0; left: 0;
  width: 52px; height: 4px; border-radius: 99px; background: var(--grad);
}
.eyebrow {
  display: inline-block; font-size: 12.5px; font-weight: 700; letter-spacing: 2px;
  text-transform: uppercase; color: var(--cyan); margin-bottom: 12px;
}
.lead { font-size: 18px; }
.center { text-align: center; }
.sub { max-width: 720px; margin: 0 auto 10px; }

/* ---------- Buttons ---------- */
.btn {
  display: inline-block; padding: 14px 28px; border-radius: 8px; font-weight: 700;
  font-size: 15.5px; cursor: pointer; border: 0; transition: filter .2s, background .2s, color .2s;
  text-decoration: none !important;
}
.btn-primary { background: var(--grad); color: #03101C; box-shadow: 0 6px 22px rgba(0, 212, 255, .28); }
.btn-primary:hover { filter: brightness(1.1); }
.btn-outline { background: transparent; color: var(--text); border: 2px solid var(--line-strong); }
.btn-outline:hover { border-color: var(--cyan); color: var(--cyan); }
.btn-lg { padding: 17px 38px; font-size: 17px; }
.btn-row { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 26px; }

/* ---------- Header ----------
   Đã chuyển hẳn sang assets/header-v2.css để trang chủ (dùng Tailwind, không
   nạp được file này vì có reset toàn cục) dùng chung được partials/nav-v2.html.
   Mọi trang có thanh menu phải nạp thêm header-v2.css.
   ---------------------------------------------------------------- */

/* ---------- Breadcrumb ---------- */
/* Thẻ này mang cả class .container, mà `body .container` ở trên có
   specificity 0,1,1 nên sẽ ghi đè `padding` nếu ở đây chỉ viết `.breadcrumb`.
   Phải dùng `body .breadcrumb` để giữ được padding dọc. */
body .breadcrumb {
  display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
  font-size: 13px; line-height: 1.4; color: var(--muted);
  padding-top: 22px; padding-bottom: 26px;
}
.breadcrumb a { color: #93A7BC; transition: color .2s; }
.breadcrumb a:hover { color: var(--cyan); text-decoration: none; }
.breadcrumb .sep { color: #3D5064; font-size: 14px; }
.breadcrumb .crumb-current { color: #E2EAF2; font-weight: 600; }

/* ---------- Hero ---------- */
.hero { background: transparent; color: #fff; padding: 84px 0; position: relative; overflow: hidden; border-bottom: 1px solid var(--line); }
.hero::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background:
    radial-gradient(700px 340px at 85% 0%, rgba(0, 212, 255, .13), transparent 60%),
    radial-gradient(520px 300px at 5% 100%, rgba(95, 197, 197, .09), transparent 60%);
}
.hero .container { position: relative; }
.hero .eyebrow { color: var(--teal); }
.hero h1 { color: #fff; margin-bottom: 18px; }
.hero p { color: var(--muted); }
.hero .lead { max-width: 640px; color: #B6C6D6; }
.hero-note { font-size: 13.5px; color: var(--muted); margin-top: 12px; }
.motto { margin-top: 16px; font-style: italic; color: var(--teal); font-size: 15.5px; }

/* ---------- Stats ---------- */
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.stat { text-align: center; padding: 22px 10px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); }
.stat b { display: block; font-size: 32px; font-weight: 800; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.stat span { font-size: 13.5px; color: var(--muted); }
.hero .stat { background: rgba(13, 27, 42, .6); border-color: var(--line); }

/* ---------- Cards & grids ---------- */
.grid { display: grid; gap: 22px; margin-top: 34px; }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
.card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 26px; box-shadow: var(--shadow); transition: box-shadow .2s, border-color .2s;
}
a.card { color: inherit; display: block; }
a.card:hover { text-decoration: none; box-shadow: var(--shadow-lg); border-color: var(--cyan); cursor: pointer; }
.card .icon { width: 46px; height: 46px; border-radius: 9px; background: rgba(0, 212, 255, .1);
  display: flex; align-items: center; justify-content: center; margin-bottom: 14px; }
.card .icon svg { width: 24px; height: 24px; stroke: var(--cyan); }
.card .icon.i-blue  { background: rgba(26, 115, 232, .16); }
.card .icon.i-blue svg  { stroke: #7FB4F7; }
.card .icon.i-teal  { background: rgba(95, 197, 197, .16); }
.card .icon.i-teal svg  { stroke: #86DEDE; }
.card .icon.i-green { background: rgba(0, 255, 136, .12); }
.card .icon.i-green svg { stroke: #59FFB4; }
.card p { font-size: 14.5px; line-height: 1.7; }
/* Thẻ chỉ có icon + tiêu đề: canh giữa theo chiều dọc, nếu không thẻ có tiêu đề
   1 dòng sẽ trống hẳn nửa dưới trong khi thẻ 2 dòng lại kín */
.card.center { display: flex; flex-direction: column; justify-content: center; }
.card.center .icon { margin-left: auto; margin-right: auto; }
.card.center h3 { margin-bottom: 0; }
.card.center p { margin-top: 8px; }
.card .more { display: inline-block; margin-top: 12px; font-size: 14px; font-weight: 600; color: var(--cyan); }
.card-flag { border: 2px solid var(--cyan); background: linear-gradient(180deg, rgba(0, 212, 255, .07), var(--surface)); }
.badge { display: inline-block; font-size: 11.5px; font-weight: 700; letter-spacing: .6px; padding: 3px 10px;
  border-radius: 99px; background: rgba(0, 212, 255, .12); color: #7DE3FF; margin-bottom: 10px; text-transform: uppercase; }
.section-navy .card, .section-alt .card { background: var(--bg); }

/* ---------- Ảnh nền cho từng thẻ ở "Dịch vụ liên quan" / "Bài viết liên quan" ----
   Mỗi thẻ mang ảnh của chính dịch vụ đó, đặt qua biến --anh trên thẻ.
   Ảnh dashboard đều là nền SÁNG nên không thể để chữ đè thẳng lên. Cách xử lý:
   ảnh chiếm phần trên, chuyển dần xuống màu thẻ đặc ở phần dưới, chữ nằm hẳn
   trên vùng đặc. Thẻ nào không có --anh thì vẫn là thẻ thường. */
/* Phải là .card.card-anh (0,2,0): quy tắc `.section-navy .card, .section-alt .card`
   ở trên cũng là 0,2,0 và dùng shorthand `background` — nếu ở đây chỉ viết
   .card-anh (0,1,0) thì background-image bị đặt về none trong mọi mục có nền
   xen kẽ. Trang cloud-dns không lộ lỗi vì mục đó là <section> thường. */
.card.card-anh {
  position: relative;
  padding-top: 178px;                 /* chừa chỗ cho dải ảnh phía trên */
  background-image:
    linear-gradient(180deg,
      rgba(13, 27, 42, 0)   0%,
      rgba(13, 27, 42, .10) 34%,
      rgba(13, 27, 42, .78) 52%,
      rgba(13, 27, 42, .98) 62%,
      var(--surface)        70%),
    var(--anh);
  background-size: cover, cover;
  background-position: center, center top;
  background-repeat: no-repeat, no-repeat;
  overflow: hidden;
}
/* Vạch sáng mảnh ở mép trên cho ảnh không bị cụt */
.card.card-anh::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(0, 212, 255, .5), transparent);
}
a.card.card-anh:hover { border-color: rgba(0, 212, 255, .38); }

@media (max-width: 900px) {
  .card.card-anh { padding-top: 150px; }
}

/* Thẻ bài viết dùng đồ hoạ trang trí thay vì ảnh chụp sản phẩm: đồ hoạ vốn đã
   tối nên không cần dải chuyển màu dày như thẻ dịch vụ, để ảnh lộ nhiều hơn. */
.card.card-anh.card-anh-doa {
  padding-top: 150px;
  background-image:
    linear-gradient(180deg,
      rgba(13, 27, 42, 0)   0%,
      rgba(13, 27, 42, .30) 40%,
      rgba(13, 27, 42, .90) 58%,
      var(--surface)        68%),
    var(--anh);
  background-position: center, center 30%;
}
@media (max-width: 900px) { .card.card-anh.card-anh-doa { padding-top: 130px; } }

/* ---------- Nền gradient cho thẻ chưa có ảnh thật ----------
   Dùng khi dịch vụ chưa dựng xong hoặc bài blog chưa có ảnh đại diện. Mỗi thẻ
   một tông trong bảng màu thương hiệu để lưới thẻ không bị lặp một hình.
   Không dùng tệp ảnh nào nên không tốn thêm byte tải về.
   MỌI selector ở đây phải 2 lớp (.card.card-xxx), kể cả 4 lớp tông màu:
   `.section-alt .card` cũng là 0,2,0 và dùng shorthand `background`, nên
   selector 1 lớp sẽ bị nó xoá mất background-image. */
.card.card-nen {
  --dai: 128px;                   /* chiều cao dải nền, xem .card-nen-cao */
  position: relative;
  padding-top: var(--dai);
  background-repeat: no-repeat;
  background-size: cover;
  overflow: hidden;
}
.card.card-nen::before {          /* vạch sáng mép trên, cùng tông với nền */
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--net, rgba(0, 212, 255, .5)), transparent);
}
/* Lớp chấm nhỏ tạo vân, đặt trong vùng ảnh để nền không phẳng lì */
.card.card-nen::after {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: var(--dai);
  background-image: radial-gradient(circle, rgba(255, 255, 255, .07) 1px, transparent 1px);
  background-size: 16px 16px;
  -webkit-mask-image: linear-gradient(180deg, #000 0%, transparent 88%);
  mask-image: linear-gradient(180deg, #000 0%, transparent 88%);
  pointer-events: none;
}

.card.card-nen-cyan {
  --net: rgba(0, 212, 255, .55);
  background-image:
    linear-gradient(180deg, rgba(13,27,42,0) 0%, rgba(13,27,42,.45) 52%, var(--surface) 76%),
    radial-gradient(120% 100% at 22% -10%, rgba(0, 212, 255, .30), transparent 68%),
    radial-gradient(100% 90% at 88% 0%,   rgba(0, 212, 255, .12), transparent 62%),
    linear-gradient(180deg, #0A1826, var(--surface));
}
.card.card-nen-blue {
  --net: rgba(26, 115, 232, .6);
  background-image:
    linear-gradient(180deg, rgba(13,27,42,0) 0%, rgba(13,27,42,.45) 52%, var(--surface) 76%),
    radial-gradient(120% 100% at 78% -10%, rgba(26, 115, 232, .34), transparent 68%),
    radial-gradient(100% 90% at 12% 0%,   rgba(0, 212, 255, .10), transparent 62%),
    linear-gradient(180deg, #0A1526, var(--surface));
}
.card.card-nen-teal {
  --net: rgba(95, 197, 197, .55);
  background-image:
    linear-gradient(180deg, rgba(13,27,42,0) 0%, rgba(13,27,42,.45) 52%, var(--surface) 76%),
    radial-gradient(130% 100% at 50% -12%, rgba(95, 197, 197, .28), transparent 70%),
    linear-gradient(180deg, #091A20, var(--surface));
}
.card.card-nen-green {
  --net: rgba(0, 255, 136, .45);
  background-image:
    linear-gradient(180deg, rgba(13,27,42,0) 0%, rgba(13,27,42,.45) 52%, var(--surface) 76%),
    radial-gradient(120% 100% at 30% -10%, rgba(0, 255, 136, .20), transparent 66%),
    radial-gradient(100% 90% at 85% 0%,   rgba(95, 197, 197, .14), transparent 62%),
    linear-gradient(180deg, #081A1C, var(--surface));
}

/* ---------- Thẻ có màu nhấn riêng ----------
   Trang chủ dùng cả chục màu nhấn cho từng dịch vụ, còn các trang v2 trước đây
   chỉ một tông cyan nên khối nào cũng na ná nhau, mắt không phân biệt được.
   Đặt biến --mau trên thẻ, ô biểu tượng và vạch mép trên tự lấy theo.
   Dòng background đầu là bản dự phòng cho trình duyệt chưa hiểu color-mix. */
.card.card-mau { position: relative; overflow: hidden; }
.card.card-mau::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: linear-gradient(90deg, var(--mau), transparent 88%);
}
a.card.card-mau:hover { border-color: color-mix(in srgb, var(--mau) 45%, transparent); }

.icon-mau {
  width: 46px; height: 46px; border-radius: 11px; margin-bottom: 15px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255, 255, 255, .05);
  background: color-mix(in srgb, var(--mau) 13%, transparent);
  border: 1px solid rgba(255, 255, 255, .12);
  border-color: color-mix(in srgb, var(--mau) 30%, transparent);
}
.icon-mau svg {
  width: 24px; height: 24px; fill: none; stroke: var(--mau);
  stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
}
/* Thẻ nổi bật dùng chung biến màu, nhưng vạch mép trên dày hơn */
.card.card-flag.card-mau::before { height: 4px; }

/* Thẻ bước có màu riêng. .step đã dùng ::before cho huy hiệu số nên vạch mép
   trên phải chuyển sang ::after, và huy hiệu đổi sang màu nhấn thay vì gradient
   chung. Selector 3 lớp để thắng .card.card-mau::before ở trên. */
.card.step.card-mau::before {
  /* Phải khai lại TOÀN BỘ thuộc tính huy hiệu, không chỉ màu: quy tắc
     .card.card-mau::before ở trên đặt content:"" và position/top/left/right/height
     cho vạch mép trên, specificity 0,2,1 cao hơn .step::before (0,1,1) nên sẽ
     đè mất con số nếu ở đây không viết lại. */
  counter-increment: s; content: counter(s);
  position: absolute; top: 26px; left: 26px; right: auto;
  width: 40px; height: 40px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 800; font-size: 17px; line-height: 1;
  background: var(--mau); color: #03101C;
  box-shadow: 0 0 0 5px rgba(255, 255, 255, .06), 0 6px 16px rgba(0, 0, 0, .35);
}
.card.step.card-mau::after {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: linear-gradient(90deg, var(--mau), transparent 88%);
}
/* Thẻ canh giữa: ô biểu tượng cũng phải canh giữa theo */
.card.center .icon-mau { margin-left: auto; margin-right: auto; }

/* Thẻ chỉ có biểu tượng + một dòng tiêu đề ("Phạm vi bảo vệ"). Ở khổ điện thoại
   lưới xuống 1 cột, thẻ rộng hết màn hình mà nội dung chỉ là ô 46px và vài chữ
   canh giữa, nhìn trống hoác. Dưới 560px xếp ngang thành dòng danh sách. */
@media (max-width: 560px) {
  .card.center.card-mau {
    display: grid; grid-template-columns: auto 1fr; column-gap: 14px;
    align-items: center; text-align: left; padding: 15px 18px;
  }
  .card.center.card-mau .icon-mau { margin: 0; width: 42px; height: 42px; }
  .card.center.card-mau h3 { margin: 0; font-size: 16px; }
}

/* Khi thẻ gradient đứng cùng hàng với thẻ ảnh thật (.card-anh, dải 178px),
   tiêu đề hai loại sẽ lệch nhau. Lớp này kéo dải gradient cho bằng.
   scripts/dong-bo-dai-the.py gắn tự động cho đúng những lưới có cả hai loại. */
.card.card-nen-cao { --dai: 178px; }

@media (max-width: 900px) {
  .card.card-nen { --dai: 110px; }
  .card.card-nen.card-nen-cao { --dai: 128px; }
}

/* ---------- Feature split ---------- */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; margin-top: 30px; }
.split .shot { border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-lg);
  background: var(--bg-alt); min-height: 260px; display: flex; align-items: center; justify-content: center; color: var(--muted); font-size: 14px; }
.checklist { list-style: none; margin-top: 14px; }
.checklist li { padding: 8px 0 8px 34px; position: relative; color: var(--muted); font-size: 15.5px; line-height: 1.6; }
.checklist li strong { color: #fff; font-weight: 600; }
.checklist li::before {
  content: ""; position: absolute; left: 0; top: 12px; width: 20px; height: 20px; border-radius: 50%;
  background: rgba(0, 255, 136, .12) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300FF88' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/12px no-repeat;
}

/* ---------- Steps ---------- */
.steps { counter-reset: s; }

/* ---------- Biến thể "biểu tượng đứng cạnh tiêu đề" ----------
   Đặt lớp .card-ngang lên lưới bao ngoài. Mặc định thẻ xếp dọc (biểu tượng /
   huy hiệu số một dòng, tiêu đề dòng dưới); ở đây gom lại một hàng cho thẻ thấp
   hơn và cặp biểu tượng - tiêu đề đọc thành một nhịp. */
.card-ngang .card.card-mau:not(.step) {
  display: grid; grid-template-columns: auto 1fr; column-gap: 14px; align-items: center;
  /* align-content: start là bắt buộc. Các thẻ trong lưới cao bằng nhau, mà mặc
     định lưới con giãn hai hàng ra cho đầy chiều cao đó, nên thẻ nào đoạn văn
     ngắn thì hàng biểu tượng bị đẩy xuống — ba thẻ cùng hàng có biểu tượng lệch
     nhau tới 25px. Cho hàng giữ đúng cỡ nội dung thì cả hàng thẳng nhau. */
  align-content: start;
}
/* Biểu tượng luôn dính mép trên của hàng: tiêu đề 1 dòng thì hàng cao bằng
   biểu tượng, tiêu đề 2 dòng thì hàng cao hơn — để canh giữa sẽ lệch 2px giữa
   các thẻ cùng lưới. Chỉ tiêu đề mới canh giữa theo hàng. */
.card-ngang .card.card-mau:not(.step) .icon-mau { margin-bottom: 0; align-self: start; }
.card-ngang .card.card-mau:not(.step) h3 { margin-bottom: 0; }
.card-ngang .card.card-mau:not(.step) p { grid-column: 1 / -1; margin-top: 12px; }
/* Thẻ bước: huy hiệu số vốn nằm tuyệt đối ở góc, phần thân phải chừa 84px phía
   trên cho nó. Kéo huy hiệu về ngang tiêu đề thì trả padding-top về như thẻ
   thường và chừa chỗ bên trái tiêu đề đúng bằng bề rộng huy hiệu. */
.card-ngang .card.step { padding-top: 26px; }
.card-ngang .card.step h3 {
  padding-left: 52px; min-height: 40px; margin-bottom: 12px;
  display: flex; align-items: center;
}
/* Thẻ bước không có tiêu đề, chỉ một đoạn văn ("Bắt đầu dùng"): chừa chỗ cho
   huy hiệu số ngay trên đoạn đó thay vì đẩy cả thẻ xuống 84px. */
.card-ngang .card.step > p:first-child { padding-left: 52px; min-height: 40px; }
/* padding-top phải >= top(26) + cao huy hiệu(40) + khoảng thở, nếu không h3 dính vào số */
.step { position: relative; padding-top: 84px; overflow: hidden; }
.step::before {
  counter-increment: s; content: counter(s);
  position: absolute; top: 26px; left: 26px; width: 40px; height: 40px; border-radius: 50%;
  background: var(--grad); color: #03101C;
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 800; font-size: 17px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 5px rgba(0, 212, 255, .08), 0 6px 16px rgba(0, 212, 255, .22);
}
/* Vạch gradient trên đầu thẻ để bước có điểm nhấn, không chỉ là chữ */
.step::after {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: var(--grad); opacity: .8;
}
.step h3 { font-size: 19px; margin-bottom: 10px; }
.step p { font-size: 15px; line-height: 1.72; }
/* Bước không có tiêu đề: nâng chữ lên vai trò nội dung chính thay vì chú thích */
.step > p:first-of-type:first-child { font-size: 16px; line-height: 1.7; color: var(--text); }

/* ---------- Table ---------- */
.table-wrap { overflow-x: auto; margin-top: 30px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); }
table.cmp { width: 100%; border-collapse: collapse; font-size: 14.5px; min-width: 560px; }
table.cmp th, table.cmp td { padding: 13px 18px; text-align: left; border-bottom: 1px solid var(--line); color: var(--text); }
table.cmp td { color: var(--muted); }
table.cmp thead th { background: #11233A; color: #fff; font-weight: 600; }
table.cmp tbody tr:last-child td { border-bottom: 0; }
table.cmp td.yes { color: var(--green); font-weight: 700; }
table.cmp td.no { color: #64748B; }

/* Bảng 2 cột "Dịch vụ | Cách bắt đầu" ở /get-started. min-width 560px của
   table.cmp khiến khổ điện thoại phải kéo ngang mới đọc hết; dưới 640px xếp
   mỗi hàng thành một thẻ dọc, ô đầu làm tiêu đề. Chỉ áp cho bảng có gắn thêm
   lớp cmp-doc, vì bảng 3 cột ở /legal xếp dọc sẽ mất nghĩa nếu không kèm nhãn
   cho từng ô. */
@media (max-width: 640px) {
  .table-wrap:has(table.cmp-doc) { border: 0; background: none; }
  table.cmp-doc { min-width: 0; }
  /* Ẩn khỏi mắt nhưng vẫn còn cho trình đọc màn hình */
  table.cmp-doc thead { position: absolute; width: 1px; height: 1px; margin: -1px;
    padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  table.cmp-doc, table.cmp-doc tbody, table.cmp-doc tr, table.cmp-doc td { display: block; width: 100%; }
  table.cmp-doc tr { border: 1px solid var(--line); border-radius: var(--radius);
    background: var(--surface); margin-bottom: 12px; padding: 6px 0; }
  table.cmp-doc tbody tr:last-child { margin-bottom: 0; }
  table.cmp-doc td { border-bottom: 0; padding: 4px 16px; }
  table.cmp-doc td:first-child { color: var(--text); font-weight: 700; font-size: 15px; padding-top: 13px; }
  table.cmp-doc td:last-child { padding-bottom: 14px; }
  /* Bảng nhiều cột (bảng khung pháp lý ở /legal): xếp dọc thì mất hàng tiêu đề
     nên từng ô tự mang nhãn của cột. Ô đầu là tên văn bản, đã rõ nghĩa nên
     không gắn data-nhan-vi và cũng không sinh nhãn. */
  table.cmp-doc td[data-nhan-vi]::before {
    content: attr(data-nhan-vi); display: block; margin-bottom: 2px;
    font-size: 11px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--cyan);
  }
  html[lang="en"] table.cmp-doc td[data-nhan-en]::before { content: attr(data-nhan-en); }
  table.cmp-doc td[data-nhan-vi] { padding-top: 10px; }
}

/* ---------- FAQ ---------- */
.faq details { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 0; margin-top: 12px;
  transition: border-color .2s; }
.faq details:hover { border-color: var(--line-strong); }
.faq details[open] { border-color: rgba(0, 212, 255, .38); }
.faq summary { padding: 16px 52px 16px 20px; font-weight: 600; line-height: 1.55; cursor: pointer;
  list-style: none; position: relative; color: var(--text); transition: color .18s; }
.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: #fff; }
.faq summary:focus-visible { outline: 3px solid var(--cyan); outline-offset: -3px; border-radius: var(--radius); }
.faq summary::after { content: "+"; position: absolute; right: 20px; top: 50%; transform: translateY(-50%);
  font-size: 21px; line-height: 1; color: var(--cyan); }
.faq details[open] summary { color: #fff; }
.faq details[open] summary::after { content: "–"; }
.faq details p { padding: 0 20px 18px; font-size: 15px; line-height: 1.7; }

/* ---------- CTA band ---------- */
.cta-band { background: var(--surface); border: 1px solid var(--line); border-radius: 16px; padding: 52px 40px; text-align: center; color: #fff;
  position: relative; overflow: hidden; }
.cta-band::before { content: ""; position: absolute; inset: 0;
  background: radial-gradient(600px 260px at 50% 0%, rgba(0, 212, 255, .16), transparent 65%); }
.cta-band > * { position: relative; }
.cta-band h2 { color: #fff; }
.cta-band p { color: var(--muted); }

/* ---------- Form ---------- */
.form-grid { display: grid; grid-template-columns: 1.4fr .6fr; gap: 34px; margin-top: 30px; }
/* Trang /contact có tiêu đề "Form tư vấn" nằm trong cột trái, nên cột phải phải
   lùi xuống đúng chiều cao tiêu đề để mép trên hai khối bằng nhau. Tính theo
   công thức của h2 (cỡ chữ clamp, line-height 1.25, margin-bottom 14px) thay vì
   số px cứng, để còn đúng khi cỡ chữ co theo bề rộng màn hình. */
#form .form-grid > .contact-side { margin-top: calc(clamp(24px, 3vw, 32px) * 1.25 + 14px); }
form.lead-form { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 28px; box-shadow: var(--shadow); }
.lead-form label { display: block; font-size: 13.5px; font-weight: 600; line-height: 1.5; margin: 0 0 6px; color: #E2EAF2; }
.lead-form .req { color: #FF8589; font-weight: 700; margin-left: 3px; }
.lead-form input, .lead-form select, .lead-form textarea {
  /* display:block là bắt buộc: mặc định input là inline-block nên nằm trên một
     line box, phần chân chữ của line box đội thêm ~37px trống dưới mỗi ô. */
  display: block;
  width: 100%; padding: 12px 14px; border: 1.5px solid var(--line-strong); border-radius: 7px;
  font: inherit; font-size: 15px; line-height: 1.5; color: var(--text); background: var(--bg-alt);
  transition: border-color .18s, box-shadow .18s;
}
/* Chỉ cho kéo dọc: kéo ngang làm ô rộng quá khung form, vỡ bố cục 2 cột
   và tràn ra ngoài thẻ. */
.lead-form textarea { resize: vertical; min-height: 88px; }
/* Bố cục form một cột: mỗi trường một dòng, kể cả ở khổ rộng. Class .o-doi trong
   HTML là dấu vết của bố cục 2 cột cũ, giữ lại cho khỏi phải sửa 12 trang nhưng
   không còn tác dụng chia cột. */
/* align-content/align-self: start là bắt buộc. Thẻ form nằm trong .form-grid nên
   bị kéo cao bằng cột thẻ liên hệ bên phải (677px), rồi lưới bên trong lại chia
   đều phần dư đó cho từng hàng: mỗi ô nhập bị đội thêm ~33px trống ở dưới, nhìn
   như form bị hở lung tung. Cho form cao đúng bằng nội dung là hết. */
.lead-form { display: grid; grid-template-columns: 1fr; row-gap: 18px;
  align-content: start; align-self: start; }
.lead-form > * { grid-column: 1 / -1; }
/* Nhãn không cần margin trên nữa: khoảng cách giữa các hàng do row-gap lo */
.lead-form .o > label:first-child { margin-top: 0; }
/* Nút gửi nằm trong ô lưới rộng bằng cả form nên mặc định bị kéo rộng theo.
   Cho co lại vừa chữ, canh trái theo mép các ô nhập. */
/* align-self: start là bắt buộc — ô lưới của nút cao 99px (gồm cả margin),
   mà mặc định grid kéo giãn item cho đầy ô nên nút phình lên 83px. */
.lead-form button[type="submit"] { justify-self: start; align-self: start;
  width: auto; min-width: 190px; white-space: nowrap; margin-top: 10px; }
@media (max-width: 640px) {
  /* Khổ hẹp thì nút full width cho dễ bấm */
  .lead-form button[type="submit"] { width: 100%; }
}

.lead-form input:hover, .lead-form select:hover, .lead-form textarea:hover { border-color: #2E4A6B; }
.lead-form input:focus, .lead-form select:focus, .lead-form textarea:focus {
  outline: none; border-color: var(--cyan); box-shadow: 0 0 0 3px rgba(0, 212, 255, .16);
}
/* Chỉ báo lỗi sau khi người dùng đã nhập, không cảnh báo ngay khi form còn trống */
.lead-form input:user-invalid, .lead-form select:user-invalid, .lead-form textarea:user-invalid { border-color: #E5484D; }
/* Ô chọn dịch vụ. Mũi tên mặc định của hệ điều hành là hình tam giác xám đặc,
   trên nền tối trông như lỗi hiển thị và không ăn nhập với bộ điều khiển còn lại.
   Tắt appearance rồi tự vẽ mũi tên bằng SVG nội tuyến: không tốn thêm request,
   đổi màu theo bảng màu thương hiệu, và giống nhau trên mọi hệ điều hành.
   Phải đặt SAU quy tắc gộp input/select/textarea ở trên, vì quy tắc đó dùng
   shorthand `background` — viết trước thì background-image bị xoá mất. */
.lead-form select {
  cursor: pointer;
  -webkit-appearance: none; -moz-appearance: none; appearance: none;
  padding-right: 44px;                     /* chừa chỗ cho mũi tên, chữ dài không đè lên */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300D4FF' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 17px;
}
/* Vệt ngăn giữa vùng chữ và mũi tên, cho thấy đây là ô bấm ra danh sách chứ
   không phải ô gõ chữ như ba ô phía trên. */
.lead-form select:hover, .lead-form select:focus {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237DE3FF' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
}
/* Danh sách xổ ra do hệ điều hành vẽ, chỉ đổi được màu nền và màu chữ.
   Đặt cùng tông thẻ để không loé lên nền trắng giữa trang tối. */
.lead-form select option { background: var(--surface); color: var(--text); padding: 8px; }

.contact-side .card { margin-bottom: 16px; }

/* Thẻ liên hệ xếp ngang ở mọi khổ: biểu tượng bên trái, tiêu đề và nội dung
   xếp chồng bên phải. Kiểu dọc cũ (biểu tượng một dòng, tiêu đề một dòng, nội
   dung một dòng) làm thẻ cao gần 180px mà chữ chỉ chiếm một góc. */
.contact-side .card.card-mau {
  display: grid; grid-template-columns: auto 1fr; column-gap: 14px;
  align-items: center; padding: 18px 22px;
}
.contact-side .card.card-mau .icon-mau {
  grid-row: span 2; width: 44px; height: 44px; margin-bottom: 0;
}
.contact-side .card.card-mau h3 { margin: 0; font-size: 16px; align-self: end; }
.contact-side .card.card-mau p { margin: 2px 0 0; align-self: start; }
/* Số hotline vốn để 19px cho thẻ dọc, ở dạng ngang thì lấn tiêu đề */
.contact-side .card.card-mau p a[href^="tel:"] { font-size: 17px !important; }

/* Thẻ "Nhận được gì khi gửi yêu cầu" và "Ưu đãi đang có" cũng nằm trong
   .contact-side và cũng mang card-mau (để lấy vạch màu mép trên), nhưng bên
   trong là tiêu đề + danh sách chứ không phải biểu tượng + một dòng chữ. Nếu
   để nguyên lưới 2 cột ở trên thì tiêu đề rơi cột trái, danh sách rơi cột phải
   và thẻ cao vọt lên hơn 1.000px. Trả về bố cục khối bình thường. */
.contact-side .card.card-loi { display: block; padding: 22px 24px; }
.contact-side .card.card-loi h3 { margin: 0 0 12px; font-size: 17px; }
.contact-side .card.card-loi .checklist { margin: 0; }
.contact-side .card.card-loi .badge { display: inline-flex; }

/* Cột thẻ đứng cạnh form. KHÔNG kéo thẻ giãn ra cho bằng chiều cao form: thử
   rồi, thẻ cao 243px mà chữ chỉ hai dòng, nhìn to và rỗng hơn cả lúc đầu.
   Giữ thẻ đúng cỡ nội dung, chấp nhận cột ngắn hơn form. */
.contact-side { display: flex; flex-direction: column; gap: 14px; }
.contact-side .card { margin-bottom: 0; }

@media (max-width: 980px) {
  .contact-side { gap: 10px; }
  .contact-side .card.card-mau { padding: 15px 18px; }
  .contact-side .card.card-mau .icon-mau { width: 42px; height: 42px; }
  .contact-side .card.card-mau h3 { font-size: 15.5px; }
  .contact-side .card.card-mau p { font-size: 14px; margin-top: 1px; }
  .contact-side .card.card-mau p a[href^="tel:"] { font-size: 16.5px !important; }
}

label.consent { display: flex; gap: 11px; align-items: flex-start; font-size: 13.5px; font-weight: 400 !important;
  color: var(--muted); margin-top: 6px !important; line-height: 1.6; cursor: pointer; }
label.consent input[type="checkbox"] {
  appearance: none; -webkit-appearance: none;
  flex: 0 0 20px; width: 20px; height: 20px; margin: 2px 0 0; padding: 0;
  border: 1.5px solid var(--line-strong); border-radius: 5px; background: var(--bg-alt);
  display: grid; place-content: center; cursor: pointer;
  transition: background .18s, border-color .18s, box-shadow .18s;
}
label.consent input[type="checkbox"]::before {
  content: ""; width: 11px; height: 11px; background: #03101C; transform: scale(0);
  transition: transform .15s cubic-bezier(.2, .9, .3, 1.4);
  clip-path: polygon(14% 44%, 0 65%, 40% 100%, 100% 16%, 82% 0%, 38% 66%);
}
label.consent:hover input[type="checkbox"] { border-color: var(--cyan); }
label.consent input[type="checkbox"]:checked { background: var(--grad); border-color: var(--cyan); }
label.consent input[type="checkbox"]:checked::before { transform: scale(1); }
label.consent input[type="checkbox"]:focus-visible { outline: 3px solid var(--cyan); outline-offset: 2px; }
label.consent input[type="checkbox"]:user-invalid { border-color: #E5484D; }
/* #64748B chỉ đạt ~3.6:1 trên nền surface, nâng lên để qua ngưỡng 4.5:1 */
.disclaimer { font-size: 12.5px; color: #8296AD; margin-top: 16px; line-height: 1.6; }

/* ---------- Thu gọn khối chữ dài trên điện thoại (partials/xem-them-v2.html) ----------
   Cắt bớt bằng max-height rồi làm mờ dần phần cuối bằng mask thay vì phủ một
   dải gradient: khối này nằm trên nền có ảnh bản đồ, gradient màu đặc sẽ lộ
   thành vệt sáng không khớp nền. */
.nut-xem-them {
  display: none; margin-top: 12px; padding: 8px 0; background: none; border: 0;
  font: inherit; font-size: 14.5px; font-weight: 700; color: var(--cyan); cursor: pointer;
}
.nut-xem-them:hover { text-decoration: underline; }
@media (max-width: 640px) {
  /* --cao-thu do xem-them-v2.html đo: đúng bằng đoạn văn đầu tiên. 9em chỉ là
     mức dự phòng khi JS chưa chạy xong. Cắt trọn đoạn nên không cần làm mờ
     phần cuối nữa — chữ mờ dần vốn để che chỗ cắt giữa câu. */
  .thu-gon .thu-gon-noi-dung { max-height: var(--cao-thu, 9em); overflow: hidden; }
  .thu-gon.san-sang .thu-gon-noi-dung { transition: max-height .32s cubic-bezier(.4, 0, .2, 1); }
  .thu-gon.mo .thu-gon-noi-dung { max-height: none; }
  /* Người bật "giảm chuyển động" thì mở/đóng tức thì */
  @media (prefers-reduced-motion: reduce) {
    .thu-gon.san-sang .thu-gon-noi-dung { transition: none; }
  }
  .nut-xem-them { display: inline-block; }
}

/* ---------- Back to top (đồng bộ với index.html) ---------- */
#back-to-top {
  position: fixed; bottom: 32px; right: 24px; z-index: 90;
  width: 48px; height: 48px; border-radius: 50%;
  background: rgba(13, 27, 42, .9); border: 1px solid rgba(0, 212, 255, .3);
  backdrop-filter: blur(12px); cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  opacity: 0; transform: translateY(16px) scale(.85); pointer-events: none;
  transition: opacity .35s ease, transform .35s ease, box-shadow .3s ease, border-color .3s ease;
}
#back-to-top.visible { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
#back-to-top:hover { border-color: rgba(0, 212, 255, .8); box-shadow: 0 0 20px rgba(0, 212, 255, .25); }
#back-to-top:hover .arrow-icon { transform: translateY(-2px); }
#back-to-top .arrow-icon { transition: transform .25s ease; color: var(--cyan); }
#back-to-top .progress-ring { position: absolute; top: -1px; left: -1px; width: 50px; height: 50px;
  transform: rotate(-90deg); pointer-events: none; }
#back-to-top .progress-ring-track { fill: none; stroke: rgba(0, 212, 255, .12); stroke-width: 2; }
#back-to-top .progress-ring-fill { fill: none; stroke: var(--cyan); stroke-width: 2; stroke-linecap: round;
  stroke-dasharray: 113.1; stroke-dashoffset: 113.1; transition: stroke-dashoffset .1s linear; }
@media (max-width: 560px) { #back-to-top { bottom: 20px; right: 16px; } }

/* ---------- Emergency ---------- */
.emergency { border-left: 5px solid #E5484D; background: rgba(229, 72, 77, .08); border: 1px solid rgba(229, 72, 77, .3); border-left-width: 5px; border-radius: var(--radius); padding: 24px 28px; margin-top: 30px; }
.emergency h3 { color: #FF8589; }

/* ---------- Footer ---------- */
.site-footer { background: rgba(3,10,18,.88); color: var(--muted); padding: 60px 0 28px; font-size: 14px; border-top: 1px solid var(--line); }
.site-footer h4 { color: #fff; font-size: 14.5px; margin-bottom: 14px; font-weight: 700; }
.footer-grid { display: grid; grid-template-columns: 1.5fr 1.15fr .85fr .8fr .8fr 1.05fr; gap: 26px; }
/* 1100–1200px sáu cột bắt đầu chật, gộp thành ba cột cho dễ đọc */
@media (max-width: 1200px) { .footer-grid { grid-template-columns: repeat(3, 1fr); gap: 30px 26px; } }
.site-footer a { color: var(--muted); display: block; padding: 3px 0; }
/* Số điện thoại và email nằm giữa câu trong ô "Thông tin liên hệ": quy tắc
   display:block ở trên đẩy chúng xuống dòng riêng, đọc thành "Điện thoại:" một
   dòng rồi số một dòng. Trả về inline cho đúng mạch câu. */
.site-footer p a { display: inline; padding: 0; }
.site-footer a:hover { color: var(--teal); }
.site-footer img { height: 44px; width: auto; margin-bottom: 14px; }
.footer-bottom { border-top: 1px solid var(--line); margin-top: 40px; padding-top: 22px;
  display: flex; gap: 18px; flex-wrap: wrap; font-size: 13px; align-items: center; }
.footer-bottom .sp { flex: 1; }
.footer-bottom a { display: inline; }

/* Hero 2 cột: cột trái là chữ, cột phải là ảnh minh hoạ. Ở màn rộng, hero
   một cột chỉ dùng nửa trái khung nội dung nên nửa phải trống hẳn.
   PHẢI khai báo TRƯỚC khối Responsive bên dưới, nếu không quy tắc
   `.hero-grid { grid-template-columns: 1fr }` trong @media sẽ bị ghi đè
   và hero vẫn chia 2 cột trên điện thoại. */
.hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 52px; align-items: center; }
.hero-grid .lead { max-width: none; }   /* đã bị cột trái giới hạn, không cần 640px nữa */
.hero-grid .shot {
  border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-lg);
  background: rgba(13, 27, 42, .55); min-height: 320px;
  display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 24px; color: var(--muted); font-size: 14px;
}

/* Ảnh chụp màn hình sản phẩm. Ảnh nguồn đã có sẵn nền tối và bo góc nên
   KHÔNG thêm khung nữa, chỉ bo góc để cắt đúng mép. */
.shot-img {
  width: 100%; height: auto; border-radius: var(--radius);
  box-shadow: var(--shadow-lg);
}

/* ---------- Bấm ảnh để xem phóng to ---------- */
.shot-zoom {
  display: block; width: 100%; padding: 0; border: 0; background: none;
  position: relative; border-radius: var(--radius);
  -webkit-tap-highlight-color: transparent;
  cursor: zoom-in;   /* con trỏ kính lúp có dấu + sẵn có của trình duyệt */
}
.shot-zoom:focus-visible { outline: 3px solid var(--cyan); outline-offset: 3px; }

/* Huy hiệu chỉ dành cho thiết bị cảm ứng màn rộng (máy tính bảng nằm ngang):
   ở đó không có con trỏ để gợi ý ảnh bấm được, nhưng tính năng vẫn bật.
   Dưới 980px tính năng đã tắt nên không hiện gì. */
.zoom-badge { display: none; }
@media (hover: none) and (min-width: 981px) {
  .zoom-badge {
    display: flex; align-items: center; justify-content: center;
    position: absolute; right: 10px; bottom: 10px;
    width: 34px; height: 34px; border-radius: 8px;
    background: rgba(5, 11, 20, .82); border: 1px solid rgba(0, 212, 255, .5);
    color: var(--cyan); pointer-events: none;
  }
  .zoom-badge svg { width: 18px; height: 18px; }
}

/* Dưới 980px không mở rộng ảnh nữa: bỏ con trỏ kính lúp và viền tiêu điểm
   để ảnh không còn trông như bấm được. */
@media (max-width: 980px) {
  .shot-zoom { cursor: default; }
  .shot-zoom:focus-visible { outline: none; }
}

/* Khổ điện thoại: ảnh chụp giao diện cao 130–245px mà chữ trong ảnh gần như
   không đọc nổi, chiếm chỗ nhiều hơn giá trị mang lại. Cắt bớt chiều cao, giữ
   phần trên là phần có nội dung chính, và BẬT LẠI xem phóng to — ảnh đã bị cắt
   thì phải có đường xem đủ, nếu không là giấu mất nội dung. */
@media (max-width: 640px) {
  .shot-zoom .shot-img { max-height: 170px; object-fit: cover; object-position: top center; }
  .shot-zoom { cursor: zoom-in; }
  .shot-zoom:focus-visible { outline: 3px solid var(--cyan); outline-offset: 3px; }
  .zoom-badge {
    display: flex; align-items: center; justify-content: center;
    position: absolute; right: 10px; bottom: 10px;
    width: 32px; height: 32px; border-radius: 8px;
    background: rgba(5, 11, 20, .82); border: 1px solid rgba(0, 212, 255, .5);
    color: var(--cyan); pointer-events: none;
  }
  .zoom-badge svg { width: 17px; height: 17px; }
}

.lightbox {
  /* reset `* { margin: 0 }` ở đầu file xoá mất `margin: auto` mặc định của
     <dialog>, làm hộp thoại dính mép trái. Phải đặt lại. */
  margin: auto;
  border: 0; padding: 0; background: none; max-width: 96vw; max-height: 94vh;
  overflow: visible; color: var(--text);
}
.lightbox::backdrop { background: rgba(3, 8, 15, .88); backdrop-filter: blur(4px); }
.lightbox img {
  display: block; width: auto; height: auto;
  /* Lấy giá trị nhỏ hơn giữa bề rộng màn hình và bề rộng ảnh gốc: vừa không
     tràn ra ngoài màn hình nhỏ, vừa không phóng quá kích thước gốc gây vỡ nét.
     --anh-rong do JS đặt khi mở ảnh. */
  max-width: min(96vw, var(--anh-rong, 96vw));
  max-height: 94vh;
  border-radius: var(--radius); box-shadow: 0 24px 70px rgba(0, 0, 0, .7);
}
.lightbox-close {
  /* đặt bên trong góc ảnh, không thò ra ngoài: khi ảnh cao gần hết màn hình
     thì nút thò lên trên sẽ bị cắt mất */
  position: absolute; top: 10px; right: 10px; z-index: 1;
  width: 40px; height: 40px; border-radius: 50%; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface); border: 1px solid var(--line-strong); color: var(--text);
  transition: background .2s, border-color .2s, color .2s;
}
.lightbox-close svg { width: 20px; height: 20px; }
.lightbox-close:hover { background: var(--bg-alt); border-color: var(--cyan); color: var(--cyan); }
@media (max-width: 560px) {
  .lightbox-close { top: 6px; right: 6px; width: 36px; height: 36px; }
}

/* ---------- Mục lấy ảnh làm nền tràn cả section ----------
   PHẢI khai báo SAU .section-alt: shorthand `background` của .section-alt
   đặt background-image về none, cùng specificity nên thứ tự quyết định. */
.map-bg {
  padding: 104px 0;                  /* cao hơn mục thường để bản đồ có chỗ thở */
  background-color: rgba(8, 18, 33, .72);
  background-image: image-set(url("/assets/img/chung/luoi-toan-cau.webp") type("image/webp"),
                              url("/assets/img/chung/luoi-toan-cau.jpg")  type("image/jpeg"));
  background-repeat: no-repeat;
  background-position: 58% center;   /* lệch phải để cụm node dày nằm cạnh cột chữ */
  background-size: cover;
  overflow: hidden;
}
/* Lớp phủ chuyển dần: đặc ở trái cho chữ đọc được, nhạt dần sang phải để thấy bản đồ */
.map-bg::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  /* Giữ đậm hết bề ngang cột chữ (0–46%) rồi mới nhạt dần. Nếu để nhạt sớm,
     một node sáng nằm sau chữ sẽ kéo tương phản xuống. Ảnh nền là đồ họa mạng
     lưới trừu tượng (không dùng bản đồ, tránh rủi ro pháp lý về chủ quyền
     biển đảo) — xem assets/img/chung/luoi-toan-cau.*. */
  background: linear-gradient(90deg,
    rgba(5, 11, 20, .93) 0%,  rgba(5, 11, 20, .90) 46%,
    rgba(5, 11, 20, .40) 70%, rgba(5, 11, 20, .10) 100%);
}
.map-bg > .container { position: relative; z-index: 1; }
.map-bg-text { max-width: 560px; }

@media (max-width: 980px) {
  /* Màn hẹp không còn chỗ trống cho bản đồ, phủ đều và đậm hơn để chữ vẫn rõ */
  .map-bg { background-position: center; }
  .map-bg::before { background: rgba(5, 11, 20, .88); }
  .map-bg-text { max-width: none; }
}

/* Mục không có ảnh minh hoạ: chữ chạy hết 1232px sẽ dài hơn 110 ký tự mỗi
   dòng, rất khó đọc. Giới hạn bề rộng và canh giữa cho bằng nhịp các mục
   2 cột bên trên. `.split h2` đã có vạch nhấn nên thêm cả ở đây cho đồng bộ. */
.prose-center { max-width: 780px; margin: 0 auto; }
.prose-center h2 { position: relative; padding-top: 20px; }
.prose-center h2::before {
  content: ""; position: absolute; top: 0; left: 0;
  width: 52px; height: 4px; border-radius: 99px; background: var(--grad);
}

/* Khối chữ dài không kèm ảnh (trang Application Shield): tiêu đề giữ cột trái,
   nội dung sang cột phải. Dùng .prose-center thì cả khối co vào giữa, hai bên
   trống huơ mà dòng chữ vẫn ngắn; tách hai cột thì lấp hết bề ngang khung mà
   độ dài dòng đọc không đổi. */
.split-chu { display: grid; grid-template-columns: minmax(260px, 430px) 1fr;
  gap: 24px 56px; align-items: start; }
.split-chu h2 { position: relative; padding-top: 20px; margin: 0;
  text-wrap: balance; }   /* chia đều các dòng tiêu đề, tránh dòng cuối cụt một chữ */
.split-chu h2::before {
  content: ""; position: absolute; top: 0; left: 0;
  width: 52px; height: 4px; border-radius: 99px; background: var(--grad);
}
/* Dưới 900px hai cột thành một, tiêu đề nằm trên nội dung như cũ */
@media (max-width: 900px) {
  .split-chu { grid-template-columns: 1fr; gap: 14px; }
}

/* ---------- Hiện dần theo cuộn ----------
   CSS chỉ ẩn khi <html> có lớp `js-reveal`. Lớp đó do một thẻ script nhỏ trong
   <head> gắn vào, nên khi JS hỏng hoặc bị tắt thì nội dung hiện bình thường
   thay vì trắng trang. */
.js-reveal .reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity .5s cubic-bezier(.22,.61,.36,1), transform .5s cubic-bezier(.22,.61,.36,1);
  will-change: opacity, transform;
}
.js-reveal .reveal.hien { opacity: 1; transform: none; }

/* Ảnh hero vào từ dưới nhiều hơn một chút cho có chiều sâu */
.js-reveal .hero-shot.reveal { transform: translateY(28px) scale(.985); }
.js-reveal .hero-shot.reveal.hien { transform: none; }

@media (prefers-reduced-motion: reduce) {
  .js-reveal .reveal { opacity: 1; transform: none; transition: none; }
}

/* ---------- Responsive ---------- */
@media (max-width: 980px) {
  .hero-grid, .split, .form-grid { grid-template-columns: 1fr; margin-top: 10px; }
  #form .form-grid > .contact-side { margin-top: 0; }   /* xếp dọc thì không còn tiêu đề bên trái để căn */
  .hero-grid .shot { min-height: 200px; }

  /* Xếp dọc thì 48px giữa chữ và ảnh là quá thưa, trông rời rạc */
  .hero-grid, .split { gap: 24px; }

  /* Bố cục zigzag trên desktop khiến một nửa số mục có ảnh đứng TRƯỚC chữ trong
     DOM. Khi xếp dọc, người đọc gặp ảnh trước cả tiêu đề nên không biết đang
     xem gì. Đảo lại: chữ trước, ảnh sau, cho mọi mục. */
  .split > div, .hero-grid > div { order: 1; }
  .split > .shot-zoom, .split > .shot,
  .hero-grid > .shot-zoom, .hero-grid > .shot { order: 2; }

  /* padding 104px đặt cho desktop, giữ nguyên ở mobile sẽ tạo 156px trống
     liền mạch giữa mục bản đồ và mục kế tiếp */
  .map-bg { padding: 52px 0; }
  .grid-4 { grid-template-columns: repeat(2, 1fr); }
  .grid-3 { grid-template-columns: repeat(2, 1fr); }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .stats { grid-template-columns: repeat(2, 1fr); }
  section { padding: 24px 0; }
}
@media (max-width: 560px) {
  /* logo có tagline quá rộng cho màn nhỏ; ẩn tagline giống cách blog ẩn bớt mục nav */
  .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
  .stats { grid-template-columns: repeat(2, 1fr); }
  .footer-grid { grid-template-columns: 1fr; }
  .btn { width: 100%; text-align: center; }
  .btn-row { flex-direction: column; }
}

/* ---------- Chân trang trên điện thoại ----------
   Một cột dọc 21 liên kết làm chân trang cao 1.520px ở khổ 360px, cuộn mãi
   không hết. Bốn nhóm liên kết xếp 2 cột, còn ô thương hiệu và ô liên hệ (câu
   dài) vẫn tràn hết bề ngang. Vùng bấm nâng lên 44px theo chuẩn cảm ứng. */
/* Vùng bấm 44px áp cho mọi khổ có cảm ứng (điện thoại lẫn máy tính bảng),
   không chỉ dưới 640px: ở 768px liên kết vẫn chỉ cao 29px. */
@media (max-width: 980px) {
  .site-footer a { min-height: 44px; display: flex; align-items: center; padding: 0; }
  .site-footer p a, .footer-bottom a { min-height: 0; display: inline; }
}
@media (max-width: 640px) {
  .site-footer { padding: 40px 0 22px; }
  .footer-grid { grid-template-columns: 1fr 1fr; gap: 24px 18px; }
  .footer-grid > :nth-child(-n+2) { grid-column: 1 / -1; }
  .site-footer h4 { margin-bottom: 6px; }
  /* Tên chính sách dài ("Chính sách bảo vệ dữ liệu cá nhân") xuống 2 dòng trong
     cột hẹp; giãn dòng chặt lại cho khối gọn mà vẫn đủ 44px vùng bấm. */
  .site-footer a { line-height: 1.35; padding: 6px 0; }
  .footer-bottom { margin-top: 24px; justify-content: center; text-align: center; gap: 8px; }
  .footer-bottom .sp { display: none; }
}


/* ---------- Nền, chép nguyên văn từ index.html của site hiện tại ---------- */
.grid-bg { background-image: linear-gradient(rgba(0,212,255,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(0,212,255,0.03) 1px, transparent 1px); background-size: 60px 60px; }
.hero-glow { position: absolute; border-radius: 50%; filter: blur(80px); pointer-events: none; }
.glow-line { height: 1px; background: linear-gradient(90deg, transparent, var(--cyan), transparent); }
/* orb nằm dưới nội dung hero (.hero đã có position:relative + overflow:hidden ở trên) */
.hero > .container { z-index: 1; }

/* ---------- Hat nen, chep nguyen van tu index.html ---------- */
#particles { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; }
/* canvas la fixed z-index:0 nen noi dung phai duoc nang len tren.
   KHÔNG đưa .site-header vào đây: quy tắc này nằm cuối file nên sẽ ghi đè
   position:sticky + z-index:50 ở trên, làm header hết dính và dropdown chui
   xuống dưới nội dung. Header tự nó đã có position + z-index riêng. */
.breadcrumb, section, .site-footer { position: relative; z-index: 1; }

