/* ==========================================================================
   Tinlai Creative — Design System
   --------------------------------------------------------------------------
   Design read : redesign-overhaul cho site marketing của studio sản xuất
                 video Nhật -> Việt. Khách: ban lãnh đạo doanh nghiệp Nhật.
                 Ngôn ngữ corporate-editorial tiết chế.
   Style       : Editorial Grid / Magazine (#66) + Exaggerated Minimalism (#47)
                 tra từ DB của skill ui-ux-pro-max. Bố cục text dùng đúng bộ
                 khí cụ của báo in: drop cap, pull quote, chữ nhiều cột,
                 nhãn treo lề, độ dài dòng lệch nhau có chủ ý.
   Dials       : VARIANCE 8 · MOTION 5 · DENSITY 4
   Theme lock  : SÁNG toàn trang. Hero là khuôn hình phim tối, khối đóng trang
                 và chân trang là dải tối. Không đảo theme giữa các mục sáng.
   Shape lock  : góc vuông toàn bộ (radius 0).
   Accent lock : đúng MỘT accent, xanh cobalt thương hiệu. Không đỏ.
   Type        : heading + display = Fraunces weight 400, trục WONK tắt
                 (đã kiểm tra có subset tiếng Việt). Body Be Vietnam Pro,
                 nhãn Plus Jakarta Sans. Fraunces italic 600 cho wordmark logo.
                 Heading nhấn bằng màu, không bằng chữ nghiêng và không đổi
                 họ chữ giữa câu.
   Dash        : không dùng gạch dài ở bất kỳ chuỗi nào người dùng đọc.
   ========================================================================== */

/* ---------- LỚP 1: PRIMITIVE TOKENS (giá trị thô) ---------------------- */
:root {
  /* neutral lạnh — một họ xám duy nhất, không pha xám ấm */
  --c-white:    #ffffff;
  --c-paper:    #f7f8fa;
  --c-paper-2:  #eef1f5;
  --c-line:     #e2e6ec;
  --c-line-2:   #cbd3dd;
  --c-ink:      #0f1622;   /* off-black, không dùng #000 */
  --c-ink-2:    #46505f;
  --c-ink-3:    #6b7583;

  /* accent: đúng một họ xanh */
  --c-blue:     #0b6fd0;
  --c-blue-dk:  #08508f;
  --c-blue-lt:  #4aa3f0;
  --c-navy:     #0a2540;
  --c-navy-dk:  #06182b;

  /* type */
  --f-sans:   "Be Vietnam Pro", "Segoe UI", system-ui, sans-serif;
  --f-label:  "Plus Jakarta Sans", system-ui, sans-serif;
  --f-mark:   "Fraunces", Georgia, serif;      /* CHỈ wordmark logo, italic 600 */
  /* Chữ hiển thị = Fraunces weight 400, TẮT trục WONK (chủ web chọn sau khi
     xem so sánh 6 phương án ở /font-test.html; 600 + WONK bật thì dày và quirky).
     ---------------------------------------------------------------------
     BẢN TIẾNG NHẬT: không cần đổi font. Trình duyệt rơi fallback theo TỪNG
     KÝ TỰ, nên trong cùng một câu Fraunces lo chữ Latin/Việt còn Noto Serif JP
     lo kana/kanji. Đó là cách xếp font CJK chuẩn: Latin trước, CJK sau.
     Việc phải làm khi dựng bản JP chỉ là:
       1. thêm <link> tải Noto Serif JP trong Base.astro (đã ghi sẵn ở đó),
       2. đặt lang="ja" trên <html>, khối `:lang(ja)` bên dưới tự áp metric.
     Không tải Noto Serif JP ở bản tiếng Việt: CSS của nó có 124 lát
     unicode-range (~29KB gzip) mà bản Việt không dùng lát CJK nào. */
  --f-display: "Fraunces", "Noto Serif JP", Georgia, serif;

  /* thang chữ fluid */
  --t-xs:   .72rem;
  --t-sm:   .84rem;
  --t-base: 1rem;
  --t-md:   clamp(1.05rem, .4vw + .95rem, 1.2rem);
  --t-lg:   clamp(1.25rem, 1vw + 1rem, 1.6rem);
  --t-xl:   clamp(1.6rem, 2vw + 1.1rem, 2.3rem);
  --t-2xl:  clamp(2rem, 3vw + 1.2rem, 3.1rem);
  --t-3xl:  clamp(2.3rem, 4.2vw + 1rem, 4.1rem);
  /* thang chữ khổ lớn cho ngôn ngữ editorial: tiêu đề section và slogan
     phải đủ lớn để chính nó là hình ảnh, không cần đồ trang trí */
  --t-head: clamp(1.85rem, 3.5vw, 3.15rem);
  --t-mega: clamp(2.1rem, 6vw, 5.4rem);

  /* nhịp dọc */
  --s-1: .5rem;
  --s-2: .875rem;
  --s-3: 1.4rem;
  --s-4: 2.2rem;
  --s-5: 3.4rem;
  --s-6: 5rem;
  --s-sec: clamp(4.5rem, 9vw, 8rem);

  /* motion */
  --e-out: cubic-bezier(.16, 1, .3, 1);
  --e-io:  cubic-bezier(.65, 0, .35, 1);
}

/* ---------- LỚP 2: SEMANTIC TOKENS (đặt tên theo công dụng) ------------ */
:root {
  --bg:            var(--c-paper);
  --bg-raised:     var(--c-white);
  --bg-sunken:     var(--c-paper-2);
  --bg-inverse:    var(--c-navy-dk);

  --text:          var(--c-ink);
  --text-muted:    var(--c-ink-2);
  --text-faint:    var(--c-ink-3);
  --text-on-dark:  #e6ecf3;
  --text-on-dark-muted: #9fb0c3;

  --accent:        var(--c-blue);
  --accent-press:  var(--c-blue-dk);
  --accent-on-dark: var(--c-blue-lt);

  --rule:          var(--c-line);
  --rule-strong:   var(--c-line-2);
  --rule-on-dark:  rgba(255, 255, 255, .14);

  --radius:        0;          /* shape lock */
  --wrap:          1300px;
  --hdr-h:         72px;       /* cap 80px theo skill */
}

/* ---------- RESET ------------------------------------------------------ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--f-sans);
  font-size: var(--t-base);
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  /* Sticky footer: trang ngắn (404, Liên hệ trên màn cao) mà không có cái này
     thì chân trang kết thúc trước đáy viewport và lộ nền sáng của body
     thành một dải trắng bên dưới. Dùng dvh để không nhảy trên iOS Safari. */
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}
main { flex: 1 0 auto; }

img, svg { display: block; max-width: 100%; }
/* <picture> mặc định là inline nên chuỗi height:100% từ khung xuống <img>
   bị đứt. Cho nó thành block chiếm đủ khung để object-fit hoạt động đúng. */
picture { display: block; width: 100%; height: 100%; }

/* Một pattern duy nhất cho mọi khung ảnh: KHUNG giữ tỷ lệ, ẢNH phủ kín khung.
   Không đặt aspect-ratio lên <img>: thuộc tính height="..." trên thẻ img là
   một presentational hint, làm cả hai chiều thành definite và aspect-ratio
   bị bỏ qua (ảnh sẽ cao đúng bằng height gốc). */
.cell-media, .split-media, .sw-media { display: block; overflow: hidden; }
.cell-media img, .split-media img, .sw-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
a { color: inherit; text-decoration: none; }
ul { list-style: none; }
button { font: inherit; background: none; border: 0; color: inherit; cursor: pointer; }

