/* ============================================================================
   SkyRecall — trang giới thiệu công khai

   ── Vì sao KHÔNG dùng lại app.css ──────────────────────────────────────────
   app.css nặng ~60 KB và dựng cho một ứng dụng có thanh điều hướng, khung chat,
   bảng biểu. Trang này chỉ cuộn xuống và bấm một nút. Nạp cả bảng kiểu của ứng
   dụng vào đây là bắt người chưa biết mình là ai tải 60 KB để đọc một trang.

   Nhưng TOKEN màu thì chép đúng nguyên giá trị, không đặt lại theo cảm tính:
   người bấm "Dùng thử" sẽ sang thẳng app, và hai sắc xanh lệch nhau một chút
   là đủ để cảm giác "hai sản phẩm khác nhau".
   ========================================================================= */

:root {
  --bg:        #f4f7fb;
  --surface:   #ffffff;
  --line:      #e2e9f3;
  --line-soft: #eef2f8;
  --ink:       #0b1628;
  --ink-2:     #33425c;
  --muted:     #64748f;
  --accent:    #0060f0;
  --accent-2:  #009cf0;
  --accent-soft: #ebf3ff;
  --busy:      #b07d00;

  --r-sm: 8px;
  --r-lg: 16px;
  --r-xl: 22px;
  --font: 16px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
  --shadow: 0 1px 2px rgba(11, 22, 40, .05), 0 12px 32px rgba(11, 22, 40, .06);
  --wrap: 1120px;
}

/* Nền tối lấy chính navy của logo, cùng họ với ứng dụng. Chỉ ĐỊNH NGHĨA LẠI
   biến — không một quy tắc thành phần nào nằm trong khối này, để đừng bao giờ
   có một màu chỉ tồn tại ở một chế độ. */
@media (prefers-color-scheme: dark) {
  :root {
    --bg:        #060f1f;
    --surface:   #0e1a2c;
    --line:      #1d2b40;
    --line-soft: #16243a;
    --ink:       #e8eff9;
    --ink-2:     #b9c7dd;
    --muted:     #8698b6;
    --accent:    #3d8bff;
    --accent-2:  #4fc3ff;
    --accent-soft: #12233d;
    --busy:      #ffc93c;
    --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 18px 48px rgba(0, 0, 0, .45);
  }
}

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0; font: var(--font);
  background: var(--bg); color: var(--ink);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3 { margin: 0; font-weight: 630; letter-spacing: -.015em; line-height: 1.2; }
p { margin: 0; }
a { color: var(--accent); }

.wrap { width: 100%; max-width: var(--wrap); margin: 0 auto; padding: 0 24px; }

/* ── Thanh trên cùng ─────────────────────────────────────────────────────── */

header.top {
  position: sticky; top: 0; z-index: 20;
  background: color-mix(in srgb, var(--bg) 88%, transparent);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
}
/* color-mix chưa có ở trình duyệt cũ; nền đục hoàn toàn vẫn đọc được, chỉ mất
   hiệu ứng mờ. Khai báo sau để nó ghi đè khi trình duyệt HIỂU, và bị bỏ qua
   khi không hiểu — đúng cách dùng @supports cho một thứ chỉ để đẹp. */
@supports not (backdrop-filter: blur(1px)) {
  header.top { background: var(--bg); }
}

/* Thanh cao 88px vì logo cao 63px: để nguyên 66px thì logo chạm cả mép trên
   lẫn mép dưới, không còn khoảng thở nào và nhìn như bị nhét vào. */
header.top .row { display: flex; align-items: center; gap: 16px; height: 88px; }
header.top .brand { display: flex; align-items: center; gap: 10px; margin-right: auto; }
/* Dấu hiệu nhận diện đầu tiên người ta nhìn thấy, nên nó phải chiếm đúng phần
   của nó. Đi kèm chiều cao thanh ở trên: đổi một cái mà quên cái kia là logo
   hoặc bị nhét chật, hoặc bơi giữa một khoảng trống. */
