/* ==========================================================================
   TOP TEN TRAVEL — DESIGN SYSTEM & HOMEPAGE STYLES
   Colors: Navy (#104a93), Accent Red (#E30613), Gold (#DAA520), Clean Light
   ========================================================================== */

/* Chữ CHỈ dành cho máy đọc: vẫn nằm trong cây DOM và vẫn được Google lẫn trình
   đọc màn hình đọc, nhưng không chiếm một pixel nào trên màn.

   Dùng cho `<h1>` của trang chuyên mục bài viết (khách yêu cầu 23/09/2026 thay
   dòng tiêu đề lặp lại bằng ảnh). `display: none` thì mất luôn với cả máy —
   trang không còn H1 nào. */
.sr-only {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

:root {
  /* Brand Colors */
  --primary: #104a93;
  --primary-dark: #1A2751;
  --primary-light: #21409A;
  --accent: #a21111;
  --accent-hover: #c40410;
  --gold: #D4AF37;
  --gold-light: #F4E8C1;

  /* Nền viên thuốc của menu chính và các nút tròn trên header — lấy đúng
     #E9F1FA của site đang chạy. */
  --pill-bg: #E9F1FA;

  /* Neutral Colors */
  --bg-main: #F3F6FB;
  --bg-surface: #FFFFFF;
  --bg-subtle: #F3F6FB;
  --text-main: #1A2751;
  --text-muted: #656565;
  --text-light: #94A3B8;
  --border: #E1F0F5;
  --border-light: #F3F6FB;

  /* Elevation Shadows */
  --shadow-sm: 0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05);
  --shadow-md: 0 0.25rem 0.75rem rgba(0, 34, 72, 0.08);
  --shadow-lg: 0 0.75rem 2rem rgba(0, 34, 72, 0.12);
  --shadow-hover: 0 1rem 2.5rem rgba(0, 34, 72, 0.18);

  /* Layout */
  --container-width: 77.5rem;
  --header-height: 5rem;
  /* ===== Cặp nút nổi (lên đầu trang + liên hệ nhanh) =====
     Ba con số này quyết định chỗ đứng của cả hai nút. Tách thành biến vì trước
     đây mỗi trang tự ghi đè `bottom` cho MỘT trong hai nút, và trên mobile
     trang danh sách tour hai nút chồng khít lên nhau. */
  --float-rail-base: 2.5rem;
  --float-rail-gap: 0.75rem;
  --float-rail-size: 2.75rem;
  /* Chiều cao mà .social-rail chiếm trong cột: HAI nút (Zalo, Gọi) cộng khoảng
     hở giữa chúng. Ô chat Subiz và .back-to-top đều xếp LÊN TRÊN thanh đó nên
     cùng đọc biến này. Trước đây chúng cộng thẳng `--float-rail-size` vì thanh
     chỉ có một nút — thêm nút thứ hai mà không tách biến ra thì cả cột chồng
     khít lên nhau đúng một thân nút. Viết bằng var() trong calc() để bản ghi đè
     `--float-rail-gap` của khổ di động tự truyền vào. */
  --float-rail-stack: calc(var(--float-rail-size) * 2 + var(--float-rail-gap));
  /* Cao hơn bản cũ vì bộ chọn nơi khởi hành xếp nhãn trên, ô chọn dưới. */
  /* 42px — đo từ .header-top của toptentravel.com.vn ở khung 1440px. */
  --topbar-height: 2.625rem;
  --radius-sm: 0.5rem;
  --radius-md: 0.75rem;
  --radius-lg: 1rem;
  --radius-full: 624.9375rem;
  --transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}

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

html {
  /* Tên font thật do next/font sinh ra và gắn vào <html> (xem app/layout.tsx).
     Giá trị dự phòng để bản thiết kế tĩnh mở trực tiếp vẫn ra đúng font. */
  font-family: var(--font-sans, 'Roboto Flex'), sans-serif;
  color: var(--text-main);
  background-color: var(--bg-main);
  line-height: 1.5;
  scroll-behavior: smooth;

  /* KHÔNG đặt `-webkit-font-smoothing: antialiased`.
   *
   * Đây mới là chỗ làm chữ trông mảnh hơn site đang chạy, không phải cỡ chữ hay
   * độ đậm. Đo ở khung 1440px: bề rộng chữ thật của cả sáu link thanh xanh hai
   * bên chênh nhau dưới 1px (58.7 vs 57.8, 149.5 vs 149.6) — cùng 13.5px, cùng
   * weight 500, cùng Roboto Flex. Khác đúng một thứ: site cũ để `auto`, bản này
   * ép `antialiased`.
   *
   * Trên macOS `antialiased` tắt subpixel rendering, nét chữ mỏng đi thấy rõ —
   * nhất là chữ sáng trên nền đậm như thanh xanh này. Đó là lý do khách đặt hai
   * ảnh cạnh nhau và nói bản cũ "bold hơn" dù số đo giống hệt. */

  /* ===== Gốc quy đổi của toàn bộ rem — đọc kỹ trước khi sửa =====
   *
   * Mọi kích thước trong 5 file CSS công khai đều viết bằng rem, nên dòng này
   * quyết định tỉ lệ của cả trang. Đặt cứng 16px thay vì để mặc định trình
   * duyệt: bản thiết kế được dựng ở 16px, và cỡ chữ người dùng tự chỉnh trong
   * trình duyệt vốn đã không tác động gì hồi CSS còn viết bằng px — giữ 16px
   * là giữ nguyên hiện trạng, không phải bước lùi.
   */
  font-size: 16px;
}

/*
 * Từ 1600px trở lên, 1rem = 1vw: cả trang co giãn tuyến tính theo bề ngang
 * viewport, đúng cách toptentravel.com.vn đang làm.
 *
 * Đây là thứ sửa lỗi zoom. Khi thu nhỏ trình duyệt, viewport tính bằng CSS
 * pixel phình ra (zoom 25% trên màn 1512px cho viewport ~6048px). Hồi mọi thứ
 * còn là px, container đứng yên ở 1240px nên nội dung teo lại thành một cột hẹp
 * kẹt giữa nền trống. Với 1vw thì container luôn bằng 77.5% viewport, tỉ lệ
 * giữa chữ, ảnh và khoảng cách không đổi — thu nhỏ ra đúng bản 1600px.
 *
 * Chọn 1600px chứ không phải 1200px như site thật là có lý do: tại đúng điểm
 * ngắt, 1vw phải bằng 16px thì hai bên mới nối liền nhau. Site thật ngắt ở
 * 1200px trong khi gốc của họ là 15px, nên vượt qua 1200px là cả trang tụt 20%
 * trong một khung hình. Ở 1600px, 1vw = 16px = đúng gốc bên này, không có bậc
 * nhảy nào. Hệ quả: mọi bề ngang <= 1600px giữ nguyên từng pixel như trước khi
 * chuyển đổi.
 *
 * Điều kiện của media query phải để nguyên px. Viết bằng rem thì điểm ngắt tự
 * co giãn theo chính cái nó điều khiển — hồi quy vô hạn, và lúc zoom ra trang
 * nhảy sang bố cục điện thoại thay vì giữ desktop.
 */
@media (min-width: 1600px) {
  html {
    font-size: 1vw;
  }
}

body {
  overflow-x: hidden;
}

/* Site đang golive dùng Roboto Flex 12px/18px và màu chữ thân bài #333.
   Chỉ scope vào public site để không làm nhỏ giao diện quản trị/tài khoản. */
.public-site {
  color: #333;
  font-size: 0.9375rem;
  line-height: 1.625rem;
}

a {
  color: inherit;
  text-decoration: none;
  transition: var(--transition);
}

ul {
  list-style: none;
}

button,
input,
select,
textarea {
  font-family: inherit;
  font-size: inherit;
  border: none;
  outline: none;
}

button {
  cursor: pointer;
  background: none;
}

img {
  max-width: 100%;
  display: block;
}

/* Ảnh trong nội dung do biên tập viên dán vào (`.td-richtext` — thân bài viết,
   trang tĩnh ghép khối, các mục của trang tour).
 *
 * CKEditor ghi kích thước bằng INLINE STYLE: `style="width:1379px;height:774px"`.
 * `max-width: 100%` ở trên bóp bề ngang xuống vừa cột (734px) nhưng chiều cao
 * inline vẫn đứng nguyên 774px, nên ảnh bị nén ngang còn 53% tỉ lệ thật —
 * người trong ảnh gầy nhẳng ra. Đo 12/09/2026 trên bài "Mì bò Đài Loan".
 *
 * Phải `!important`: đây là cuộc đấu với thuộc tính `style` trên chính thẻ,
 * mà inline style thắng mọi khai báo thường của stylesheet. Chỉ chạm `height`,
 * không chạm `width` — `max-width` đã lo bề ngang rồi. */
.td-richtext img {
  height: auto !important;
}

.container {
  width: 100%;
  max-width: var(--container-width);
  margin: 0 auto;
  padding: 0 1.25rem;
}

/* ======= TOP BAR ======= */
.top-bar {
  background: var(--primary);
  color: #fff;
  font-size: 0.75rem;
  line-height: 1.125rem;
  height: var(--topbar-height);
  display: flex;
  align-items: center;
  border-bottom: 0.0625rem solid rgba(255, 255, 255, 0.08);
}

/* `flex-end` chứ không `space-between`: từ 26/08/2026 cụm "Xem giá khởi hành
   tại" đã bỏ (xem `patchDepartureFilter`), thanh chỉ còn MỘT con là dải link
   phụ — mà `space-between` với một con thì dồn nó về sát mép trái, ngay dưới ổ
   logo. Dải này vốn nằm bên phải. */
.top-bar__inner {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  width: 100%;
  gap: 1.25rem;
}

/* Bộ chọn nơi khởi hành — nhãn nằm trên, ô chọn nằm dưới.
   Xếp dọc chứ không ngang: hai dòng vừa khít chiều cao thanh, và cụm này hẹp
   hơn hẳn so với xếp ngang nên dải link bên phải còn đủ chỗ trên một dòng. */
.top-bar__depart {
  display: flex;
  flex-direction: column;
  justify-content: center;
  flex: none;
  line-height: 1.15;
}

/* Ba con số dưới đây đo thẳng từ toptentravel.com.vn ở khung 1440px, không
   phải ước lượng: nhãn 9px/1.5, ô chọn 10.5px/1.25, link 13.5px/500/1.5. Site
   cũ đặt gốc rem là 14.4px còn bản này là 16px, nên cùng một con số rem ra hai
   cỡ chữ khác nhau — phải quy về px của site cũ rồi chia lại cho 16. */
.top-bar__depart label {
  font-size: 0.5625rem;
  line-height: 1.5;
  font-weight: 500;
  color: rgba(255, 255, 255, 0.85);
  white-space: nowrap;
}

/* Bỏ mũi tên mặc định của trình duyệt rồi vẽ lại bằng ảnh nền: mũi tên gốc lấy
   màu chữ hệ thống, trên nền xanh đậm gần như không thấy. */
.top-bar__depart select {
  -webkit-appearance: none;
  appearance: none;
  background: transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%23D4AF37' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m6 8 4 4 4-4'/%3E%3C/svg%3E") no-repeat right center / 0.875rem 0.875rem;
  padding: 0 1rem 0 0;
  color: var(--gold);
  font-weight: 700;
  font-size: 0.65625rem;
  line-height: 1.25;
  cursor: pointer;
}

/* Danh sách xổ ra do hệ điều hành vẽ trên nền trắng — vàng trên trắng không
   đọc được, nên chữ trong option phải trả về màu thân bài. */
.top-bar__depart select option {
  color: var(--text-main);
}

.top-bar__depart-go {
  margin-left: 0.5rem;
  color: var(--gold);
  text-decoration: underline;
}

.top-bar__links {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  min-width: 0;
}

/* Vạch ngăn dựng bằng ::after thay vì gõ ký tự "|" vào HTML: trình đọc màn hình
   bỏ qua nó, và mục cuối cùng không thừa một vạch lửng. */
.top-bar__links a {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  white-space: nowrap;
  font-size: 0.84375rem;
  font-weight: 500;
  line-height: 1.5;
}

.top-bar__links a::after {
  content: '';
  width: 0.0625rem;
  height: 0.6875rem;
  background: rgba(255, 255, 255, 0.4);
}

.top-bar__links a:last-child::after {
  display: none;
}

.top-bar__links a:hover {
  color: #ffffff;
  text-decoration: underline;
}

/* ======= HEADER ======= */
.header {
  position: sticky;
  top: 0;
  z-index: 1000;
  background: rgba(255, 255, 255, 0.95);
  backdrop-filter: blur(1rem);
  -webkit-backdrop-filter: blur(1rem);
  height: var(--header-height);
  border-bottom: 0.0625rem solid var(--border);
  transition: var(--transition);
}

.header.scrolled {
  box-shadow: var(--shadow-md);
  height: 4.375rem;
}

/* Logo gốc 265x76. Ở 4.25rem nó chiếm 237px bề ngang — cộng nút gọi, năm viên
   thuốc menu và cụm nút phải là tràn khỏi container 77.5rem. 3.75rem cho ra
   ~209px, vừa đủ để cả hàng nằm trên một dòng. */
.header .header__logo img {
  max-height: 3.75rem;
}

.header.scrolled .header__logo img {
  max-height: 3.125rem;
}

/* Không `justify-content: space-between` nữa: bố cục mới là logo → nút gọi →
   menu chạy liền nhau từ trái, còn cụm nút phải tự dạt sang phải bằng
   `margin-left: auto` (xem .header__actions). */
.header__inner {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  height: 100%;
}

.header__logo {
  flex: none;
}

/* Nút gọi đỏ nằm ngay cạnh logo như site đang chạy. Bo góc vuông hơn viên thuốc
   của menu để nó tách hẳn ra, không đọc nhầm thành một mục menu nữa. */
.header__phone {
  flex: none;
  display: flex;
  align-items: center;
  gap: 0.375rem;
  /* Chiều cao do padding quyết định chứ không đặt cứng 2.25rem: site cũ là
     6px/9px quanh chữ 13.5px, ra đúng 33px. Ghim 36px thì nút cao hơn bản cũ
     một dòng pixel thấy rõ khi khách đặt hai ảnh cạnh nhau. */
  padding: 0.375rem 0.5625rem;
  border-radius: 0.375rem;
  background: var(--accent);
  color: #fff;
  font-weight: 700;
  font-size: 0.84375rem;
  line-height: 1.5;
  white-space: nowrap;
}

/* Biểu tượng ống nghe nhỏ lại theo chữ: 16px cạnh chữ 13.5px làm nút rộng hơn
   bản cũ 25px dù cỡ chữ đã khớp. */
.header__phone svg {
  width: 0.875rem;
  height: 0.875rem;
}

.header__phone:hover {
  background: var(--primary);
}

/* Logo */
.header__logo-text {
  display: flex;
  flex-direction: column;
  line-height: 1;
}

.header__logo-top {
  font-size: 1.375rem;
  font-weight: 900;
  color: var(--primary);
  letter-spacing: -0.03125rem;
}

.header__logo-bot {
  font-size: 0.6875rem;
  font-weight: 800;
  color: var(--accent);
  letter-spacing: 0.21875rem;
}

/* Nav */
.header__nav {
  min-width: 0;
}

.header__nav-list {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

/* Cố ý **không** đặt position: relative — mega-dropdown neo vào .header để chạy
   hết bề ngang trang. Gạch chân active nằm trên `> a` (đã relative) nên không
   cần. Trên mobile dropdown là position: static nên cũng không ảnh hưởng. */
.header__nav-item {
  height: var(--header-height);
  display: flex;
  align-items: center;
}

/* Mỗi mục là một viên thuốc nền xanh nhạt, thay cho kiểu chữ trơn có gạch chân
   chạy ngang của bản thiết kế cũ. `<li>` vẫn cao bằng cả header (xem trên) nên
   vùng hover vẫn liền mạch xuống mega-dropdown, dù viên thuốc thấp hơn. */
.header__nav-item>a {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  height: 2.25rem;
  padding: 0 0.6875rem;
  border-radius: var(--radius-full);
  background: var(--pill-bg);
  font-weight: 600;
  font-size: 0.75rem;
  line-height: 1.125rem;
  color: var(--primary);
  white-space: nowrap;
}

.header__nav-item>a svg {
  flex: none;
}

.header__nav-item:hover>a,
.header__nav-item.is-open>a,
.header__nav-item>a[aria-current="page"] {
  background: var(--primary);
  color: #fff;
}

/* Mũi tên của mục có menu con. Dựng bằng viền nên nó ăn theo `currentColor` —
   viên thuốc đổi sang nền xanh đậm là mũi tên tự chuyển sang trắng. */
.header__nav-item--has-dropdown>a::after {
  content: '';
  width: 0;
  height: 0;
  border-left: 0.25rem solid transparent;
  border-right: 0.25rem solid transparent;
  border-top: 0.3125rem solid currentColor;
}

/* Mega Dropdown — dải trắng chạy hết bề ngang trang, giống site đang chạy.
   Neo vào .header chứ không vào <li>: bản cũ `left: 0` tính từ mục menu nên
   panel 5-6 cột của "Tour Combo" / "Thị thực" (hai mục cuối thanh nav) tràn
   khỏi mép phải màn hình. .header đã là containing block sẵn vì `position:
   sticky` cũng tính là positioned — chỉ cần gỡ `position: relative` khỏi <li>
   (xem chú thích ở .header__nav-item). */
.mega-dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  width: 100%;
  transform: translateX(0) translateY(0.625rem);
  background: var(--bg-surface);
  box-shadow: var(--shadow-lg);
  border-top: 0.0625rem solid var(--border);
  padding: 2rem 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: var(--transition);
  z-index: 1100;
}

/* Mở bằng CÚ BẤM, không phải rê chuột — class `.is-open` do index.js gắn (xem
   khối "6. Menu chính"). Bản `:hover` cũ có hai chỗ hỏng: rê ngang thanh nav là
   năm panel cao 2000px lần lượt phủ kín trang, và trên máy cảm ứng khổ desktop
   (laptop màn cảm ứng, iPad nằm ngang > 1024px) không có hover nên chạm vào mục
   cha là nhảy thẳng sang trang zone, không bao giờ xem được menu. Khổ mobile
   vốn đã chạy bằng `.is-open` (xem khối @media 1024px) — nay hai khổ cùng luật. */
.header__nav-item.is-open .mega-dropdown {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(0) translateY(0);
}

/* Panel chạy hết bề ngang, nhưng cột phải thẳng hàng với nội dung trang — lặp
   lại đúng khuôn của .container. */
.mega-dropdown__inner {
  display: grid;
  /* Số cột do server đặt qua `--mega-cols` (xem megaColumns trong templates.ts).
     Cột rộng tối đa 240px và dồn về trái thay vì kéo giãn `1fr`: menu 3 nhóm mà
     trải hết 1240px thì mỗi cột thừa nửa bề ngang, đọc như bảng rỗng. */
  grid-template-columns: repeat(var(--mega-cols, 4), minmax(0, 15rem));
  justify-content: start;
  gap: 1.5rem 2rem;
  width: 100%;
  max-width: var(--container-width);
  margin: 0 auto;
  padding: 0 1.25rem;
  align-items: start;
}

/* Tiêu đề cột trong mega menu là `<div>`, KHÔNG phải `<h4>`.
 *
 * Menu nằm trong <header>, tức lặp lại y nguyên trên MỌI trang. Để nó là <h4>
 * thì công cụ SEO đọc cấu trúc heading của một bài viết ra bảy cái H4 (Châu Á,
 * Châu Âu, Châu Mỹ…) đứng TRƯỚC cả H1 của bài — vừa sai thứ bậc H1→H2→H3, vừa
 * làm mọi trang trông như có cùng một dàn ý.
 *
 * Đây thuần là chữ điều hướng nên không cần cấp heading nào cả; giữ nguyên
 * kích thước, màu và khoảng cách của bản cũ để giao diện không đổi. */
.mega-dropdown__col-title,
/* Lồng thêm một class cho đủ độ đặc hiệu: `.mega-dropdown__col a` bên dưới
   cũng đặt font-size/color/font-weight, và với `<h4>` thì selector cũ hơn nó
   một cấp nên thắng. Viết phẳng `.mega-dropdown__col-title a` là hoà độ đặc
   hiệu mà lại đứng trước — chữ tiêu đề cột sẽ tụt xuống bằng cỡ mục con. */
.mega-dropdown__col .mega-dropdown__col-title a {
  font-size: 1.04167rem;
  text-transform: uppercase;
  letter-spacing: 0.05rem;
  color: var(--primary);
  margin-bottom: 0.75rem;
  font-weight: 700;
}

.mega-dropdown__col a {
  display: block;
  font-size: 0.9375rem;
  line-height: 1.125rem;
  color: var(--text-main);
  padding: 0.375rem 0;
  font-weight: normal;
}

.mega-dropdown__col a:hover {
  color: var(--primary);
  transform: translateX(0.25rem);
}

/* Actions — `margin-left: auto` là thứ đẩy cụm này về mép phải, thay cho
   `space-between` cũ trên .header__inner. */
.header__actions {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-left: auto;
  flex: none;
}

.header__search-btn {
  width: 2.25rem;
  height: 2.25rem;
  border-radius: var(--radius-full);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--primary);
  background: var(--pill-bg);
  transition: var(--transition);
}

.header__search-btn:hover {
  background: var(--primary);
  color: #fff;
}

/* Giữ nguyên nền xanh đậm chứ không đổi sang viên thuốc nhạt như các mục menu:
   đây là hành động, phải nổi lên khỏi dải nav chứ không hoà vào. */
.header__login-btn {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  height: 2.25rem;
  background: var(--primary);
  color: #fff;
  padding: 0 0.875rem;
  border-radius: var(--radius-full);
  font-weight: 600;
  font-size: 0.75rem;
  white-space: nowrap;
  box-shadow: var(--shadow-sm);
  transition: var(--transition);
}

.header__login-btn:hover {
  background: var(--primary-light);
  transform: translateY(-0.0625rem);
  box-shadow: var(--shadow-md);
}

/* Ba mảnh chỉ có nghĩa ở khổ điện thoại, dựng sẵn ở tầng máy chủ nhưng mặc định
   ẩn: ô chọn nơi khởi hành trong hàng header (bản gốc vẫn nằm trên thanh trên
   cùng ở desktop) và phần đầu menu phủ kín màn hình. */
.header__depart,
.header__nav-head {
  display: none;
}

/* Bản chép của dải liên kết phụ, chỉ dùng trong menu hamburger ở khổ điện thoại
   (do patchMobileNavUtility dựng ở tầng máy chủ). Mặc định ẩn: ở mọi khổ rộng
   hơn thì chính dải gốc trên thanh trên cùng đang hiện.

   Phải hai lớp (`.header__nav` bọc ngoài) chứ không phải một: khối
   `@media (max-width: 1024px)` bên dưới đặt `.header__nav-item { display: block }`
   — cùng độ đặc hiệu mà đứng sau, nên một lớp là bị đè và sáu mục này hiện ra ở
   khoảng 769–1024px, đúng khổ mà dải gốc vẫn còn nguyên. */
.header__nav .header__nav-item--utility {
  display: none;
}

.header__hamburger {
  display: none;
  flex-direction: column;
  gap: 0.3125rem;
  width: 1.75rem;
  height: 1.75rem;
  justify-content: center;
}

/*
 * Dưới 1180px container hẹp lại tới mức logo + nút gọi + 5 viên thuốc + cụm nút
 * phải không còn nằm vừa một dòng. Thứ hy sinh trước là dãy số điện thoại: nút
 * rút về chỉ còn icon tròn, vẫn bấm gọi được, và lấy lại khoảng 110px.
 *
 * Chỉ chặn trên (`max-width`) chứ không cần chặn dưới: từ 768px trở xuống menu
 * đã thu vào hamburger nên hàng ngang không còn chật.
 */
@media (max-width: 1180px) {
  .header__phone {
    width: 2.25rem;
    padding: 0;
    justify-content: center;
    border-radius: var(--radius-full);
  }

  .header__phone span {
    display: none;
  }
}

.header__hamburger span {
  display: block;
  height: 0.15625rem;
  width: 100%;
  background: var(--primary);
  border-radius: 0.125rem;
  transition: var(--transition);
}

/* Search Overlay */
.search-overlay {
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  background: var(--bg-surface);
  box-shadow: var(--shadow-md);
  border-bottom: 0.0625rem solid var(--border);
  padding: 1rem 0;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-0.625rem);
  transition: var(--transition);
}

.search-overlay.active {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.search-overlay__form {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  background: var(--bg-subtle);
  padding: 0.75rem 1.25rem;
  border-radius: var(--radius-full);
  border: 0.0625rem solid var(--border);
}

.search-overlay__form input {
  flex: 1;
  background: transparent;
  font-size: 0.833313rem;
}

.search-overlay__close {
  font-size: 1.125rem;
  color: var(--text-muted);
}

/* ======= HERO SECTION ======= */
/* Chiều cao phải tự đặt: ba dòng chữ giữa ảnh đã bỏ (xem patchHeroChrome), nên
   nếu để chiều cao do nội dung quyết thì hero co lại còn đúng bằng hộp tìm kiếm
   và tấm ảnh biên tập viên đăng chỉ còn là một dải mỏng.

   `overflow` để `visible` chứ không `hidden` như bản thiết kế: hộp tìm kiếm cố
   ý thò xuống dưới mép hero, và ba lớp phủ của nó (gợi ý điểm đến, bảng tháng,
   bảng nơi khởi hành) còn cao hơn thế. Ảnh của slideshow vẫn nằm trong
   `.hero__bg` vốn có `overflow: hidden` riêng, nên không có gì tràn ra. */
.hero {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 27rem;
  padding: 0;
  color: #fff;
  overflow: visible;
}

/* ===== Banner Gallery / Slideshow ===== */
.hero__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}

.hero__slides {
  position: absolute;
  inset: 0;
}

.hero__slide {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  opacity: 0;
  transform: scale(1.06);
  transition: opacity 1s ease, transform 6s ease;
  will-change: opacity, transform;
}

.hero__slide.is-active {
  opacity: 1;
  transform: scale(1);
  z-index: 1;
}

/* Mũi tên điều hướng */
.hero__arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
  width: 3rem;
  height: 3rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 0.0625rem solid rgba(255, 255, 255, 0.3);
  background: rgba(255, 255, 255, 0.12);
  backdrop-filter: blur(0.375rem);
  -webkit-backdrop-filter: blur(0.375rem);
  color: #fff;
  cursor: pointer;
  transition: background 0.2s ease, transform 0.2s ease;
}