::selection { background: var(--accent); color: #fff; }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}
[id] { scroll-margin-top: calc(var(--hdr-h) + 1.5rem); }

h1, h2, h3, h4 {
  font-family: var(--f-display);
  font-weight: 400;
  line-height: 1.26;
  letter-spacing: -.014em;
  text-wrap: balance;
  /* opsz là trục cỡ chữ quang học, dùng bình thường. WONK giữ 0: đó là trục
     làm lệch nét kiểu quirky, bật lên là mất vẻ tinh tế. */
  font-variation-settings: "opsz" 48, "WONK" 0;
}
/* Khổ display lớn: mở opsz tối đa để nét mảnh hơn, siết chữ lại một chút. */
h1, .display-xl {
  font-variation-settings: "opsz" 144, "WONK" 0;
  letter-spacing: -.022em;
}
/* Cỡ nhỏ cần thêm chút thân chữ mới đủ rõ, 400 sẽ mảnh quá. */
h3, h4 { font-weight: 500; }

/* ==========================================================================
   BẢN TIẾNG NHẬT
   Kana/kanji do Noto Serif JP đảm nhiệm qua fallback từng ký tự. Nhưng
   metric của Mincho khác Latin, nên phải bù lại chứ không dùng chung số:
   - tracking ÂM là sai với CJK, chữ vuông sẽ dính nhau
   - Mincho cần leading thoáng hơn Latin
   - Noto Serif JP 400 mảnh hơn Fraunces 400 ở cùng cỡ, nâng lên 500
   - text-wrap: balance gần như vô dụng với CJK; line-break: strict mới
     áp đúng luật kinsoku (không để dấu câu đứng đầu dòng)
   ========================================================================== */
/* Be Vietnam Pro và Plus Jakarta Sans KHÔNG có glyph tiếng Nhật, nên bản JP
   phải chèn Noto Sans JP vào ngăn xếp. Đặt sau font Latin để chữ Latin trong
   câu tiếng Nhật (tên riêng, Tinlai, SNS) vẫn giữ đúng dáng của bản Việt. */
:lang(ja) {
  --f-sans:  "Be Vietnam Pro", "Noto Sans JP", "Segoe UI", system-ui, sans-serif;
  --f-label: "Plus Jakarta Sans", "Noto Sans JP", system-ui, sans-serif;
}

:lang(ja) h1,
:lang(ja) h2,
:lang(ja) h3,
:lang(ja) h4,
:lang(ja) .display-xl,
:lang(ja) .pull,
:lang(ja) .stmt-lead,
:lang(ja) .manifesto-lead,
:lang(ja) .creed p,
:lang(ja) .tenet-k {
  letter-spacing: .01em;
  line-height: 1.52;
  font-weight: 500;
  text-wrap: initial;
  line-break: strict;
  word-break: normal;
}
/* Tiếng Nhật không có dấu cách nên trình duyệt được phép ngắt dòng ở BẤT KỲ
   ký tự nào, kể cả giữa cụm chữ đang được tô màu nhấn (「人らしさ」 -> 人ら /
   しさ). Cụm nhấn bị cắt đôi thì mất luôn ý nghĩa của việc nhấn. inline-block
   biến cả cụm thành một khối không tách được, nên dòng sẽ ngắt TRƯỚC nó. */
:lang(ja) h1 em,
:lang(ja) h2 em { display: inline-block; }

/* Thân bài tiếng Nhật cũng cần leading thoáng hơn và không siết chữ. */
:lang(ja) body,
:lang(ja) p {
  line-height: 1.9;
  letter-spacing: .01em;
}
/* Drop cap không dùng được với tiếng Nhật: ::first-letter trên một kanji
   sẽ cho một khối vuông khổng lồ, không phải hiệu ứng chữ hoa mở đầu. */
:lang(ja) .dropcap::first-letter {
  float: none;
  font-size: inherit;
  line-height: inherit;
  padding: 0;
  color: inherit;
}

/* ==========================================================================
   BỐ CỤC TEXT KIỂU BÁO IN
   Bộ khí cụ để chữ tự tạo nhịp, thay vì mọi đoạn đều cùng một khối giữa trang.
   ========================================================================== */

/* Chữ cái đầu khổ lớn. Chỉ dùng MỘT lần mỗi trang, ở đoạn mở đầu. */
.dropcap::first-letter {
  float: left;
  font-family: var(--f-display);
  font-weight: 500;
  font-size: 4.1em;
  line-height: .84;
  padding: .04em .1em 0 0;
  color: var(--accent);
}

/* Câu trích rút ra khỏi mạch văn, có gạch accent phía trên. */
.pull {
  font-family: var(--f-display);
  font-weight: 500;
  font-size: clamp(1.35rem, 2.5vw, 2.15rem);
  line-height: 1.38;
  letter-spacing: -.018em;
  padding-top: var(--s-3);
  border-top: 2px solid var(--accent);
  max-width: 28ch;
}

/* Nhãn treo ở lề trái, nội dung bên phải. Tạo cột lề đặc trưng của báo in. */
.hang {
  display: grid;
  grid-template-columns: 11rem minmax(0, 1fr);
  gap: clamp(1.2rem, 3vw, 3rem);
  align-items: start;
}
.hang-l {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--text-faint);
  padding-top: .45em;
}
.on-dark .hang-l { color: var(--accent-on-dark); }

/* Độ dài dòng lệch nhau có chủ ý, tránh mọi đoạn cùng một bề ngang. */
.measure-short { max-width: 34ch; }
.measure-mid   { max-width: 48ch; }
.measure-long  { max-width: 66ch; }
/* nhấn trong tiêu đề: CÙNG họ chữ, phân biệt bằng màu + độ đậm.
   Không chèn font khác vào giữa câu (mixed-family emphasis là amateur). */
h1 em, h2 em, h3 em {
  font-style: normal;
  font-weight: 800;
  color: var(--accent);
}

p { text-wrap: pretty; }

/* ---------- LAYOUT PRIMITIVES ----------------------------------------- */
.wrap {
  width: min(var(--wrap), 100% - clamp(2rem, 7vw, 6rem));
  margin-inline: auto;
}

.sec { padding: var(--s-sec) 0; }
.sec-raised { background: var(--bg-raised); border-block: 1px solid var(--rule); }
.sec-sunken { background: var(--bg-sunken); }
.sec-tight { padding-top: 0; }

.skip {
  position: absolute;
  top: -100%;
  left: 1rem;
  z-index: 200;
  padding: .6rem 1.1rem;
  background: var(--bg-inverse);
  color: #fff;
  font-family: var(--f-label);
  font-size: var(--t-sm);
}
.skip:focus { top: 1rem; }

/* Nhãn nhỏ chữ hoa. NGÂN SÁCH: tối đa 1 nhãn / 3 section.
   Đếm thủ công trước khi ship. */
.label {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--text-faint);
}

/* ---------- TYPOGRAPHY BLOCKS ----------------------------------------- */
/* Tiêu đề section dùng thang chữ lớn để chính nó là hình ảnh của mục. */
.h-sec {
  font-size: var(--t-head);
  letter-spacing: -.024em;
  max-width: 26ch;
}
/* Tiêu đề + phần dẫn xếp DỌC, không dùng kiểu "tiêu đề trái, đoạn nhỏ
   trôi nổi bên phải" (split-header) — skill ban cái đó. */
.sub-sec {
  margin-top: var(--s-3);
  max-width: 58ch;
  color: var(--text-muted);
  font-size: var(--t-md);
}

.prose > * + * { margin-top: var(--s-3); }
.prose p { color: var(--text-muted); max-width: 62ch; }
.prose strong { color: var(--text); font-weight: 600; }