header.top .brand img { height: 63px; width: auto; display: block; }
header.top nav { display: flex; align-items: center; gap: 22px; font-size: 14.5px; }
header.top nav a { color: var(--ink-2); text-decoration: none; }
header.top nav a:hover { color: var(--accent); }

/* Logo hai bản cho hai nền. Không dùng JavaScript, vì như vậy sẽ có một
   khoảnh khắc logo sai màu trước khi script kịp chạy.

   ── Vì sao phải viết đủ `header.top .brand img.dark` ──────────────────────
   Bản đầu chỉ viết `img.dark { display: none }`. Nó THUA, vì ngay phía trên
   có `header.top .brand img { display: block }` — độ ưu tiên (0,2,2) so với
   (0,1,1). Kết quả: cả hai bản logo cùng hiện, nằm sát nhau như một logo bị
   nhân đôi. Đã nhìn thấy đúng như vậy trên bản chạy thật.

   Bài học: đặt `display` trong luật kích thước chung rồi lại định tắt nó bằng
   một bộ chọn hẹp hơn là tự đặt bẫy cho chính mình. */
header.top .brand img.dark { display: none; }
@media (prefers-color-scheme: dark) {
  header.top .brand img.light { display: none; }
  header.top .brand img.dark  { display: block; }
}

/* ── Bộ chọn ngôn ngữ ─────────────────────────────────────────────────────

   Tách khỏi menu chính bằng một vạch dọc: "English" nằm lẫn giữa Trí nhớ và
   Bảng giá thì đọc ra như một mục nội dung nữa, chứ không ra là "đổi ngôn ngữ".

   Dựng bằng <details>/<summary> nên KHÔNG cần JavaScript: mở đóng, phím Enter,
   phím Esc đều là hành vi sẵn có của trình duyệt.

   ── Vì sao có CẢ cờ lẫn mã hai chữ ────────────────────────────────────────
   Windows không có phông emoji cờ. Ở đó 🇻🇳 hiện ra thành hai chữ cái ghép,
   hoặc thành hai ô vuông rỗng. Nên mã "VI"/"EN" luôn nằm cạnh và là thứ đọc
   được ở mọi nền tảng; cờ chỉ là phần thêm cho nơi vẽ được. */
.langsel { position: relative; }
.langsel > summary {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 7px 12px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line); background: var(--surface);
  font-size: 14px; color: var(--ink-2); list-style: none; white-space: nowrap;
}
.langsel > summary::-webkit-details-marker { display: none; }  /* Safari */
.langsel > summary:hover { border-color: var(--accent); color: var(--accent); }
.langsel .fl { font-size: 15px; line-height: 1; }
/* Tên ngôn ngữ đầy đủ, KHÔNG phải mã hai chữ.

   Windows không vẽ được emoji cờ: 🇻🇳 hiện ra thành hai chữ "VN". Ghép với mã
   "VI" bên cạnh thì nút đọc ra là "VN VI" — hai mã dính nhau, không ai hiểu.
   Tên đầy đủ thì đọc được ở mọi nền tảng, dù cờ có vẽ ra hay không. */
.langsel .name { font-weight: 600; font-size: 13.5px; }
.langsel .chev { width: 13px; height: 13px; fill: none; stroke: currentColor;
                 stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.langsel[open] > summary .chev { transform: rotate(180deg); }

.langsel ul {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 30;
  margin: 0; padding: 6px; list-style: none; min-width: 190px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); box-shadow: var(--shadow);
}
.langsel li a {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px; border-radius: var(--r-sm);
  color: var(--ink); text-decoration: none; font-size: 14.5px;
}
.langsel li a:hover { background: var(--accent-soft); color: var(--accent); }
/* Ngôn ngữ đang xem: đánh dấu bằng CHẤM chứ không chỉ bằng màu, để người phân
   biệt màu kém vẫn thấy mình đang ở đâu. */
.langsel li a[aria-current="true"] { font-weight: 620; }
.langsel li a[aria-current="true"]::after {
  content: ''; margin-left: auto; width: 7px; height: 7px;
  border-radius: 50%; background: var(--accent);
}