.hero__arrow:hover {
  background: rgba(212, 175, 55, 0.9);
  border-color: transparent;
}

.hero__arrow--prev {
  left: 1.5rem;
}

.hero__arrow--next {
  right: 1.5rem;
}

/* Chấm điều hướng */
.hero__dots {
  position: absolute;
  left: 50%;
  bottom: 1.5rem;
  transform: translateX(-50%);
  z-index: 3;
  display: flex;
  gap: 0.625rem;
}

.hero__dot {
  width: 0.625rem;
  height: 0.625rem;
  padding: 0;
  border: none;
  border-radius: var(--radius-full);
  background: rgba(255, 255, 255, 0.45);
  cursor: pointer;
  transition: background 0.25s ease, width 0.25s ease;
}

.hero__dot:hover {
  background: rgba(255, 255, 255, 0.75);
}

.hero__dot.is-active {
  width: 1.75rem;
  background: var(--gold);
}

@media (prefers-reduced-motion: reduce) {
  .hero__slide {
    transition: opacity 0.3s ease;
    transform: none;
  }

  .hero__slide.is-active {
    transform: none;
  }
}

.hero__content {
  position: relative;
  /* Cao hơn các khối phía dưới để hộp tìm kiếm — và ba lớp phủ mở ra từ nó —
     nằm ĐÈ lên khối ngay bên dưới, thay vì chui xuống dưới nó. Vẫn thấp hơn
     header dính (1000) và thanh liên hệ nổi (900). */
  z-index: 20;
  /* Số âm chính là phần hộp tìm kiếm thò ra khỏi hero, đè lên nền trắng bên
     dưới — bố cục của mẫu khách đưa. Đặt ở đây chứ không ở `.hero__search` vì
     `.hero` đang là flex: margin âm trên chính flex item mới rút được chiều cao
     hero xuống theo. */
  margin-bottom: -3.25rem;
  text-align: center;
}

/* Ba dòng chữ giữa hero đã bỏ (patchHeroChrome), nhưng trang vẫn phải có đúng
   một `<h1>`: bỏ hẳn là trang chủ không còn tiêu đề cấp một nào cho bọ tìm kiếm
   lẫn trình đọc màn hình. Giấu khỏi mắt chứ KHÔNG `display: none` — cách đó giấu
   luôn khỏi cây nội dung, tức xoá thật chứ không phải giấu. */
.hero__title--sr {
  position: absolute;
  width: 0.0625rem;
  height: 0.0625rem;
  padding: 0;
  margin: -0.0625rem;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Hero Search Box (OTA Style) */
.hero__search {
  max-width: 60rem;
  margin: 0 auto;
  background: rgba(255, 255, 255, 0.14);
  backdrop-filter: blur(1.25rem);
  -webkit-backdrop-filter: blur(1.25rem);
  border: 0.0625rem solid rgba(255, 255, 255, 0.2);
  border-radius: var(--radius-lg);
  padding: 0.75rem;
  box-shadow: var(--shadow-lg);
}

.hero__search-box {
  display: grid;
  grid-template-columns: 2fr 1.5fr 1fr auto;
  gap: 0.5rem;
  background: #fff;
  padding: 0.5rem;
  border-radius: var(--radius-md);
}

/* Dải nhánh sản phẩm nằm trên cùng, chiếm trọn bề ngang hộp tìm kiếm.
   `1 / -1` chứ không phải `span 4`: hộp là lưới 4 cột ở desktop nhưng rút còn
   1 cột ở điện thoại, viết số cứng thì ở màn nhỏ dải này tràn ra ngoài. */
.hero__search-types {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: 0.375rem;
  padding: 0.25rem 0.25rem 0;
}

/* Ô radio thật, chỉ giấu khỏi mắt chứ không `display: none` — mất hẳn khỏi cây
   thì bàn phím không tab tới được và trình đọc màn hình không thấy nhóm này. */
.hero__search-type input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.hero__search-type span {
  display: inline-block;
  padding: 0.4375rem 1rem;
  border: 0.0625rem solid var(--border);
  border-radius: var(--radius-full);
  background: var(--bg-subtle);
  color: var(--primary);
  font-size: 0.75rem;
  font-weight: 700;
  cursor: pointer;
  transition: var(--transition);
}

.hero__search-type span:hover {
  border-color: var(--primary);
}

.hero__search-type input:checked+span {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
}

/* Bàn phím: viền focus phải nằm trên chữ, vì ô radio đã bị giấu đi. */
.hero__search-type input:focus-visible+span {
  outline: 0.125rem solid var(--gold);
  outline-offset: 0.125rem;
}

/* ===== Cùng dải đó, rút thành một ô chọn trên điện thoại ===== */
/* index.js dựng ô này từ chính mấy nút bên trên rồi gắn `.is-enhanced`; chỉ khối
   @media 768px bên dưới mới cho nó hiện. Mặc định `none` vì hai lý do: màn rộng
   vẫn là dải nút, và trang không chạy được JS thì ô này chưa từng được dựng —
   nhưng nếu có ai chèn tay vào markup, giấu sẵn vẫn đúng hơn là bày ra một ô
   chọn không gửi đi đâu cả. */
.hero__search-typefield {
  display: none;
  align-items: center;
  gap: 0.625rem;
  width: 100%;
  padding: 0.75rem 1rem;
  background: var(--bg-subtle);
  border-radius: var(--radius-sm);
  color: var(--text-main);
}

/* Hình cái thẻ ở đầu ô: cùng màu, cùng cỡ với hình lịch và máy bay của hai ô
   dưới, để ba ô đọc thành một hàng câu hỏi chứ không phải hai thứ khác nhau. */
.hero__search-typefield>svg:first-child {
  color: var(--primary);
  flex-shrink: 0;
}

/* Mũi tên cuối ô chỉ là chỉ dấu "bấm ra còn nữa" nên mờ hơn hình đầu ô — giống
   hệt cách `.hero__picker-trigger svg` phân biệt hai loại hình. */
.hero__search-typefield>svg:last-child {
  color: var(--text-muted, #6b7a90);
  flex-shrink: 0;
}

/* `appearance: none` để bỏ mũi tên mặc định của trình duyệt: đã có mũi tên vẽ
   tay ở trên, không thì ô có hai cái cạnh nhau. Menu bung ra vẫn là menu gốc của
   điện thoại — thứ chọn tốt nhất trên màn nhỏ, và không có lớp phủ nào để bị
   bảng trượt của /tours cắt mất. */
.hero__search-typeselect {
  flex: 1;
  min-width: 0;
  background: transparent;
  border: 0;
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--text-main);
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

.hero__search-typeselect:focus-visible {
  outline: 0.125rem solid var(--gold);
  outline-offset: 0.25rem;
}

/* ===== Hàng "Tìm kiếm nổi bật" — dải chủ đề kéo từ dưới hero lên ===== */
/* Nằm trong lòng hộp tìm kiếm, dưới hàng ô hỏi, ngăn bằng một đường kẻ: đây là
   lối tắt của chính câu hỏi hộp này đang hỏi, không phải một khối khác. */
/* `min-width: 0` ở ĐÂY mới là chỗ quyết định, không phải ở dải cuộn bên trong:
   ô lưới mặc định không co nhỏ hơn nội dung của nó, mà nội dung đây là nhãn +
   bốn viên chủ đề. Thiếu dòng này thì trên điện thoại chính hàng này kéo cả hộp
   tìm kiếm rộng hơn màn hình và mọi ô bị cắt cụt bên phải. */
.hero__featured {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  min-width: 0;
  margin-top: 0.125rem;
  padding: 0.5rem 0.25rem 0;
  border-top: 0.0625rem solid var(--border);
}

/* `.hero__content` căn giữa mọi chữ bên trong nó — nhãn này phải tự gỡ ra, không
   thì ở màn hẹp (nhãn xuống dòng riêng) nó nằm giữa trong khi dải chip ngay dưới
   bắt đầu từ mép trái. */
.hero__featured-label {
  flex-shrink: 0;
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--text-muted, #6b7a90);
  text-align: left;
}

/* `min-width: 0` là bắt buộc: mặc định flex item không co nhỏ hơn nội dung của
   nó, mà nội dung đây là một dải cuộn ngang — thiếu dòng này thì dải đẩy cả hộp
   tìm kiếm rộng ra thay vì tự cuộn bên trong. */
.hero__featured .home-nav__row {
  flex: 1;
  min-width: 0;
}

/* Dải này chỉ vài mục và nằm gọn trong hộp, không cần hai nút mũi tên chiếm chỗ
   hai bên — vuốt/lăn vẫn cuộn được như thường. */
.hero__featured .home-nav__arrow {
  display: none;
}

/* `is-static` do index.js gắn khi dải đủ chỗ, và nó căn GIỮA — hợp với khối
   điều hướng rộng cả trang, nhưng ở đây dải đứng ngay sau nhãn "Tìm kiếm nổi
   bật:" nên căn giữa mở ra một khoảng trống giữa nhãn và chip đầu tiên, đọc ra
   như nhãn đang nói về một thứ ở tận đâu. */
.hero__featured .home-nav__track,
.hero__featured .home-nav__track.is-static {
  justify-content: flex-start;
  gap: 0.5rem;
  padding: 0;
}

/* Ở khối cũ mỗi chủ đề là một ô dọc (icon to, tên ở dưới, rộng 8.5rem). Trong
   hộp tìm kiếm phải nằm ngang thành viên thuốc, không thì một hàng chủ đề cao
   hơn cả hàng ô hỏi phía trên nó. */
.hero__featured .home-nav__theme {
  flex-direction: row;
  gap: 0.375rem;
  min-width: 0;
  padding: 0.3125rem 0.75rem;
  border: 0.0625rem solid var(--border);
  border-radius: var(--radius-full);
  background: var(--bg-subtle);
  white-space: nowrap;
}

.hero__featured .home-nav__theme:hover {
  transform: none;
  border-color: var(--primary);
}

.hero__featured .home-nav__theme-icon {
  width: 1.25rem;
  height: 1.25rem;
}

.hero__featured .home-nav__theme-name {
  font-size: 0.835rem;
  font-weight: normal;
}

.hero__search-field {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.75rem 1rem;
  background: var(--bg-subtle);
  border-radius: var(--radius-sm);
  color: var(--text-main);
}

.hero__search-field svg {
  color: var(--primary);
  flex-shrink: 0;
}

.hero__search-field input,
.hero__search-field select {
  width: 100%;
  background: transparent;
  font-size: 0.75rem;
  font-weight: 500;
  color: var(--text-main);
}

.hero__search-submit {
  background: var(--accent);
  color: #fff;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0 1.75rem;
  border-radius: var(--radius-sm);
  font-weight: 700;
  font-size: 0.75rem;
  transition: var(--transition);
}

.hero__search-submit:hover {
  background: var(--accent-hover);
  transform: scale(1.02);
}

/* ===== Bảng gợi ý điểm đến dưới ô "Bạn muốn đi đâu?" ===== */
/* Ô chứa phải là mốc định vị, nếu không lớp phủ sẽ bám vào .hero (đang có
   transform cho slideshow) và rơi lệch hẳn xuống giữa ảnh nền. */
.hero__search-field--dest {
  position: relative;
}

.hero__dest-panel {
  position: absolute;
  top: calc(100% + 0.75rem);
  left: 0;
  z-index: 40;
  /* Rộng hơn ô nhập — ô chỉ chiếm 2fr của thanh tìm kiếm, mà lưới ba cột cần
     chỗ cho ảnh + tên + số tour. Kẹp theo bề ngang màn để trên máy hẹp bảng
     không tràn ra ngoài rồi sinh thanh cuộn ngang cho cả trang. */
  width: max(100%, 46rem);
  max-width: calc(100vw - 3rem);
  max-height: min(32rem, 70vh);
  overflow-y: auto;
  padding: 1.25rem 1.5rem 1rem;
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: 0 1.5rem 3rem rgba(10, 30, 60, 0.22);
  text-align: left;
  cursor: default;
}

.hero__dest-panel[hidden] {
  display: none;
}

/* ===========================================================================
   Tờ chọn điểm đến toàn màn hình (chỉ điện thoại)

   Trên màn hẹp, bảng gợi ý thả xuống dưới ô nhập bị kẹp giữa hai thứ: mép dưới
   màn hình và bàn phím ảo vừa bật lên. Chỗ còn lại đủ cho hai dòng rưỡi, tức
   khách phải cuộn trong một khe hẹp để đọc một danh sách vốn dài mười mấy mục.

   Nên ở khổ đó nó mở thành một tờ phủ kín màn hình, có tiêu đề và ô tìm riêng —
   đúng cách mọi ứng dụng đặt vé làm. `index.js` gắn lớp `is-sheet` khi
   `matchMedia('(max-width: 768px)')` khớp; ngoài khổ đó tờ này không tồn tại,
   bảng thả xuống vẫn nguyên như cũ.

   `position: fixed` chỉ phủ được cả màn hình khi KHÔNG tổ tiên nào tạo khối
   chứa mới — xem chú thích `backdrop-filter` ở khối `@media (max-width: 768px)`
   của `.hero__search`.
   ======================================================================== */
.hero__dest-panel.is-sheet {
  position: fixed;
  inset: 0;
  z-index: 1200;
  width: 100%;
  max-width: none;
  /* dvh chứ không phải vh: thanh địa chỉ của Safari/Chrome trên iOS co lại khi
     cuộn, vh giữ nguyên số cũ nên đáy tờ bị hụt đúng bằng chiều cao thanh đó. */
  height: 100dvh;
  max-height: none;
  padding: 0;
  border-radius: 0;
  box-shadow: none;
  overscroll-behavior: contain;
}

/* Phần đầu tờ dựng sẵn trong DOM nhưng chỉ có nghĩa ở chế độ tờ: bảng thả xuống
   trên desktop đã có ô nhập của chính nó ngay bên trên. */
.hero__dest-panel:not(.is-sheet) .hero__dest-sheet {
  display: none;
}

.hero__dest-sheet {
  position: sticky;
  top: 0;
  z-index: 2;
  background: #fff;
  border-bottom: 0.0625rem solid var(--border, #e6ebf2);
}

.hero__dest-sheet-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 0.875rem 1rem;
}

.hero__dest-sheet-title {
  margin: 0;
  font-size: 1.0625rem;
  font-weight: 800;
  color: var(--text, #0f2a4a);
}

.hero__dest-sheet-close {
  flex-shrink: 0;
  width: 2.5rem;
  height: 2.5rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--radius-full);
  background: transparent;
  color: var(--text, #0f2a4a);
  cursor: pointer;
}

.hero__dest-sheet-close:active {
  background: var(--bg-soft, #f1f5fa);
}

.hero__dest-sheet-search {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 1rem 0.875rem;
  padding: 0.6875rem 0.875rem;
  border: 0.0625rem solid var(--border, #e6ebf2);
  border-radius: var(--radius-md);
  color: var(--text-muted, #6b7a90);
}

.hero__dest-sheet-search input {
  flex: 1;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--text, #0f2a4a);
  /* 16px chẵn: dưới mốc này Safari trên iPhone tự phóng to cả trang khi con trỏ
     vào ô — xem khối cuối file. */
  font-size: 1rem;
}

.hero__dest-panel.is-sheet .hero__dest-group {
  padding: 0 1rem;
}

.hero__dest-panel.is-sheet .hero__dest-empty {
  padding: 0.75rem 1rem 1rem;
}

/* Nền trang không được cuộn sau lưng tờ: cuộn "xuyên" qua lớp phủ là lỗi kinh
   điển của bottom sheet trên di động — đóng tờ ra thì trang đã trôi đi đâu mất. */
body.has-dest-sheet {
  overflow: hidden;
}

/* Tờ nằm trong `.hero__content`, mà khối đó có `z-index: 20` — tức số 1200 của
   tờ chỉ so bì được với anh em BÊN TRONG khối ấy. Header dính (1000) và cụm nút
   nổi (900) nằm ngoài nên vẫn phủ lên trên: tiêu đề và nút đóng của tờ chui
   xuống dưới logo. Nâng chính khối chứa lúc tờ mở, đóng tờ là trả về như cũ. */
body.has-dest-sheet .hero__content {
  z-index: 1300;
}

.hero__dest-group+.hero__dest-group {
  margin-top: 1.25rem;
  padding-top: 1.125rem;
  border-top: 0.0625rem solid var(--border, #e6ebf2);
}

.hero__dest-title {
  margin-bottom: 0.875rem;
  color: var(--text-main);
  font-size: 0.9375rem;
  font-weight: 800;
}

.hero__dest-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.5rem 1.25rem;
}

/* Nhóm TOUR xếp một cột. Tên tour dài 60-80 ký tự; nhét vào lưới ba cột của
   nhóm danh mục thì dòng nào cũng cụt ở chữ thứ tư và mười dòng trông giống hệt
   nhau — không chọn được cái nào. */
.hero__dest-grid--rows {
  grid-template-columns: minmax(0, 1fr);
  gap: 0.25rem;
}

/* Và ở một cột thì tên được xuống dòng, tối đa hai dòng. Quy tắc cắt-một-dòng
   bên dưới là của ô điểm đến trong lưới ba cột, để nguyên ở đây là vừa có chỗ
   vừa không dùng. */
.hero__dest-grid--rows .hero__dest-text strong {
  white-space: normal;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  line-height: 1.35;
}

.hero__dest-item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem;
  border-radius: var(--radius-sm);
  color: var(--text-main);
  transition: var(--transition);
}

.hero__dest-item:hover,
.hero__dest-item.is-active {
  background: var(--bg-subtle);
}

.hero__dest-item[hidden] {
  display: none;
}

.hero__dest-thumb {
  width: 3rem;
  height: 3rem;
  flex-shrink: 0;
  border-radius: 0.625rem;
  overflow: hidden;
  background: var(--bg-subtle);
}

/* Chuyên mục chưa có ảnh: vẽ ghim bản đồ vào ô thay vì để một hình vuông xám
   trơ ra. Bảng cũ không gặp cảnh này vì nó chỉ lấy chuyên mục tầng 2, mà tầng
   đó thì biên tập đặt ảnh đủ; gợi ý bây giờ với tới cả tầng sâu hơn (Tour Nhật
   Bản Tết, Tour MICE Nhật Bản) — phần lớn trong số đó chưa có ảnh nào. Ẩn hẳn ô
   thì các dòng trong cùng một lưới lệch nhau, còn tệ hơn. */
.hero__dest-thumb:empty {
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted, #6b7a90);
  background:
    center / 1.25rem 1.25rem no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7a90' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z'/%3E%3Ccircle cx='12' cy='10' r='3'/%3E%3C/svg%3E"),
    var(--bg-subtle);
}

.hero__dest-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.hero__dest-text {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
}

.hero__dest-text strong {
  font-size: 0.9375rem;
  font-weight: 700;
  /* Tên dài như "Thành phố Hồ Chí Minh" phải cắt gọn, không được đẩy cột. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.hero__dest-text small {
  color: var(--text-muted, #6b7a90);
  font-size: 0.8125rem;
}

.hero__dest-empty {
  padding: 0.75rem 0.5rem 0.25rem;
  color: var(--text-muted, #6b7a90);
  font-size: 0.875rem;
}

.hero__dest-empty[hidden] {
  display: none;
}

/* ===== Bảng chọn "Tháng khởi hành" / "Nơi khởi hành" ===== */
/* Hai ô này vẫn là <select> thật trong HTML — không có JS thì khách bấm ra menu
   của trình duyệt và form gửi đúng như cũ. index.js dựng nút + bảng phủ lên rồi
   gắn `.is-enhanced` để giấu <select> đi; <select> vẫn là chỗ giữ giá trị. */
.hero__search-field--picker {
  position: relative;
}

.hero__search-field--picker.is-enhanced select {
  display: none;
}

.hero__picker-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  width: 100%;
  color: var(--text-muted, #6b7a90);
  font-size: 0.75rem;
  font-weight: 500;
  text-align: left;
}

.hero__picker-trigger.is-filled {
  color: var(--text-main);
  font-weight: 700;
}

/* Mũi tên của nút, không phải biểu tượng của ô: `.hero__search-field svg` phía
   trên tô nó thành xanh đậm như hình lịch/máy bay, mà nó chỉ là chỉ dấu "bấm ra
   còn nữa" nên phải mờ hơn. Cùng độ đặc hiệu, quy tắc này đứng sau nên thắng. */
.hero__picker-trigger svg {
  color: var(--text-muted, #6b7a90);
  transition: var(--transition);
}

.hero__picker-trigger[aria-expanded="true"] svg {
  transform: rotate(180deg);
}

/* Không có gì để chọn (chuyên mục chưa mở lịch khởi hành nào): nút mờ đi và
   nói thẳng, thay vì mở ra một bảng trắng. */
.hero__picker-trigger:disabled {
  opacity: 0.6;
  cursor: default;
}

.hero__picker-panel {
  position: absolute;
  top: calc(100% + 0.75rem);
  left: 0;
  z-index: 40;
  width: max(100%, 20rem);
  max-width: calc(100vw - 3rem);
  padding: 1rem 1.125rem 1.125rem;
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: 0 1.5rem 3rem rgba(10, 30, 60, 0.22);
  text-align: left;
  cursor: default;
}

/* Ô "Nơi khởi hành" nằm sát mép phải hộp tìm kiếm: bảng thả từ mép trái ra sẽ
   thò khỏi hộp trên màn hẹp, nên nó bám mép phải và mở ngược vào trong. */
.hero__picker-panel.is-right {
  left: auto;
  right: 0;
}

.hero__picker-panel[hidden] {
  display: none;
}

.hero__picker-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 0.875rem;
}

.hero__picker-head strong {
  color: var(--text-main);
  font-size: 0.9375rem;
  font-weight: 800;
}

.hero__picker-close {
  display: flex;
  color: var(--text-muted, #6b7a90);
  transition: var(--transition);
}

.hero__picker-close:hover {
  color: var(--text-main);
}

.hero__picker-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 0.875rem;
}

.hero__picker-any {
  color: var(--accent);
  font-size: 0.875rem;
  font-weight: 700;
}

.hero__picker-any:hover {
  text-decoration: underline;
}

.hero__picker-year {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.hero__picker-year-label {
  min-width: 2.75rem;
  color: var(--text-main);
  font-size: 0.9375rem;
  font-weight: 800;
  text-align: center;
}

.hero__picker-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.75rem;
  height: 1.75rem;
  border: 0.0625rem solid var(--border, #e6ebf2);
  border-radius: var(--radius-full);
  color: var(--accent);
  transition: var(--transition);
}

.hero__picker-nav:hover:not(:disabled) {
  border-color: var(--accent);
}

/* Hết dữ liệu về phía đó rồi. Để mờ chứ không giấu: có vậy khách mới biết mình
   đang ở đầu dải chứ không tưởng nút hỏng. */
.hero__picker-nav:disabled {
  color: var(--text-muted, #6b7a90);
  opacity: 0.45;
  cursor: default;
}

.hero__picker-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.5rem;
}

.hero__picker-grid[hidden] {
  display: none;
}

.hero__picker-month {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.0625rem;
  padding: 0.5625rem 0.25rem;
  border: 0.0625rem solid var(--border, #e6ebf2);
  border-radius: var(--radius-sm);
  color: var(--text-main);
  transition: var(--transition);
}

.hero__picker-month strong {
  font-size: 0.875rem;
  font-weight: 700;
}

.hero__picker-month small {
  color: var(--text-muted, #6b7a90);
  font-size: 0.6875rem;
}

.hero__picker-month:hover {
  border-color: var(--primary);
  background: var(--bg-subtle);
}

.hero__picker-list {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  max-height: min(20rem, 50vh);
  overflow-y: auto;
}

.hero__picker-row {
  padding: 0.5625rem 0.75rem;
  border-radius: var(--radius-sm);
  color: var(--text-main);
  font-size: 0.875rem;
  font-weight: 600;
  text-align: left;
  transition: var(--transition);
}

.hero__picker-row:hover {
  background: var(--bg-subtle);
}

.hero__picker-row--any {
  color: var(--accent);
  font-weight: 700;
}

/* Đặt sau `--any` để lựa chọn đang chọn luôn thắng về màu, kể cả khi nó là dòng
   "Bất kỳ nơi nào". */
.hero__picker-month.is-selected,
.hero__picker-row.is-selected {
  border-color: var(--primary);
  background: var(--primary);
  color: #fff;
}

.hero__picker-month.is-selected small {
  color: rgba(255, 255, 255, 0.85);
}

/* Viền focus phải tự viết: khối reset đầu file đặt `outline: none` cho mọi nút. */
.hero__picker-trigger:focus-visible,
.hero__picker-close:focus-visible,
.hero__picker-nav:focus-visible,
.hero__picker-any:focus-visible,
.hero__picker-month:focus-visible,
.hero__picker-row:focus-visible {
  outline: 0.125rem solid var(--gold);
  outline-offset: 0.125rem;
}

/* Quick Stats */
.hero__stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem;
  max-width: 55rem;
  margin: 0 auto;
  padding-top: 1.875rem;
  border-top: 0.0625rem solid rgba(255, 255, 255, 0.15);
}

.hero__stat strong {
  display: block;
  font-size: 2rem;
  font-weight: 900;
  color: var(--gold);
}

.hero__stat span {
  font-size: 0.8125rem;
  color: rgba(255, 255, 255, 0.75);
}

/* ===== Khối điều hướng hai tầng (đầu section Ưu đãi giờ chót) ===== */
/* Tầng trên: dải điểm đến dạng viên thuốc. Tầng dưới: thẻ trắng chứa dải chủ đề.
   Cả hai đặt trên nền gradient xanh của .flash-sale, nên đều là nền trắng chữ
   navy — cùng ngôn ngữ với thẻ tour ngay bên dưới, không phải nền mờ như bản
   trước (bản đó nằm trên ảnh hero nên mới cần trong suốt). */
.home-nav {
  margin: 2rem auto;
}

/* Hàng cuộn + hai nút mũi tên. Nút nằm đè lên hai mép dải chứ không đẩy dải hẹp
   lại: bề ngang dành cho nội dung là thứ quý nhất ở đây. */
.home-nav__row {
  position: relative;
}

.home-nav__row+.home-nav__panel {
  margin-top: 1rem;
}

.home-nav__track {
  display: flex;
  align-items: stretch;
  gap: 0.75rem;
  overflow-x: auto;
  scroll-behavior: smooth;
  /* Chừa chỗ hai bên cho nút mũi tên và cho phần bóng đổ của chip khỏi bị cắt. */
  padding: 0.5rem 2.75rem;
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.home-nav__track::-webkit-scrollbar {
  display: none;
}

/* Đủ chỗ cho mọi mục thì căn giữa. Lớp này do index.js gắn sau khi đo, không
   đặt thẳng `justify-content: center` trong CSS: với flex cuộn ngang, căn giữa
   lúc nội dung tràn sẽ đẩy mục đầu ra ngoài vùng cuộn và không kéo lại được. */
.home-nav__track.is-static {
  justify-content: center;
}

.home-nav__arrow {
  position: absolute;
  top: 50%;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  transform: translateY(-50%);
  border-radius: var(--radius-full);
  border: 0;
  background: #fff;
  color: var(--gold);
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--shadow-md);
  transition: var(--transition);
}

.home-nav__arrow:hover {
  background: var(--gold);
  color: #fff;
}

.home-nav__arrow[hidden] {
  display: none;
}

.home-nav__arrow--prev {
  left: 0;
}

.home-nav__arrow--next {
  right: 0;
}

/* --- Tầng 1: điểm đến --- */
.home-nav__chip {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  gap: 0.625rem;
  padding: 0.3125rem 1.125rem 0.3125rem 0.3125rem;
  border-radius: var(--radius-full);
  background: #fff;
  color: var(--text-main);
  box-shadow: var(--shadow-md);
  transition: var(--transition);
}

.home-nav__chip:hover {
  transform: translateY(-0.125rem);
  box-shadow: var(--shadow-hover);
  color: var(--primary-dark, var(--text-main));
}

.home-nav__chip-thumb {
  width: 2.5rem;
  height: 2.5rem;
  flex-shrink: 0;
  overflow: hidden;
  border-radius: var(--radius-full);
  background: var(--gold-light);
}

.home-nav__chip-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.home-nav__chip-name {
  font-size: 0.9375rem;
  font-weight: 700;
  white-space: nowrap;
}

/* --- Tầng 2: chủ đề --- */
.home-nav__panel {
  position: relative;
  border-radius: 1.5rem;
  background: #fff;
  box-shadow: var(--shadow-lg);
}

.home-nav__panel .home-nav__track {
  padding: 1.5rem 3.25rem;
}

.home-nav__theme {
  display: flex;
  flex: 0 0 auto;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  gap: 0.625rem;
  min-width: 8.5rem;
  padding: 0.25rem 0.5rem;
  color: var(--text-main);
  text-align: center;
  transition: var(--transition);
}

.home-nav__theme:hover {
  transform: translateY(-0.1875rem);
  color: var(--accent);
}

.home-nav__theme-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
}

.home-nav__theme-icon img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.home-nav__theme-name {
  font-size: 0.9375rem;
  font-weight: 700;
  line-height: 1.3;
}

/* ======= SECTION HEADER ======= */
.section-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  margin-bottom: 2rem;
}

.section-header--center {
  text-align: center;
  flex-direction: column;
  align-items: center;
}

.section-header__label {
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.0625rem;
  color: var(--accent);
  margin-bottom: 0.25rem;
}

.section-header__title {
  font-size: 1.666688rem;
  line-height: 2.291688rem;
  font-weight: 800;
  color: var(--primary);
  letter-spacing: -0.03125rem;
}

.section-header__link {
  font-weight: 600;
  font-size: 0.75rem;
  color: var(--primary);
}

.section-header__link:hover {
  color: var(--accent);
}

/* ======= DESTINATIONS ======= */
.destinations {
  padding: 3rem 0;
}

.destinations-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  margin-bottom: 2rem;
  flex-wrap: wrap;
  gap: 1rem;
}

.bento-grid {
  display: grid;
  grid-template-columns: 2fr 1.5fr 1.5fr;
  gap: 1.25rem;
  height: 31.25rem;
}

/* Thuộc tính `hidden` chỉ được UA stylesheet đặt `display:none`, mà quy tắc của
   UA luôn thua quy tắc của trang — nên `display:grid` ở trên ghi đè và cả hai
   nhánh (Trong nước / Nước ngoài) cùng hiện. Phải tự khai báo lại. */
.bento-grid[hidden] {
  display: none;
}

.bento-col {
  display: grid;
  grid-template-rows: 1fr 1fr;
  gap: 1.25rem;
  height: 100%;
}

.bento-card {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  display: block;
  height: 100%;
}

.bento-card__img {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}

.bento-card:hover .bento-card__img {
  transform: scale(1.08);
}

.bento-card__overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 40%, rgba(0, 34, 72, 0.85) 100%);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: 1.5rem;
  color: #fff;
}

.bento-card__tag {
  align-self: flex-end;
  background: rgba(255, 255, 255, 0.2);
  border: 0.0625rem solid rgba(255, 255, 255, 0.3);
  padding: 0.25rem 0.75rem;
  border-radius: var(--radius-full);
  font-size: 0.6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03125rem;
}

.bento-card__tag--popular {
  background: rgba(212, 175, 55, 0.2);
  border-color: rgba(212, 175, 55, 0.4);
  color: var(--gold);
}

.bento-card__meta h3 {
  font-size: 1rem;
  font-weight: 800;
  margin-bottom: 0.125rem;
}

.bento-card--large .bento-card__meta h3 {
  font-size: 1rem;
}

.bento-card__meta p {
  font-size: 0.8125rem;
  color: rgba(255, 255, 255, 0.8);
}

/* ======= TOURS SECTION ======= */
.tours-section {
  padding: 3rem 0;
  background: var(--bg-surface);
}

/* ===== Hai dải tour do biên tập chọn tay =====
 *
 * Chèn ngay dưới section "Săn tour giá hời" (xem `patchHomeRails` bên
 * lib/public/templates.ts). Dùng lại nguyên bộ `.tours-section` +
 * `.tours-header-wrapper` của khối trên nên ở đây chỉ khai đúng phần khác.
 *
 * Nền xen kẽ: ba khối tour liền nhau cùng một nền thì mắt đọc thành một khối
 * dài duy nhất, không nhận ra đây là ba nhóm sản phẩm khác nhau.
 *
 * Dùng --bg-subtle (#F3F6FB) chứ không phải một biến nền trắng khác: .tours-section
 * vốn đã là --bg-surface (#FFFFFF), nên đặt trắng lên trắng thì "xen kẽ" không
 * đổi được pixel nào. */

#home-rail-domestic {
  background: #ffffff;
  padding-top: 0;
  padding-bottom: 1.5rem;
}

/* Nút "Xem tất cả →" ở đầu năm khối trang chủ — hai dải tour, Tour Mice, các
   dải tin, Cẩm nang du lịch (khách yêu cầu 28/09/2026 cùng một chữ, cùng một
   kiểu; xem `patchSectionMore` bên lib/public/templates.ts). Thân nút là
   .btn--outline, ở đây chỉ khai phần riêng; khổ điện thoại ở @media 768px.
   `flex: none`: cả năm đứng trong hàng flex cạnh tiêu đề, tiêu đề dài thì nút
   không được co lại mà để tiêu đề xuống dòng. */
.section-more {
  flex: none;
  white-space: nowrap;
}

/* Hai hàng thẻ cho dải "Tour nước ngoài" ("8 tour 2 dòng").

   Băng cuộn đổi từ flex sang grid: flex-wrap KHÔNG dùng được ở đây vì băng còn
   phải cuộn ngang được trên màn hẹp, mà wrap thì nó xuống dòng thay vì tràn.
   `grid-auto-flow: column` giữ đúng tính chất đó — thêm thẻ là mọc thêm CỘT.

   Hệ quả phải biết: thẻ xếp theo cột chứ không theo hàng, tức thứ tự 1-2 nằm ở
   cột đầu (trên/dưới), 3-4 ở cột hai. Cột mới là đơn vị cuộn nên cặp thẻ đi
   cùng nhau là đúng, nhưng ai chỉnh `display_order` trong admin cần biết nó
   chạy dọc trước.

   `flex: 0 0 ...` khai ở .tours-track>.tour-card thành vô hiệu trong grid, nên
   bề ngang cột phải khai lại ở đây — và khai lại ở CẢ HAI ngưỡng responsive
   bên dưới, không thì màn hẹp rơi về cột co giãn. */
.home-rail--rows-2 {
  padding-bottom: 1.5rem !important;
}

.home-rail--rows-2 .tours-track {
  display: grid;
  grid-auto-flow: column;
  grid-template-rows: repeat(2, auto);
  grid-auto-columns: calc((100% - 4.5rem) / 4);
  align-items: start;
  padding: 0.5rem 0 1.5rem;
  margin: 0 auto !important;
}

/* ======= BANNER ĐẦU DẢI TOUR (trang chủ) ======= */

/* Khối banner dưới tiêu đề dải — dựng lại khối "Ưu đãi Tour" của site cũ.
   Hai bố cục, chọn theo số lượng banner ở bannerBlockHtml (lib/public/templates.ts):
   đủ 5 tấm thì mosaic, ít hơn thì lưới hai cột giữ nguyên tỉ lệ ảnh. */
.rail-banners {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
  margin-bottom: 2rem;
}

.rail-banner {
  display: block;
  overflow: hidden;
  border-radius: 0.75rem;
  background: var(--bg-subtle);
  transition: var(--transition);
}

.rail-banner:hover {
  transform: translateY(-0.1875rem);
  box-shadow: var(--shadow-md);
}

/* Khung phải có tỉ lệ CỐ ĐỊNH, không được để `height: auto`: ảnh tải lười nên
   trước khi tải xong trình duyệt không biết cao bao nhiêu và ô co về 0 — cả
   khối banner biến mất rồi bung ra đẩy nội dung xuống khi ảnh về (đo được
   592x0 ở 1440px).

   3.4:1 là khổ thật của bộ banner dải ngang bên site cũ (1988x584) nên bốn tấm
   đang chạy không bị cắt tí nào. Tấm nào biên tập tải lên sau lệch khổ thì
   `cover` cắt hai mép — banner ở vị trí này nên giữ đúng khổ đó. */
.rail-banner img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 3.4;
  object-fit: cover;
}

/* Mosaic: 4 cột, tấm đầu chiếm ô 2x2 bên trái, bốn tấm sau xếp 2x2 bên phải.
   Đúng năm tấm mới kín lưới — bannerBlockHtml chỉ bật lớp này khi đủ 5. */
.rail-banners--mosaic {
  grid-template-columns: repeat(4, 1fr);
}

.rail-banners--mosaic .rail-banner--lead {
  grid-column: span 2;
  grid-row: span 2;
}

/* Mosaic đi với bộ banner khổ vuông hơn: 1.74:1 là tỉ lệ thật của khối "Ưu đãi
   Tour" site cũ (1234x710). */
.rail-banners--mosaic .rail-banner img {
  aspect-ratio: 1.74;
}

/* Tấm lớn cao bằng hai tấm nhỏ + khoảng hở, nên bỏ aspect-ratio và để nó kéo
   đầy ô 2x2. */
.rail-banners--mosaic .rail-banner--lead img {
  aspect-ratio: auto;
}

.tours-header-wrapper {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  margin-bottom: 2rem;
  flex-wrap: wrap;
  gap: 1rem;
}

.tours-tabs-pill {
  display: flex;
  background: var(--bg-subtle);
  padding: 0.25rem;
  border-radius: var(--radius-full);
  border: 0.0625rem solid var(--border);
}

.tours-tab-btn {
  font-size: 0.875rem;
  font-weight: 700;
  color: var(--text-muted);
  padding: 0.5rem 1.25rem;
  border-radius: var(--radius-full);
  transition: var(--transition);
}

.tours-tab-btn.active {
  background: rgb(162 17 17);
  color: #ffffff;
  box-shadow: var(--shadow-sm);
}

/* Bốn cột, và trang chủ nạp 8 tour cho mỗi tab (xem app/page.tsx) — vừa đúng
   hai hàng đầy, không để hàng cuối lẻ vài thẻ. */
.tour-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem;
}