/* ---------- BUTTONS & LINKS ------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  white-space: nowrap;               /* CTA không được xuống 2 dòng */
  padding: .9rem 1.75rem;
  border: 1px solid transparent;
  border-radius: var(--radius);
  font-family: var(--f-label);
  font-size: var(--t-sm);
  font-weight: 600;
  letter-spacing: .04em;
  position: relative;
  overflow: hidden;
  transition: background .3s var(--e-io), color .3s var(--e-io),
              border-color .3s var(--e-io), transform .12s ease;
}
.btn:active { transform: translateY(1px); }
.btn > * { position: relative; z-index: 1; }

/* nền accent + chữ trắng: 4.6:1, đạt WCAG AA */
.btn-solid { background: var(--accent); color: #fff; }
.btn-solid::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--c-navy);
  transform: translateY(101%);
  transition: transform .38s var(--e-io);
}
.btn-solid:hover::before { transform: translateY(0); }

/* nút phụ trên nền sáng: viền đậm, chữ mực. Tương phản 13:1 */
.btn-ghost { color: var(--text); border-color: var(--rule-strong); }
.btn-ghost:hover { background: var(--text); border-color: var(--text); color: #fff; }

/* trên ảnh tối: nền trắng đặc, không dùng nút trong suốt trên ảnh */
.btn-onmedia { background: #fff; color: var(--c-navy-dk); }
.btn-onmedia:hover { background: var(--accent); color: #fff; }
.btn-ghostmedia { color: #fff; border-color: rgba(255, 255, 255, .55); }
.btn-ghostmedia:hover { background: #fff; color: var(--c-navy-dk); border-color: #fff; }

.tlink {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  font-family: var(--f-label);
  font-size: var(--t-sm);
  font-weight: 600;
  color: var(--accent);
  padding-bottom: .3rem;
  border-bottom: 1px solid var(--rule-strong);
  transition: color .3s, border-color .3s, gap .3s var(--e-out);
}
.tlink:hover { color: var(--accent-press); border-bottom-color: var(--accent); gap: .85rem; }
.tlink svg { flex: none; transition: transform .3s var(--e-out); }
.tlink:hover svg { transform: translateX(3px); }
.on-dark .tlink,
.close .tlink { color: var(--accent-on-dark); border-bottom-color: var(--rule-on-dark); }
.on-dark .tlink:hover,
.close .tlink:hover { color: #fff; border-bottom-color: #fff; }

/* ---------- HEADER ---------------------------------------------------- */
/* Trạng thái nền do IntersectionObserver quyết định (xem main.js).
   KHÔNG dùng scroll listener. */
.hdr {
  position: fixed;
  inset: 0 0 auto;
  z-index: 100;
  border-bottom: 1px solid transparent;
  transition: background .35s ease, border-color .35s ease, backdrop-filter .35s ease;
}
.hdr-in {
  height: var(--hdr-h);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
}
.hdr.solid {
  background: rgba(247, 248, 250, .92);
  backdrop-filter: blur(14px);
  border-bottom-color: var(--rule);
}

/* logo: wordmark serif (quyết định của chủ web, giữ nguyên) */
.mark {
  display: flex;
  flex-direction: column;
  line-height: 1.08;
  color: var(--text);
  transition: color .35s ease;
}
.mark b {
  font-family: var(--f-mark);
  font-style: italic;
  font-weight: 600;
  font-size: 1.5rem;
  letter-spacing: -.012em;
  /* italic có chữ có nét xuống: chừa chỗ để không bị cắt chân */
  line-height: 1.1;
  padding-bottom: .04em;
}
.mark span {
  font-family: var(--f-label);
  font-size: .55rem;
  font-weight: 600;
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-top: .3rem;
  transition: color .35s ease;
}

.nav { display: flex; gap: 1.9rem; }
.nav a {
  position: relative;
  padding: .3rem 0;
  font-family: var(--f-label);
  font-size: var(--t-sm);
  font-weight: 500;
  color: var(--text-muted);
  transition: color .3s;
}
.nav a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1.5px;
  background: var(--accent);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform .35s var(--e-io);
}
.nav a:hover { color: var(--text); }
.nav a:hover::after,
.nav a[aria-current="page"]::after { transform: scaleX(1); transform-origin: left; }
.nav a[aria-current="page"] { color: var(--accent); }

.hdr-cta { padding: .68rem 1.3rem; }

/* nhóm bên phải header: chọn ngôn ngữ + nút Liên hệ.
   Gom lại để khi ẩn nút CTA ở mobile, bộ chọn ngôn ngữ vẫn đứng nguyên chỗ. */
.hdr-end { display: flex; align-items: center; gap: 1.2rem; }

/* ---------- CHỌN NGÔN NGỮ ---------------------------------------------- */
/* Không đóng khung, không nền: chỉ hai lá cờ. Cờ đang tắt bị khử màu và mờ đi,
   cờ đang bật giữ nguyên màu. Nhờ vậy nhận ra ngôn ngữ hiện tại bằng MÀU chứ
   không phải bằng một hộp viền, đúng ngôn ngữ thị giác chung của site. */
.lang-sw { display: flex; align-items: center; }
.lang-op {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  /* đệm dọc để vùng bấm cao khoảng 36px, cờ 14px thôi thì quá nhỏ để chạm */
  padding: .55rem 0;
  font-family: var(--f-label);
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .1em;
  color: var(--text-muted);
  opacity: .7;
  transition: opacity .3s, color .3s;
}
.lang-op + .lang-op {
  margin-left: .6rem;
  padding-left: .6rem;
  border-left: 1px solid var(--rule);
}
.lang-flag {
  display: inline-flex;
  line-height: 0;
  /* cờ Nhật gần như toàn trắng: không có viền là nó biến mất trên nền sáng */
  box-shadow: 0 0 0 1px rgba(10, 37, 64, .18);
  filter: saturate(0);
  transition: filter .3s;
}
.lang-op:hover { opacity: 1; color: var(--text); }
.lang-op:hover .lang-flag { filter: none; }
.lang-op[aria-current="true"] { opacity: 1; color: var(--text); }
.lang-op[aria-current="true"] .lang-flag { filter: none; }

/* hero tối: header trong suốt lúc ở đỉnh trang, chữ trắng */
body.has-media-hero .hdr:not(.solid) { border-bottom-color: rgba(255, 255, 255, .18); }
body.has-media-hero .hdr:not(.solid) .lang-op { color: rgba(255, 255, 255, .8); }
body.has-media-hero .hdr:not(.solid) .lang-op:hover,
body.has-media-hero .hdr:not(.solid) .lang-op[aria-current="true"] { color: #fff; }
body.has-media-hero .hdr:not(.solid) .lang-op + .lang-op { border-left-color: rgba(255, 255, 255, .28); }
body.has-media-hero .hdr:not(.solid) .lang-flag { box-shadow: 0 0 0 1px rgba(255, 255, 255, .45); }
body.has-media-hero .hdr:not(.solid) .mark { color: #fff; }
body.has-media-hero .hdr:not(.solid) .mark span { color: rgba(255, 255, 255, .66); }
body.has-media-hero .hdr:not(.solid) .nav a { color: rgba(255, 255, 255, .9); }
body.has-media-hero .hdr:not(.solid) .nav a:hover { color: #fff; }
body.has-media-hero .hdr:not(.solid) .nav a[aria-current="page"] { color: #fff; }
body.has-media-hero .hdr:not(.solid) .burger span { background: #fff; }

.burger {
  display: none;
  flex-direction: column;
  gap: 5px;
  padding: .5rem;
}
.burger span {
  width: 23px;
  height: 2px;
  background: var(--text);
  transition: transform .3s var(--e-io), opacity .2s;
}
.burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.menu {
  position: fixed;
  inset: var(--hdr-h) 0 0 0;
  z-index: 90;
  background: var(--bg-raised);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--s-3);
  padding: var(--s-4) 1.5rem;
  overflow-y: auto;
  opacity: 0;
  visibility: hidden;
  transition: opacity .3s ease, visibility .3s ease;
}
.menu.open { opacity: 1; visibility: visible; }
/* <nav> là MỘT flex item của .menu, nên nếu không tự xếp cột thì ba liên kết
   bên trong nằm sát nhau trên một dòng. Tiếng Việt còn lộ ra vài khoảng trắng
   nên trông chỉ hơi chật; tiếng Nhật không có dấu cách giữa từ nên ba mục dính
   liền thành một khối chữ. */
.menu nav {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-3);
}
.menu a:not(.btn) {
  font-family: var(--f-label);
  font-size: 1.3rem;
  font-weight: 600;
}
.menu a[aria-current="page"] { color: var(--accent); }
.menu .btn { margin-top: var(--s-3); }

/* ==========================================================================
   BAND — dải ảnh tràn viền, phá khung 1240px
   ========================================================================== */
.band {
  position: relative;
  width: 100%;
  aspect-ratio: 21 / 8;
  overflow: hidden;
  background: var(--c-navy-dk);
}
.band img { width: 100%; height: 100%; object-fit: cover; }
.band-cap {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: var(--s-4) 0 var(--s-3);
  background: linear-gradient(180deg, transparent, rgba(6, 14, 26, .78));
}
.band-cap p {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .88);
}

/* Đã bỏ dải chữ chạy (.strip) theo yêu cầu chủ web. Kèm theo đó bỏ luôn
   @keyframes slide vì không còn gì dùng tới nó. */

/* ==========================================================================
   SVC — dịch vụ: lưới báo in ba cột, MỌI THỨ THẲNG HÀNG.
   Ảnh minh họa nằm thẳng trong bố cục, ai cũng thấy, kể cả trên mobile.
   Không dùng ảnh nổi bám con trỏ: cách đó ẩn ảnh khỏi thiết bị cảm ứng.

   Trước đây tôi cho ba ô lệch tầng và ba tỷ lệ ảnh khác nhau để tránh mẫu
   "3 thẻ giống nhau xếp ngang". Sai: hai thứ đó cộng lại làm không còn một
   đường thẳng hàng nào, nên nó đọc ra thành lỗi bố cục chứ không ra chủ ý.
   Giờ khoá bốn đường thẳng hàng: hairline trên, mép trên ảnh, đáy ảnh, và
   dòng "Chi tiết" dưới cùng. Chất báo in đến từ hairline + nhãn + việc
   KHÔNG có khung thẻ, chứ không đến từ việc xô lệch mọi thứ.
   ========================================================================== */
.svc-set {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.2rem, 2.6vw, 2.4rem);
  align-items: stretch;          /* ba ô cao bằng nhau */
}

.svc-item {
  display: flex;
  flex-direction: column;
  border-top: 1px solid var(--rule-strong);
  padding-top: var(--s-3);
}

/* MỘT tỷ lệ duy nhất cho cả ba: cùng bề rộng cột nên đáy ảnh cũng thẳng hàng.
   4/3 gần với tỷ lệ gốc của ảnh (1400x980) nên cắt rất ít. */
.svc-fig {
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--bg-sunken);
  margin-bottom: var(--s-3);
}
.svc-fig img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .8s var(--e-out);
}
.svc-item:hover .svc-fig img { transform: scale(1.04); }

/* Nhãn tiếng Anh dài ngắn khác nhau và xuống dòng khác nhau, nên phải chừa
   sẵn chỗ cho 2 dòng. Nếu không, tiêu đề ba ô sẽ bắt đầu ở ba độ cao khác nhau. */
.svc-en {
  display: block;
  min-height: 2.6em;
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .18em;
  line-height: 1.3;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: .5rem;
}
/* Cùng lý do với .svc-en: tiêu đề ba ô dài ngắn khác nhau, và tiếng Nhật dài
   hơn tiếng Việt vì chữ vuông chiếm gấp đôi bề ngang. Chừa sẵn 2 dòng để đoạn
   mô tả của ba ô luôn bắt đầu trên cùng một đường. */
.svc-item h3 { font-size: var(--t-lg); min-height: 2.5em; transition: color .3s; }
.svc-item:hover h3 { color: var(--accent); }
.svc-item > p { margin-top: var(--s-2); color: var(--text-muted); font-size: var(--t-sm); }

/* Đẩy xuống đáy ô: mô tả dài ngắn khác nhau nhưng ba dòng "Chi tiết"
   vẫn nằm trên cùng một đường. */
.svc-more {
  display: inline-flex;
  align-self: flex-start;
  align-items: center;
  gap: .45rem;
  margin-top: auto;
  padding-top: var(--s-3);
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--accent);
}
.svc-more svg { transition: transform .35s var(--e-out); }
.svc-item:hover .svc-more svg { transform: translateX(5px); }

/* Đã bỏ cơ chế ảnh nổi bám con trỏ (.peek). Lý do: nó chỉ hoạt động trên
   thiết bị có chuột, nên người dùng mobile không bao giờ thấy ảnh minh họa,
   và người dùng desktop phải trỏ đúng vào hàng mới biết là có ảnh.
   Ảnh giờ nằm thẳng trong bố cục, xem .svc-set bên trên. */

/* ==========================================================================
   FIELD — một trường màu xanh đặc. Đây là khoảnh khắc màu duy nhất của trang
   (taste-skill cho phép đúng 1 "color block" mỗi trang).
   Chữ trắng trên #0b6fd0 = 4.6:1, đạt WCAG AA.
   ========================================================================== */
.field { background: var(--accent); color: #fff; padding: var(--s-sec) 0; }
.field h2 { font-size: var(--t-head); color: #fff; max-width: 24ch; }
.field-lead { margin-top: var(--s-3); max-width: 52ch; color: rgba(255, 255, 255, .84); font-size: var(--t-md); }
.field-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  margin-top: clamp(2.5rem, 5vw, 4rem);
  border-top: 1px solid rgba(255, 255, 255, .32);
}
.field-item { padding: var(--s-4) clamp(1.2rem, 2.4vw, 2.2rem) 0; }
.field-item + .field-item { border-left: 1px solid rgba(255, 255, 255, .32); }
.field-item:first-child { padding-left: 0; }
.field-n {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .72);
}
.field-item h3 { margin: var(--s-2) 0 var(--s-1); font-size: var(--t-lg); color: #fff; }
.field-item p { color: rgba(255, 255, 255, .82); font-size: var(--t-sm); }
.field .tlink { color: #fff; border-bottom-color: rgba(255, 255, 255, .5); margin-top: var(--s-4); }
.field .tlink:hover { color: #fff; border-bottom-color: #fff; }

/* ==========================================================================
   MANIFESTO — câu định vị khổ lớn, nền sáng
   ========================================================================== */
.manifesto { padding: var(--s-sec) 0; background: var(--bg-raised); border-block: 1px solid var(--rule); }
.manifesto-grid {
  display: grid;
  grid-template-columns: 1.35fr 1fr;
  gap: clamp(2rem, 6vw, 5rem);
  align-items: start;
}
.manifesto q, .manifesto-lead {
  display: block;
  font-family: var(--f-display);
  font-weight: 500;
  font-size: clamp(1.5rem, 3.1vw, 2.7rem);
  line-height: 1.34;
  letter-spacing: -.016em;
  quotes: none;
}
.manifesto-lead em { font-style: normal; color: var(--accent); }
.manifesto-side p { color: var(--text-muted); }
.manifesto-side p + p { margin-top: var(--s-2); }
.manifesto-side .tlink { margin-top: var(--s-3); }

.tri-keys {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3) var(--s-4);
  margin-top: var(--s-4);
  padding-top: var(--s-3);
  border-top: 1px solid var(--rule);
}
.tri-keys div { min-width: 150px; }
.tri-keys b {
  display: block;
  font-size: var(--t-lg);
  font-weight: 800;
  letter-spacing: -.02em;
  color: var(--accent);
}
.tri-keys span { font-size: var(--t-sm); color: var(--text-muted); }

/* ==========================================================================
   HERO — ảnh tràn viền cao trọn khung nhìn, chữ dồn xuống đáy.
   Đây là ngôn ngữ của bản v2 mà chủ web chọn: khung nhìn đầu tiên là một
   khuôn hình phim, chữ nằm dưới như phụ đề mở đầu.
   Dùng dvh chứ không vh để thanh địa chỉ iOS không làm nhảy layout.
   ========================================================================== */
.hero {
  position: relative;
  min-height: 100dvh;
  display: grid;
  align-content: end;
  isolation: isolate;
  overflow: hidden;
  padding: calc(var(--hdr-h) + 3rem) 0 clamp(2.5rem, 6vh, 4.5rem);
  background-color: #0a1626;
  background-image: url("/img/hero/hero-studio.jpg");
  background-image: image-set(
    url("/img/hero/hero-studio.webp") type("image/webp"),
    url("/img/hero/hero-studio.jpg") type("image/jpeg")
  );
  background-repeat: no-repeat;
  background-position: 26% center;
  background-size: cover;
}
/* lớp phủ tối dần sang phải để chữ trắng luôn đạt tương phản AA */
.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    linear-gradient(256deg, rgba(6, 14, 26, .94) 0%, rgba(6, 14, 26, .8) 36%,
                    rgba(6, 14, 26, .34) 64%, rgba(6, 14, 26, .1) 100%),
    linear-gradient(180deg, rgba(6, 14, 26, .5) 0%, transparent 24%);
}
.hero-in { display: grid; gap: clamp(1.6rem, 4vh, 2.6rem); }

.hero .label { color: rgba(255, 255, 255, .74); }

/* Slogan không giới hạn bề ngang: dòng dài nhất cần đủ chỗ để không
   xuống dòng thứ ba. Cỡ chữ và wrap 1300px được tính cùng nhau. */
.hero h1 {
  margin-top: var(--s-2);
  font-size: clamp(2rem, 5.4vw, 4.9rem);
  line-height: 1.2;
  letter-spacing: -.02em;
  color: #fff;
}
.hero h1 em { color: #8ecbff; }
.hero h1 .ln { display: block; }
.hero h1 .ln > span { display: block; }

/* Chân hero: phần dẫn bên trái, CTA bên phải, cùng chạm một đường đáy */
.hero-tail {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: clamp(1.5rem, 4vw, 3rem);
  flex-wrap: wrap;
  padding-top: var(--s-3);
  border-top: 1px solid rgba(255, 255, 255, .28);
}
.hero-tail p {
  max-width: 42ch;
  color: rgba(233, 240, 248, .86);
  font-size: var(--t-md);
}
.hero-act { display: flex; gap: .7rem; flex-wrap: wrap; }

/* ==========================================================================
   SECTION FAMILY 2 — EDITORIAL STATEMENT
   Một câu định vị cỡ lớn. Không thẻ, không ảnh, không nhãn.
   ========================================================================== */
.stmt { padding: var(--s-sec) 0; background: var(--bg-raised); border-block: 1px solid var(--rule); }
.stmt-grid {
  display: grid;
  grid-template-columns: 7fr 5fr;   /* lệch có chủ ý, không 50/50 */
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: end;
}
/* Câu cỡ lớn cũng phải dùng chữ hiển thị, không thì lệch giọng
   với heading serif ngay bên trên. */
.stmt-lead {
  font-family: var(--f-display);
  font-size: var(--t-xl);
  font-weight: 500;
  line-height: 1.36;
  letter-spacing: -.018em;
  max-width: 34ch;
}
.stmt-body { color: var(--text-muted); }
.stmt-body p + p { margin-top: var(--s-2); }
.stmt-body .tlink { margin-top: var(--s-3); }

/* ==========================================================================
   SECTION FAMILY 3 — ASYMMETRIC BENTO (đúng 3 ô cho 3 dịch vụ)
   1 ô lớn + 2 ô nhỏ xếp dọc. Cả 3 ô đều có ảnh thật -> đạt yêu cầu
   "bento phải có biến thiên hình ảnh", không phải 3 thẻ chữ trắng trên trắng.
   ========================================================================== */
.bento {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  grid-template-rows: auto auto;
  gap: 1px;
  background: var(--rule-strong);
  border: 1px solid var(--rule-strong);
}
/* Ô đầu cao gấp đôi. Cho ảnh giãn lấp phần cao còn lại, nếu không
   ô này sẽ hở một khoảng trống lớn phía dưới phần chữ. */
.bento > :first-child { grid-row: span 2; }
.bento > :first-child .cell-media { flex: 1; aspect-ratio: auto; min-height: 340px; }
.bento > :first-child .cell-body { margin-top: auto; }

.cell {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--bg-raised);
  overflow: hidden;
  transition: background .35s ease;
}
.cell:hover { background: #f2f7fd; }
.cell-media {
  background: var(--bg-sunken);
  aspect-ratio: 16 / 10;
}
.bento > :first-child .cell-media { aspect-ratio: 4 / 3; }
.cell-media img { transition: transform .7s var(--e-out); }
.cell:hover .cell-media img { transform: scale(1.04); }

.cell-body { padding: var(--s-3) clamp(1.3rem, 2vw, 1.9rem) var(--s-4); }
.cell h3 { font-size: var(--t-lg); }
.cell-en {
  display: block;
  margin-top: .45rem;
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--text-faint);
}
.cell p { margin-top: var(--s-2); color: var(--text-muted); font-size: var(--t-sm); }
.cell .tlink { margin: var(--s-3) clamp(1.3rem, 2vw, 1.9rem) 0; align-self: flex-start; }

/* ==========================================================================
   SECTION FAMILY 4 — FEATURE + TRIO (dự án)
   1 dự án nổi bật khổ lớn, 3 dự án còn lại hàng dưới. Không zigzag.
   ========================================================================== */
.feat {
  display: grid;
  grid-template-columns: 1.55fr 1fr;
  gap: clamp(1.6rem, 4vw, 3.2rem);
  align-items: center;
}
.feat-body h3 { font-size: var(--t-xl); }
.feat-body p { margin-top: var(--s-2); color: var(--text-muted); }
.feat-body .tlink { margin-top: var(--s-3); }

.trio {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.2rem, 2.5vw, 2rem);
  margin-top: var(--s-5);
  padding-top: var(--s-5);
  border-top: 1px solid var(--rule);
}
.trio h3 { margin-top: var(--s-2); font-size: var(--t-md); }
.trio .tlink { margin-top: var(--s-2); font-size: var(--t-xs); }

.kicker,
/* cùng lý do specificity như .tenet-k: `.feat-body p` là 0-0-1-1 */
.feat-body .kicker {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--accent);
  margin-top: 0;
}

/* ---------- VIDEO: mặt tiền bấm-mới-tải (không nhồi 15 iframe) -------- */
.vf {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--c-navy-dk);
  border: 1px solid var(--rule-strong);
}
.vf img, .vf iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.vf img { object-fit: cover; transition: transform .7s var(--e-out), opacity .35s; }
.vf-btn { position: absolute; inset: 0; display: grid; place-items: center; width: 100%; }
.vf-btn:hover img { transform: scale(1.035); opacity: .88; }
.vf-play {
  position: relative;
  display: grid;
  place-items: center;
  width: 62px;
  height: 62px;
  border-radius: 50%;                /* ngoại lệ shape lock duy nhất:
                                        nút play tròn là quy ước phổ quát */
  background: rgba(255, 255, 255, .95);
  color: var(--c-navy-dk);
  box-shadow: 0 10px 30px -10px rgba(6, 14, 26, .55);
  transition: transform .32s var(--e-out), background .3s, color .3s;
}
.vf-btn:hover .vf-play { transform: scale(1.09); background: var(--accent); color: #fff; }
.vf-play svg { width: 22px; height: 22px; margin-left: 2px; }
.trio .vf-play { width: 48px; height: 48px; }
.trio .vf-play svg { width: 17px; height: 17px; }

.vcap { margin-top: .7rem; font-size: var(--t-sm); color: var(--text-muted); }

/* lưới video nhiều cột (trang Dự án) */
.vgrid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--s-4) var(--s-3);
}