/* ── Menu cho màn hẹp ─────────────────────────────────────────────────────

   Từ 900px trở xuống thanh <nav> bị giấu đi, và trước đây không có gì thay
   thế: trên điện thoại chỉ còn logo, bộ chọn ngôn ngữ và nút "Dùng thử" —
   không có đường nào tới Trí nhớ, Giọng nói, Thiết bị hay Bảng giá ngoài việc
   cuộn tay xuống tìm.

   Cùng khuôn <details> với bộ chọn ngôn ngữ nên không cần JavaScript. Mặc định
   ẨN, chỉ hiện đúng ở ngưỡng mà <nav> tắt đi — hai luật đó phải đi cùng nhau,
   sửa một cái mà quên cái kia là màn hẹp mất sạch điều hướng, hoặc màn rộng có
   hai menu chồng nhau. */
header.top .menu { position: relative; display: none; }
header.top .menu > summary {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--ink-2); list-style: none;
}
header.top .menu > summary::-webkit-details-marker { display: none; }  /* Safari */
header.top .menu > summary:hover { border-color: var(--accent); color: var(--accent); }
.menu .burger {
  width: 18px; height: 18px; fill: none; stroke: currentColor;
  stroke-width: 2; stroke-linecap: round;
}

.menu ul {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 30;
  margin: 0; padding: 6px; list-style: none; min-width: 200px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); box-shadow: var(--shadow);
}
.menu li a {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 11px; border-radius: var(--r-sm);
  color: var(--ink); text-decoration: none; font-size: 15px;
}
.menu li a:hover { background: var(--accent-soft); color: var(--accent); }
.menu li a[aria-current="true"] { font-weight: 620; }

/* Ngôn ngữ nằm CUỐI menu, sau một vạch ngăn: nó không phải một trang nữa, và
   để lẫn vào giữa Bảng giá với Trí nhớ thì đọc ra như một mục nội dung. */
.menu .lang { border-top: 1px solid var(--line-soft); margin-top: 6px; padding-top: 6px; }
.menu .lang + .lang { border-top: 0; margin-top: 0; padding-top: 0; }
.menu .fl { font-size: 15px; line-height: 1; }

/* Vạch ngăn giữa menu nội dung và bộ chọn ngôn ngữ. */
header.top .sep { width: 1px; height: 22px; background: var(--line); flex: none; }

/* ── Nút ─────────────────────────────────────────────────────────────────── */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  padding: 13px 24px; border-radius: 999px;
  font-size: 15.5px; font-weight: 600; text-decoration: none;
  border: 1px solid transparent; cursor: pointer; white-space: nowrap;
}
.btn.primary {
  background: linear-gradient(135deg, #0060f0, #009cf0);
  color: #fff;                       /* CỐ ĐỊNH, không dùng biến: ở nền tối
                                        --accent-ink là màu gần đen, và chữ gần
                                        đen trên nền xanh thì không đọc được. */
  box-shadow: 0 2px 10px rgba(0, 96, 240, .3);
}
.btn.primary:hover { filter: brightness(1.07); }
.btn.ghost { background: var(--surface); color: var(--ink); border-color: var(--line); }
.btn.ghost:hover { border-color: var(--accent); color: var(--accent); }
.btn .i { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.7;
          stroke-linecap: round; stroke-linejoin: round; }

/* ── Hero ────────────────────────────────────────────────────────────────── */

.hero { padding: 76px 0 60px; }
.hero .grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: 48px; align-items: center; }
.hero h1 { font-size: clamp(32px, 4.4vw, 52px); text-wrap: balance; }
.hero .lead {
  margin-top: 20px; font-size: clamp(16.5px, 1.7vw, 19px);
  color: var(--ink-2); max-width: 34em;
}
.hero .cta { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 32px; }
.hero .note { margin-top: 16px; font-size: 13.5px; color: var(--muted); }