/* Tour Card */
.tour-card {
  background: var(--bg-surface);
  border: 0.0625rem solid var(--border);
  border-radius: 0.875rem;
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: var(--transition);
  display: flex;
  flex-direction: column;
}

/* Rê chuột: thẻ NHẤC LÊN và đổ bóng, không chỉ đổi viền (khách yêu cầu
   24/09/2026 — "chỉ hiện mỗi viền đỏ, chưa làm nổi bật"). Dùng chung mọi chỗ
   có thẻ tour: ba dải trang chủ, giờ chót, trang chuyên mục.

   Bóng có spread ÂM để lan ngang ít (14px) mà vẫn đổ sâu xuống dưới: thẻ nằm
   trong băng cuộn `.hcarousel__track`, mà băng cuộn cắt mọi thứ tràn ra ngoài
   padding của nó — padding đó được nới vừa đúng bóng này (xem .hcarousel__track).
   Đổi cỡ bóng thì đo lại chỗ đó.

   Chỉ ở máy có chuột: trên màn cảm ứng `:hover` dính lại sau khi chạm, thẻ vừa
   bấm sẽ đứng nhấc lên khi khách quay lại trang. */
@media (hover: hover) {
  .tour-card:hover {
    transform: translateY(-0.25rem);
    box-shadow:
      0 0.75rem 1.25rem -0.375rem rgba(0, 34, 72, 0.22),
      0 0.125rem 0.375rem rgba(0, 34, 72, 0.06);
    border-color: var(--accent-hover);
  }
}

@media (hover: hover) and (prefers-reduced-motion: reduce) {
  .tour-card:hover {
    transform: none;
  }
}

/* Bọc ảnh để các nhãn đè lên ảnh (số chỗ, dải giờ chót) có mốc định vị riêng,
   không dính vào .tour-card__img — thẻ đó đang mang background-image nên đổi
   kích thước nó là đổi luôn khung ảnh. */
.tour-card__media {
  position: relative;
}

/* Ảnh LÙI VÀO trong khung thẻ và tự bo góc (mẫu khách duyệt 23/09/2026), thay
   cho kiểu tràn sát mép của mẫu cũ.

   Thẻ "Ưu đãi giờ chót" KHÔNG lùi: dải đỏ đếm ngược nằm sát đáy ảnh, ảnh lùi
   vào thì dải đó thừa ra hai bên và đè lên phần nền trắng của thẻ. */
.tour-card:not(.tour-card--flash) .tour-card__media {
  padding: 0.375rem 0.375rem 0;
}

.tour-card:not(.tour-card--flash) .tour-card__img {
  border-radius: 0.625rem;
  overflow: hidden;
}

/* Tỷ lệ 3:2, đo từ toptentravel.com.vn: ảnh thẻ tour bên đó luôn 1.505 dù thẻ
   rộng 233px hay 210px. Bản này trước đây ghim cao 13.75rem, ra 1.268 — gần
   khổ 5:4. Ảnh tour của Top Ten hầu hết là banner ngang có chữ, nhét vào khung
   cao hơn thì `cover` cắt mất hai bên, đúng chỗ chữ nằm.

   Dùng `aspect-ratio` chứ không ghim chiều cao mới: thẻ co giãn theo màn, ghim
   px là mỗi bề rộng lại ra một tỷ lệ khác. */
.tour-card__img {
  position: relative;
  aspect-ratio: 3 / 2;
  background-size: cover;
  background-position: center;
}

/* Không còn ruy băng hãng bay đè lên ảnh (khách báo 16/09/2026): ảnh tour là
   banner có sẵn chữ in trong ảnh, dải màu góc trên phải che đúng chữ đó. Tên
   hãng nay là dòng cuối của `.tour-card__info-new` — xem populateTourCard(). */

.tour-card__badge {
  position: absolute;
  top: 0.875rem;
  left: 0.875rem;
  z-index: 2;
  background: var(--accent);
  color: #fff;
  font-size: 0.6875rem;
  font-weight: 800;
  padding: 0.25rem 0.625rem;
  border-radius: var(--radius-full);
}

.tour-card__badge--green {
  background: #10B981;
}

.tour-card__body {
  padding: .5rem .65rem;
  display: flex;
  flex-direction: column;
  flex: 1;
}

.tour-card__meta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.75rem;
  color: var(--text-muted);
  font-weight: 600;
  margin-bottom: 0.5rem;
}

.tour-card__code {
  background: var(--bg-subtle);
  padding: 0.125rem 0.5rem;
  border-radius: 0.25rem;
  color: var(--primary);
}

.tour-card__duration {
  color: var(--accent);
}

/* Tiêu đề in hoa, màu thương hiệu. Giữ nguyên kẹp 2 dòng: tên tour thật rất dài
   ("Tour miền Bắc: Hà Nội - Hà Giang - Đồng Văn - Sapa - ...") và in hoa còn ngốn
   thêm bề ngang, bỏ kẹp là thẻ cao thấp lệch nhau khắp lưới. */
/* KHÔNG in hoa (mẫu khách duyệt 23/09/2026): tên tour viết hoa toàn bộ ngốn
   thêm ~15% bề ngang nên "Tour Hàn Quốc mùa thu 2026 | Seoul - Nami - Everland"
   bị cắt sớm hơn một nhịp, mà chữ hoa liền mạch cũng khó đọc hơn. */