/* ==========================================================================
   SECTION FAMILY 5 — TYPOGRAPHIC TRIPTYCH (triết lý 3T)
   3 cột chữ, phân tách bằng hairline dọc. Không thẻ, không ảnh, không số.
   ========================================================================== */
.tri-set {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0;
  border-top: 1px solid var(--rule-on-dark);
}
.tenet { padding: var(--s-4) clamp(1.2rem, 2.5vw, 2.2rem) 0; }
.tenet + .tenet { border-left: 1px solid var(--rule-on-dark); }
/* Phải scope 2 class: `.tenet p` bên dưới có specificity 0-0-1-1, sẽ đè
   `.tenet-k` (0-0-1-0) và làm chữ khoá co nhỏ, mất màu. */
.tenet .tenet-k {
  font-family: var(--f-display);
  font-size: var(--t-xl);
  font-weight: 500;
  line-height: 1;
  letter-spacing: -.024em;
  color: var(--accent-on-dark);
}
.tenet h3 { margin: var(--s-3) 0 var(--s-1); font-size: var(--t-md); color: #fff; }
.tenet p { color: var(--text-on-dark-muted); font-size: var(--t-sm); }

.on-dark { background: var(--bg-inverse); color: var(--text-on-dark); }
.on-dark .h-sec { color: #fff; }
.on-dark .sub-sec { color: var(--text-on-dark-muted); }
.on-dark .label { color: var(--accent-on-dark); }

.creed {
  margin-top: var(--s-5);
  padding-top: var(--s-4);
  border-top: 1px solid var(--rule-on-dark);
}
.creed p {
  font-family: var(--f-display);
  font-weight: 500;
  font-size: var(--t-lg);
  line-height: 1.55;
  max-width: 40ch;
  color: #fff;
}

/* ==========================================================================
   SECTION FAMILY 6 — CLOSING BAND (email là nhân vật chính)
   Bỏ form. Chỉ còn một đường liên hệ duy nhất -> một CTA duy nhất.
   ========================================================================== */
.close {
  background: var(--bg-inverse);
  color: var(--text-on-dark);
  padding: var(--s-sec) 0 0;
}
.close-in {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: end;
}
.close h2 { font-size: var(--t-head); letter-spacing: -.024em; color: #fff; max-width: 22ch; }
.close-side p { color: var(--text-on-dark-muted); max-width: 42ch; }

/* email hiển thị to, bấm được — đây là điểm chuyển đổi duy nhất của site */
.mailto {
  display: inline-block;
  margin-top: var(--s-3);
  font-size: var(--t-lg);
  font-weight: 600;
  letter-spacing: -.01em;
  color: #fff;
  border-bottom: 2px solid var(--accent-on-dark);
  padding-bottom: .25rem;
  transition: color .3s, border-color .3s;
}
.mailto:hover { color: var(--accent-on-dark); border-bottom-color: #fff; }

/* khi chưa có email thật thì hiện trạng thái rỗng rõ ràng,
   không bịa địa chỉ và không để link chết */
.mail-missing {
  margin-top: var(--s-3);
  padding: var(--s-2) var(--s-3);
  border: 1px dashed var(--rule-on-dark);
  color: var(--text-on-dark-muted);
  font-size: var(--t-sm);
}

/* ---------- PAGE HERO (các trang con) --------------------------------- */
/* Không dùng số khổng lồ 01/02/03 nữa: đó là kiểu trang trí đánh số bị ban. */
.pg-hero {
  padding: calc(var(--hdr-h) + clamp(3rem, 7vw, 5.5rem)) 0 clamp(2.5rem, 5vw, 4rem);
  border-bottom: 1px solid var(--rule);
  background:
    radial-gradient(ellipse 700px 420px at 88% -10%, rgba(74, 163, 240, .13), transparent 62%),
    var(--bg);
}
/* Cùng ngôn ngữ với hero trang chủ: chữ khổ lớn, rồi một hairline, rồi phần dẫn.
   Heading vẫn SANS theo yêu cầu chủ web; sự liền mạch đến từ thang chữ và
   bố cục, không phải từ việc đổi font. */
.pg-hero h1 {
  font-size: var(--t-mega);
  line-height: 1.12;
  letter-spacing: -.028em;
  max-width: 22ch;
}
.pg-hero .lead {
  margin-top: clamp(1.6rem, 3vw, 2.4rem);
  padding-top: var(--s-3);
  border-top: 1px solid var(--rule-strong);
  max-width: 60ch;
  color: var(--text-muted);
  font-size: var(--t-md);
}

/* ---------- PAGE HERO có ảnh minh họa (trang Về chúng tôi) -------------
   Ảnh màu nước nền sáng nên KHÔNG đổi chữ sang trắng: giữ nguyên theme sáng
   của trang, chỉ phủ một lớp trắng mờ dần từ trái sang để chữ luôn nằm trên
   nền gần trắng. Ảnh đặt lệch phải và dùng `contain` để không bị cắt cụt.
   `isolation: isolate` tạo stacking context riêng, nhờ đó hai pseudo-element
   z-index âm vẫn nằm TRÊN nền của section chứ không chui xuống dưới. */
.pg-hero-illus {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  min-height: min(62vh, 520px);
  /* grid chứ không flex: .wrap tự lo bề rộng của nó, flex hay bóp méo item */
  display: grid;
  align-content: center;
}
.pg-hero-illus::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -2;
  background-image: url("/img/gioi-thieu/con-nguoi.jpg");
  background-image: image-set(
    url("/img/gioi-thieu/con-nguoi.webp") type("image/webp"),
    url("/img/gioi-thieu/con-nguoi.jpg") type("image/jpeg")
  );
  background-repeat: no-repeat;
  background-position: right center;
  background-size: contain;
}
/* lớp phủ giữ vùng chữ bên trái luôn đủ tương phản */
.pg-hero-illus::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  /* Chữ chạy tới ~58% bề ngang, nên vùng đặc phải phủ quá mốc đó rồi mới
     tan dần. Phần trái của tranh vốn gần như trống nên che đi không mất gì. */
  background: linear-gradient(
    90deg,
    var(--bg) 0%,
    var(--bg) 42%,
    rgba(247, 248, 250, .85) 60%,
    rgba(247, 248, 250, 0) 84%
  );
}
/* phần dẫn phải ngắn hơn mặc định, nếu không nó chạy vào dưới ảnh */
.pg-hero-illus .lead { max-width: 44ch; }

/* ---------- Nhãn tiếng Anh + danh sách gạch đầu dòng ------------------
   Trước đây đi kèm khối .rail của trang Quy trình. Trang đó đã bị xoá nên
   .rail và .rail-row cũng bỏ theo; hai class dưới vẫn giữ vì trang Dịch vụ
   đang dùng. Tên vẫn mang tiền tố rail- để khỏi phải sửa lan sang markup. */
.rail-en {
  display: block;
  margin-top: .4rem;
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--text-faint);
}
.rail-side { display: flex; flex-direction: column; gap: .55rem; }
.rail-side li {
  padding-left: 1.15rem;
  position: relative;
  font-size: var(--t-sm);
  color: var(--text);
}
.rail-side li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .68em;
  width: 6px;
  height: 6px;
  background: var(--accent);
}