/* Chòm sao: canvas thật, chạy bằng chính thuật toán của ứng dụng.
   Không phải ảnh chụp — nên nó không bao giờ lỗi thời so với sản phẩm. */
.orb { position: relative; aspect-ratio: 1 / 1; max-height: 440px; margin-inline: auto; width: 100%; }
.orb canvas { width: 100%; height: 100%; display: block; }

/* ── Khối nội dung ───────────────────────────────────────────────────────── */

section.band { padding: 64px 0; border-top: 1px solid var(--line); }
section.band > .wrap > h2 { font-size: clamp(24px, 3vw, 34px); text-wrap: balance; }
section.band > .wrap > .sub { margin-top: 14px; color: var(--ink-2); max-width: 58ch; }

.cards { display: grid; gap: 18px; margin-top: 36px; grid-template-columns: repeat(3, 1fr); }
.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 24px;
}
.card h3 { font-size: 17.5px; }
.card p { margin-top: 9px; color: var(--ink-2); font-size: 15px; }
.card .i {
  width: 22px; height: 22px; margin-bottom: 14px; color: var(--accent);
  fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
}
.card .icons { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.card .icons .i { margin-bottom: 0; }

/* Chưa dựng xong thì LÀM MỜ, không dán nhãn chữ.

   Một cái nhãn "đang làm" bắt người đọc dừng lại đọc thêm một từ nữa, giữa lúc
   họ đang lướt. Mờ đi thì mắt tự hiểu ngay: cái này chưa tới lượt. Đây cũng là
   đúng quy ước đã dùng cho chòm sao ở đầu trang, nơi năng lực chưa dựng vẽ bằng
   nét đứt và màu nhạt — người dùng học một lần, đọc được ở cả hai chỗ. */
.card.dim { opacity: .58; }
.card.dim .i { color: var(--muted); }

/* Hàng hai cột: chữ một bên, minh hoạ một bên. */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; margin-top: 40px; }
.split.flip > *:first-child { order: 2; }
.split h3 { font-size: clamp(21px, 2.4vw, 27px); }
.split p { margin-top: 14px; color: var(--ink-2); }
.split ul { margin: 18px 0 0; padding-left: 20px; color: var(--ink-2); }
.split li { margin-bottom: 8px; }

/* Khung mô phỏng màn hình — dựng bằng HTML thật, không phải ảnh chụp, nên nó
   sắc nét ở mọi độ phân giải và tự đổi theo nền sáng/tối. */
.shot {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden;
}
.shot .bar {
  display: flex; align-items: center; gap: 8px;
  padding: 11px 14px; border-bottom: 1px solid var(--line); background: var(--line-soft);
  font-size: 12.5px; color: var(--muted);
}
.shot .body { padding: 18px; display: flex; flex-direction: column; gap: 11px; }
.fact {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 14px; border: 1px solid var(--line); border-radius: var(--r-sm);
  font-size: 14.5px;
}
.fact small { display: block; color: var(--muted); font-size: 12px; margin-top: 3px; }
.fact .x { color: var(--muted); flex: none; }

.bubble-row { display: flex; flex-direction: column; gap: 10px; }
.bub { padding: 11px 14px; border-radius: var(--r-lg); font-size: 14.5px; max-width: 86%; }
.bub.you { background: var(--line-soft); align-self: flex-end; }
.bub.ai  { background: var(--surface); border: 1px solid var(--line); align-self: flex-start; }

/* ── "Luôn ở bên bạn" ─────────────────────────────────────────────────────

   Dải này cố ý KHÁC hình so với các khối trên. Trang đã có ba hàng thẻ ba cột
   giống nhau; thêm hàng thứ tư nữa thì mắt lướt qua không dừng lại chỗ nào.

   Nền accent-soft và bố cục dòng thời gian làm nó nổi lên như một đoạn nghỉ,
   và đó đúng là chỗ đáng nghỉ: phần trước nói MÁY LÀM ĐƯỢC GÌ, phần này nói
   NÓ Ở ĐÂU TRONG NGÀY CỦA BẠN. */