.tour-card__title {
  color: var(--primary);
  font-size: .9325rem;
  font-weight: 700;
  line-height: 1.45;
  margin-bottom: .35rem;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.tour-card__title a:hover {
  color: var(--accent);
}

/* Lưới HAI cột, không nhãn (mẫu khách duyệt 23/09/2026):

     [#] TBLTT01        |  [🕐] 4 ngày 3 đêm
     [📍] Hồ Chí Minh   |  [✈] Vietnam Airlines

   Mẫu cũ là bốn dòng "nhãn ...... GIÁ TRỊ": nhãn lặp lại đúng thứ icon đã nói,
   và bốn dòng đẩy thẻ cao thêm ~40px. `.tour-card__info-row` (khuôn gốc trong
   index.html) vẫn giữ luật riêng bên dưới cho các trang tĩnh chưa nối dữ liệu. */
.tour-card__info-new {
  display: grid;
  /* Cột phải rộng hơn: bên trái là mã tour và tên thành phố (ngắn), bên phải là
     thời lượng và TÊN HÃNG — "Emirates Airlines", "China Southern Airlines".
     Chia đôi đều thì mọi tên hãng dài đều cụt thành "Emirates Airli…". */
  grid-template-columns: minmax(0, 0.88fr) minmax(0, 1.12fr);
  column-gap: 0.4375rem;
  row-gap: 0.1875rem;
  font-size: 0.75rem;
  color: var(--text-main);
  margin-bottom: 0;
}

.tour-card__cell {
  display: flex;
  align-items: center;
  gap: 0.3125rem;
  min-width: 0;
  font-weight: 600;
  line-height: 1.7;
}

/* Giá trị dài ("Emirates Airlines", "Thành phố Hồ Chí Minh") cắt bằng ba chấm
   chứ không xuống dòng: xuống dòng là thẻ đó cao hơn ba thẻ cùng hàng. */
.tour-card__cell>span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tour-card__cell svg {
  flex: none;
  width: 0.875rem;
  height: 0.875rem;
  color: var(--primary);
}

/* Vạch ngăn hai cột — chỉ ở ô cột PHẢI, và chỉ khi ô đó thật sự tồn tại. Tour
   không có hãng bay thì ô thứ tư không được dựng, nên không có vạch mồ côi. */
.tour-card__cell:nth-child(2n) {
  padding-left: 0.5rem;
  border-left: 0.0625rem solid var(--border);
}

/* Dòng thông tin: icon — nhãn — giá trị dồn phải.
   Nhãn `flex: 1` là thứ đẩy giá trị sang mép phải, nên không cần
   `justify-content: space-between` (cách đó sẽ tách cả icon ra khỏi nhãn). */
.tour-card__info-row {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.tour-card__info-label {
  flex: 1 1 auto;
  min-width: 0;
}

.tour-card__info-value {
  flex: 0 0 auto;
  font-weight: 700;
  color: var(--text-main);
  text-align: right;
  /* Tên tỉnh dài ("Thành phố Hồ Chí Minh") không được đẩy nhãn xuống dòng. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 62%;
  text-transform: uppercase;
}

/* Dòng không có nhãn (thời lượng): giá trị đứng ngay sau icon, canh trái, và
   không đậm — nó là thông tin phụ, không phải một cặp nhãn/giá trị. */
.tour-card__info-row--single .tour-card__info-value {
  flex: 1 1 auto;
  text-align: left;
  font-weight: 600;
  max-width: none;
}

.tour-card__ico {
  color: var(--primary);
  flex-shrink: 0;
}

.tour-card__info-row svg {
  flex-shrink: 0;
}

/* Dải đợt khởi hành: hai nút cố định hai đầu, chip cuộn ngang ở giữa.
   Không `flex-wrap` như bản trước — nhóm 18 đợt sẽ xuống bốn dòng và đội thẻ
   cao gấp đôi những thẻ bên cạnh, vỡ lưới. */
.tour-card__departures {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  margin: 0.5rem 0;
  border: none;
  padding-top: 0;
}

/* Icon lịch đứng đầu dải ngày (mẫu 23/09/2026), thay chỗ nút "‹" cũ. Chỉ là
   nhãn hình — nút điều hướng duy nhất nằm ở cuối dải. */
.tour-card__dep-ico {
  flex: none;
  display: inline-flex;
  color: var(--primary);
}

/* Dải ngày + giá DÍNH ĐÁY thẻ. Thẻ có hãng bay dài hơn thẻ không có hãng đúng
   một dòng; `margin-top: auto` ở đây (thay cho ở chân thẻ) biến phần chênh đó
   thành khoảng trống TRÊN dải ngày, nên trong cùng một hàng lưới cả dải ngày lẫn
   giá đều thẳng nhau. `padding-top` giữ khoảng cách tối thiểu cũ 0.5rem — auto
   ra 0 khi thẻ không có chỗ thừa. Hai auto cùng lúc thì trình duyệt chia đôi chỗ
   trống, nên chân thẻ đứng ngay sau dải ngày phải về 0. */
.tour-card__body>.tour-card__departures {
  margin-top: auto;
  padding-top: 0.5rem;
}

.tour-card__departures+.tour-card__footer-new {
  margin-top: 0;
}

.tour-card__dep-track {
  display: flex;
  /* `min-width: 0` là bắt buộc: flex item mặc định `min-width: auto`, tức là nở
     theo bề rộng nội dung thay vì co lại — `overflow-x` sẽ không bao giờ kích
     hoạt và dải 18 chip đẩy nút ‹ › văng khỏi thẻ. */
  flex: 1 1 auto;
  min-width: 0;
  gap: 0.375rem;
  overflow-x: auto;
  scroll-behavior: smooth;
  scroll-snap-type: x proximity;
  /* Thanh cuộn hệ thống chiếm mất ~0.9rem chiều cao trong một dải chỉ cao
     1.4rem, nên ẩn đi và điều hướng bằng hai nút. Vuốt ngang vẫn chạy. */
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.tour-card__dep-track::-webkit-scrollbar {
  display: none;
}

/* Nút điều hướng: vòng tròn hai bên dải, đủ lớn để bấm được bằng ngón tay
   (1.75rem = 28px, sát mức tối thiểu khuyến nghị cho mục tiêu phụ nằm trong một
   hàng cao 1.75rem). */
.tour-card__dep-nav {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.75rem;
  height: 1.75rem;
  padding: 0;
  border: 0.0625rem solid var(--border);
  border-radius: 50%;
  background: #fff;
  color: var(--primary);
  cursor: pointer;
  transition: var(--transition);
}

.tour-card__dep-nav:hover:not(:disabled),
.tour-card__dep-nav:focus-visible {
  border-color: var(--primary);
  background: var(--primary);
  color: #fff;
}

/* Tới đầu/cuối dải thì làm mờ chứ KHÔNG ẩn: ẩn một nút làm dải rộng thêm
   1.75rem, các chip nhảy ngang ngay lúc người xem đang bấm — mất mốc để bám.
   Chỉ ẩn hẳn khi dải không cuộn được (JS đặt [hidden]), tức thẻ 1-2 đợt. */
.tour-card__dep-nav:disabled {
  color: #C8D3DC;
  cursor: default;
}

.tour-card__dep-nav[hidden] {
  display: none;
}

/* Chip ngày là <a> khi đợt đó có URL riêng, <span> khi chưa có alias. Gộp một
   quy tắc cho cả hai để thẻ không đổi hình chỉ vì thiếu link.

   Viền rỗng thay vì nền xám đặc: một dải 18 khối xám đọc như thanh trạng thái bị
   vô hiệu, còn viền màu thương hiệu cho thấy đây là thứ bấm được. */
/* Chip ĐẦU = đợt gần nhất, tô nền nhạt cho nổi (mẫu 23/09/2026). Không phải
   trạng thái "đang chọn" — thẻ không có chỗ chọn nào — mà là mốc người mua hỏi
   trước nhất: "đi sớm nhất được ngày nào". */
.tour-card__dep-track>.tour-card__dep-chip:first-child {
  background: var(--pill-bg);
  border-color: var(--pill-bg);
}

.tour-card__dep-chip {
  /* `flex: 0 0 auto` chứ không để co: trong dải cuộn, chip co lại sẽ nén
     "26/09" thành "26/0…" thay vì đẩy sang phần cuộn được. */
  flex: 0 0 auto;
  scroll-snap-align: start;
  display: inline-flex;
  align-items: center;
  font-size: 0.8125rem;
  font-weight: 700;
  line-height: 1;
  color: var(--primary);
  background: #fff;
  border: 0.0625rem solid #B9CBE0;
  padding: 0.375rem 0.5rem;
  border-radius: 0.375rem;
  white-space: nowrap;
  transition: var(--transition);
}

a.tour-card__dep-chip:hover,
a.tour-card__dep-chip:focus-visible {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
}

/* Số chỗ còn nhận — con tem đè lên góc dưới trái của ảnh.

   Đè lên ảnh chứ không nằm trong cụm thông tin: chỉ một phần nhỏ tour có đợt ưu
   đãi, để trong luồng chữ thì thẻ có dòng này cao hơn thẻ bên cạnh và cả hàng
   bốn thẻ so le chân. Đè lên ảnh là mọi thẻ cao bằng nhau, có hay không.

   Nền đặc chứ không phải chữ đỏ trên ảnh: ảnh tour là ảnh chụp đoàn, chữ đỏ rơi
   vào vùng sáng là mất hút. */
/* "Số chỗ: N" ở đầu phải dòng thời lượng — không còn đè lên ảnh (16/09/2026).
   `flex: none` để chữ thời lượng (`flex: 1`, có dấu ba chấm) co trước, con tem
   không bao giờ bị cắt. `line-height` khai lại vì của .public-site là độ dài
   cố định: để mặc định là viên thuốc cao hơn dòng 26px, dòng này cao hơn dòng
   cùng hàng của thẻ bên cạnh. `cursor: help` báo có tooltip câu đủ. */
/* Lớp phủ bấm được trên ô ảnh của thẻ tour và thẻ combo.
 *
 * `inset: 0` phủ đúng ô ảnh — `.tour-card__media` / `.combo-card__media` đều
 * đã là `position: relative`. `z-index: 3` để nằm TRÊN nhãn "HOT" và dải đỏ
 * đếm ngược của thẻ giờ chót: hai thứ đó chỉ để đọc, nhưng nếu chúng nằm trên
 * thì đúng phần ảnh đẹp nhất lại là chỗ bấm không ăn.
 *
 * Trong suốt hoàn toàn và không có nội dung: mọi hiệu ứng rê chuột của thẻ
 * vẫn do `.tour-card:hover` lo, lớp này chỉ nhận cú bấm. */
.tour-card__media-link {
  position: absolute;
  inset: 0;
  z-index: 3;
}

.tour-card__seats {
  /* `position: relative` là để giữ chữ ẩn `.tour-card__sr` LẠI TRONG thẻ.
     Nó là `position: absolute`, mà trong thẻ không có ô nào được định vị, nên
     ô chứa nó trèo ra tận `.tours-carousel` (relative) — tức RA NGOÀI băng
     cuộn `.tours-track`. Thẻ nằm ở cột thứ tư của dải "Tour nước ngoài" thì
     đốm 1px đó rơi ở x≈900 và không bị băng cuộn cắt: trang chủ trên điện
     thoại 390px có `scrollWidth` 902 — cả trang trôi ngang 512px, ảnh bìa và
     ô tìm kiếm lòi ra ngoài mép trái. Đốm vô hình, nên không nhìn thẳng vào
     nó thì không thấy nguyên nhân ở đâu. */
  position: relative;
  flex: none;
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  padding: 0.125rem 0.5rem;
  border-radius: var(--radius-full);
  background: #fdecec;
  color: var(--accent);
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1.3;
  white-space: nowrap;
  cursor: help;
}

.tour-card__seats strong {
  font-weight: 800;
}

/* svg bị reset toàn cục thành display:block; trong inline-flex nó là flex item
   nên không sao, nhưng phải chặn co lại khi dòng chật. */
.tour-card__seats svg {
  flex: none;
}

/* Chữ chỉ dành cho trình đọc màn hình: "Số chỗ còn nhận" đọc đủ câu trong khi
   mắt chỉ thấy "Số chỗ". */
.tour-card__sr {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.tour-card__footer-new {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  margin-top: auto;
  border: none;
  padding-top: 0;
}

.tour-card__price-new {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

/* "Giá từ" và giá gạch bỏ nằm CÙNG một dòng, giá bán to bên dưới — đúng bố cục
   mẫu. Chỉ 5/1496 tour có giá gạch bỏ nên dòng này thường chỉ còn hai chữ
   "Giá từ"; vì thế nó phải tự gọn lại chứ không được chiếm chỗ chờ sẵn. */
.tour-card__price-line {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.375rem;
}

.tour-card__price-new span {
  font-size: 0.6875rem;
  color: var(--text-muted);
  text-transform: uppercase;
  font-weight: 600;
}

/* Giá và nút đổi màu cho nhau so với bản trước: giá từ đỏ sang navy, nút từ
   navy sang đỏ. Đỏ là màu nhấn của hệ, dồn nó vào nút thì hành động cần bấm nổi
   hơn con số — con số vốn đã đủ nổi nhờ cỡ chữ và độ đậm. */
.tour-card__price-new strong {
  font-size: 1.25rem;
  font-weight: 800;
  color: var(--primary);
}

/* Giá niêm yết gạch ngang, chỉ xuất hiện khi có đợt ưu đãi đang chạy.
   Đậm 700 (khách yêu cầu 24/09/2026 "in đậm hơn chút") — cùng độ đậm khách đã
   tự đặt cho giá gạch của thẻ giờ chót. */
.tour-card__price-old {
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--text-muted);
  text-decoration: line-through;
}

/* Nút bo tròn hoàn toàn (pill) theo mẫu. `flex-shrink: 0` vì giá bên cạnh có thể
   dài tới "78.990.000 đ" — không có nó thì nút bị bóp méo chữ "Xem chi tiết".

   Bộ số nhỏ và chữ không đậm là theo yêu cầu 26/08/2026: nút chỉ dẫn sang trang
   tour, không phải hành động chính của thẻ — giá mới là thứ phải nổi nhất. */
.tour-card__btn-new {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
  background: var(--accent-hover);
  color: #fff;
  padding: .375rem .625rem;
  border-radius: .5rem;
  font-size: 0.8rem;
  font-weight: 700;
  white-space: nowrap;
  transition: var(--transition);
}

.tour-card__btn-new:hover {
  background: var(--accent);
}

.tour-card__btn-new svg {
  flex: none;
}

/* Nút "Tư vấn ngay" của thẻ MICE có HAI bản trong HTML, CSS chọn bản hợp với
   thiết bị: máy bàn mở chat Zalo, điện thoại gọi tổng đài. Chọn bằng CSS chứ
   không bằng JS — đổi href sau khi tải xong thì cú chạm sớm đi sai chỗ.
   Mốc 720px giữ cho khớp với `.td-book__call--tel` bên tour-details.css. */
.tour-card__btn--tel {
  display: none;
}

@media (max-width: 720px) {
  .tour-card__btn--chat {
    display: none;
  }

  .tour-card__btn--tel {
    display: inline;
  }
}

/* Nền nút đã là --accent, nên hover phải sang --accent-hover; giữ nguyên
   --accent như trước thì rê chuột vào không thấy gì đổi. */
.tour-card__btn-new:hover {
  background: var(--accent-hover);
}

@media (max-width: 768px) {
  .flash-sale__head {
    margin: 1.75rem 0;
  }
}

.btn--outline {
  display: inline-block;
  padding: 0.375rem 1rem;
  border: 0.1rem solid var(--primary);
  color: var(--primary);
  border-radius: var(--radius-full);
  font-weight: 700;
  font-size: 0.9375rem;
  transition: var(--transition);
}

.btn--outline:hover {
  background: var(--primary);
  color: #fff;
}

/* ======= KHỐI GỢI Ý BÀI VIẾT (Tin mới nhất / Tin xem nhiều nhất) =======
 *
 * Dùng chung cho cột phải của HAI trang: danh sách cẩm nang và chi tiết bài
 * viết. Đặt ở index.css vì trang chi tiết chỉ nạp index.css + tour-details.css,
 * không nạp zone-layouts.css — để bên đó thì trang chi tiết mất sạch kiểu.
 */
.nl-widget {
  background: var(--bg-surface);
  border: 0.0625rem solid var(--border);
  border-radius: var(--radius-lg);
  padding: 1.25rem;
  box-shadow: var(--shadow-sm);
}

.nl-widget__head {
  font-size: 1.25rem;
  font-weight: 800;
  color: var(--primary);
  padding-bottom: 0.75rem;
  border-bottom: 0.125rem solid var(--accent);
}

.nl-widget__list {
  display: flex;
  flex-direction: column;
}

.nl-widget__item {
  display: flex;
  gap: 0.875rem;
  padding: 0.875rem 0;
  border-bottom: 0.0625rem solid var(--border-light);
}

.nl-widget__item:last-child {
  border-bottom: none;
  padding-bottom: 0;
}

.nl-widget__thumb {
  flex: none;
  width: 5.625rem;
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-sm);
  background-size: cover;
  background-position: center;
  background-color: var(--bg-subtle);
}

.nl-widget__body {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  min-width: 0;
}

.nl-widget__title {
  font-size: 0.9375rem;
  font-weight: 700;
  line-height: 1.45;
  color: var(--primary);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nl-widget__item:hover .nl-widget__title {
  color: var(--accent);
}

.nl-widget__date {
  font-size: 0.8125rem;
  color: var(--text-muted);
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.nl-widget__date::after {
  content: "";
  width: 0.375rem;
  height: 0.375rem;
  background: var(--accent);
}

/* ======= NỘI DUNG SOẠN THẢO (.td-richtext) =======
 *
 * Lớp bọc dùng chung cho MỌI đoạn HTML lấy từ CMS cũ: mô tả chuyên mục, thân
 * bài cẩm nang, điểm nhấn hành trình, dịch vụ bao gồm. Trước nay nó KHÔNG có
 * một luật CSS nào, trong khi reset ở đầu file đặt `ul { list-style: none }` và
 * `p { margin: 0 }` — nên mọi bài viết đổ ra thành một khối chữ đặc, gạch đầu
 * dòng biến mất, các đoạn dính liền nhau. Đó là gốc chung của ba lỗi khách báo
 * (điểm nhấn hành trình, dịch vụ bao gồm, bài cẩm nang).
 *
 * Đặt ở index.css chứ không ở tour-details.css vì trang chuyên mục chỉ nạp
 * index.css + tour-list.css + zone-layouts.css — để bên tour-details thì các
 * trang đó vẫn hỏng nguyên.
 */
.td-richtext {
  font-size: 0.9375rem;
  line-height: 1.75;
  color: var(--text-main);
}

.td-richtext>*:first-child {
  margin-top: 0;
}

.td-richtext>*:last-child {
  margin-bottom: 0;
}

.td-richtext p {
  margin: 0 0 0.875rem;
}

.td-richtext ul,
.td-richtext ol {
  margin: 0 0 0.875rem;
  padding-left: 1.25rem;
  list-style: disc;
}

.td-richtext ol {
  list-style: decimal;
}

.td-richtext li {
  margin-bottom: 0.375rem;
}

.td-richtext li:last-child {
  margin-bottom: 0;
}

.td-richtext h2,
.td-richtext h3,
.td-richtext h4 {
  color: var(--primary);
  font-weight: 800;
  line-height: 1.35;
  margin: 1.75rem 0 0.75rem;
}

.td-richtext h2 {
  font-size: 1.25rem;
}

.td-richtext h3 {
  font-size: 1.0625rem;
}

.td-richtext h4 {
  font-size: 1rem;
}

.td-richtext img {
  max-width: 100%;
  height: auto;
  border-radius: var(--radius-md);
}

.td-richtext blockquote {
  margin: 0 0 0.875rem;
  padding: 0.25rem 0 0.25rem 1rem;
  border-left: 0.1875rem solid var(--primary-light);
  color: var(--text-muted);
}

.td-richtext table {
  width: 100%;
  border-collapse: collapse;
  margin: 0 0 0.875rem;
}

.td-richtext th,
.td-richtext td {
  border: 0.0625rem solid var(--border);
  padding: 0.5rem 0.625rem;
  text-align: left;
}

/* Textlink phải nhìn ra là link.
   Reset ở đầu file đặt `a { color: inherit; text-decoration: none }` cho toàn
   site — hợp lý với menu và thẻ tour, nhưng trong một bài viết thì nó biến mọi
   liên kết thành chữ thường. Gạch chân mảnh + màu thương hiệu là quy ước ai
   cũng đọc được, không cần học. */
.td-richtext a {
  color: var(--primary);
  font-weight: 600;
  text-decoration: underline;
  text-decoration-thickness: 0.0625rem;
  text-underline-offset: 0.1875rem;
  text-decoration-color: rgba(16, 74, 147, 0.45);
}

.td-richtext a:hover {
  color: var(--accent);
  text-decoration-color: currentColor;
}

/* ======= HORIZONTAL CAROUSEL (dùng chung: flash-sale / hot-deal / press) ======= */
.hcarousel {
  position: relative;
}

/* Padding nới ra để bóng của thẻ nhấc lên khi rê chuột (.tour-card:hover) không
   bị băng cuộn cắt cụt: `overflow-x: auto` kéo luôn trục dọc thành auto, nên
   mọi thứ tràn khỏi padding đều bị xén — trên (thẻ nhấc 4px + 2px bóng), dưới
   (22px bóng), hai bên (14px). Margin ÂM trả lại đúng phần nới, nên thẻ vẫn
   đứng y chỗ cũ và bề ngang thẻ (tính theo % bề trong của băng) không đổi.
   `scroll-padding-inline` để thẻ cuộn tới vẫn dừng thẳng mép container chứ
   không lùi vào 12px. Hai bên chỉ tràn 12px ra ngoài `.container`, trong khi
   container chừa 1.25rem — băng không chạm mép màn. */
.hcarousel__track {
  display: flex;
  gap: 1.5rem;
  overflow-x: hidden;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  padding: 0.5rem 0.875rem 1.5rem;
  margin: 0 auto;
  scroll-padding-inline: 0.75rem;
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.tours-track.hcarousel__track,
.mice__track.hcarousel__track {
  margin: 0 -0.875rem
}

.hcarousel__track::-webkit-scrollbar {
  display: none;
}

/* Máy bàn để `overflow-x: hidden` (khách chỉnh 30/09/2026: chỉ đi bằng mũi tên
   + tự trôi). Nhưng `hidden` chặn luôn thao tác VUỐT, mà ≤680px mũi tên bị ẩn:
   trên điện thoại dải Top Ten News (không tự trôi) đứng im ở thẻ đầu, các dải
   khác không vuốt lại được (khách báo 30/09/2026 "trên đt ko scroll ngang
   được"). Màn cảm ứng và màn hẹp trả về `auto`. */
@media (hover: none),
(max-width: 680px) {
  .hcarousel__track {
    overflow-x: auto;
  }
}

.hcarousel__arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 4;
  width: 2.215rem;
  height: 2.215rem;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fff;
  color: var(--primary);
  border: 0.0625rem solid var(--border);
  box-shadow: var(--shadow-md);
  cursor: pointer;
  transition: var(--transition);
}

.hcarousel__arrow:hover {
  background: var(--primary);
  color: #fff;
}

.hcarousel__arrow[hidden] {
  display: none;
}

.hcarousel__arrow--prev {
  left: -1.715rem;
}

.hcarousel__arrow--next {
  right: -1.715rem;
}

/* Mũi tên nằm HẲN ngoài mép băng (-2.215rem = 35px) chỉ vừa khi lề hai bên
   ≥ 35px. Lề đó là padding 20px của .container cộng phần màn dư ra quá 1240px,
   tức phải từ ~1271px trở lên. Hẹp hơn là mũi tên phải thò khỏi mép màn tới
   15px và CẢ TRANG trôi ngang (đo 28/09/2026: scrollWidth 696 ở 681px, 1039 ở
   1024px, 1265 ở 1260px); mũi tên trái thì lòi ra mép trái, bị cắt mất nửa.
   Từ 1300px trở xuống lùi về vị trí nửa trong nửa ngoài (thò 18px, lọt trong
   lề 20px). Mốc 1300 chứ không 1271: màn Windows có thanh cuộn dọc 17px, bề
   ngang bố cục hẹp hơn số của media query. Dưới 680px mũi tên đã ẩn. */
@media (max-width: 81.25rem) {
  .hcarousel__arrow--prev {
    left: -1.125rem;
  }

  .hcarousel__arrow--next {
    right: -1.125rem;
  }
}

/* ======= FLASH SALE — ƯU ĐÃI GIỜ CHÓT ======= */
.flash-sale {
  padding: 3rem 0;
  background: #f7f8fa;
  color: #fff;
}

.flash-sale__panel {
  position: relative;
  padding: 2.5rem 2.25rem 2.75rem;
  border-radius: 1.75rem;
  background: linear-gradient(135deg, var(--red-600) 0%, var(--accent-hover) 50%, var(--accent) 100%);
  /*
  background:
    repeating-conic-gradient(from -20deg at 50% 7%,
      rgba(255, 255, 255, 0.055) 0deg 5deg,
      transparent 5deg 12deg),
    linear-gradient(135deg, #ed1722 0%, #df0714 55%, #c90612 100%);*/
  box-shadow: 0 1rem 2.75rem rgba(134, 13, 20, 0.14);
}

.flash-sale__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.25rem;
  margin-bottom: 1.75rem;
}

.flash-sale__title-wrap {
  display: flex;
  align-items: center;
  min-width: 0;
  gap: 0.875rem;
}

.flash-sale__bolt {
  width: auto;
  height: auto;
  flex-shrink: 0;
  display: inline-flex;
  color: #ffd23f;
  filter: drop-shadow(0 0.125rem 0 rgba(129, 22, 12, 0.22));
}

/* To gần bằng cả khối tiêu đề + dòng phụ (~68px) chứ không chỉ bằng một dòng
   chữ (khách yêu cầu 24/09/2026 "icon flash sale lớn hơn"; bản trước 2rem). */
.flash-sale__bolt svg {
  width: 3.5rem;
  height: 3.5rem;
}

.flash-sale__title {
  font-size: clamp(1.875rem, 2.1vw, 2.25rem);
  font-weight: 900;
  line-height: 1.1;
  letter-spacing: -0.035rem;
}

.flash-sale__subtitle {
  max-width: 38rem;
  margin-top: 0.35rem;
  color: rgba(255, 255, 255, 0.9);
  font-size: 0.9375rem;
  line-height: 1.45;
}

.flash-sale__more {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  min-height: 2.875rem;
  padding: 0.375rem 0.4375rem 0.375rem 1.125rem;
  border: 0.09375rem solid rgba(255, 255, 255, 0.9);
  border-radius: var(--radius-full);
  background: transparent;
  color: #fff;
  box-shadow: none;
  font-weight: 700;
  font-size: 0.875rem;
  white-space: nowrap;
  transition: var(--transition);
}

.flash-sale__more:hover {
  background: rgba(255, 255, 255, 0.1);
  transform: none;
}

.flash-sale__more span:last-child {
  width: 2.125rem;
  height: 2.125rem;
  border-radius: 50%;
  background: #fff;
  color: #c90612;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.flash-sale .hcarousel__arrow {
  color: #c90612;
  border-color: rgba(127, 29, 29, 0.12);
  box-shadow: var(--shadow-md);
}

.flash-sale .hcarousel__arrow:hover {
  background: #c90612;
  color: #fff;
}

/* `.flash-card` chỉ còn dùng cho index.html — bản thiết kế gốc. Khối "Ưu đãi
   giờ chót" trên site chạy bằng `.tour-card` từ 09/09/2026 (xem
   `replaceFlashCards`), nên sửa mấy quy tắc dưới đây KHÔNG đổi gì ngoài trang. */
.flash-card {
  scroll-snap-align: start;
  flex: 0 0 calc((100% - 4.5rem) / 4);
  background: #fff;
  border-radius: var(--radius-lg);
  overflow: hidden;
  color: var(--text-main);
  box-shadow: var(--shadow-md);
  display: flex;
  flex-direction: column;
}

.flash-card__media {
  position: relative;
  height: 11.875rem;
}

.flash-card__img {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
}

.flash-card__timer {
  position: absolute;
  top: 0.75rem;
  right: 0.75rem;
  background: rgba(255, 255, 255, 0.95);
  color: var(--accent);
  font-weight: 800;
  font-size: 0.8125rem;
  font-variant-numeric: tabular-nums;
  padding: 0.3125rem 0.625rem;
  border-radius: var(--radius-full);
  box-shadow: var(--shadow-sm);
}

.flash-card__quick {
  position: absolute;
  bottom: 0.75rem;
  right: 0.75rem;
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  background: rgba(15, 23, 42, 0.75);
  color: var(--gold);
  font-size: 0.75rem;
  font-weight: 700;
  padding: 0.375rem 0.75rem;
  border-radius: var(--radius-full);
  -webkit-backdrop-filter: blur(0.25rem);
  backdrop-filter: blur(0.25rem);
}

.flash-card__body {
  padding: 1rem;
  display: flex;
  flex-direction: column;
  gap: 0.3125rem;
  flex-grow: 1;
}

.flash-card__title {
  font-size: 0.9375rem;
  line-height: 1.2rem;
  font-weight: 700;
  line-height: 1.4;
  color: var(--primary);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 2.5rem;
}

.flash-card__code {
  font-size: 0.8375rem;
  font-weight: 700;
  color: var(--primary);
  letter-spacing: 0;
}

.flash-card__meta {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 0.375rem;
  font-size: 0.9125rem;
  color: var(--text-muted);
}

.flash-card__meta-item {
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
  font-weight: 700;
}

.flash-card__seats {
  color: var(--accent);
  font-weight: 500;
  text-align: right;
}

.flash-card__foot {
  margin-top: auto;
  padding-top: 0;
  border-top: none;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 0;
}

.flash-card__price small {
  display: block;
  font-size: 0.6875rem;
  color: var(--text-muted);
}

.flash-card__price del {
  font-size: 0.75rem;
  color: var(--text-light);
}

.flash-card__price strong {
  display: block;
  font-size: 1rem;
  font-weight: 900;
  color: var(--primary);
}

.flash-card__btn {
  background: var(--accent);
  color: #fff;
  font-weight: 700;
  font-size: 0.83333rem;
  padding: .375rem .625rem;
  border-radius: var(--radius-sm);
  white-space: nowrap;
  transition: var(--transition);
}

.flash-card__btn:hover {
  background: var(--accent-hover);
}

/* ======= THẺ TRONG KHỐI "ƯU ĐÃI GIỜ CHÓT" =======

   Từ 09/09/2026 khối này dùng ĐÚNG `.tour-card` của hai dải tour bên dưới, không
   còn khuôn `.flash-card` riêng (xem `replaceFlashCards` trong templates.ts).
   Bề ngang 4/2/1 thẻ mỗi màn đã có sẵn: băng được gắn thêm lớp `tours-track` nên
   ăn theo `.tours-track>.tour-card` ở cả ba ngưỡng. Ở đây chỉ còn hai việc.

   `color` phải khai lại: `.flash-sale` đặt `color: #fff` cho cả section để tiêu
   đề nổi trên nền đỏ, mà `.tour-card` không tự khai màu chữ nào — thừa kế sang
   là những dòng không có màu riêng (nhãn "Mã tour", "Nơi khởi hành") thành chữ
   trắng trên nền thẻ trắng. `.flash-card` cũ khai `color: var(--text-main)` ngay
   trên thẻ, đúng vì lý do này. */
.flash-sale .tour-card {
  color: var(--text-main);
}

/* Dải đỏ chân ảnh: số chỗ còn nhận + đồng hồ đếm tới hạn chót của đợt.

   Kéo hết bề ngang ảnh chứ không phải hai con tem rời ở hai góc: đây là hai nửa
   của cùng một câu ("còn 5 chỗ, còn 6 ngày"), và góc dưới trái vốn chỉ đủ chỗ
   cho MỘT con tem — `populateTourCard` đã đặt "Số chỗ còn nhận" ở đúng đó, nên
   `replaceFlashCards` gỡ con tem ấy đi thay vì để hai cái chồng lên nhau. */
.tour-card__flash {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.375rem;
  padding: 0.3125rem 0.5rem;
  background: #ea2121;
  color: #fff;
  font-size: 0.75rem;
  font-weight: 700;
  line-height: 1.25;
  white-space: nowrap;
  /* Đợt dài trên 100 ngày cho ra thêm ô "Ngày"; chặn tràn ở đây để một chuỗi
     bất thường không đẩy được gì ra ngoài mép ảnh. */
  overflow: hidden;
}

/* Hai nửa của dải: "⚡ Còn N chỗ" bên trái, đồng hồ bên phải (mẫu 23/09/2026).
   Trước đó cả dải canh giữa và ngăn nhau bằng một chấm — mẫu mới tách hẳn hai
   mép nên số chỗ không bị đồng hồ đẩy chạy qua lại mỗi giây. */
.tour-card__flash-seats {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tour-card__flash-timer {
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
  flex: none;
}

/* Nhãn "Kết thúc sau" nhạt hơn số: nó là lời dẫn, không phải con số phải đọc. */
.tour-card__flash-label {
  font-weight: 600;
  color: rgba(255, 255, 255, 0.88);
}

.tour-card__flash-clock {
  display: inline-flex;
  align-items: stretch;
  gap: 0.1875rem;
}

/* Một ô: số ở trên, nhãn đơn vị ngay dưới, cùng nền trắng.
   `tabular-nums` để số không đổi bề ngang mỗi giây, nếu không cả dải nhấp nháy
   theo từng nhịp đếm. */
.tour-card__flash-unit {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-width: 1.5rem;
  padding: 0.0625rem 0.1875rem;
  border-radius: 0.25rem;
  background: #fff;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}

/* `display: inline-flex` ở trên THẮNG luật `[hidden] { display: none }` của
   trình duyệt (luật tác giả đè luật mặc định), nên ô bị ẩn vẫn hiện — phải tự
   khai. Thiếu dòng này là đồng hồ luôn bốn ô và dải đỏ chật đến mức "Còn 5 chỗ"
   bị cắt cụt. */
.tour-card__flash-unit[hidden] {
  display: none;
}

.tour-card__flash-unit b {
  font-size: 0.75rem;
  font-weight: 700;
  color: #ea2121;
}

.tour-card__flash-unit i {
  font-style: normal;
  font-size: 0.5rem;
  font-weight: 500;
  color: var(--text-muted);
}

/* svg bị reset toàn cục thành display:block; trong flex nó là flex item nên
   không sao, chỉ phải chặn co lại khi dải chật. */
.tour-card__flash svg {
  flex: none;
  color: #FFD23F;
}

.tour-card__flash strong {
  font-weight: 800;
}

/* Chấm ngăn giữa hai nửa. Dựng bằng phần tử rỗng + `::before` chứ không gõ ký tự
   "·" vào HTML: nó là đồ trang trí, trình đọc màn hình không cần đọc ra. */
.tour-card__flash-sep::before {
  content: "";
  display: block;
  width: 0.1875rem;
  height: 0.1875rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.65);
}

/* `tabular-nums`: chữ số không đổi bề ngang thì đồng hồ không co giãn từng giây
   kéo cả dải nhấp nháy theo. */
.tour-card__flash-time {
  font-variant-numeric: tabular-nums;
  font-weight: normal;
}

/* ----- Thân thẻ giờ chót (mẫu khách duyệt 09/09/2026) -----

   Mọi khác biệt so với thẻ ở hai dải tour đều khoá sau `.tour-card--flash`, để
   sửa ở đây không chạm vào dải TOUR NƯỚC NGOÀI / TOUR TRONG NƯỚC. Xem
   `replaceFlashCards` trong templates.ts để biết phần nào do dữ liệu quyết. */

/* Thẻ giờ chót dựng lại cụm thông tin thành MỘT dòng (`.tour-card__meta-line`),
   nên trả `.tour-card__info-new` về khối thường — để nguyên lưới hai cột thì
   dòng "📍 Hồ Chí Minh · 🕐 4 ngày 3 đêm" co vào đúng nửa trái thẻ. */
.tour-card--flash .tour-card__info-new {
  display: block;
}

/* Tên tour giữ nguyên chữ hoa/thường của biên tập, không ép in hoa như thẻ dải:
   in hoa ngốn thêm bề ngang, mà thân thẻ này đã thêm một hàng hãng bay. */
.tour-card--flash .tour-card__title {
  text-transform: none;
  font-size: 0.9375rem;
}

/* Hàng viên "Mã tour" + "Khởi hành" (mẫu khách duyệt 23/09/2026), thay cho hàng
   hãng bay của mẫu 09/09.

   `flex-wrap` chứ không ép một dòng: mã tour dài (TTHQ1000) cộng ngày khởi hành
   vẫn vừa ở thẻ 4/màn khổ 1440, nhưng ở 2 thẻ/màn khổ 1024 thì hai viên phải
   được phép xuống dòng — ép một dòng là chữ trong viên bị cắt cụt. */
.tour-card__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
  margin-bottom: 0.4375rem;
  container-type: inline-size;
}

/* Hàng hẹp hơn 230px (khổ 1101–1279px và điện thoại 360px, đo 23/09/2026) thì
   hai viên đủ nhãn không còn vừa một dòng: viên ngày rớt xuống dòng hai, và vì
   các thẻ trong băng cao bằng nhau nên CẢ HÀNG thẻ cao thêm 24px theo. Ở đó bỏ
   chữ "Mã tour:" / "Khởi hành:" — icon # và icon lịch đã nói đủ — chứ không cắt
   mã tour. Chữ vẫn nằm trong DOM cho trình đọc màn hình (kiểu .sr-only).
   Hàng nào vẫn chật hơn nữa (≤320px) thì xuống dòng như cũ, viên ngày vẫn dồn
   phải.
   Từ 24/09/2026 hai viên không còn nhãn nào hiện ra (khách bỏ "Mã tour:" và
   "Ngày đi:", chữ nằm trong `.tour-card__sr`), nên luật này tạm không còn phần
   tử nào khớp — giữ lại cho lúc bật lại nhãn. */
@container (max-width: 229px) {
  .tour-card__tag-key {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
  }
}

/* 10px và padding hẹp: hai viên phải vừa MỘT dòng trong thân thẻ 263px (đo
   23/09/2026 — ở 11px thì "Mã tour: TTHQ1000" + "Khởi hành: 09/10" ra 237px,
   thừa 6px nên viên ngày rớt xuống dòng thứ hai và thẻ cao thêm 20px).
   Đây là hai dòng phụ, không phải chữ đọc lâu — cỡ nhỏ ở đây không hại. */
/* `position: relative` bắt buộc: nhãn bị ẩn kiểu .sr-only ở hàng hẹp (luật
   @container phía trên) là `position: absolute`. Không có ô định vị nào gần thì
   nó neo tận ngoài `.tours-track` và kéo cả trang trôi ngang — đúng lỗi 21/09
   của `.tour-card__sr`. */
.tour-card__tag {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.1875rem;
  min-width: 0;
  padding: 0.125rem 0.3125rem;
  border-radius: 0.375rem;
  background: var(--pill-bg);
  font-size: 0.625rem;
  font-weight: 600;
  color: var(--text-muted);
  line-height: 1.6;
  white-space: nowrap;
}

/* Mã tour dài (TTHQ1000) cắt bằng ba chấm chứ không đẩy viên ngày xuống dòng —
   mẫu vẽ hai viên trên CÙNG một dòng. */
.tour-card__tag>span {
  overflow: hidden;
  text-overflow: ellipsis;
}

.tour-card__tag svg {
  flex: none;
  width: 0.625rem;
  height: 0.625rem;
  color: var(--primary);
}

.tour-card__tag strong {
  font-weight: 800;
  color: var(--primary);
}

/* Ngày khởi hành in ĐỎ: nó là thứ người mua dò trước nhất trong khối giờ chót
   ("còn đi được ngày nào"), và là con số duy nhất trên thân thẻ đổi theo đợt. */
/* Dồn PHẢI (khách yêu cầu 23/09/2026): mã tour neo mép trái, ngày neo mép phải,
   mắt dò ngày đi theo một cột thẳng qua bốn thẻ. */
.tour-card__tag--date {
  margin-left: auto;
  background: #FDEDEE;
  font-size: .75rem
}

.tour-card__tag--date svg,
.tour-card__tag--date strong {
  color: var(--accent-hover);
}

/* Icon lịch đứng trên ĐƯỜNG CHÂN CHỮ của ngày, không canh giữa (khách báo
   25/09/2026 "cho svg nằm ngang hàng với ngày khởi hành").
   Canh giữa là canh theo HỘP DÒNG của chữ, mà vị trí chữ số trong hộp dòng mỗi
   trình duyệt làm tròn một kiểu: ảnh khách chụp (retina) icon thấp hơn chữ số
   đúng 1px cả mép trên lẫn mép dưới, còn Chrome headless thì bằng nhau — nên
   nhấc cứng 1px là chữa máy này hỏng máy kia (đã thử: Chrome lệch lên 1,1px).
   Đường chân chữ thì trình duyệt nào cũng tính giống nhau, nên đặt icon theo
   chân chữ là icon đứng CÙNG một chỗ so với chữ số ở mọi máy. Icon lịch cao
   hơn chữ số (hai ngạnh trên thò lên), nên đáy hộp icon phải xuống DƯỚI chân
   chữ 1px thì mực icon mới ở giữa chữ số — đo CDP: chỉ canh chân chữ là icon
   cao hơn 1,13px, thêm 1px xuống là lệch còn ~0,1px. `transform` không đổi
   chiều cao viên (hàng viên đang sát giới hạn, xem .tour-card__tag).
   Viên mã tour (chữ 10px) không lệch trong ảnh khách, không đụng.
   Mũi tên ▾ cũng theo chân chữ, KHÔNG cần bù: đo lệch -0,25…+0,38px ở
   1920/1440/390px (canh giữa thì thấp 0,3–0,9px ở Chrome, 1px trong ảnh khách). */
.tour-card__tag--date {
  align-items: baseline;
}

.tour-card__tag--date>svg:first-child {
  transform: translateY(0.0625rem);
}

/* "5N4Đ" (khách yêu cầu 25/09/2026) bọc <abbr title="5 ngày 4 đêm">: bỏ gạch
   chấm mặc định của trình duyệt, chữ in y như span thường. */
.tour-card--flash .tour-card__meta-item abbr {
  text-decoration: none;
  cursor: inherit;
}

/* Tour từ hai đợt trở lên: viên ngày là ô chọn ngày (lib/public/templates.ts,
   replaceFlashCards). Viên vẫn vẽ bằng chữ như cũ; ô <select> THẬT nằm đè lên
   trong suốt. Hai lý do không tự vẽ lại ô chọn:
   - danh sách xổ ra là của hệ điều hành — trên điện thoại là bánh xe chọn,
     bàn phím dùng được, không phải viết thêm dòng JS nào để mở/đóng;
   - ô chọn giữ 16px dù viên chỉ 10px: chữ trong ô nhập dưới 16px là iOS tự
     phóng to cả trang khi khách chạm vào. Ô trong suốt nên cỡ chữ không lộ ra.
   `min-height`/`max-width` khai lại vì ô chọn cao hơn viên thì phần thừa (vô
   hình) đè lên dòng "nơi đi · thời lượng" bên dưới và nuốt cú bấm ở đó. */
.tour-card__tag--pick {
  position: relative;
  gap: 0.125rem;
  cursor: pointer;
  transition: background-color .15s ease;
}

.tour-card__tag--pick:hover {
  background: #FBD9DB;
}

.tour-card__tag--pick:focus-within {
  outline: 2px solid var(--accent-hover);
  outline-offset: 1px;
}

/* Mũi tên xổ xuống: nhỏ hơn icon lịch, để nó đọc như dấu "chọn được" chứ không
   thành icon thứ hai.
   Mũi tên 7px + khe 2px (viên thường là 3px) là CÓ TÍNH: thêm mũi tên làm viên
   rộng ra, mà "Mã tour: TMBS1000" + viên ngày khi đó cần 231,6px trong hàng
   231px — viên ngày rớt xuống dòng hai (đo 23/09/2026, khổ 1440). Nới lại hai
   con số này là phải đo lại thẻ có mã dài nhất. */
.tour-card__tag--pick>svg:last-of-type {
  width: 0.4375rem;
  height: 0.4375rem;
}

.tour-card__date-select {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  min-width: 0;
  max-width: 100%;
  min-height: 0;
  margin: 0;
  padding: 0;
  border: 0;
  opacity: 0;
  font-size: 16px;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

/* Nơi khởi hành · thời lượng trên MỘT dòng, không nhãn: nhãn "Nơi khởi hành" và
   "Thời gian" lặp lại đúng thứ mà icon đã nói, mà thẻ thì chỉ rộng 263px. */
.tour-card--flash .tour-card__meta-line {
  display: flex;
  align-items: center;
  gap: 0.3125rem;
  min-width: 0;
  font-size: 0.8125rem;
  color: var(--text-muted);
  line-height: 1.9;
}

/* Giá trị dài ("Thành phố Hồ Chí Minh") cắt bằng dấu ba chấm thay vì xuống dòng
   — xuống dòng là thẻ đó cao hơn ba thẻ cùng hàng, chân hàng so le. */
.tour-card--flash .tour-card__meta-line span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Hai cụm: nơi đi bên trái, thời lượng dồn PHẢI thẳng mép viên ngày phía trên
   (khách yêu cầu 24/09/2026; bản trước hai cụm nối nhau qua một vạch ngăn).
   Thời lượng `flex: none` — không bao giờ cắt; chật thì nơi đi nhận dấu ba
   chấm. `min-width: 0` ở chữ bên trong để dấu ba chấm của luật trên chạy được
   trong inline-flex (mặc định flex item không co nhỏ hơn chữ của nó). */
.tour-card--flash .tour-card__meta-item {
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
  min-width: 0;
}

.tour-card--flash .tour-card__meta-item>span {
  min-width: 0;
}

.tour-card--flash .tour-card__meta-item--end {
  flex: none;
  margin-left: auto;
}

/* CỘT PHẢI của thẻ: viên ngày, thời lượng, nút "Đặt tour" chung MỘT bề ngang
   nên thẳng mép TRÁI lẫn mép phải (khách kẻ khung 25/09/2026: "canh left…
   thời gian tour dời qua left để cân bằng"). Trước đó ba thứ chỉ dồn phải, mép
   trái lệch nhau tới 38px (nút 91,7 / viên ngày 81–89 / thời lượng 54–68px).
   Bề ngang = thứ RỘNG NHẤT trong ba: viên ngày có ▾ (92,3px ở 1440px, chữ
   ngày .75rem) và nút (91,7px), làm tròn lên 93px. Khai bằng rem như hai thứ
   đó nên co giãn cùng cỡ chữ gốc ở mọi khổ. Đổi cỡ chữ viên ngày, chữ hay
   padding của nút thì đo lại: thứ nào tự nhiên rộng hơn cột là mép trái lệch.
   Mép trái cột là mép HỘP của viên ngày và nút, và mép icon đồng hồ — đối xứng
   với cột trái (hộp viên mã, icon ghim, giá đều bám mép thân thẻ). */
.tour-card--flash {
  --flash-side: 5.8125rem;
}

.tour-card--flash .tour-card__tag--date {
  min-width: var(--flash-side);
  /* Viên một ngày (không có ▾) hẹp hơn cột ~11px: chữ ở giữa viên chứ không
     để một khoảng hồng trống bên phải. */
  justify-content: center;
}

.tour-card--flash .tour-card__meta-item--end {
  width: var(--flash-side);
}

.tour-card--flash .tour-card__btn-new {
  min-width: var(--flash-side);
  justify-content: center;
}

/* Chữ "Giá từ" trên thẻ giờ chót: ẩn (mẫu không có).
   Nhắm `> span` chứ không cả dòng — `<del>` giá gốc cũng nằm trong dòng này và
   phải ở lại: nó là con số duy nhất cho thấy đợt ưu đãi rẻ hơn bao nhiêu. */
.tour-card--flash .tour-card__price-line>span {
  display: none;
}

/* Dãy chip ngày đã bị `replaceFlashCards` gỡ khỏi thẻ giờ chót, mà chính nó
   mang `margin-top: auto` để dính giá xuống đáy thẻ — trả "auto" lại cho chân
   thẻ, nếu không bốn thẻ trong một hàng cao thấp so le theo độ dài tên tour. */
.tour-card--flash .tour-card__footer-new {
  margin-top: auto;
  align-items: center;
}

/* Giá bán: to và XANH theo mẫu 23/09/2026 (mẫu cũ để chữ đen).
   Giá gốc gạch ngang nằm trên một dòng riêng, nhỏ và xám — nó chỉ để so sánh. */
.tour-card--flash .tour-card__price-new strong {
  font-size: 1.125rem;
  font-weight: 800;
  color: var(--primary);
  line-height: 1.3;
}

.tour-card--flash .tour-card__price-old {
  font-size: 0.75rem;
  color: var(--text-muted);
  font-weight: 700;
  text-decoration: line-through;
}

/* Nút "Đặt tour" có mũi tên: cao hơn nút của hai dải tour vì ở đây nó là lời
   mời chính của cả khối. */
.tour-card--flash .tour-card__btn-new {
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
  padding: 0.4375rem 0.75rem;
  border-radius: 0.5rem;
  background: var(--accent-hover);
  font-size: 0.8125rem;
  font-weight: 700;
}

.tour-card--flash .tour-card__btn-new:hover {
  background: var(--accent);
}

/* Bo góc to hơn thẻ thường và bỏ viền: trên nền đỏ của khối, viền xanh nhạt
   thành một đường kẻ lạ quanh mỗi thẻ. */
.tour-card--flash {
  border: 0;
  border-radius: 0.875rem;
}

/* ======= HOT DEAL — COMBO VMB + KHÁCH SẠN ======= */
.hotdeal {
  padding: 4rem 0;
  background: var(--bg-main);
}

.hotdeal__head {
  text-align: center;
  margin-bottom: 1.5rem;
}

.hotdeal__title {
  display: inline-flex;
  align-items: center;
  gap: 0.875rem;
  font-size: 1.666688rem;
  line-height: 2.291688rem;
  font-weight: 900;
  color: var(--primary);
}

.hotdeal__badge {
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: linear-gradient(135deg, #FB7185, #E11D48);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.75rem;
  font-weight: 800;
  box-shadow: 0 0.25rem 0.625rem rgba(225, 29, 72, 0.35);
}

.hotdeal__subtitle {
  max-width: 45rem;
  margin: 0.75rem auto 0;
  font-size: 0.9375rem;
  color: var(--text-muted);
}

.hotdeal__controls {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 1.75rem;
  flex-wrap: wrap;
}

.hotdeal__filters {
  display: flex;
  gap: 0.625rem;
  flex-wrap: wrap;
}

.hotdeal__filter {
  padding: 0.625rem 1.25rem;
  border-radius: var(--radius-full);
  font-size: 0.875rem;
  font-weight: 600;
  border: 0.0625rem solid var(--border);
  background: #fff;
  color: var(--text-muted);
  cursor: pointer;
  transition: var(--transition);
}

.hotdeal__filter.active {
  background: var(--primary-dark);
  color: #fff;
  border-color: var(--primary-dark);
}

.hotdeal__filter:hover:not(.active) {
  border-color: var(--primary);
  color: var(--primary);
}

.hotdeal__more {
  display: inline-flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.5rem 0.5rem 0.5rem 1.25rem;
  border: 0.09375rem solid #2563EB;
  color: #2563EB;
  border-radius: var(--radius-full);
  font-weight: 700;
  font-size: 0.875rem;
  transition: var(--transition);
}

.hotdeal__more:hover {
  background: rgba(37, 99, 235, 0.08);
}

.hotdeal__more span:last-child {
  width: 1.75rem;
  height: 1.75rem;
  border-radius: 50%;
  background: #2563EB;
  color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.combo-card {
  scroll-snap-align: start;
  flex: 0 0 calc((100% - 4.5rem) / 4);
  background: #fff;
  border-radius: var(--radius-lg);
  overflow: hidden;
  border: 0.0625rem solid var(--border);
  box-shadow: var(--shadow-sm);
  transition: var(--transition);
  display: flex;
  flex-direction: column;
}

.combo-card:hover {
  transform: translateY(-0.375rem);
  box-shadow: var(--shadow-hover);
}

.combo-card__media {
  position: relative;
  height: 12.5rem;
}

.combo-card__img {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
}

.combo-card__badge {
  position: absolute;
  top: 0.75rem;
  left: 0.75rem;
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  background: #fff;
  color: var(--accent);
  font-weight: 800;
  font-size: 0.75rem;
  padding: 0.25rem 0.75rem 0.25rem 0.3125rem;
  border-radius: var(--radius-full);
  box-shadow: var(--shadow-sm);
}

.combo-card__badge b {
  width: 1.375rem;
  height: 1.375rem;
  border-radius: 50%;
  background: linear-gradient(135deg, #FB7185, #E11D48);
  color: #fff;
  font-size: 0.5625rem;
  display: flex;
  align-items: center;
  justify-content: center;
}

.combo-card__body {
  padding: 1rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  flex-grow: 1;
}

.combo-card__title {
  font-size: 0.833313rem;
  line-height: 1.145812rem;
  font-weight: 800;
  line-height: 1.35;
  color: var(--primary);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 2.5rem;
}

.combo-card__stars {
  color: var(--gold);
  font-size: 0.875rem;
  letter-spacing: 0.125rem;
}

.combo-card__meta {
  display: flex;
  gap: 1rem;
  font-size: 0.78125rem;
  color: var(--text-muted);
}

.combo-card__meta span {
  display: inline-flex;
  align-items: center;
  gap: 0.3125rem;
}

.combo-card__hotel {
  font-size: 0.78125rem;
  color: var(--text-main);
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  font-weight: 600;
}

/* Footer ăn sát hai mép thẻ: huỷ đúng phần `padding: 1rem` mà .combo-card__body
   đang đặt ở bên phải và dưới đáy, giữ nguyên bên trái cho cụm giá. Nhờ vậy nút
   chạm được vào góc dưới-phải thay vì lơ lửng cách mép một quãng. */
.combo-card__foot {
  margin-top: auto;
  margin-right: -1rem;
  margin-bottom: -1rem;
  /* Cố ý không kẻ `border-top` như bản tham khảo: nút màu đặc ở góc dưới-phải
     đã tự tách footer khỏi phần thân, thêm đường kẻ là chia thẻ hai lần cho
     cùng một mục đích. */
  padding-top: 0.75rem;
  display: flex;
  /* stretch chứ không flex-end: nút phải cao bằng cả hàng footer, đúng như khối
     màu đặc ở bản tham khảo. */
  align-items: stretch;
  justify-content: space-between;
  gap: 0.625rem;
}

/* Bù lại phần padding đáy vừa huỷ ở trên — chỉ cụm giá cần, nút thì cố tình
   chạm đáy. */
.combo-card__price {
  align-self: flex-end;
  padding-bottom: 1rem;
}

.combo-card__price small {
  display: block;
  font-size: 0.6875rem;
  color: var(--text-muted);
}

.combo-card__price strong {
  font-size: 1.125rem;
  font-weight: 900;
  color: #a21111;
}

.combo-card__btn {
  display: flex;
  align-items: center;
  background: var(--primary);
  color: #fff;
  font-weight: 800;
  font-size: 0.8125rem;
  padding: 0.75rem 1.125rem;
  /* Chỉ bo góc trên-trái. Ba góc còn lại không cần khai báo: .combo-card có
     `overflow: hidden` + bo 1rem nên tự cắt nút theo đúng góc thẻ. */
  border-radius: 1.25rem 0 0 0;
  white-space: nowrap;
  transition: var(--transition);
}

.combo-card__btn:hover {
  background: var(--accent);
}

/* ======= TOUR MICE =======
 *
 * Dải riêng cho hàng bán theo đoàn, đặt ngay dưới khối tour nổi bật — đúng chỗ
 * site đang chạy để nó.
 *
 * Không có thẻ riêng: dùng lại .tour-card của khối trên, chỉ đổi cách xếp (băng
 * cuộn ngang thay vì lưới) và bỏ dòng thời lượng ở phần markup. Vẽ thêm một
 * kiểu thẻ thứ hai cho cùng một loại nội dung là để hai chỗ trên trang chủ nói
 * về tour bằng hai giọng khác nhau.
 *
 * Nền `--bg-main` để tách khỏi khối tour nổi bật ngay trên (nền trắng): hai dải
 * thẻ trắng liền nhau trên nền trắng thì mắt đọc thành một khối dài. Cùng cách
 * .hotdeal tự tách khỏi phần trên nó.
 */
.mice {
  padding: 3rem 0;
  background: var(--bg-main);
}

/* Canh ĐÁY như .tours-header-wrapper của hai dải tour ở trên (28/09/2026, lúc
   đồng bộ nút "Xem tất cả →"): canh giữa thì riêng dải này có nút thấp hơn
   8,7px so với bốn khối kia. Khổ điện thoại về canh giữa — xem @media 768px. */
.mice__head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  margin-bottom: 1.5rem;
}

.mice__title {
  font-size: 1.666688rem;
  line-height: 2.291688rem;
  font-weight: 900;
  color: var(--primary);
}

/* Dải này KHÔNG dùng `.tour-grid` nữa: một hàng cuộn ngang trên bộ `.hcarousel`
   dùng chung với flash-sale, nên băng, mũi tên và bước nhảy JS đã có sẵn ở đó.

   Chỉ còn phải khai bề ngang thẻ: `.tour-card` sinh ra để làm con của grid nên
   tự nó không có flex-basis nào — bỏ trống thì tám thẻ co lại nhét hết vào một
   khung, không thẻ nào tràn ra và băng không bao giờ cuộn.

   Đúng công thức của `.flash-card` (4 thẻ / màn, trừ 3 khoảng hở 1.5rem): hai
   dải nằm cùng một trang thì mép thẻ phải thẳng hàng nhau. */
.mice__track>.tour-card,
.tours-track>.tour-card {
  flex: 0 0 calc((100% - 4.5rem) / 4);
  scroll-snap-align: start;
}

/* ======= TRUST / WHY CHOOSE US ======= */
.trust {
  padding: 0 0 3rem;
  background: linear-gradient(180deg, var(--bg-main) 0%, #EBF3FA 100%);
}

.trust__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem;
}

.trust__card {
  background: var(--bg-surface);
  border-radius: var(--radius-lg);
  padding: 2rem 1.5rem;
  text-align: center;
  box-shadow: var(--shadow-sm);
  border: 0.0625rem solid var(--border);
  transition: var(--transition);
}

.trust__card:hover {
  transform: translateY(-0.375rem);
  box-shadow: var(--shadow-md);
}

.trust__icon {
  font-size: 2.5rem;
  margin-bottom: 1rem;
}

.trust__card h3 {
  font-size: 1rem;
  font-weight: 800;
  color: var(--primary);
  margin-bottom: 0.625rem;
}

.trust__card p {
  font-size: 0.875rem;
  color: var(--text-muted);
  line-height: 1.6;
}

/* ======= PRESS — BÁO CHÍ NÓI VỀ CHÚNG TÔI ======= */
.news {
  padding: 3rem 0;
  background: var(--bg-surface);
}

.news .hcarousel__track {
  padding: 0.5rem 0 0;
}

.press-card {
  scroll-snap-align: start;
  flex: 0 0 calc((100% - 4.5rem) / 4);
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
}

.press-card__media {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  height: 12.5rem;
  box-shadow: var(--shadow-sm);
}

.press-card__img {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}

.press-card:hover .press-card__img {
  transform: scale(1.06);
}

.press-card__source {
  position: absolute;
  bottom: 0.75rem;
  right: 0.75rem;
  background: #fff;
  color: var(--primary);
  font-weight: 800;
  font-size: 0.75rem;
  padding: 0.3125rem 0.75rem;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-sm);
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  /* Viên ngày đè lên ảnh, mà ảnh là link vào bài (replaceNewsRails): bấm trúng
     viên phải rơi xuống link bên dưới, không thì góc đó "chết". */
  pointer-events: none;
}

.press-card__source::before {
  content: '';
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 50%;
  background: var(--accent);
}

.press-card__title {
  font-size: 0.833313rem;
  font-weight: 700;
  line-height: 1.145812rem;
  color: var(--text-main);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.press-card__title a:hover {
  color: var(--accent);
}

/* ======= TIN TỨC & CẨM NANG DU LỊCH (BLOG) ======= */
.blog {
  padding: 3rem 0;
  background: var(--bg-main);
}

.blog__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.75rem;
}

.blog-card {
  background: var(--bg-surface);
  border: 0.0625rem solid var(--border);
  border-radius: 0.875rem;
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: var(--transition);
  display: flex;
  flex-direction: column;
}

.blog-card:hover {
  transform: translateY(-0.375rem);
  box-shadow: var(--shadow-md);
}

/* Ảnh LÙI VÀO trong khung và tự bo góc (mẫu khách duyệt 23/09/2026), cùng kiểu
   với thẻ tour dựng lại cùng ngày. `height` tính cả padding nên phải cộng bù
   0.375rem, nếu không ba thẻ thấp đi đúng ngần ấy so với bản cũ. */
.blog-card__media {
  position: relative;
  display: block;
  height: 12.875rem;
  padding: 0.375rem 0.375rem 0;
  overflow: hidden;
}

.blog-card__img {
  border-radius: 0.625rem;
}

.blog-card__img {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}

.blog-card:hover .blog-card__img {
  transform: scale(1.06);
}

.blog-card__tag {
  position: absolute;
  top: 0.875rem;
  left: 0.875rem;
  background: var(--accent);
  color: #fff;
  font-size: 0.6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03125rem;
  padding: 0.3125rem 0.75rem;
  border-radius: var(--radius-full);
}

.blog-card__body {
  padding: 1.25rem;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
  flex-grow: 1;
}

.blog-card__title {
  font-size: 0.833313rem;
  font-weight: 800;
  line-height: 1.145812rem;
  color: var(--primary);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.blog-card__title a:hover {
  color: var(--accent);
}

.blog-card__excerpt {
  font-size: 0.875rem;
  color: var(--text-muted);
  line-height: 1.6;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.blog-card__foot {
  margin-top: auto;
  padding-top: 0.75rem;
  border-top: 0.0625rem solid var(--border-light);
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.8125rem;
  color: var(--text-light);
}

.blog-card__more {
  color: var(--accent);
  font-weight: 700;
}

/* ======= FOOTER =======
 *
 * Dải chân trang dựng lại theo footer-demo.html: nền xanh đậm riêng (#144285,
 * đậm hơn --primary của thân trang nên chân trang tách ra thành một dải rõ ràng
 * mà không cần đường kẻ đỏ như bản cũ), điểm nhấn hổ phách, và bốn cột thu thành
 * accordion trên di động.
 *
 * Vàng ở đây là #F59E0B chứ không phải --gold (#D4AF37) của thân trang: --gold
 * dùng trên nền trắng nên bị xỉn hẳn khi đặt lên nền xanh đậm. Đặt thành biến
 * cục bộ để cả khối chỉ có một chỗ sửa.
 */
.footer {
  --footer-bg: #144285;
  --footer-amber: #F59E0B;
  --footer-amber-dark: #D97706;
  /* Số hotline nhạt hơn --footer-amber một bậc: chúng là chữ đậm cỡ lớn nên ở
     mức hổ phách kia sẽ nặng hơn cả tiêu đề cột. */
  --footer-amber-soft: #FBD947;
  --footer-line: rgba(255, 255, 255, 0.1);
  --footer-panel: rgba(255, 255, 255, 0.04);

  background: var(--footer-bg);
  color: #fff;
  box-shadow: 0 -0.625rem 2.5rem rgba(0, 0, 0, 0.1);
}

.footer__main {
  padding: 4.5rem 0 0;
}

.footer__grid {
  display: grid;
  /* Hai cột điểm đến rộng hơn cột "Về Top Ten": nội dung của chúng là danh sách
     chảy ngang, cột hẹp thì mỗi hàng vẫn chỉ nhét được một tên. */
  grid-template-columns: 1.9fr 0.9fr 1.3fr 1.3fr;
  gap: 2.5rem 3rem;
}

/* Logo thật thay cho khối chữ "TOP TEN / TRAVEL" gõ tay: hai dòng chữ trắng và
   hổ phách kia không phải nhận diện của hãng, đứng cạnh logo ở header là lệch
   hẳn — khách phàn nàn đúng chỗ này.

   Tấm nền trắng là bắt buộc, không phải trang trí: brand/logo.png nền trong
   suốt và mang hai màu tối — chữ "TOP TEN TRAVEL" đỏ, dòng www và vành con dấu
   xanh navy. Thả thẳng lên --footer-bg (#144285) thì dòng địa chỉ web và cả
   vành dấu chìm mất, chỉ còn chữ đỏ nổi lờ mờ. */
.footer__logo {
  display: inline-flex;
  align-items: center;
  background: #fff;
  border-radius: 0.75rem;
  padding: 0.75rem 1.125rem;
  margin-bottom: 1.5rem;
  box-shadow: 0 0.5rem 1.25rem rgba(0, 0, 0, 0.18);
}

.footer__logo img {
  display: block;
  /* Cao gần bằng logo header (3.75rem) nhưng nhẹ hơn một bậc: ở footer nó là
     chữ ký cuối trang chứ không phải mỏ neo điều hướng. */
  height: 3rem;
  width: auto;
}

.footer__desc {
  font-size: 0.9375rem;
  font-weight: 300;
  line-height: 1.7;
  color: rgba(255, 255, 255, 0.78);
  margin-bottom: 2rem;
  padding-right: 1.25rem;
}

.footer__contact-list {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.footer__contact-item {
  display: flex;
  align-items: flex-start;
  gap: 1rem;
  font-size: 0.9375rem;
  color: rgba(255, 255, 255, 0.88);
}

.footer__contact-item svg {
  flex-shrink: 0;
  width: 1.125rem;
  margin-top: 0.1875rem;
  color: var(--footer-amber);
}

.footer__contact-item a:hover {
  color: #fff;
  text-decoration: underline;
  text-underline-offset: 0.1875rem;
}

.footer__social {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-top: 2.25rem;
}

.footer__social-link {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.06);
  border: 0.0625rem solid rgba(255, 255, 255, 0.12);
  color: #fff;
  transition: var(--transition);
}

.footer__social-link--text {
  width: auto;
  min-width: 2.75rem;
  padding: 0 0.75rem;
  font-size: 0.75rem;
  font-weight: 700;
}

.footer__social-logo {
  display: block;
  width: 1.375rem;
  height: 1.375rem;
  object-fit: contain;
}

/* TikTok khách tải lên có biểu tượng đen trên nền trắng: đảo thành biểu tượng
   trắng rồi dùng screen để phần nền đen hòa vào màu nền của nút. */
.footer__social-link[aria-label*="tiktok" i] .footer__social-logo {
  filter: grayscale(1) contrast(4) invert(1);
  mix-blend-mode: screen;
}

.footer__social-link:hover {
  background: var(--footer-amber);
  border-color: var(--footer-amber);
  color: #02132b;
  transform: translateY(-0.3125rem);
  box-shadow: 0 0.625rem 1.25rem rgba(245, 158, 11, 0.25);
}

/* Nhãn Bộ Công Thương: ảnh thật, không phải nút — nên không có nền tròn, không
   hover. Chép về public/brand/ thay vì nhúng URL của server cũ: nó nằm trên mọi
   trang, một request đi ra ngoài mỗi lần tải là phụ thuộc không cần thiết. */
.footer__bct {
  height: 2.75rem;
  width: auto;
  margin-left: 0.25rem;
}

.footer__cert-link {
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
}

.footer__cert-link .footer__bct {
  margin-left: 0;
  transition: opacity 0.2s ease;
}

.footer__cert-link:hover .footer__bct {
  opacity: 0.82;
}

/* ===== Bốn cột link ===== */

/* Ô tích điều khiển accordion di động; ẩn khỏi mắt nhưng vẫn nhận được tiêu
   điểm bàn phím để đóng/mở bằng Space. Thanh liên hệ nổi từng dùng cùng cách
   này, nay nó là hai nút tĩnh nên đây là chỗ duy nhất còn lại. */
.footer__col-toggle {
  position: absolute;
  width: 0.0625rem;
  height: 0.0625rem;
  opacity: 0;
  pointer-events: none;
}

.footer__col h4 {
  position: relative;
  display: inline-block;
  color: #fff;
  font-size: 1.0625rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03125rem;
  margin-bottom: 1.875rem;
}

.footer__col h4 label {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
}

/* Gạch chân hổ phách kéo dài hết cột khi rê chuột vào cột — chỉ báo "cả cụm này
   là một nhóm", không phải một nút bấm. */
.footer__col h4::after {
  content: '';
  position: absolute;
  bottom: -0.625rem;
  left: 0;
  width: 2.5rem;
  height: 0.1875rem;
  border-radius: 0.125rem;
  background: var(--footer-amber);
  transition: width 0.3s ease;
}

.footer__col:hover h4::after {
  width: 100%;
}

/* Mũi tên chỉ có nghĩa khi cột gập lại được, tức từ 768px trở xuống. */
.footer__col-chevron {
  display: none;
  transition: transform 0.3s ease;
}

.footer__col-list {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
}

/* Hai cột điểm đến có tới 16 mục mỗi cột. Xếp dọc thì riêng chân trang cao hơn
   cả một màn hình, phần lớn là khoảng trắng giữa các dòng ngắn ("Mỹ", "Nga").
   Cho chữ chảy ngang và tự xuống dòng — đúng cách bản mobile đã làm từ trước,
   nay dùng luôn cho màn rộng. */
#footer-col-outbound~.footer__col-list,
#footer-col-domestic~.footer__col-list {
  flex-direction: row;
  flex-wrap: wrap;
  gap: 0.625rem 1.125rem;
}

/* `display: contents` để thẻ <li> biến mất khỏi bố cục, các thẻ <a> thành mục
   trực tiếp của lưới flex — nếu không mỗi <li> vẫn là một khối chiếm trọn hàng. */
#footer-col-outbound~.footer__col-list li,
#footer-col-domestic~.footer__col-list li {
  display: contents;
}

#footer-col-outbound~.footer__col-list a,
#footer-col-domestic~.footer__col-list a {
  display: inline-flex;
  white-space: nowrap;
}

/* Mũi tên trượt vào khi rê chuột làm chữ nhảy chỗ trong bố cục chảy ngang —
   ở đây bỏ cả mũi tên lẫn cú đẩy ngang, chỉ đổi màu. */
#footer-col-outbound~.footer__col-list a::before,
#footer-col-domestic~.footer__col-list a::before {
  display: none;
}

#footer-col-outbound~.footer__col-list a:hover,
#footer-col-domestic~.footer__col-list a:hover {
  transform: none;
}

.footer__col-list a {
  display: flex;
  align-items: center;
  font-size: 0.9375rem;
  font-weight: 300;
  color: rgba(255, 255, 255, 0.78);
}

/* Mũi tên ẩn sẵn rồi trượt vào khi rê chuột: giữ được chỉ báo hover của bản
   thiết kế mà không cần tải FontAwesome chỉ cho một ký tự. */
.footer__col-list a::before {
  content: '›';
  margin-right: 0.5rem;
  font-weight: 700;
  color: var(--footer-amber);
  opacity: 0;
  transform: translateX(-0.625rem);
  transition: var(--transition);
}

.footer__col-list a:hover {
  color: #fff;
  transform: translateX(0.3125rem);
}

.footer__col-list a:hover::before {
  opacity: 1;
  transform: translateX(0);
}

/* ===== Tổng đài hỗ trợ =====
   Bốn số hotline theo dòng sản phẩm, do patchFooterHotlines() đổ vào từ
   FOOTER_HOTLINES (lib/public/templates.ts). */
.footer__support {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2.5rem;
  margin: 3.75rem 0 2.5rem;
  padding: 2rem 2.5rem;
  border: 0.0625rem solid rgba(255, 255, 255, 0.09);
  border-radius: 1rem;
  background: var(--footer-panel);
  transition: var(--transition);
}

.footer__support:hover {
  background: rgba(255, 255, 255, 0.06);
  border-color: rgba(245, 158, 11, 0.3);
  box-shadow: 0 0.625rem 2.5rem rgba(0, 0, 0, 0.15);
}

.footer__support-head {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  flex-shrink: 0;
}

.footer__support-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 4rem;
  height: 4rem;
  border-radius: 1rem;
  background: linear-gradient(135deg, var(--footer-amber), var(--footer-amber-dark));
  color: #001630;
  box-shadow: 0 0.5rem 1.25rem rgba(245, 158, 11, 0.3);
}

.footer__support-title {
  font-size: 1.25rem;
  font-weight: 800;
  letter-spacing: 0.0625rem;
  text-transform: uppercase;
  color: #fff;
  margin-bottom: 0.25rem;
}

.footer__support-desc {
  font-size: 0.875rem;
  font-weight: 300;
  color: rgba(255, 255, 255, 0.72);
}

.footer__hotlines {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1.5rem;
  flex-grow: 1;
}

.footer__hotline-item {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  color: inherit;
}

/* Vạch mảnh giữa các số thay cho bốn cái hộp: đủ để mắt tách nhóm mà không thêm
   một tầng viền nữa vào trong khối đã có viền. */
.footer__hotline-item:not(:last-child)::after {
  content: '';
  position: absolute;
  right: -0.75rem;
  top: 10%;
  height: 80%;
  width: 0.0625rem;
  background: var(--footer-line);
}

.footer__hotline-label {
  font-size: 0.8125rem;
  font-weight: 500;
  color: rgba(255, 255, 255, 0.68);
  text-transform: uppercase;
  letter-spacing: 0.0625rem;
}

.footer__hotline-number {
  font-size: 1.375rem;
  font-weight: 800;
  color: var(--footer-amber-soft);
  /* Số điện thoại luôn đọc trái→phải kể cả trong ngữ cảnh RTL. */
  direction: ltr;
  white-space: nowrap;
  transition: var(--transition);
}

.footer__hotline-item:hover .footer__hotline-number {
  color: #fff;
}

/* ===== Nhãn tin cậy ===== */
.footer__badges {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 1.5rem;
  padding-bottom: 2rem;
}

.footer__badge {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.875rem;
  font-weight: 300;
  color: rgba(255, 255, 255, 0.8);
}

/* Xanh chứ không hổ phách: hổ phách trong chân trang này đang là màu của thứ bấm
   được (link hover, số hotline, gạch chân tiêu đề). Nhãn tin cậy thì không bấm
   được — cho nó màu riêng. */
.footer__badge svg {
  flex-shrink: 0;
  color: #10B981;
}

/* ===== Thanh bản quyền ===== */
.footer__bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.875rem 2rem;
  flex-wrap: wrap;
  padding: 1.5rem 0;
  /* Gạch đứt, không liền: thanh này là phần đuôi của cùng một khối chứ không
     phải một dải mới — nét liền thứ hai trong chân trang sẽ đọc thành thế. */
  border-top: 0.0625rem dashed var(--footer-line);
  font-size: 0.875rem;
  font-weight: 300;
  color: rgba(255, 255, 255, 0.68);
}

.footer__bottom a {
  color: rgba(255, 255, 255, 0.82);
}

.footer__bottom a:hover {
  color: var(--footer-amber);
}

.footer__bottom-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.5rem;
}

/* Nút hotline nổi (.floating-contact) đã bỏ — `patchCommon` gỡ luôn phần tử
   khỏi mọi trang, xem lib/public/templates.ts. Liên hệ nhanh giờ chỉ còn thanh
   .social-rail bên phải. */

/* ======= BACK TO TOP =======
 *
 * Xếp thành cặp với nút liên hệ của .social-rail ở mép phải, không còn nằm lẻ ở
 * góc trái dưới: hai nút nổi ở hai góc đối diện thì mắt phải quét cả màn hình
 * mới thấy hết, mà cả hai đều là "việc phụ" của trang.
 *
 * Neo theo đáy màn cùng một bộ biến với .social-rail, và cộng thêm
 * `--float-rail-stack` = chiều cao của chính thanh đó. Thanh liên hệ giờ có hai
 * nút chứ không phải một, nên đừng cộng `--float-rail-size` ở đây nữa.
 */
.back-to-top {
  position: fixed;
  /* Neo theo ĐÁY màn hình, không phải giữa màn.
     `--float-rail-base` là khoảng hở mặc định với mép dưới; trang nào có thanh
     cố định dưới cùng (form đặt tour trên mobile) thì ghi đè riêng biến này.
     `--float-rail-lift` do index.js đặt: bằng chiều cao thanh cố định đáy màn
     của trang (.td-bookbar, .bt-mobilebar, .tl-mobilebar). KHÔNG tính chân
     trang — nút nổi phải đứng yên khi cuộn, xem chú thích ở syncFloatingOffsets.
     `--float-rail-chat` do SUBIZ_RAIL_ON_MOBILE trong app/layout.tsx đặt: chỗ
     của ô chat chen vào giữa cột trên di động. Bằng 0 khi widget chưa dựng xong
     hoặc trên desktop, nên nút này không bao giờ phụ thuộc vào Subiz để đứng
     đúng chỗ. */
  bottom: calc(var(--float-rail-base) + var(--float-rail-lift, 0px) + var(--float-rail-stack) + var(--float-rail-gap) + var(--float-rail-chat, 0px));
  right: 0.75rem;
  width: var(--float-rail-size);
  height: var(--float-rail-size);
  border-radius: var(--radius-full);
  background: var(--primary);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md);
  opacity: 0;
  visibility: hidden;
  transition: var(--transition);
  /* Thấp hơn .social-rail (900), vì bấm nút gọi là danh sách bung LÊN TRÊN và
     chạy qua chỗ nút này — danh sách phải nằm trên. Vẫn đứng trên nội dung
     thường (không có z-index) và dưới header dính (1000). Thang của cột nút
     nổi: ô chat Subiz 880 < nút lên đầu trang 890 < cột gọi 900. */
  z-index: 890;
}