/* ---------- SPLIT (ảnh + chữ) ------------------------------------------
   Trang Dịch vụ dùng tối đa 2 split liên tiếp rồi PHẢI đổi family khác:
   3 split zigzag liên tiếp là mẫu banal, skill cap ở 2. */
.split {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: clamp(1.8rem, 4vw, 3.5rem);
  align-items: center;
}
.split-rev > .split-media { order: 2; }
.split-media {
  aspect-ratio: 4 / 3;
  background: var(--bg-sunken);
  border: 1px solid var(--rule);
}
.split h2 { font-size: var(--t-xl); }
.split p { margin-top: var(--s-2); color: var(--text-muted); }

/* ---------- STACK-WIDE (băng ảnh ngang + chữ 2 cột bên dưới) ----------- */
.sw-media {
  aspect-ratio: 21 / 8;
  border: 1px solid var(--rule);
  background: var(--bg-sunken);
}
.sw-body {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: clamp(1.8rem, 4vw, 3.5rem);
  margin-top: var(--s-4);
  align-items: start;
}
.sw-body h2 { font-size: var(--t-xl); }
.sw-body p { margin-top: var(--s-2); color: var(--text-muted); }

/* ---------- FACTS (số ô = số nội dung, không bao giờ có ô rỗng) -------- */
.facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 1px;
  background: var(--rule-strong);
  border: 1px solid var(--rule-strong);
}
.facts > * { background: var(--bg-raised); padding: var(--s-3) clamp(1.2rem, 2vw, 1.7rem) var(--s-4); }
.facts h3 {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--accent-press);
}
.facts p { margin-top: var(--s-2); color: var(--text-muted); font-size: var(--t-sm); }