section.always { padding: 76px 0; border-top: 1px solid var(--line); background: var(--accent-soft); }
section.always h2 { font-size: clamp(24px, 3vw, 34px); text-wrap: balance; }
section.always > .wrap > .sub { margin-top: 14px; color: var(--ink-2); max-width: 58ch; }

.moments { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0 20px; margin-top: 44px; }
/* Căn giữa cả cột: ảnh, chấm, giờ, nơi chốn và câu mô tả nằm trên cùng một
   trục dọc. Chấm ở giữa cột thì đường kẻ nối bốn chấm chia đều bề ngang, đọc
   ra là một ngày trôi đều chứ không phải bốn ô rời nhau. */
.moment { position: relative; text-align: center; }

/* max-width 190px, KHÔNG phải 100% của cột.

   Ảnh gốc chỉ khoảng 500px mỗi chiều. Trải hết bề ngang cột (~253px) thì trên
   màn hình 2x cần 506px, tức là vừa đúng bằng nguồn: không còn dư một pixel
   nào, và kết quả nhìn mềm nhoè. Không thể làm nét hơn nguồn được, nên cách
   sửa đúng là thu nhỏ chỗ hiển thị chứ không phải phóng to tệp.

   Ở 190px thì ảnh 400px là 2,1 lần: sắc trên mọi màn hình, mà nhẹ hơn. Và nó
   cũng thôi lấn át phần chữ bên dưới. */
.moment img {
  display: block; width: 100%; max-width: 190px; margin-inline: auto;
  /* height: auto BẮT BUỘC, và đây là chỗ dễ bỏ sót nhất trong cả tệp.

     Thẻ img mang width="400" height="400" để trình duyệt chừa sẵn chỗ, khỏi
     nhảy trang khi ảnh về. Nhưng thuộc tính height ánh xạ thành một khai báo
     `height: 400px`. CSS ở đây không đặt height, nên khai báo đó CÓ hiệu lực
     — và khi cả hai chiều đã xác định thì aspect-ratio bị bỏ qua hoàn toàn.

     Hậu quả nhìn thấy được: ô 190×400, object-fit: cover cắt mất hai bên, và
     bong bóng thoại trong ảnh đứt làm đôi. Đúng cái bẫy mà `img { height: auto }`
     trong mọi bộ reset sinh ra để tránh. */
  height: auto; aspect-ratio: 1 / 1;
  object-fit: cover; border-radius: var(--r-lg); border: 1px solid var(--line);
  margin-bottom: 18px; background: var(--line-soft);
}
.moment .ic {
  display: block; width: 26px; height: 26px; margin-bottom: 14px; color: var(--accent);
  fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
}

/* Đường nối chạy qua các mốc: hình ảnh của một ngày liền mạch, không đứt quãng
   giữa các thiết bị. Mốc cuối không có đuôi, nếu không nó chỉ ra khoảng trống
   bên phải.

   Đường nối nằm trong .rail có CHIỀU CAO CỐ ĐỊNH chứ không neo vào .moment.
   Lý do: phía trên nó là một tấm ảnh vuông cao bằng bề ngang cột, mà bề ngang
   cột thì đổi theo màn hình. Neo vào .moment thì phải đoán một khoảng cách
   không bao giờ đúng ở mọi độ rộng. */
.moment .rail { position: relative; height: 16px; margin-bottom: 14px; }
.moment .rail::before {
  content: ''; position: absolute; left: 0; top: 7px;
  width: calc(100% + 20px); height: 2px; background: var(--accent); opacity: .22;
}
/* Mốc cuối kéo hết tới mép phải chứ không cụt lại ở chấm.

   Trước đây nó dừng ngay sau chấm cuối, và một đường đứt ngang giữa chừng đọc
   ra là "hết dữ liệu" chứ không phải "hết một ngày". Đây là cột cuối nên 100%
   đã chạm đúng mép phải của khối, không tràn ra ngoài. */