.back-to-top.visible {
  opacity: 1;
  visibility: visible;
}

.back-to-top:hover {
  background: var(--accent);
  transform: translateY(-0.1875rem);
}

/* ======= RESPONSIVE DESIGN (MOBILE & TABLET) ======= */

@media (max-width: 1024px) {
  .tour-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  /* Tablet: thu ô chủ đề lại một chút để một màn thấy được nhiều mục hơn. */
  .home-nav__theme {
    min-width: 7.5rem;
  }

  .bento-grid {
    grid-template-columns: repeat(2, 1fr);
    height: auto;
    gap: 1rem;
  }

  .bento-col {
    height: auto;
    gap: 1rem;
  }

  .bento-card {
    height: 15rem;
  }

  .bento-card--large {
    grid-column: span 2;
    height: 20rem;
  }

  .trust__grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/*
 * ===== Điểm ngắt của MENU CHÍNH — 1024px, không phải 768px =====
 *
 * Dải nav ngang cần khoảng 628px cho năm mục, cộng logo 209px, nút gọi và cụm
 * nút phải là ~1030px. Container dưới 1024px không còn đủ chỗ: bản cũ để chữ
 * xuống dòng (mục menu cao gấp đôi, đọc rất lộn xộn), và vì mục menu giờ có
 * `white-space: nowrap` thì thay vì xuống dòng nó sẽ chọc ra ngoài mép phải,
 * kéo cả trang trượt ngang.
 *
 * Nên từ 1024px trở xuống menu thu vào hamburger luôn — đúng mốc site đang chạy
 * dùng. Hằng số này còn ở một chỗ nữa: `mqMobile` trong public/legacy/index.js;
 * sửa ở đây thì phải sửa cả bên đó, nếu không menu hiện ra kiểu mobile nhưng
 * bấm vào mục cha lại điều hướng đi thay vì bung accordion.
 *
 * Thanh trên cùng vẫn giữ tới 768px: bộ chọn nơi khởi hành cộng dải link phụ
 * chỉ chiếm ~731px nên ở 1024px vẫn thoải mái.
 */
@media (max-width: 1024px) {
  .header__hamburger {
    display: flex;
  }

  /* ===== MOBILE NAV — panel xổ xuống dưới header ===== */
  .header__nav {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    display: block;
    background: #fff;
    border-top: 0.0625rem solid var(--border);
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    box-shadow: var(--shadow-lg);
    max-height: calc(100vh - 4rem);
    overflow-y: auto;
    padding: 0;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-0.875rem);
    transition: opacity .28s ease, transform .28s ease, visibility .28s;
    z-index: 1050;
  }

  body.nav-open .header__nav {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
  }

  body.nav-open {
    overflow: hidden;
  }

  .header__nav-list {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    width: 100%;
  }

  .header__nav-item {
    height: auto;
    display: block;
    border-bottom: 0.0625rem solid var(--border-light);
  }

  /* Gỡ hẳn kiểu viên thuốc của bản desktop: trong panel accordion mỗi mục là
     một hàng chạy hết bề ngang, bo góc và nền nhạt ở đây sẽ thành những cục
     rời rạc xếp chồng. */
  .header__nav-item>a {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    height: auto;
    padding: 0.9375rem 1.375rem;
    border-radius: 0;
    background: transparent;
    font-size: .935rem;
  }

  .header__nav-item:hover>a {
    background: transparent;
    color: var(--primary);
  }

  .header__nav-item>a[aria-current="page"] {
    background: var(--bg-subtle);
    color: var(--primary);
  }

  .header__nav-item>a::after {
    display: none;
  }

  /* Canh trái mọi mục, kể cả mục có icon.
     `space-between` ở trên chia đều khoảng trống giữa **mọi** con của thẻ <a>.
     Mục không icon có hai con (chữ + mũi tên ::before) nên chữ nằm sát trái;
     nhưng Tour MICE / Tour Combo / Thị thực có thêm <svg> thành ba con, và chữ
     — vốn là con ở giữa — bị đẩy ra chính giữa hàng. Dồn tất cả về trái rồi đẩy
     riêng mũi tên sang phải bằng `margin-left: auto` (xem quy tắc ::before
     bên dưới). */
  .header__nav-item>a {
    justify-content: flex-start;
    gap: 0.75rem;
  }

  /* Mũi tên chỉ báo cho mục có dropdown.
     `margin-left: auto` là thứ đẩy nó về sát mép phải sau khi hàng đổi sang
     `justify-content: flex-start` ở trên — không có nó thì mũi tên dính ngay
     sau chữ. */
  .header__nav-item--has-dropdown>a::before {
    content: '';
    order: 2;
    width: 0.5625rem;
    height: 0.5625rem;
    margin-left: auto;
    border-right: 0.125rem solid var(--text-muted);
    border-bottom: 0.125rem solid var(--text-muted);
    transform: rotate(45deg);
    transition: transform .25s ease;
  }

  .header__nav-item--has-dropdown.is-open>a::before {
    transform: rotate(-135deg);
  }

  /* Mega dropdown -> accordion trượt trong luồng */
  .mega-dropdown,
  .mega-dropdown--sm {
    position: static;
    min-width: 0;
    width: 100%;
    padding: 0;
    background: var(--bg-subtle);
    border: none;
    border-radius: 0;
    box-shadow: none;
    transform: none;
    opacity: 1;
    pointer-events: auto;
    visibility: hidden;
    max-height: 0;
    overflow: hidden;
    transition: max-height .32s ease;
  }

  .header__nav-item--has-dropdown.is-open .mega-dropdown {
    visibility: visible;
    /* Chỉ là lưới đỡ: khi bung, index.js ghi đè max-height bằng chiều cao đo
       được của chính panel. Con số cứng ở đây không giới hạn nội dung mà cắt
       nó — `overflow: hidden` ở trên — nên phải rộng hơn mọi menu có thể có.
       Menu dựng từ DB dài hơn mockup nhiều: riêng "Tour Nước Ngoài" đã 49 link,
       cao 2000px, trong khi trần cũ 75rem chỉ chứa được 1200px. */
    max-height: 250rem;
  }

  .mega-dropdown__inner {
    grid-template-columns: 1fr;
    gap: 0.125rem;
    /* Gỡ khuôn .container của bản desktop — accordion chiếm trọn bề ngang. */
    max-width: none;
    margin: 0;
    padding: 0.25rem 0 0.625rem;
  }

  .mega-dropdown__col {
    padding: 0.25rem 1.375rem;
  }

  .mega-dropdown__col-title {
    margin: 0.625rem 0 0.25rem;
  }

  /* Cấp hai của menu điện thoại: châu lục trước, quốc gia sau.
   *
   * Khách báo 21/09/2026: mở "Tour Nước Ngoài" là xổ thẳng 49 quốc gia nối
   * đuôi nhau, phải vuốt mấy màn mới hết một mục menu. Nay danh sách con đóng
   * sẵn, hàng châu lục mang mũi tên và bấm vào mới xổ (index.js gắn
   * .mega-dropdown__col--fold cho nhóm CÓ link con).
   *
   * Giấu bằng display:none chứ không phải max-height: nhóm nhiều nhất 11 link,
   * ít nhất 1 — một con số cứng thì hoặc cắt nhóm to hoặc chừa khoảng trống
   * dưới nhóm nhỏ. Panel cha đã có transition riêng và index.js đo lại chiều
   * cao sau mỗi lần xổ. */
  .mega-dropdown__col--fold .mega-dropdown__col-title {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    cursor: pointer;
  }

  .mega-dropdown__col--fold .mega-dropdown__col-title::after {
    content: '';
    width: 0.5rem;
    height: 0.5rem;
    margin-left: auto;
    border-right: 0.125rem solid var(--text-muted);
    border-bottom: 0.125rem solid var(--text-muted);
    transform: rotate(45deg);
    transition: transform .25s ease;
  }

  .mega-dropdown__col--fold.is-open .mega-dropdown__col-title::after {
    transform: rotate(-135deg);
  }

  .mega-dropdown__col--fold>a {
    display: none;
  }

  .mega-dropdown__col--fold.is-open>a {
    display: block;
  }

  .mega-dropdown__col a {
    padding: 0.5625rem 0;
    font-size: 0.9375rem;
  }

  .mega-dropdown__col a:hover {
    transform: none;
  }

  /* Hamburger -> chữ X khi mở */
  body.nav-open .header__hamburger span:nth-child(1) {
    transform: translateY(0.46875rem) rotate(45deg);
  }

  body.nav-open .header__hamburger span:nth-child(2) {
    opacity: 0;
  }

  body.nav-open .header__hamburger span:nth-child(3) {
    transform: translateY(-0.46875rem) rotate(-45deg);
  }

  /* Actions gọn lại để không tràn */
  .header__actions {
    gap: 0.625rem;
  }
}