/* ---------- MAIL BLOCK (điểm chuyển đổi duy nhất, khổ sáng) ------------ */
.mail-block {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: center;
  padding: clamp(1.8rem, 4vw, 2.8rem);
  background: var(--bg-raised);
  border: 1px solid var(--rule-strong);
  border-left: 3px solid var(--accent);
}
.mail-block h2 { font-size: var(--t-lg); }
.mail-block p { margin-top: var(--s-1); color: var(--text-muted); font-size: var(--t-sm); }
.mail-lg {
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  font-size: var(--t-lg);
  font-weight: 700;
  letter-spacing: -.012em;
  color: var(--accent-press);
  white-space: nowrap;
  border-bottom: 2px solid var(--accent);
  padding-bottom: .2rem;
  transition: color .3s, border-color .3s;
}
.mail-lg:hover { color: var(--text); border-bottom-color: var(--text); }
.mail-lg svg { width: 22px; height: 22px; flex: none; }
.mail-block .mail-missing { border-color: var(--rule-strong); color: var(--text-muted); }

/* ---------- 2-COL CARD GRID (quy trình / dẫn hướng 404) ---------------- */
/* Dùng thay cho danh sách gạch đầu dòng dài và thay cho 3 thẻ đều nhau. */
.duo {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1px;
  background: var(--rule-strong);
  border: 1px solid var(--rule-strong);
}
.duo > * {
  display: block;
  padding: var(--s-4) clamp(1.3rem, 2.5vw, 2.2rem);
  background: var(--bg-raised);
  transition: background .3s ease;
}
a.duo-item:hover { background: #f2f7fd; }
a.duo-item:hover h3 { color: var(--accent); }
.duo h3 { font-size: var(--t-md); }
.duo p { margin-top: var(--s-1); color: var(--text-muted); font-size: var(--t-sm); }

/* ---------- INFO TABLE (hồ sơ doanh nghiệp) ---------------------------- */
.info {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid var(--rule-strong);
  background: var(--bg-raised);
}
.info th, .info td {
  padding: var(--s-3) clamp(1.1rem, 2vw, 1.6rem);
  text-align: left;
  vertical-align: top;
  font-size: var(--t-sm);
}
.info tr + tr th, .info tr + tr td { border-top: 1px solid var(--rule); }
.info th {
  width: 230px;
  background: #f4f7fb;
  border-right: 1px solid var(--rule);
  font-family: var(--f-label);
  font-weight: 600;
  color: var(--c-navy);
  white-space: nowrap;
}
.info td { color: var(--text-muted); }
.info td strong { color: var(--text); font-weight: 600; }

/* ---------- FOOTER ---------------------------------------------------- */
.foot { background: var(--bg-inverse); color: var(--text-on-dark-muted); }
.foot-in {
  display: grid;
  grid-template-columns: 1.7fr 1fr 1fr;
  gap: var(--s-4);
  padding: var(--s-6) 0 var(--s-4);
}
.foot .mark { color: #fff; }
.foot .mark span { color: rgba(255, 255, 255, .5); }
.foot-blurb { margin-top: var(--s-2); font-size: var(--t-sm); max-width: 32ch; }
.foot-h {
  font-family: var(--f-label);
  font-size: var(--t-xs);
  font-weight: 600;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: #fff;
  margin-bottom: var(--s-2);
}
.foot-col a, .foot-col p {
  display: block;
  font-size: var(--t-sm);
  margin-bottom: .5rem;
  transition: color .3s;
}
.foot-col a:hover { color: #fff; }
/* Bộ chọn ngôn ngữ nằm trong cột chân trang: cột này đặt mọi <a> thành block,
   phải trả .lang-op về inline-flex nếu không cờ và mã ngôn ngữ sẽ rớt dòng. */
.foot-col .lang-sw { margin-top: .9rem; }
.foot-col .lang-op { display: inline-flex; margin-bottom: 0; color: var(--text-on-dark-muted); }
.foot-col .lang-op:hover,
.foot-col .lang-op[aria-current="true"] { color: #fff; }
.foot-col .lang-op + .lang-op { border-left-color: var(--rule-on-dark); }
.foot-col .lang-flag { box-shadow: 0 0 0 1px rgba(255, 255, 255, .4); }

.foot-social { display: flex; gap: .5rem; margin-top: var(--s-3); }
.foot-social a {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 1px solid var(--rule-on-dark);
  font-family: var(--f-label);
  font-size: var(--t-xs);
  transition: background .3s, border-color .3s, color .3s;
}
.foot-social a:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
.foot-btm {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  padding: var(--s-3) 0;
  border-top: 1px solid var(--rule-on-dark);
}
.foot-btm p { font-family: var(--f-label); font-size: var(--t-xs); letter-spacing: .06em; }

/* ==========================================================================
   MOTION — MOTION_INTENSITY 5
   Mỗi chuyển động phải trả lời được "nó truyền đạt điều gì":
   - hero rise  : phân tầng, dẫn mắt vào slogan trước rồi mới tới CTA
   - reveal     : kể chuyện theo nhịp cuộn, tránh đổ ập một lúc
   - hover      : phản hồi, cho biết cái gì bấm được
   Không marquee, không scroll-hijack, không animation vô cớ.
   ========================================================================== */
@keyframes rise { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } }
@keyframes fade { from { opacity: 0; } to { opacity: 1; } }

/* Chỉ ẩn khi JS thực sự đang chạy. Nếu main.js chết, <head> bỏ class .js
   và toàn bộ nội dung hiện bình thường. */
.js .rv {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity .7s var(--e-out), transform .7s var(--e-out);
}
.js .rv.in { opacity: 1; transform: none; }

.js .hero .label { animation: fade .8s ease .1s both; }
.js .hero h1 .ln > span { animation: rise 1.05s var(--e-out) both; }
.js .hero h1 .ln:nth-child(1) > span { animation-delay: .16s; }
.js .hero h1 .ln:nth-child(2) > span { animation-delay: .28s; }
.js .hero-tail { animation: fade 1s ease .52s both; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .js .rv,
  .js .hero .label,
  .js .hero h1 .ln > span,
  .js .hero-tail {
    opacity: 1;
    transform: none;
    animation: none;
    transition: none;
  }
  .cell-media img, .vf img { transition: none; }
}

/* ==========================================================================
   RESPONSIVE — mọi lưới lệch đều phải khai báo cách đổ về 1 cột
   ========================================================================== */
/* --- TẦNG TABLET 881px..1180px: vẫn là bố cục rộng, chỉ siết lại ---------
   Trước đây tôi cho mọi thứ đổ 1 cột ngay từ 1024px, nên cửa sổ rộng
   900..1024px trông y như mobile. Tầng này giữ lưới nhiều cột lâu hơn. */
@media (max-width: 1180px) {
  .feat { grid-template-columns: 1fr 1fr; }
  .close-in { grid-template-columns: 1fr 1fr; }
  .manifesto-grid { grid-template-columns: 1fr 1fr; }
  .stmt-grid { grid-template-columns: 1fr 1fr; }
  .bento { grid-template-columns: 1fr 1fr; }
  .bento > :first-child { grid-row: auto; }
  .bento > :first-child .cell-media { aspect-ratio: 16 / 10; min-height: 0; }
  /* khổ tablet: ba cột vẫn giữ, chỉ siết nhãn cho khỏi xuống quá nhiều dòng */
  .svc-en { letter-spacing: .12em; }
}

/* --- Ẩn nav ngang chỉ khi thật sự không đủ chỗ (880px), không phải 1024px */
@media (max-width: 880px) {
  .nav, .hdr-cta { display: none; }
  .burger { display: flex; }
  /* Nút Liên hệ biến mất ở khổ này, bộ chọn ngôn ngữ thì ở lại: nó là thứ duy
     nhất còn trong .hdr-end nên phải tự đủ lớn để chạm bằng ngón tay. */
  .lang-op { padding: .8rem 0; }
}

/* --- TẦNG HẸP: từ đây mới đổ về 1 cột ------------------------------------ */
@media (max-width: 880px) {
  .hang { grid-template-columns: 1fr; gap: var(--s-2); }
  .hang-l { padding-top: 0; }
  .band { aspect-ratio: 16 / 9; }
  /* khổ hẹp: ảnh minh họa xuống đáy, lớp phủ đổi thành dọc để chữ ở trên
     vẫn nằm trên nền trắng thay vì đè lên tranh */
  .pg-hero-illus { min-height: 0; padding-bottom: clamp(9rem, 34vw, 13rem); }
  .pg-hero-illus::before { background-position: center bottom; background-size: 130% auto; }
  .pg-hero-illus::after {
    background: linear-gradient(180deg, var(--bg) 0%, var(--bg) 46%, rgba(247, 248, 250, 0) 82%);
  }
  .pg-hero-illus .lead { max-width: none; }
  .field-grid { grid-template-columns: 1fr; border-top: 0; }
  .field-item { padding-left: 0; padding-top: var(--s-3); border-top: 1px solid rgba(255,255,255,.32); }
  .field-item + .field-item { border-left: 0; }
  .manifesto-grid, .stmt-grid { grid-template-columns: 1fr; align-items: start; }
  .bento { grid-template-columns: 1fr; }
  .bento > :first-child .cell-media { aspect-ratio: 16 / 9; }
  .feat, .close-in { grid-template-columns: 1fr; align-items: start; }
  .trio { grid-template-columns: 1fr 1fr; }
  .tri-set { grid-template-columns: 1fr; }
  .tenet + .tenet { border-left: 0; border-top: 1px solid var(--rule-on-dark); }
  .tenet:first-child { padding-top: var(--s-3); }
  .foot-in { grid-template-columns: 1fr 1fr; }
  .split, .sw-body { grid-template-columns: 1fr; }
  .split-rev > .split-media { order: 0; }
  .mail-block { grid-template-columns: 1fr; align-items: start; }
  /* dịch vụ: bỏ cột mô tả, giữ tiêu đề + mũi tên */
  /* một cột: ảnh về khổ ngang cho đỡ chiếm chiều cao, nhãn không cần
     chừa chỗ 2 dòng nữa vì các ô xếp dọc, không phải so hàng ngang */
  .svc-set { grid-template-columns: 1fr; gap: var(--s-4); }
  .svc-fig { aspect-ratio: 16 / 10; }
  .svc-en { min-height: 0; }
  .svc-item h3 { min-height: 0; }
  .svc-more { margin-top: var(--s-3); padding-top: 0; }
}

/* --- Màn hẹp: header chỉ còn logo + cờ + burger. Hai mã "VI"/"JA" bị bỏ khỏi
   header để tagline của logo không bị ép xuống dòng; chữ vẫn nằm trong DOM cho
   trình đọc màn hình, chỉ ẩn khỏi mắt. Cờ đang bật thêm gạch chân vì lúc này
   chỉ còn màu để phân biệt, mà màu một mình thì không đủ (WCAG 1.4.1). */
@media (max-width: 560px) {
  .hdr .lang-code {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .hdr .lang-op { gap: 0; }
  .hdr .lang-op[aria-current="true"] { box-shadow: inset 0 -2px 0 currentColor; }
}

@media (max-width: 700px) {
  .hero { background-position: 42% center; }
  .stack-wide > .sw-media img { aspect-ratio: 16 / 9; }
  /* Địa chỉ email phải nằm trọn MỘT dòng: cắt đôi giữa địa chỉ vừa xấu vừa
     khó đọc, và người dùng hay chép tay. Nên thu cỡ chữ theo bề ngang màn
     hình thay vì cho ngắt dòng. Đo ở 320px: 26 ký tự cần ~201px, khung 226px.
     `overflow-wrap` chỉ là lưới an toàn cho email dài hơn nữa. */
  .mail-lg {
    white-space: nowrap;
    font-size: clamp(.82rem, 3.9vw, 1.05rem);
    overflow-wrap: anywhere;
  }
  .mail-lg svg { width: 18px; height: 18px; }
  /* màn hẹp: phủ tối đều để chữ tách khỏi ảnh */
  .hero::after {
    background: linear-gradient(180deg, rgba(6, 14, 26, .72) 0%,
                rgba(6, 14, 26, .84) 52%, rgba(6, 14, 26, .93) 100%);
  }
  .trio { grid-template-columns: 1fr; }
  .duo { grid-template-columns: 1fr; }
  .vgrid { grid-template-columns: 1fr; }
  .foot-in { grid-template-columns: 1fr; }
  .info th, .info td { display: block; width: 100%; border-right: 0; }
  .info th { border-bottom: 0; padding-bottom: .3rem; white-space: normal; }
  .info tr + tr th { border-top: 1px solid var(--rule); }
  .info tr + tr td { border-top: 0; }
}