.moment:last-child .rail::before { width: 100%; }
.moment .dot {
  position: absolute; left: 50%; transform: translateX(-50%); top: 0;
  z-index: 1; display: block;
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--bg); border: 3px solid var(--accent);
}
.moment .when {
  font-size: 13px; font-weight: 650; color: var(--accent);
  letter-spacing: .03em; font-variant-numeric: tabular-nums;
}
.moment .where { margin-top: 3px; font-size: 13px; color: var(--muted); }
.moment p { margin-top: 12px; color: var(--ink-2); font-size: 15px; }

.always .punch {
  margin-top: 48px; padding-top: 30px; border-top: 1px solid var(--line);
  font-size: clamp(17px, 2vw, 21px); font-weight: 600; color: var(--ink);
  text-wrap: balance; max-width: 52ch;
}

/* ── Bảng giá rút gọn ────────────────────────────────────────────────────── */

.plans { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin-top: 36px; align-items: start; }
.plan {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 26px; position: relative;
}
.plan.best { border-color: var(--accent); box-shadow: var(--shadow); }
.plan .tag {
  position: absolute; top: -11px; left: 26px;
  background: var(--accent); color: #fff; font-size: 12px; font-weight: 600;
  padding: 3px 11px; border-radius: 999px;
}
.plan h3 { font-size: 19px; }
.plan .price { margin-top: 12px; font-size: 30px; font-weight: 660; letter-spacing: -.02em; }
.plan .price small { font-size: 14px; font-weight: 500; color: var(--muted); letter-spacing: 0; }
.plan .vnd { margin-top: 2px; font-size: 14px; color: var(--muted); }
.plan ul { margin: 20px 0 24px; padding: 0; list-style: none; font-size: 14.5px; color: var(--ink-2); }
.plan li { display: flex; gap: 9px; margin-bottom: 9px; }
.plan li::before { content: '✓'; color: var(--accent); font-weight: 700; flex: none; }
.plan .btn { width: 100%; }

/* Con số phải thẳng cột khi đọc lướt — chữ số cùng bề rộng thì mắt so được
   nhanh mà không phải đọc từng chữ. */
.plan .price, table.limits td { font-variant-numeric: tabular-nums; }

/* table-layout: fixed — nếu không, trình duyệt chia cột theo NỘI DUNG, và cột
   "Không giới hạn" rộng gấp đôi cột "300". Ba cột gói phải bằng nhau thì mắt
   mới so ngang được. */
table.limits { width: 100%; border-collapse: collapse; margin-top: 32px; font-size: 15px; table-layout: fixed; }
table.limits th, table.limits td { padding: 13px 14px; border-bottom: 1px solid var(--line); text-align: left; }
table.limits th { font-weight: 600; color: var(--muted); font-size: 13px; text-transform: uppercase; letter-spacing: .04em; }

/* Tiêu đề cột phải căn CÙNG PHÍA với giá trị bên dưới nó.
   Bản đầu chỉ căn phải cho td, còn th để nguyên bên trái — nên "FREE" nằm lệch
   hẳn so với cột số ngay dưới, và cả bảng đọc ra như bị xô. */
table.limits th:not(:first-child),
table.limits td:not(:first-child) { text-align: right; }

table.limits th:first-child, table.limits td:first-child { width: 34%; }
table.limits td { overflow-wrap: anywhere; }   /* "Không giới hạn" không tràn cột */
.tablewrap { overflow-x: auto; }   /* bảng không được đẩy cả trang trượt ngang */

/* ── Câu hỏi thường gặp ──────────────────────────────────────────────────── */

.faq { margin-top: 34px; display: grid; gap: 12px; }
.faq details {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 16px 20px;
}
.faq summary { cursor: pointer; font-weight: 600; font-size: 16px; }
.faq details p { margin-top: 12px; color: var(--ink-2); font-size: 15px; }

/* ── Lời kêu gọi cuối ────────────────────────────────────────────────────── */