@media (max-width: 768px) {

  /* HEADER GOM VỀ MỘT HÀNG (mẫu: header mobile của dulichviet.com.vn)
   *
   *   [logo nhỏ]  📍 TP. Hồ Chí Minh ▾        [tìm] [tài khoản] [≡]
   *
   * Thanh trên cùng biến mất hẳn: sáu link phụ của nó đã vào menu hamburger
   * (`.header__nav-item--utility`), còn bộ chọn nơi khởi hành thì lên chính hàng
   * header (`.header__depart`, do patchMobileHeaderDepart dựng). Không còn gì
   * trong đó để giữ lại một dải xanh cao 2.5rem ở đỉnh mọi trang. */
  .top-bar {
    display: none;
  }

  /* Chiều cao do `.header__inner` quyết định, kể cả lúc đã cuộn.
   *
   * Bản gốc co header từ 5rem xuống 4.375rem khi cuộn — hợp lý với header
   * desktop hai tầng, nhưng ở đây hàng header đã gọn còn 3.375rem: luật
   * `.header.scrolled` (hai lớp, đặc hiệu hơn `.header`) kéo vỏ ngoài lên 4.375rem
   * trong khi ruột vẫn 3.375rem, nên vừa cuộn một cái là header phình thêm 1rem
   * và logo trôi lệch khỏi hàng nút. */
  .header,
  .header.scrolled {
    height: auto;
  }

  .header__inner {
    height: 3.375rem;
    gap: 0.5rem;
  }

  /* Logo thu còn ngang tầm hàng nút: bản 3.125rem chiếm hơn nửa bề ngang, không
     còn chỗ cho tên thành phố. */
  .header .header__logo img {
    max-height: 2rem;
  }

  /* Nút gọi rời header: cụm nút nổi ở mép phải màn hình đã có nút gọi thường
     trực, và hàng này giờ phải chứa thêm tên thành phố. */
  .header__phone {
    display: none;
  }

  .header__depart {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    flex: 1;
    min-width: 0;
  }

  .header__depart-pin {
    flex-shrink: 0;
    color: var(--primary);
  }

  /* Cùng kiểu ô chọn như bản trên thanh xanh, đổi màu cho nền trắng: vàng gold
     trên trắng thì gần như không đọc được. */
  .header__depart select {
    -webkit-appearance: none;
    appearance: none;
    flex: 1;
    min-width: 0;
    background: transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%230F2A4A' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m6 8 4 4 4-4'/%3E%3C/svg%3E") no-repeat right center / 0.75rem 0.75rem;
    padding: 0 0.875rem 0 0;
    border: 0;
    color: var(--text-main);
    font-weight: 700;
    font-size: 0.8125rem;
    line-height: 1.2;
    cursor: pointer;
  }

  /* Đúng khổ mà dải gốc vừa ẩn thì bản chép trong menu hiện lên — không chồng
     lấn nhau ở bất kỳ bề ngang nào. Vẫn hai lớp để cùng độ đặc hiệu với luật
     ẩn mặc định, nếu không thì luật kia (đứng trước nhưng đặc hiệu hơn) thắng
     và sáu mục không bao giờ hiện. */
  .header__nav .header__nav-item--utility {
    display: block;
  }

  /* MENU PHỦ KÍN MÀN HÌNH, trượt từ phải sang (mẫu: `.mmContent` của
     dulichviet). Bản ở khổ 1024px là một panel xổ xuống dưới header, cao tối đa
     `100vh - 4rem`: trên điện thoại nó vừa che nửa trang vừa để lộ nội dung
     nhấp nháy phía sau, mà danh sách chuyên mục thì dài hơn chỗ đó nhiều.

     Hiện/ẩn bằng opacity + visibility (đã có sẵn ở khối 1024px), KHÔNG trượt
     ngang: panel `position: fixed` mà đẩy ra ngoài mép phải thì Chrome vẫn tính
     nó vào bề rộng cuộn của tài liệu — đo được scrollWidth 780 trên màn 390, tức
     cả trang trượt ngang được đúng một màn hình trắng. */
  .header__nav {
    position: fixed;
    inset: 0;
    height: 100dvh;
    max-height: none;
    border-top: 0;
    border-radius: 0;
    transform: none;
    transition: opacity .25s ease, visibility .25s;
    z-index: 1100;
  }

  body.nav-open .header__nav {
    transform: none;
  }

  .header__nav-head {
    position: sticky;
    top: 0;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.875rem 1rem;
    background: #fff;
    border-bottom: 0.0625rem solid var(--border);
  }

  .header__nav-title {
    font-weight: 800;
    font-size: 1.0625rem;
    color: var(--text-main);
  }

  .header__nav-close {
    flex-shrink: 0;
    width: 2.25rem;
    height: 2.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: var(--text-main);
    cursor: pointer;
  }

  /* Vạch ngăn giữa nhóm tour và nhóm nội dung: không có nó thì "Giới thiệu"
     đọc như một mục tour thứ sáu. */
  .header__nav-item--utility-first {
    border-top: 0.0625rem solid var(--border);
  }

  /* Nhẹ hơn nhóm tour một nấc: đây là liên kết phụ, không phải mục bán hàng. */
  .header__nav-item--utility>a {
    font-size: .935rem;
    font-weight: 600;
  }

  /* Xếp ngang chứ không xếp dọc như desktop: một dòng vừa hết bề ngang máy,
     không phải hy sinh chiều cao cho hai dòng chữ nhỏ. */
  .top-bar__depart {
    flex: 1;
    flex-direction: row;
    align-items: center;
    gap: 0.5rem;
    min-width: 0;
  }

  .top-bar__depart label {
    font-size: 0.75rem;
  }

  .top-bar__depart select {
    flex: 1;
    min-width: 0;
    font-size: 0.8125rem;
    background-position: right center;
  }

  /* Ngang tầm hàng nút bên phải. Cỡ 3.125rem của bản trước chiếm gần nửa bề
     ngang header — hồi đó không sao vì hàng này chỉ có logo và mấy cái nút,
     nhưng nay còn phải chứa tên thành phố (`.header__depart`).

     Kể cả trạng thái đã cuộn: luật `.header.scrolled .header__logo img` của bản
     desktop đặc hiệu hơn, không ghi đè thì vừa cuộn là logo nhảy từ 34px lên
     50px, cao hơn cả hàng header. */
  .header .header__logo img,
  .header.scrolled .header__logo img {
    max-height: 2.125rem;
  }

  /* Ba nút tròn cạnh nhau chiếm gần nửa bề ngang header ở cỡ cũ (2.25–2.5rem),
     lấn cả chỗ của logo. Thu về 2rem và siết khoảng cách. */
  .header__actions {
    gap: 0.375rem;
  }

  .header__phone,
  .header__search-btn,
  .header__login-btn {
    width: 2rem;
    height: 2rem;
  }

  /* Kích thước gốc nằm ở thuộc tính width/height của chính thẻ <svg>; phải ghi
     đè bằng CSS thì hình mới co theo nút. */
  .header__phone svg,
  .header__search-btn svg,
  .header__login-btn svg {
    width: 0.9375rem;
    height: 0.9375rem;
  }

  /* Đăng nhập -> chỉ còn icon cho gọn */
  .header__login-btn {
    padding: 0;
    gap: 0;
    justify-content: center;
    border-radius: var(--radius-full);
  }

  .header__login-btn span {
    display: none;
  }

  /* ĐIỆN THOẠI: ẢNH QUẢNG CÁO Ở TRÊN, HỘP TÌM KIẾM Ở DƯỚI — KHÔNG CHỒNG NHAU.
   *
   * Bản desktop cố ý cho hộp tìm kiếm nằm đè lên tấm ảnh: bề ngang 60rem chỉ ăn
   * hết một dải giữa, hai bên và phần trên ảnh vẫn nhìn thấy rõ. Trên màn 390px
   * thì không còn "hai bên" nào cả — hộp xếp một cột, cao ~25rem, phủ gần kín
   * tấm ảnh. Banner biên tập viên đăng lên chỉ còn hở một vệt trên đầu, tức trả
   * tiền chỗ quảng cáo tốt nhất trang để hiện một khoảng mờ.
   *
   * Nên ở khổ này hero xếp thành hai tầng thật: tầng một là ảnh (đúng nghĩa
   * gallery, bấm/vuốt được), tầng hai là hộp tìm kiếm trên nền trắng.
   *
   * Dùng grid chứ không phải bỏ `position: absolute` của từng phần: chấm chỉ
   * trang (`.hero__dots`) là con của `.hero`, không phải của `.hero__bg`, nên
   * nếu chỉ đẩy ảnh về dòng chảy thì chấm rơi xuống đáy hộp tìm kiếm. Xếp cả
   * ảnh lẫn chấm vào CÙNG một ô lưới thì chúng chồng lên nhau đúng như cũ mà
   * không cần biết tấm ảnh cao bao nhiêu. */
  .hero {
    display: grid;
    grid-template-rows: auto auto;
    min-height: 0;
    padding-top: 0;
    /* Chữ trong hộp tìm kiếm không còn nằm trên ảnh tối nữa. */
    color: var(--text);
    background: #fff;
  }

  .hero__bg {
    position: relative;
    grid-area: 1 / 1;
    inset: auto;
    /* Banner là ảnh ngang; 16/9 giữ đúng dáng quen thuộc của một dải quảng cáo
       và không ăn quá nửa màn hình đầu tiên. */
    aspect-ratio: 16 / 9;
  }

  /* Nhãn xuống dòng riêng: để cùng hàng với dải chip thì trên màn 390px nó ăn
     mất một phần ba bề ngang, còn lại vừa đúng một viên rưỡi — nhìn ra như dải
     bị cắt cụt chứ không phải cuộn được. */
  .hero__featured {
    flex-direction: column;
    align-items: stretch;
    gap: 0.375rem;
  }

  .hero__content {
    grid-area: 2 / 1;
    /* Hết đè lên khối bên dưới thì cũng hết phần thò ra. */
    margin-bottom: 0;
    /* Không có lề TRÊN: ô tìm kiếm kéo sát đáy banner (yêu cầu 28/08/2026 —
       "kéo lên trên một chút"). Không kéo âm hơn nữa: dãy chấm chuyển ảnh nằm
       cách đáy banner đúng 0.875rem, âm vào là hộp tìm kiếm đè lên chúng. */
    padding: 0.875rem;
  }

  /* Nền kính mờ là để hộp NỔI TRÊN ảnh. Hết nằm trên ảnh thì mọi thứ làm nó nổi
     lên — viền, bo góc, đổ bóng — chỉ còn tác dụng vẽ một đường kẻ ngang chia
     đôi trang, tách tấm gallery ra khỏi phần thân. Nên ở khổ này hộp phẳng hẳn,
     liền mạch từ ảnh xuống nội dung.

     `backdrop-filter` còn một tác dụng phụ quan trọng: phần tử mang nó trở thành
     khối chứa của mọi con `position: fixed` bên trong — tức tờ chọn điểm đến
     toàn màn hình bên dưới sẽ bị nhốt trong hộp tìm kiếm. Bỏ nó đi là điều kiện
     để tờ đó phủ được cả màn hình. */
  .hero__search {
    background: #fff;
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    padding: 0;
  }


  /* Trên mobile: ẩn mũi tên, chỉ dùng chấm + tự chạy */
  .hero__arrow {
    display: none;
  }

  /* Cùng ô lưới với tấm ảnh nên chấm vẫn nằm trên ảnh, canh đáy — không cần
     `position: absolute` và cũng không cần biết ảnh cao bao nhiêu. */
  .hero__dots {
    position: relative;
    grid-area: 1 / 1;
    left: auto;
    bottom: auto;
    transform: none;
    align-self: end;
    justify-self: center;
    margin-bottom: 0.875rem;
  }

  /* Hai cột: "Tháng khởi hành" và "Nơi khởi hành" đứng cạnh nhau, mỗi ô còn đủ
     rộng cho nhãn của nó. Ba ô còn lại là câu hỏi mở hoặc nút bấm nên chiếm
     trọn hàng. Xếp một cột như bản trước thì hộp cao thêm ~6rem mà không ô nào
     đọc dễ hơn. */
  /* `minmax(0, 1fr)` chứ không phải `1fr`: mặc định `1fr` là `minmax(auto, 1fr)`
     nên nhãn dài nhất ("Tháng khởi hành") nong cột trái rộng ra, hai nửa lệch
     hẳn — nút "Tìm tour" ở hàng dưới bị bóp còn hai phần ba ô "Tất cả" cạnh nó.

     Cũng phẳng như hộp ngoài: hai lớp bo góc lồng nhau trên nền trắng chỉ vẽ
     thêm một cái khung nữa quanh mấy ô nhập. */
  .hero__search-box {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    border-radius: 0;
    box-shadow: none;
    padding: 0;
  }

  .hero__search-field--dest,
  .hero__featured {
    grid-column: 1 / -1;
  }

  /* Thứ tự trên màn hẹp: "Bạn muốn đi đâu?" chiếm cả hàng, rồi tháng | nơi khởi
     hành, rồi HÀNG CUỐI ghép ô "Tất cả" với nút "Tìm tour".
     Sắp bằng `order` chứ không đổi DOM: ô "Tất cả" phải là con đầu của <form>
     (patchHeroSearch prepend nó vào đó) để giá trị `type` luôn được gửi, và ở
     khổ desktop nó vẫn là dải nút nằm trên cùng. */
  .hero__search-types {
    order: 4;
    grid-column: auto;
  }

  .hero__search-submit {
    order: 5;
    grid-column: auto;
  }

  .hero__featured {
    order: 6;
  }

  /* Hai ô nửa hàng chỉ còn ~11rem: bóp đệm và khoảng hở để nhãn dài nhất
     ("Tháng khởi hành") đứng đủ một dòng. */
  .hero__search-field--picker {
    padding-left: 0.625rem;
    padding-right: 0.625rem;
    gap: 0.375rem;
  }

  .hero__search-field--picker .hero__picker-trigger {
    gap: 0.25rem;
    font-size: 0.6875rem;
    /* Thà tràn ra còn hơn bẻ dòng: bẻ dòng làm hai ô cao vống lên và lệch hẳn
       so với các ô một dòng ở trên. */
    white-space: nowrap;
  }

  /* Đây mới là chỗ dải nút đổi thành ô chọn — trên mọi thanh tìm kiếm cùng lúc,
     vì cả ba (trang chủ, /tours, bảng trượt lọc) dùng chung mảnh markup này.
     Đổi có điều kiện `.is-enhanced`: chưa dựng được ô chọn thì thà để nguyên dải
     nút ba dòng còn hơn giấu mất câu hỏi. */
  .hero__search-types.is-enhanced .hero__search-type {
    display: none;
  }

  .hero__search-types.is-enhanced .hero__search-typefield {
    display: flex;
  }

  /* Còn mỗi một ô con thì khoảng đệm trên của dải thành khe hở thừa giữa ô này
     và ô "Bạn muốn đi đâu?" ngay dưới. */
  .hero__search-types.is-enhanced {
    padding: 0;
  }

  /* Trên mobile thanh tìm kiếm xếp một cột, ô nhập rộng bằng cả hộp — bảng gợi
     ý bám theo ô là vừa đủ, không cần nới thêm. Lưới rút về một cột: ba cột
     trên màn 360px thì mỗi ô còn ~90px, tên nào cũng bị cắt cụt. */
  .hero__dest-panel {
    width: 100%;
    max-width: none;
    max-height: 60vh;
    padding: 1rem;
  }

  .hero__dest-grid {
    grid-template-columns: 1fr;
    gap: 0.25rem;
  }

  /* BẢNG CHỌN THÁNG / NƠI KHỞI HÀNH MỞ TRỌN BỀ NGANG HỘP.
   *
   * Ô mở ra nó chỉ rộng nửa hàng (~11rem), mà ruột bảng là lưới tháng kèm số
   * tour từng tháng: bám đúng bề ngang ô thì mỗi hàng nhét được hai ô tháng,
   * bảng dài ngoằng và số tour bị ép xuống dòng. Cho nó rộng bằng CẢ HAI cột
   * cộng khoảng hở giữa — tức đúng bề ngang hộp tìm kiếm — thì lưới tháng thở
   * được, và mép bảng thẳng hàng với mép hộp thay vì cắt ngang giữa chừng.
   *
   * 200% là phần trăm của chính ô chứa (nửa hàng), cộng `gap: 0.5rem` của lưới.
   * Ô bên trái mở sang phải (`left: 0`), ô bên phải mở ngược sang trái
   * (`is-right`, do index.js gắn) — cả hai đều phủ trọn hộp, không tràn mép nào. */
  .hero__picker-panel {
    left: 0;
    right: auto;
    width: calc(200% + 0.5rem);
    max-width: none;
  }

  .hero__picker-panel.is-right {
    left: auto;
    right: 0;
  }

  .hero__search-submit {
    height: 3rem;
    justify-content: center;
  }

  .hero__stats {
    grid-template-columns: repeat(2, 1fr);
    gap: 1rem;
  }

  /* Điện thoại: bỏ nút mũi tên, vuốt là đủ; thu nhỏ vùng đệm hai bên để mỗi
     dải lấy lại gần một ô nội dung. */
  .home-nav__arrow {
    display: none;
  }

  .home-nav__track,
  .home-nav__panel .home-nav__track {
    padding: 0.5rem 0.25rem;
    scroll-snap-type: x mandatory;
  }

  .home-nav__panel .home-nav__track {
    padding: 1rem 0.75rem;
  }

  .home-nav__chip,
  .home-nav__theme {
    scroll-snap-align: start;
  }

  .home-nav__theme {
    min-width: 6.5rem;
  }

  .home-nav__theme-icon {
    width: 2.5rem;
    height: 2.5rem;
  }

  .home-nav__theme-name,
  .home-nav__chip-name {
    font-size: 0.875rem;
  }

  /* Lưới tour ở trang chủ -> băng cuộn ngang.
     Một cột nghĩa là mỗi thẻ rộng hết màn và cao gần trọn màn hình, phải vuốt
     tám lần mới hết một tab. Đây chỉ là khối giới thiệu trên trang chủ (trang
     kết quả là .tl-grid, có bộ lọc và phân trang riêng, không đụng tới), nên
     cuộn ngang vừa cho thấy có nhiều tour vừa không nuốt hết chiều dọc. */
  .tour-grid {
    display: flex;
    gap: 0.875rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    -ms-overflow-style: none;
    /* Tràn ra sát hai mép màn hình nhưng thẻ đầu vẫn thẳng hàng lề nội dung:
       âm đúng bằng padding của .container rồi cộng lại vào trong. Thiếu nó thì
       thẻ kế tiếp bị cắt cụt ngay tại lề, trông như lỗi tràn chứ không ra ý
       "còn nữa, vuốt tiếp". */
    margin-inline: -1.25rem;
    padding-inline: 1.25rem;
    scroll-padding-inline: 1.25rem;
    padding-bottom: 0.25rem;
  }

  .tour-grid::-webkit-scrollbar {
    display: none;
  }

  /* Chừa hé mép thẻ sau để thấy ngay là băng này vuốt được. */
  .tour-grid>.tour-card {
    flex: 0 0 78%;
    scroll-snap-align: start;
  }

  /* Không ghim chiều cao ảnh ở mobile nữa: `.tour-card__img` nay là
     `aspect-ratio: 3/2`, ghim px ở đây là phá lại đúng tỷ lệ vừa khớp với site
     cũ — và ảnh banner lại bị cắt, lần này chỉ trên điện thoại nên còn khó phát
     hiện hơn. */

  /* Bento trên mobile: thẻ đầu chiếm cả bề ngang, 4 thẻ còn lại thành 2 hàng ×
     2 thẻ.

     Không cần đổi markup: patchDestinationTiles() luôn dựng đúng hình
     1 + 2 + 2 (zones[0] là .bento-card--large, rồi hai .bento-col mỗi cái 2 thẻ),
     nên chỉ việc đổi mỗi .bento-col từ 2 hàng dọc thành 2 cột ngang. Bản trước để
     .bento-grid một cột và .bento-col vẫn xếp dọc, thành ra 5 thẻ chồng nhau
     thành một cột dài. */
  .bento-grid {
    grid-template-columns: 1fr;
  }

  .bento-col {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto;
  }

  .bento-card--large {
    grid-column: span 1;
    height: 15rem;
  }

  /* Bốn thẻ nhỏ giờ chỉ rộng nửa màn nên hạ chiều cao theo, không thì mỗi thẻ
     thành một khối vuông cao lêu nghêu. */
  .bento-col .bento-card {
    height: 9.5rem;
  }

  .tours-header-wrapper,
  .destinations-header {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.75rem;
  }

  /* Dải tour trang chủ: "Xem tất cả" trở lại CÙNG HÀNG với tiêu đề, nép phải
     (yêu cầu 28/08/2026). Xếp dọc như luật ngay trên thì nút chiếm trọn một
     dòng ngay trước băng thẻ, đẩy thẻ đầu tiên xuống dưới nếp gấp. */
  .home-rail .tours-header-wrapper {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    flex-wrap: nowrap;
    gap: 0.75rem;
  }

  .home-rail .tours-header-wrapper .section-header__title {
    min-width: 0;
  }

  /* Đầu dải Mice và dải tin (Top Ten News…) canh GIỮA như hai dải tour trên
     (28/09/2026): cùng một nút 42px cạnh tiêu đề một dòng 22px, canh đáy thì
     tiêu đề tụt thấp hơn tâm nút 10px. Không áp cho Cẩm nang du lịch: bên trái
     nó là nhãn nhỏ + tiêu đề, canh giữa là nút leo lên ngang dòng nhãn. */
  .mice__head,
  .news .section-header {
    align-items: center;
  }

  /* Nút "Xem tất cả →" của cả năm khối (xem luật gốc .section-more). */
  .section-more {
    padding: 0.375rem 0.75rem;
    font-size: 0.8125rem;
  }

  .news__grid {
    grid-template-columns: 1fr;
  }

  /* "Vì sao chọn chúng tôi" và "Cẩm nang du lịch" thành băng vuốt ngang, cùng
     kiểu với khối "Báo chí nói về chúng tôi".

     Dùng flex + scroll-snap thay vì bọc thêm markup .hcarousel: ở mobile hai mũi
     tên của .hcarousel vốn đã bị ẩn (xem @media max-width 768px bên dưới), nên
     phần còn lại của carousel đó CHÍNH LÀ băng vuốt này. Bọc markup chỉ để thêm
     hai nút không bao giờ hiện, mà lại phải sửa cả hai patcher đang bám vào
     .trust__grid / .blog__grid.

     Bốn thẻ xếp dọc trước đây làm trang chủ dài thêm gần bốn màn hình. */
  .trust__grid,
  .blog__grid {
    display: flex;
    grid-template-columns: none;
    gap: 1rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* Đệm dọc để bóng của thẻ không bị khung cuộn cắt mất. */
    padding: 0.25rem 0.125rem 0.75rem;
    scrollbar-width: none;
    -ms-overflow-style: none;
  }

  .trust__grid::-webkit-scrollbar,
  .blog__grid::-webkit-scrollbar {
    display: none;
  }

  /* 84% để thẻ kế tiếp hé ra ở mép phải — đó là thứ cho người xem biết còn nội
     dung để vuốt. Đúng con số .press-card đang dùng ở @media 680px, để ba băng
     trên cùng trang lộ ra bằng nhau.

     `flex: 0 0` chứ không để co, nếu không cả bốn thẻ tự nén vừa màn và băng
     không còn gì để cuộn. */
  .trust__card,
  .blog__grid .blog-card {
    flex: 0 0 84%;
    scroll-snap-align: start;
  }

  .section-header__title {
    font-size: 1.125rem;
    font-weight: 800;
    color: var(--primary);
    letter-spacing: 0;
    line-height: 1.2;
  }

  /* Từ ba tab lên bốn (thêm Combo và Mice) là hàng này không còn đủ chỗ trên
     màn điện thoại: mỗi nhãn tự gãy làm hai dòng, "Tour nước / ngoài" đọc như
     hai mục khác nhau. Ép mỗi nhãn một dòng rồi cho cả hàng cuộn ngang khi
     thiếu chỗ — thà phải vuốt còn hơn đọc nhầm.
     Ẩn thanh cuộn: nó nằm đè lên viền bo tròn của viên thuốc. */
  .tours-tabs-pill {
    max-width: 100%;
    overflow-x: auto;
    scrollbar-width: none;
    /* Bốn nhãn vừa khít 390px sau khi bóp đệm; máy hẹp hơn (360px) thì tab cuối
       ló ra một phần — đó chính là dấu hiệu "còn nữa, vuốt đi". */
    padding: 0.1875rem;
  }

  .tours-tabs-pill::-webkit-scrollbar {
    display: none;
  }

  .tours-tab-btn {
    font-size: 0.75rem;
    font-weight: 600;
    padding: 0.4375rem 0.375rem;
    white-space: nowrap;
    /* Nút không được co lại dưới bề rộng chữ, nếu không flex vẫn bóp chúng cho
       vừa hàng và `white-space: nowrap` thành ra cắt cụt chữ. */
    flex: 0 0 auto;
  }

  /* Trừ hero ra: ở khổ này hero là ảnh quảng cáo dán sát header rồi tới hộp tìm
     kiếm, hai dải đệm 2.5rem chỉ chèn thêm hai vệt trắng — mà vì `!important`
     nên chính khối hero bên trên không đè lại được.

     Trừ luôn `.td-section` (12/09/2026). Luật này sinh ra cho các DẢI của trang
     chủ, nhưng nó là một chọn tử THẺ TRẦN kèm `!important`, nên nó với tới mọi
     <section> của mọi trang nạp index.css. Trang tĩnh ghép khối (Giới thiệu,
     Tuyển dụng…) dựng mục nội dung bằng <section class="td-section">, thế là
     `padding: 1.375rem 1.125rem` mà tour-details.css đặt cho thẻ đó bị xoá —
     đo ở khổ 390px: chữ trong bài nằm cách mép đúng 8px, tức dính vào viền
     màn. Trang chi tiết tour không dính vì ở đó `.td-section` là <div>.

     Đây là chữa TRIỆU CHỨNG. Gốc bệnh là chọn tử thẻ trần + `!important`: thẻ
     <section> nào mang lớp tự quản lề cũng sẽ dính lại. Muốn chữa gốc thì phải
     bó luật này vào riêng trang chủ, mà trang chủ lại là trang duy nhất có
     <main> KHÔNG mang lớp nào — cần đặt một lớp mốc cho nó trước đã. */


  /* Dải chip điểm đến là phần ĐUÔI của hộp tìm kiếm, không phải một mục riêng —
     nó được `patchHomeNav` chèn vào đầu `.flash-sale .container` chỉ vì đó là
     khối kế tiếp, chứ không phải vì nó thuộc về "Ưu đãi giờ chót".
     Hệ quả: nó ăn HAI khoảng cộng lại — 2.5rem đệm trên của <section> ở luật
     ngay trên đây, cộng 2rem lề trên của chính `.home-nav` = 72px trắng trơn
     nằm giữa banner và hàng chip. Trên màn 390px đó là gần một phần mười chiều
     cao trang, đúng ngay chỗ khách vừa gõ xong điểm đến và đang tìm bước tiếp.

     Phải `!important` vì luật `section:not(.hero)` bên trên cũng `!important`;
     không có mức đặc hiệu nào thắng được nó.
     `:has(.home-nav)` để chỉ bóp khi dải chip thật sự có mặt — chưa cấu hình
     chip nào thì `patchHomeNav` không chèn gì, lúc đó tấm "Ưu đãi giờ chót" đỏ
     cần nguyên khoảng đệm để không dán vào đáy banner. */
  #flash-sale:has(.home-nav) {
    padding-top: 1rem !important;
  }

  .home-nav {
    margin-top: 0;
    margin-bottom: 1.5rem;
  }

}