.final { padding: 76px 0; border-top: 1px solid var(--line); text-align: center; }
.final h2 { font-size: clamp(26px, 3.4vw, 38px); text-wrap: balance; }
.final p { margin-top: 16px; color: var(--ink-2); }
.final .cta { display: flex; justify-content: center; flex-wrap: wrap; gap: 12px; margin-top: 30px; }

/* ── Chân trang ──────────────────────────────────────────────────────────── */

footer.site { border-top: 1px solid var(--line); padding: 44px 0 56px; font-size: 14.5px; }
footer.site .cols { display: flex; flex-wrap: wrap; gap: 40px 64px; }
footer.site .col { display: flex; flex-direction: column; gap: 10px; }
footer.site .col strong { font-size: 13px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); font-weight: 600; }
footer.site a { color: var(--ink-2); text-decoration: none; }
footer.site a:hover { color: var(--accent); }
footer.site .fine { margin-top: 36px; color: var(--muted); font-size: 13.5px; }

/* ── Trang chữ (điều khoản, riêng tư) ────────────────────────────────────── */

article.doc { max-width: 74ch; margin: 0 auto; padding: 56px 0 80px; }
article.doc h1 { font-size: clamp(28px, 3.6vw, 38px); }
article.doc .updated { margin-top: 12px; color: var(--muted); font-size: 14px; }
article.doc h2 { font-size: 21px; margin-top: 40px; }
article.doc h3 { font-size: 17px; margin-top: 26px; }
article.doc p, article.doc li { color: var(--ink-2); margin-top: 12px; }
article.doc ul { padding-left: 22px; }
article.doc .callout {
  margin-top: 22px; padding: 16px 18px; border-radius: var(--r-lg);
  background: var(--accent-soft); border: 1px solid var(--line);
}
article.doc .callout p { color: var(--ink); margin-top: 0; }

/* Bỏ qua tới nội dung — cho người dùng bàn phím, không phải trang trí. */
.skip {
  position: absolute; left: -9999px;
  background: var(--surface); color: var(--ink); padding: 12px 18px;
  border-radius: var(--r-sm); border: 1px solid var(--accent); z-index: 50;
}
.skip:focus { left: 16px; top: 12px; }

:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }

/* ── Màn hẹp ─────────────────────────────────────────────────────────────── */