.tours-section__cta {
  margin: 1.75rem auto 0;
  text-align: center
}

/* Ba nút "Xem tất cả …", một cho mỗi tab — chỉ nút của tab đang mở được hiện.
   Ẩn bằng `display: none` chứ không bằng `visibility`/opacity: ba nút cùng một
   ô, còn chiếm chỗ là hai nút vô hình vẫn ăn chiều cao và vẫn tab tới được. */
.tours-section__cta [data-tour-cta] {
  display: none;
}

.tours-section__cta [data-tour-cta].is-active {
  /* inline-block, đúng giá trị của .btn--outline — đổi sang flex là padding và
     đường cơ sở của chữ lệch đi so với mọi nút khác cùng kiểu trên trang. */
  display: inline-block;
}

/* ======= RESPONSIVE — SECTION MỚI (flash-sale / hot-deal / press / footer) ======= */
@media (max-width: 1024px) {

  .flash-sale__panel {
    padding: 2rem 1.75rem 2.25rem;
  }

  .flash-card,
  .combo-card,
  .press-card,
  .mice__track>.tour-card,
  .tours-track>.tour-card {
    flex-basis: calc((100% - 1.5rem) / 2);
  }

  /* flex-basis ở trên không tới được băng hai hàng (nó là grid) — bề ngang cột
     phải khai riêng, cùng công thức 2 thẻ/màn. */
  .home-rail--rows-2 .tours-track {
    grid-auto-columns: calc((100% - 1.5rem) / 2);
  }

  .blog__grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (max-width: 680px) {
  .flash-sale {
    background: #f7f8fa;
  }

  .flash-sale__panel {
    padding: 1.5rem 1rem 1.75rem;
    border-radius: 1rem;
    box-shadow: 0 0.75rem 2rem rgba(134, 13, 20, 0.12);
  }

  /* Nút "Xem tour ưu đãi" xuống DƯỚI băng thẻ (yêu cầu 28/08/2026).
   *
   * Trên điện thoại nó là một nút rộng cả màn nằm giữa tiêu đề và băng thẻ:
   * khách phải lướt qua một nút "xem tất cả" trước khi nhìn thấy dù chỉ một ưu
   * đãi nào. Đưa xuống cuối thì nó thành bước tiếp theo tự nhiên sau khi đã vuốt
   * hết mấy thẻ.
   *
   * `display: contents` ở `.flash-sale__head` để tiêu đề và nút trở thành con
   * trực tiếp của `.flash-sale__panel`, nhờ vậy `order` xếp chúng chung một
   * hàng dọc với băng thẻ — mà markup trong index.html không phải đổi. */
  .flash-sale__panel {
    display: flex;
    flex-direction: column;
    padding: 1.5rem 1rem 1.75rem;
  }

  .flash-sale__head {
    display: contents;
  }

  .flash-sale__title-wrap {
    order: 1;
    margin-bottom: 1.25rem;
  }

  .flash-sale__panel .hcarousel {
    order: 2;
  }

  .flash-sale__title-wrap {
    align-items: flex-start;
    gap: 0.625rem;
  }

  .flash-sale__bolt {
    display: inline-flex;
    margin-top: 0.125rem;
  }

  .flash-sale__bolt svg {
    width: 2.5rem;
    height: 2.5rem;
  }

  .flash-sale__subtitle {
    max-width: 18rem;
    font-size: 0.875rem;
  }

  .flash-sale__more {
    order: 3;
    width: 100%;
    justify-content: space-between;
    min-height: 2.75rem;
    margin-top: 1.25rem;
  }

  .flash-card,
  .combo-card,
  .press-card,
  .mice__track>.tour-card,
  .tours-track>.tour-card {
    flex-basis: 84%;
  }

  /* Dưới 680px giữ nguyên hai hàng chứ không gộp về một: gộp lại thì dải nước
     ngoài thành tám lượt vuốt liên tiếp. */
  .home-rail--rows-2 .tours-track {
    grid-auto-columns: 84%;
  }

  /* Banner dải ngang 3.4:1 xếp hai cột trên điện thoại thì cao chưa tới 50px,
     chữ trên ảnh không đọc nổi. Một cột. */
  .rail-banners {
    grid-template-columns: 1fr;
  }

  /* Mosaic bốn cột trên điện thoại thì tấm nhỏ còn chưa tới 80px — bỏ hẳn
     kiểu mosaic, mọi tấm về lưới hai cột như bố cục còn lại. Ảnh mosaic vuông
     hơn nên hai cột vẫn đọc được. */
  .rail-banners--mosaic {
    grid-template-columns: repeat(2, 1fr);
  }

  .rail-banners--mosaic .rail-banner--lead {
    grid-column: span 2;
    grid-row: auto;
  }

  .rail-banners--mosaic .rail-banner--lead img {
    aspect-ratio: 1.74;
  }

  /* .blog__grid không còn luật một cột ở đây: từ 768px xuống nó đã là băng vuốt
     ngang (display:flex), mà grid-template-columns thì vô hiệu trên flex
     container — để lại chỉ khiến người đọc sau tưởng nó còn tác dụng. */

  .flash-sale__title {
    font-size: 1.625rem;
  }

  .hotdeal__title,
  .mice__title {
    font-size: 1.5rem;
  }

  .hcarousel__arrow {
    display: none;
  }
}

/* ======= RESPONSIVE — FOOTER =======
 *
 * Ba mốc, mỗi mốc gỡ một chiều của bố cục desktop:
 *   1200px — khối tổng đài thôi nằm ngang, tiêu đề lên trên bốn số.
 *   1024px — cột thương hiệu chiếm cả hàng, ba cột link xuống hàng dưới.
 *    768px — ba cột link gập thành accordion (xem .footer__col-toggle).
 */
@media (max-width: 1200px) {
  .footer__support {
    flex-direction: column;
    align-items: flex-start;
  }

  .footer__hotlines {
    width: 100%;
  }
}

@media (max-width: 1024px) {

  /* Cột thương hiệu cần chừng 26rem cho dòng địa chỉ và bốn nút liên hệ; dưới
     mốc này chia bốn thì nó hẹp hơn thế. Cho nó cả hàng rồi để ba cột link chia
     đều hàng dưới — vẫn là bốn cột, chỉ xếp thành hai hàng. */
  .footer__grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 2.5rem;
  }

  .footer__col--brand {
    grid-column: 1 / -1;
  }

  .footer__desc {
    padding-right: 0;
    max-width: 34rem;
  }

  .footer__hotlines {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    row-gap: 1.5rem;
  }

  /* Vạch chỉ còn nghĩa giữa hai số cùng hàng; ở cuối hàng thì nó là một nét dọc
     lơ lửng ngoài mép khối. */
  .footer__hotline-item:nth-child(2)::after {
    display: none;
  }
}

@media (max-width: 768px) {

  /* gap: 0 để các cột gập lại xếp sát nhau — đường kẻ dưới mỗi tiêu đề đã là thứ
     tách chúng, thêm khoảng hở 2.5rem nữa thì bốn hàng accordion rời rạc. */
  .footer__grid {
    grid-template-columns: 1fr;
    gap: 0;
  }

  .footer__col--brand {
    margin-bottom: 2.5rem;
  }

  .footer__col h4 {
    display: block;
    width: 100%;
    margin-bottom: 0;
    font-size: 0.9375rem;
  }

  .footer__col h4 label {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 0.875rem 0;
    border-bottom: 0.0625rem solid var(--footer-line);
    cursor: pointer;
  }

  /* Gạch chân hổ phách là chỉ báo hover của desktop; ở đây mỗi tiêu đề đã có
     đường kẻ riêng, để cả hai là hai nét chồng nhau. */
  .footer__col h4::after {
    display: none;
  }

  .footer__col-chevron {
    display: block;
  }

  .footer__col-list {
    max-height: 0;
    margin: 0;
    overflow: hidden;
    transition: max-height 0.4s ease, margin 0.4s ease;
  }

  /* Không dùng `none` vì transition cần một số cụ thể; 31.25rem đủ cho cột dài
     nhất (7 mục). */
  .footer__col-toggle:checked~.footer__col-list {
    max-height: 31.25rem;
    margin: 1rem 0 1.25rem;
  }

  .footer__col-toggle:checked~h4 .footer__col-chevron {
    transform: rotate(180deg);
    color: var(--footer-amber);
  }

  .footer__col-toggle:focus-visible~h4 label {
    outline: 0.125rem solid var(--footer-amber);
    outline-offset: 0.125rem;
  }

  #footer-col-outbound~h4,
  #footer-col-domestic~h4 {
    margin-top: 1.625rem;
    margin-bottom: 0.75rem;
    font-size: 1.25rem;
    font-weight: 800;
    text-transform: none;
    letter-spacing: 0;
  }

  #footer-col-outbound~h4 label,
  #footer-col-domestic~h4 label {
    justify-content: flex-start;
    padding: 0;
    border-bottom: 0;
    cursor: default;
  }

  #footer-col-outbound~h4 .footer__col-chevron,
  #footer-col-domestic~h4 .footer__col-chevron {
    display: none;
  }

  #footer-col-outbound~.footer__col-list,
  #footer-col-domestic~.footer__col-list,
  #footer-col-outbound:checked~.footer__col-list,
  #footer-col-domestic:checked~.footer__col-list {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    gap: 0.75rem 1rem;
    max-height: none;
    margin: 0 0 1.875rem;
    overflow: visible;
  }

  #footer-col-outbound~.footer__col-list li,
  #footer-col-domestic~.footer__col-list li {
    display: contents;
  }

  #footer-col-outbound~.footer__col-list a,
  #footer-col-domestic~.footer__col-list a {
    display: inline-flex;
    font-size: 1rem;
    font-weight: 400;
    line-height: 1.35;
    color: rgba(255, 255, 255, 0.72);
    transform: none;
  }

  #footer-col-outbound~.footer__col-list a::before,
  #footer-col-domestic~.footer__col-list a::before {
    display: none;
  }

  .footer__support {
    gap: 2rem;
    margin: 2.5rem 0 2rem;
    padding: 1.5rem;
    border-radius: 0.75rem;
  }

  .footer__support-icon {
    width: 3rem;
    height: 3rem;
    border-radius: 0.75rem;
  }

  .footer__support-icon svg {
    width: 1.25rem;
    height: 1.25rem;
  }

  .footer__support-title {
    font-size: 1rem;
  }

  .footer__hotlines {
    gap: 1rem 1.5rem;
  }

  .footer__hotline-item::after {
    display: none !important;
  }

  .footer__hotline-label {
    font-size: 0.6875rem;
  }

  .footer__hotline-number {
    font-size: 1.125rem;
  }

  /* Nhãn tin cậy giữ mép trái như mọi thứ phía trên nó (accordion, địa chỉ,
     thanh bản quyền). Bản thiết kế canh giữa dải này, nhưng bốn nhãn dài không
     đều nhau canh giữa trên màn hẹp thì thành bốn dòng thụt ra thụt vào. */
  .footer__badges {
    gap: 0.625rem 1.25rem;
  }
}

@media (max-width: 480px) {
  .footer__logo img {
    height: 2.375rem;
  }

  .footer__logo {
    padding: 0.625rem 0.875rem;
    border-radius: 0.625rem;
  }

  /* Vẫn hai số một hàng như trên tablet, không xuống một cột: bốn số xếp dọc
     kéo khối tổng đài cao gần bằng cả màn hình điện thoại, đẩy dải nhãn tin cậy
     và thanh bản quyền ra khỏi tầm nhìn.
   *
     Chỗ hẹp nhất là điện thoại 20rem: trừ 1.25rem đệm .container mỗi bên và
     1.5rem đệm .footer__support mỗi bên còn 14.5rem, chia hai trừ khe 0.75rem
     là 6.875rem một cột. Số 13 ký tự ở cỡ 1rem chiếm ~6.7rem — vừa khít, nên
     cỡ chữ ở đây là con số đã tính, không phải chọn cho đẹp. */
  .footer__hotlines {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.125rem 0.75rem;
  }

  .footer__hotline-label {
    font-size: 0.625rem;
    letter-spacing: 0.03125rem;
  }

  .footer__hotline-number {
    font-size: 1rem;
  }
}

/* Dưới 20rem (Galaxy Fold gập lại) cỡ 1rem bắt đầu tràn vì `white-space: nowrap`
   không cho số xuống dòng. Hạ thêm một bậc thay vì cho xuống dòng: số điện thoại
   bị ngắt giữa dòng là đọc sai số. */
@media (max-width: 20rem) {
  .footer__hotline-number {
    font-size: 0.875rem;
  }
}

/* Ảnh đại diện của thẻ được bọc trong link chi tiết (xem linkCardTarget trong
   templates.ts). Phải display:block + height:100% vì .flash-card__img và
   .combo-card__img đều lấy chiều cao 100% của .*__media — thẻ <a> inline cao
   auto thì ảnh sập xuống 0. */
.card-media-link {
  display: block;
  height: 100%;
}

.combo-card__title a:hover {
  color: var(--accent);
}

/* ======= THANH LIÊN HỆ NỔI BÊN PHẢI =======
 *
 * HAI nút tròn xếp dọc: Zalo trên, Gọi dưới. Bản trước là MỘT nút bật/tắt bung
 * ra bốn kênh — checkbox ẩn, danh sách trượt, hai bố cục riêng cho desktop và
 * di động. Bỏ hết: giờ chỉ còn hai thẻ <a> thật, bấm là đi, không trạng thái
 * nào để đồng bộ (xem components/public/social-rail.tsx).
 *
 * Không có viên thuốc bọc ngoài như bản thiết kế: nút lên-đầu-trang là phần tử
 * riêng nằm ngoài component này, nên có hộp thì cụm thành một cái trong hộp hai
 * cái ngoài hộp. Bỏ hộp đi thì cả cột là những hình tròn rời cùng cỡ — mỗi nút
 * tự có nền đặc và bóng nên vẫn đọc được khi đè lên ảnh hero.
 */
.social-rail {
  position: fixed;
  /* Nút Gọi sát đáy; Zalo, ô chat và lên-đầu-trang xếp lên trên nó. Mốc này ăn
     khớp với `bottom` của .back-to-top và của ô chat Subiz — cả ba tính từ cùng
     bộ biến `--float-rail-*`, nên sửa một chỗ là phải xem lại cả ba. */
  bottom: calc(var(--float-rail-base) + var(--float-rail-lift, 0px));
  right: 0.75rem;
  /* Dưới header dính (z-index 1000) nhưng trên nội dung thường. */
  z-index: 900;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--float-rail-gap);
}

/* Cùng --float-rail-size và cùng cột với .back-to-top: ba nút nổi là một cụm,
   lệch cỡ là mắt đọc thành ba thứ không liên quan. */
.social-rail__btn {
  display: grid;
  place-items: center;
  width: var(--float-rail-size);
  height: var(--float-rail-size);
  border-radius: var(--radius-full);
  color: #fff;
  box-shadow: var(--shadow-md);
  cursor: pointer;
  transition: var(--transition);
}

.social-rail__btn svg {
  width: 1.375rem;
  height: 1.375rem;
}

.social-rail__btn:hover {
  transform: translateY(-0.1875rem);
}

.social-rail__btn:focus-visible {
  outline: 0.125rem solid var(--primary);
  outline-offset: 0.125rem;
}

/* Xanh Zalo (#0068FF) chứ không phải navy của site: nút này dẫn ra một ứng dụng
   khác, và người Việt nhận ra Zalo bằng đúng màu đó trước khi kịp đọc chữ. Để
   navy thì nó chìm vào nút Gọi ngay dưới, thành hai vòng tròn giống hệt nhau
   khác mỗi ruột. */
.social-rail__btn--zalo {
  background: #0068ff;
}

.social-rail__btn--zalo:hover {
  background: #0055d4;
}

/* Logo Zalo là logo chữ — xem chú thích trong social-rail.tsx. */
.social-rail__text {
  font-size: 0.75rem;
  font-weight: 800;
  letter-spacing: -0.025rem;
}

.social-rail__btn--call {
  background: var(--primary);
}

.social-rail__btn--call:hover {
  background: var(--accent);
}

/* Trên di động thanh này VẪN HIỆN, và .back-to-top vẫn xếp cặp với nó ở mép
   phải — không còn `display: none` như bản trước.
 *
 * Lý do bản trước ẩn nó là sợ đè lên thanh CTA dính đáy (.td-bookbar,
 * .bt-mobilebar). Nhưng cả cụm neo ở `top: 50%`, tức giữa màn hình, còn thanh
 * CTA nằm sát đáy: lúc bung hết bốn nút cụm cao thêm ~14rem tính từ giữa, vẫn
 * hụt so với mép dưới trên mọi màn cao từ 36rem. Không có chỗ nào chồng nhau.
 *
 * Mép phải là của CẢ BA nút nổi, kể cả ô chat Subiz — nó được kéo về đúng cột
 * này bằng SUBIZ_RAIL_ON_MOBILE trong app/layout.tsx. Sửa vị trí cột ở đây thì
 * xem lại cả đoạn đó. */


/* Trên màn hẹp, cột nút nổi cần thoáng hơn: ngón tay to hơn con trỏ chuột, và
   đáy màn còn có thanh cố định của trang danh sách tour / trang đặt tour.
 *
 * Thứ tự từ dưới lên đúng như bản mobile của travel.com.vn: nút gọi sát đáy, ô
 * chat ở giữa, nút lên-đầu-trang trên cùng — nên KHÔNG còn đảo thứ tự riêng cho
 * di động như bản trước (nút gọi ở trên, lên-đầu-trang ở dưới). Cả ba khoảng
 * cách đáy đều tính từ cùng bộ biến nên chèn ô chat vào giữa không phải sửa gì
 * ở đây. */
@media (max-width: 768px) {
  :root {
    --float-rail-base: 3.25rem;
    --float-rail-gap: 1rem;
  }
}


/* ===========================================================================
   iOS Safari: font ô nhập ≥ 16px trên di động để trang không tự phóng to.

   Safari trên iPhone phóng to cả trang khi con trỏ vào một ô nhập có
   `font-size` dưới 16px, rồi KHÔNG thu lại sau khi rời ô — khách gõ xong là
   mắc kẹt trong bản phóng to, phải tự chụm hai ngón mới về được. Đây là hành vi
   cố định của hệ điều hành, không tắt được bằng thuộc tính nào của ô nhập.

   Cách chữa duy nhất không gây hại là nâng cỡ chữ. Cách còn lại — thêm
   `maximum-scale=1` vào thẻ viewport — chặn luôn cả thao tác chụm-để-phóng của
   người dùng trên toàn trang, tức lấy khả năng đọc của người mắt kém ra đổi.

   Ba trang tour đã có khối tương đương trong CSS riêng của chúng
   (tour-list.css, tour-details.css, book-tour.css); đây là phần còn thiếu:
   thanh tìm kiếm đầu trang chủ, lớp phủ tìm kiếm và ô chọn nơi khởi hành trên
   thanh trên cùng — cả ba đều xuất hiện ở MỌI trang công khai qua index.css.

   Đặt cuối file để thắng khối `@media (max-width: 768px)` phía trên đang đặt
   `.top-bar__depart select` ở 0.8125rem: hai quy tắc cùng độ đặc hiệu thì quy
   tắc đứng sau thắng.
   ======================================================================== */
@media (max-width: 640px) {

  .hero__search-field input,
  .hero__search-field select,
  .search-overlay__form input,
  .top-bar__depart select {
    font-size: 1rem;
  }
}

/* ===== Popup chào khách ===== */
/* Dựng sẵn ở máy chủ nhưng mang `hidden`; index.js mới quyết định có mở không —
   khách đã đóng thì trong `cookie_hours` giờ tiếp theo không thấy lại. */
.site-popup[hidden] {
  display: none;
}

.site-popup {
  position: fixed;
  inset: 0;
  z-index: 1200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.25rem;
}

.site-popup__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(10, 22, 51, 0.6);
}

.site-popup__panel {
  position: relative;
  width: min(34rem, 100%);
  max-height: 90vh;
  overflow-y: auto;
  padding: 2rem 1.75rem 1.75rem;
  border-radius: var(--radius-lg);
  background: #fff;
  color: var(--text-main);
  box-shadow: var(--shadow-hover);
}

.site-popup__close {
  position: absolute;
  top: 0.5rem;
  right: 0.75rem;
  width: 2rem;
  height: 2rem;
  border: 0;
  border-radius: var(--radius-full);
  background: transparent;
  color: var(--text-muted, #64748b);
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
}

.site-popup__close:hover {
  background: var(--gold-light);
  color: var(--text-main);
}

.site-popup__title {
  margin: 0 0 0.75rem;
  font-size: 1.25rem;
  font-weight: 800;
}

.site-popup__image {
  display: block;
  width: 100%;
  height: auto;
  border-radius: var(--radius-md, 0.75rem);
}

.site-popup__body {
  margin-top: 0.875rem;
  font-size: 0.9375rem;
  line-height: 1.6;
}

.site-popup__link {
  display: block;
  color: inherit;
}

/* ======= CÂU HỎI THƯỜNG GẶP =======
 *
 * Dùng chung cho zone, chi tiết tour và chi tiết bài viết — `faqSectionHtml`
 * trong lib/public/templates.ts dựng đúng một bộ thẻ cho cả ba.
 *
 * Để ở index.css chứ không tour-details.css vì khối này còn xuất hiện trên các
 * trang dựng từ tours.html (chuyên mục tin, trang thẻ) — những trang KHÔNG nạp
 * tour-details.css. index.css là file duy nhất trang công khai nào cũng có.
 *
 * `<details>` mở/đóng bằng chính HTML, không có JS nào ở đây cả: bản trước ghi
 * style thẳng vào thẻ và trỏ vào --gray-200 / --navy-900 / --gray-700 — ba biến
 * không tồn tại trong bộ này, nên viền biến mất và chữ mất màu.
 */
.td-faqs__list {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-top: 1.5rem;
}

.td-faq-item {
  border: 0.0625rem solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-surface);
  overflow: hidden;
}

.td-faq-item[open] {
  border-color: var(--primary-light);
  box-shadow: var(--shadow-md);
}

.td-faq-item__q {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.875rem 1.125rem;
  cursor: pointer;
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.45;
  color: var(--primary);
  /* Bỏ tam giác mặc định: `list-style` lo Firefox, `::-webkit-details-marker`
     lo Safari — thiếu vế thứ hai là Safari hiện cả tam giác lẫn mũi chevron. */
  list-style: none;
}

.td-faq-item__q::-webkit-details-marker {
  display: none;
}

.td-faq-item__text {
  flex: 1;
  min-width: 0;
}

.td-faq-item__chevron {
  flex: none;
  transition: transform 0.2s ease;
}

.td-faq-item[open] .td-faq-item__chevron {
  transform: rotate(180deg);
}

.td-faq-item__a {
  padding: 0 1.125rem 1rem;
  color: var(--text-main);
  font-size: 0.9375rem;
  line-height: 1.7;
  /* Biên tập viên gõ câu trả lời trong ô textarea thuần: xuống dòng của họ là
     ký tự \A thật, không phải thẻ <br>. Không giữ khoảng trắng thì cả đoạn dồn
     thành một dòng liền. */
  white-space: pre-wrap;
}

/* ======= BANNER CỘT PHẢI BÀI VIẾT =======
 *
 * Vị trí `news-detail-aside` trong /admin/banners, chen giữa "Tin mới nhất" và
 * "Tin xem nhiều nhất". Đặt ở index.css vì cùng lý do với `.nl-widget` ngay
 * trên: trang chi tiết bài viết chỉ nạp index.css + tour-details.css, để trong
 * zone-layouts.css là mất sạch kiểu.
 *
 * Không có tiêu đề khối. Đây là banner của chính công ty, không phải quảng cáo
 * bên thứ ba, nên không cần nhãn "Quảng cáo"; mà thêm một dòng tiêu đề nữa vào
 * cột đã có hai khối cùng cỡ chữ thì banner đọc ra như khối gợi ý thứ ba. */
.nl-banner {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.nl-banner__item {
  display: block;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--bg-subtle);
  box-shadow: var(--shadow-sm);
  transition: var(--transition);
}

a.nl-banner__item:hover {
  transform: translateY(-0.125rem);
  box-shadow: var(--shadow-md);
}

/* `auto 4 / 3` chứ không phải `4 / 3` trần, và cũng không phải `height: auto`.
 *
 * Bỏ trống chiều cao là ô co về 0 trước khi ảnh tải xong rồi bung ra đẩy cả cột
 * xuống — đúng lỗi đã đo ở banner dải ngang trang chủ (592x0 ở khổ 1440px).
 * Nhưng ép cứng một tỉ lệ như `.rail-banner` thì ở đây lại sai: dải ngang có
 * sẵn bộ banner đúng khổ 1988x584 để bám theo, còn vị trí này mới mở, biên tập
 * tải lên tấm nào là tấm ấy — cắt hai mép một tấm có chữ là hỏng nội dung.
 *
 * `auto 4 / 3` lấy 4:3 để GIỮ CHỖ khi trình duyệt chưa biết khổ ảnh, rồi nhường
 * cho tỉ lệ thật ngay khi ảnh về. Nên khổ đề nghị là 800x600: đúng khổ đó thì
 * không xê dịch một pixel nào. */
.nl-banner__item img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: auto 4 / 3;
  object-fit: cover;
}

/* ======= LỀ NGANG TRÊN ĐIỆN THOẠI: MỌI TRANG THEO TRANG CHI TIẾT TOUR =======

   Trang chi tiết tour từ trước đã kéo thẻ nội dung ra ngoài lề của `.container`
   (`@media (max-width: 720px) { .td-section { margin-left/right: -0.75rem } }`
   trong tour-details.css), nên mép thẻ nằm ở 8px thay vì 20px. Các trang còn
   lại thì không — đo 09/09/2026 ở khổ 390px: chi tiết tour 8px, còn /tours,
   chuyên mục, đặt tour, thị thực và tin tức đều 20px. Đi từ danh sách vào chi
   tiết là khối nội dung nhảy ngang 12px, đọc ra như hai trang của hai site.

   Kéo THẺ chứ không nới `.container`: nới container thì tiêu đề trang và chữ
   chạy thẳng trong container cũng dạt ra 8px — sát mép quá để đọc. Giữ nguyên
   20px cho chữ, chỉ thẻ nội dung mới bám ra, đúng như chi tiết tour đang làm.

   Kéo VỎ LƯỚI (`.tl-grid`, `.nl-list`) thay vì từng thẻ con: lưới còn chạy hai
   cột ở khoảng 600–720px, kéo từng thẻ ở đó là hai cột chồng lên nhau. Vỏ lưới
   nở ra 24px thì mọi cột bên trong tự rộng theo, đúng ở cả một lẫn hai cột.

   Đặt ở index.css vì luật này bắc qua bốn khuôn trang khác nhau (tour-list,
   book-tour, visa, news) — mỗi khuôn nạp một tệp CSS riêng, để trong tệp nào
   cũng chỉ đúng một phần. Chọn tử không khớp gì trên trang đang mở thì vô hại. */