@media (max-width: 900px) {
  .hero { padding: 48px 0 40px; }
  .hero .grid, .split { grid-template-columns: 1fr; gap: 34px; }
  /* Trên màn hẹp mọi thứ xếp một cột, nên đảo thứ tự chỉ làm chữ rơi xuống
     dưới hình — đọc trước, nhìn sau mới đúng. */
  .split.flip > *:first-child { order: 0; }
  .cards, .plans { grid-template-columns: 1fr; }
  /* Dòng thời gian xoay đứng: bốn mốc cạnh nhau trên màn 360px thì mỗi mốc
     còn 80px, chữ vỡ thành từng chữ một. */
  /* Màn hẹp: xếp dọc. Đường nối bỏ hẳn — kéo một vạch dọc qua bốn tấm ảnh
     vuông thì nó cắt ngang giữa ảnh, xấu hơn là không có. */
  /* Hai cột ở khoảng giữa, KHÔNG phải một.

     Ngưỡng này là 900px, mà ảnh thì vuông. Một cột ở đây nghĩa là ảnh rộng
     ~860px và cao đúng bằng thế: cả màn hình máy tính bảng chỉ vừa một khoảnh
     khắc, phải cuộn bốn lần mới hết một ngày. Xuống hẳn màn điện thoại mới bỏ
     về một cột. */
  .moments { grid-template-columns: 1fr 1fr; gap: 34px 20px; }
  .moment .rail { display: none; }
  /* Bỏ trần 190px: trần đó có để bốn ảnh xếp hàng ngang trên máy tính không
     bị phình ra. Xếp dọc rồi thì nó chỉ còn làm ảnh nằm lọt thỏm giữa một cột
     rộng gấp đôi, chừa một khoảng trống bên phải không để làm gì. */
  .moment img { margin-bottom: 14px; margin-inline: 0; max-width: none; }
  /* Xếp dọc thì căn giữa không còn tác dụng gì: chỉ còn một cột, và chữ căn
     giữa trên màn hẹp thì mỗi dòng một lề, đọc mệt hơn hẳn. */
  .moment { text-align: left; }
  section.always { padding: 48px 0; }
  section.band, .final { padding: 48px 0; }
  header.top nav { display: none; }
  header.top .menu { display: block; }
  /* Ở khoảng 561–900px vẫn còn chỗ cho nút ngôn ngữ riêng, nên bỏ hai mục
     ngôn ngữ trong menu đi — bày cùng một lựa chọn ở hai nơi cạnh nhau chỉ
     làm người dùng phải nghĩ xem hai cái đó có khác nhau không. */
  .menu .lang { display: none; }
  /* Màn hẹp: logo nhỏ lại. 63px trên máy 360px thì nó với nút "Dùng thử" và
     bộ chọn ngôn ngữ không còn đủ chỗ trên một hàng. */
  header.top .row { height: 66px; gap: 10px; }
  header.top .brand img { height: 40px; }
  /* Nút chính thu gọn trên màn hẹp.

     Đo trên máy 390px: logo 77 + bộ chọn ngôn ngữ 51 + nút 166 + khoảng cách 32
     = 326 trên 342 chỗ có. Còn 16px, tức là chật cứng và trông như sắp tràn.
     Thu nút xuống ~120px thì còn thở được — mà không mất gì, vì ngay bên dưới
     phần mở đầu đã có đúng cái nút đó ở cỡ đầy đủ. */
  header.top .btn.primary { padding: 9px 15px; font-size: 14px; }

  /* Ẩn nút tải app Windows trên điện thoại.

     Không ai cài được ứng dụng Windows từ điện thoại, nên ở đây nó là một lời
     mời dẫn tới ngõ cụt — và nó đứng ngay cạnh nút chính, chia mất sự chú ý
     đúng chỗ quan trọng nhất của trang.

     TẠM THỜI: khi có bản iOS/Android thì chỗ này đổi thành nút tải app đúng
     nền tảng, chứ không phải bỏ hẳn hàng nút thứ hai. Chỉ ẩn ở phần mở đầu;
     khối "Một trí nhớ, mọi thiết bị" bên dưới vẫn liệt kê đủ nền tảng. */
  .hero .cta .btn.ghost { display: none; }
  /* Menu nội dung ẩn đi, nhưng bộ chọn ngôn ngữ thì GIỮ: người đọc tiếng
     Anh mở trang tiếng Việt trên điện thoại cần lối ra, và cuộn xuống chân
     trang để tìm không phải là một lối ra. */
  header.top .sep { display: none; }
  /* Màn hẹp: chỉ còn cờ và mũi tên. Tên ngôn ngữ nằm trong danh sách khi mở ra,
     nên không mất thông tin nào. */
  .langsel > summary { padding: 7px 10px; }
  .langsel .name { display: none; }
  .orb { max-height: 330px; }
}

/* Điện thoại: một cột, ảnh chạy hết bề ngang.

   Dưới ngưỡng này thì hai cột chỉ còn ~190px mỗi bên, và câu mô tả vỡ thành
   sáu bảy dòng — hẹp tới mức đọc khó hơn là cuộn thêm. */
@media (max-width: 560px) {
  .moments { grid-template-columns: 1fr; gap: 34px 0; }

  /* Điện thoại hẹp: gộp nút ngôn ngữ vào trong menu.
     Ba điều khiển cạnh nhau (menu, ngôn ngữ, "Dùng thử") cộng với logo là vừa
     đúng 360px — không còn khoảng thở nào, và trên máy hẹp hơn thì tràn hàng.
     Ngôn ngữ là thứ người ta bấm một lần rồi thôi, nên nó vào menu. */
  header.top .langsel { display: none; }
  .menu .lang { display: list-item; }
}
