/* ==========================================================================
   BẢNG MÀU — sửa ở ĐÂY là đổi màu toàn bộ giao diện 2.
   Đang dùng: BẢNG 1 "Trung tính ngả hồng + đỏ logo".
   Màu nhấn #D81212 KHÔNG phải tự chọn — đó là mã đỏ lấy thẳng từ file logo
   (uploads/logo-lovekiss.png, chiếm 61,8% số điểm ảnh đỏ). Neo vào logo chứ
   không neo vào banner: logo là tài sản vĩnh viễn, banner thay theo từng đợt.
   Nền ngả hồng (không ngả vàng) để cùng nhiệt độ màu với ảnh banner hồng —
   trước đây nền kem ấm + ảnh hồng lạnh là lý do hai phần trông đá nhau.
   Toàn bộ mã màu trong main.css, menu-mobile.css, style.css đã quy về các biến
   dưới đây, không còn hex rời rạc. Muốn thử bảng khác thì chỉ đổi 15 dòng này.
   ========================================================================== */
:root {
  --aw-nen:        #FBF7F6;  /* nền trang - trung tính ngả hồng */
  --aw-nen-2:      #F5EDEC;  /* nền chìm: ô tìm kiếm, ảnh trống, khối xen kẽ */
  --aw-the:        #FFFFFF;  /* mặt thẻ sản phẩm */
  --aw-chu:        #1F1A1A;  /* chữ chính (đen ngả hồng, KHÔNG dùng #000) */
  --aw-chu-2:      #382F2F;  /* chữ chính nhạt hơn 1 bậc */
  --aw-chu-phu:    #7A6F6F;  /* chữ phụ, meta */
  --aw-ke:         #EDE3E2;  /* đường kẻ 1px */
  --aw-ke-dam:     #CFC0BF;  /* kẻ đậm, icon mờ */
  --aw-nhan:       #D81212;  /* ĐỎ LOGO - chỉ ~10% diện tích */
  --aw-nhan-dam:   #AE0E0E;  /* nhấn khi di chuột */
  --aw-nhan-sang:  #F2696A;  /* nhấn dùng TRÊN NỀN TỐI (chân trang, menu trượt) */
  --aw-nhan-nhat:  #FBE9E9;  /* nền chọn/hover rất nhạt */
  --aw-nhan-vien:  #F2CFCF;  /* viền nhấn */
  --aw-giam:       #A81B22;  /* giá giảm - đỏ TRẦM HƠN đỏ logo một bậc, để nhãn
                                "giảm 30%" không nuốt mất nhận diện thương hiệu */
  --aw-giam-dam:   #85141A;

  /* Màu CHỮ đặt trên nền màu. Ở bảng nền sáng thì trắng; ở bảng NỀN TỐI màu nhấn là
     màu SÁNG nên chữ trên nó phải TỐI — không có hai biến này thì mọi bảng nền tối
     đều bị ép phải dìm màu nhấn xuống cho đủ tương phản với chữ trắng, và mất hết
     chất "ánh kim trên nền tối". */
  --aw-tren-nhan:  #FFFFFF;   /* trên nút màu nhấn và nhãn giảm giá */
  --aw-tren-chu:   #FFFFFF;   /* trên chân trang / nút dùng --aw-chu làm nền */
  --aw-tren-anh:   #FFFFFF;   /* trên LỚP PHỦ ĐEN đè lên ảnh — luôn sáng ở MỌI bảng màu,
                                 kể cả bảng nền tối, vì lớp phủ là rgba(0,0,0,.x) cố định
                                 chứ không phải một biến nền. Dùng --aw-tren-chu ở đây là
                                 sai: bảng nền tối có --aw-chu SÁNG nên --aw-tren-chu TỐI,
                                 thành chữ tối trên lớp phủ đen. */

  /* ---- CHỮ ----------------------------------------------------------------
     Đổi 2 dòng này là đổi font toàn bộ giao diện. Tách tiêu đề khỏi nội dung vì
     cảm giác "sang" đến từ tiêu đề CÓ CHÂN đặt trên nội dung KHÔNG CHÂN; đổi cả
     hai cùng lúc thường chỉ ra "khác", không ra "đẹp hơn".
     Mặc định tiêu đề ăn theo nội dung -> chưa đổi gì thì trang y hệt như cũ.

     HAI ĐIỀU PHẢI KIỂM TRƯỚC KHI ĐƯA MỘT FONT VÀO DANH SÁCH:
     1. Đủ dấu tiếng Việt. Rất nhiều font phổ biến KHÔNG có. Poppins đã kiểm:
        thiếu ộ ắ ể ứ ư — nhìn chữ thường không phát hiện ra, phải đọc bảng mã.
     2. Có ký tự ₫ (U+20AB). Đây là bẫy RIÊNG, tách khỏi mục 1: Lora có đủ chữ
        Việt nhưng KHÔNG có ₫ — lấy làm font nội dung là giá tiền vỡ ngay.
        (Roboto đang dùng: đã kiểm cả hai, đủ.)

     Ba bộ KHÔNG cần tải gì, dán vào là chạy:
       hệ thống : system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif
       có chân  : Georgia, "Times New Roman", serif
       máy chữ  : ui-monospace, "Cascadia Mono", Consolas, monospace
     Muốn font riêng (Be Vietnam Pro, Inter, Merriweather…) thì phải tải về, cắt
     còn Latin + chữ Việt, thêm @font-face — xem mục TỐI ƯU TÀI NGUYÊN ở AGENTS.md. */
  --aw-font-than:    "Roboto", system-ui, -apple-system, "Segoe UI", Arial, sans-serif;
  --aw-font-tieu-de: var(--aw-font-than);
}

/* ===========================================================================
   GIAO DIỆN 2 — LỚP ĐÈ.
   Phần nhìn thấy được lấy nguyên từ bộ CSS gốc trong assets/gd3/ (bootstrap,
   swiper, main.css, swiper-custom). File này chỉ làm ba việc:
     1. Cho băng chuyền chạy KHÔNG CẦN Swiper JS.
     2. Vá mấy chỗ Autoweb có mà bản gốc không có (ảnh trống, thanh xem thử,
        menu trượt, thanh đáy điện thoại).
     3. Sửa vài chỗ bản gốc dựa vào JS để đặt kích thước.
   Nạp SAU CÙNG nên đè được main.css mà không phải sửa một dòng nào của họ —
   giữ nguyên file gốc thì sau này họ sửa giao diện, chép đè lại là xong.
   =========================================================================== */

/* ---------------------------------------------------------------- băng chuyền
   Swiper thật đặt width/margin cho từng .swiper-slide bằng JS. Không có JS thì
   mọi slide rộng 100% và .swiper{overflow:hidden} cắt mất phần còn lại — nhìn
   như chỉ có đúng một sản phẩm. Ba dòng dưới biến nó thành dải cuộn ngang thật. */
/* KHE GIỮA CÁC THẺ ĐI QUA ĐÚNG MỘT BIẾN — đừng gõ lại con số ở nơi khác.
   Bề ngang mỗi thẻ = (100% − tổng các khe) / số thẻ, nên hai chỗ đó PHẢI cùng một số.
   Trước 22/09/2026 cả sáu dòng đều ghi cứng 20px; tôi hạ `gap` xuống 14px ở khổ điện thoại
   mà quên phần `calc`, thế là thẻ vẫn tính theo 20 → thừa 6px, lề phải 19px trong khi lề
   trái 13px. Lệch kiểu này mắt thấy ngay mà đọc CSS thì không, vì hai dòng cách nhau 430 dòng. */
.wrap-swiper { --gd3-khe: 20px; }
.wrap-swiper .swiper { overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; }
.wrap-swiper .swiper-wrapper { transform: none !important; gap: var(--gd3-khe); }
.wrap-swiper .swiper-slide { scroll-snap-align: start; height: auto; width: calc((100% - var(--gd3-khe)) / 2); }
@media (min-width: 768px)  { .wrap-swiper .swiper-slide { width: calc((100% - 2 * var(--gd3-khe)) / 3); } }
@media (min-width: 992px)  { .wrap-swiper .swiper-slide { width: calc((100% - 3 * var(--gd3-khe)) / 4); } }
@media (min-width: 1200px) { .wrap-swiper .swiper-slide { width: calc((100% - 4 * var(--gd3-khe)) / 5); } }
/* Nút mũi tên: giữ nguyên kiểu dáng của swiper-custom.css (38x70, nền trắng mờ, ::after rỗng
   nên hiện icon FontAwesome bên trong), chỉ chạy bằng JS của mình ở cuối layout.php.
   .swiper-button-lock là class có sẵn của Swiper (display:none) — JS gắn vào khi dải không tràn,
   khỏi bày hai nút bấm không ăn gì. */
.wrap-swiper .swiper-button-prev, .wrap-swiper .swiper-button-next { border: 0; padding: 0; }
/* swiper-custom.css đẩy nút ra -38px ở màn ≥992px, mà .block-products lại overflow:hidden nên
   nút bị cắt mất. Kéo vào trong mép dải. */
@media (min-width: 992px) {
  .block-products .wrap-swiper .swiper-button-prev { left: 4px; }
  .block-products .wrap-swiper .swiper-button-next { right: 4px; }
}
/* Dưới 992px thì GIẤU HẲN hai nút: trên điện thoại vuốt ngón tay là xong, không cần nút.
   Bản gốc để nút ở -15px và bị .block-products{overflow:hidden} cắt mất — nhìn thì giống nhau,
   nhưng nút vô hình mà vẫn bấm được bằng phím Tab là cái bẫy cho người dùng bàn phím. */
@media (max-width: 991.98px) {
  .block-products .wrap-swiper .swiper-button-prev,
  .block-products .wrap-swiper .swiper-button-next { display: none; }
}
/* Dải danh mục ở điện thoại: ô nhỏ hơn thẻ sản phẩm. */
.category-products-mb .swiper-slide { width: 104px; }

/* Giấu hẳn thanh cuộn ngang: đã có nút ◀ ▶ và vẫn vuốt/lăn chuột được, thanh cuộn chỉ làm
   xấu dải sản phẩm. Vẫn giữ overflow-x:auto nên bàn phím và cảm ứng không mất đường cuộn. */
.wrap-swiper .swiper { scrollbar-width: none; -ms-overflow-style: none; }
.wrap-swiper .swiper::-webkit-scrollbar { display: none; height: 0; }

/* ---------------------------------------------------------------- vá chỗ thiếu */
.gd3-ten-site { font-weight: 800; font-size: 20px; color: var(--aw-chu); white-space: nowrap; }
#logo-head { height: 46px; width: auto; }

.gd3-khong-anh { display: grid; place-items: center; width: 100%; aspect-ratio: 1 / 1; background: var(--aw-nen); color: var(--aw-ke-dam); font-size: 26px; }

.gd3-loi { background: #fdeaea; border: 1px solid #f3c4c6; color: #b42318; border-radius: 10px; padding: 12px 14px; }

/* Nhãn "đã bán" tái dùng ô badge của bản gốc. */
.gd3-card-badge b { font-weight: 700; }
.product-item .sale.gd3-het { background-image: linear-gradient(to right, var(--aw-chu-phu), var(--aw-chu-2)); }

/* Nút ba gạch: bản gốc là <a>, ở đây là <button> nên phải gỡ nền mặc định. */
.icon-menu-mobile { background: transparent; border: 0; padding: 0; display: inline-flex; flex-direction: column; gap: 4px; }

/* ---------------------------------------------------------------- menu trượt */
.gd3-menu-truot { position: fixed; inset: 0 auto 0 0; width: 280px; max-width: 86vw; background: var(--aw-chu); color: var(--aw-nen-2);
  z-index: 1100; transform: translateX(-100%); transition: transform .22s ease; overflow-y: auto; }
body.gd3-menu-mo .gd3-menu-truot { transform: none; }
.gd3-menu-truot a { display: block; padding: 12px 16px; color: var(--aw-nen-2); text-decoration: none; border-bottom: 1px solid rgba(255,255,255,.08); }
.gd3-menu-truot a:hover { background: rgba(255,255,255,.08); color: var(--aw-nhan-sang); }
.gd3-menu-truot-dau { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; background: var(--aw-nhan-sang); color: var(--aw-chu); }
.gd3-menu-truot-dau button { background: transparent; border: 0; font-size: 26px; line-height: 1; color: var(--aw-chu); cursor: pointer; }
.gd3-menu-mask { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 1090; }

/* ---------------------------------------------------------------- chân trang */
.gd3-chan { background: var(--aw-chu); color: var(--aw-ke-dam); }
.gd3-chan a { color: var(--aw-ke-dam); text-decoration: none; }
.gd3-chan a:hover { color: var(--aw-nhan-sang); }
.gd3-chan p { margin: 0 0 6px; font-size: 13.5px; line-height: 1.55; }
.gd3-chan i { width: 16px; color: var(--aw-nhan-sang); }
.gd3-chan-tit { color: var(--aw-nhan-sang); font-weight: 800; margin-bottom: 12px; font-size: 15px; }

/* Chân trang là thẻ <footer>, nên luật `section .container { max-width: unset }` của bộ CSS gốc
   KHÔNG với tới nó. Hệ quả: ở 1366px mọi khối bên trên rộng 1351px còn chân trang co lại 1140px,
   để hở hai lề trắng 113px mỗi bên — nhìn như chân trang thuộc về một trang khác.
   Cho nó fluid y hệt phần còn lại thay vì chép max-width cứng: màn nào cũng thẳng hàng. */
.gd3-chan .container { max-width: unset; }

.gd3-chan-luoi { padding: 34px 0 26px; row-gap: 26px; }
/* Tiêu đề cột: gạch chân ngắn để bốn cột nhìn ra ngay là bốn khối ngang hàng. */
.gd3-chan-tit::after { content: ''; display: block; width: 34px; height: 2px;
  background: var(--aw-nhan); margin-top: 7px; border-radius: 2px; }
/* Cột danh mục chia đôi: `columns` chứ không phải grid, vì số mục thay đổi theo dữ liệu —
   grid phải biết trước số hàng, còn columns thì tự rải. */
.gd3-chan-doi { columns: 2; column-gap: 20px; }
.gd3-chan-doi p { break-inside: avoid; }
.gd3-chan-th { margin-bottom: 12px; }
.gd3-chan-th img { height: 40px; width: auto; }
.gd3-chan-slogan { color: var(--aw-nen-2); opacity: .9; margin-bottom: 8px !important; font-weight: 600; }
.gd3-chan-gioi { opacity: .72; margin-bottom: 12px !important; }
.gd3-chan-luoi p { margin-bottom: 7px; }
.gd3-chan-hotline { font-weight: 800; color: var(--aw-nhan-sang) !important; font-size: 15px; letter-spacing: .3px; }
.gd3-chan-them { color: var(--aw-nhan-sang) !important; font-weight: 700; }
.gd3-chan-bct a { color: var(--aw-nhan-sang); }

/* Dãy icon mạng xã hội: hình tròn viền mờ, sáng lên khi rê. Không dùng ảnh logo của từng
   mạng — một tệp icon chữ đã nạp sẵn thì không có lý do tải thêm 6 tấm PNG. */
/* Hàng "Kết nối với chúng tôi": ô vuông bo góc mang ĐÚNG màu nền của từng mạng (màu đặt
   inline trong layout.php), biểu tượng trắng. 38px: đủ to cho ngón tay, 4 ô vừa nửa cột ở 375px. */
.gd3-chan-tit-xh { margin-top: 18px; }
.gd3-chan-xh { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.gd3-chan-xh a { width: 38px; height: 38px; border-radius: 9px; display: grid; place-items: center;
  color: #fff; text-decoration: none; box-shadow: 0 1px 2px rgba(0,0,0,.25);
  transition: transform .15s, filter .15s; }
@media (hover: hover) { .gd3-chan-xh a:hover { transform: translateY(-2px); filter: brightness(1.08); } }
.gd3-chan-xh i { width: auto; margin: 0; font-size: 19px; color: #fff; }
.gd3-chan-xh svg { width: 32px; height: 32px; display: block; }
/* 375px: nửa cột rộng 164px — 4 ô 36px + 3 khe 6px = 162, bốn kênh vẫn nằm MỘT hàng. */
@media (max-width: 575px) {
  .gd3-chan-xh { gap: 6px; }
  .gd3-chan-xh a { width: 36px; height: 36px; }
  .gd3-chan-xh svg { width: 30px; height: 30px; }
}

.gd3-chan-copy { border-top: 1px solid var(--aw-chu-2); padding: 12px 0; font-size: 12.5px; color: var(--aw-ke-dam); }
.gd3-chan-copy-hang { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 20px; }
/* Hàng pháp lý & giới thiệu — nằm ngay trên dòng bản quyền.
   Tách các mục bằng KHOẢNG CÁCH, không bằng dấu chấm giữa: đã thử `a + a::before { content:"·" }`
   và ở 375px dòng này xuống hai hàng, hàng dưới mở đầu bằng một dấu chấm lạc lõng — dấu ngăn
   dính vào mục sau thì cứ xuống dòng là lòi ra. Khoảng cách thì rộng hẹp nào cũng đúng. */
.gd3-chan-phaply { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 22px; padding-bottom: 10px; }
.gd3-chan-phaply a { color: var(--aw-ke-dam); text-decoration: none; }
.gd3-chan-phaply a:hover { color: var(--aw-nhan-sang); text-decoration: underline; }
@media (max-width: 767px) { .gd3-chan-phaply { justify-content: center; gap: 6px 16px; } }
.gd3-chan-tt { display: inline-flex; align-items: center; gap: 6px; margin-right: 16px; }

@media (max-width: 991px) {
  .gd3-chan-copy-hang { justify-content: center; text-align: center; }
  .gd3-chan-doi { columns: 2; }
}

/* ---------------------------------------------------------------- thước đo màn hình (chỉ admin)
   Mép trái, giữa màn hình: chỗ duy nhất không đụng nút "lên đầu trang" (phải-dưới), thanh đáy
   điện thoại (dưới) và nút chat nổi. z-index trên cả lớp phủ menu (4) và header (1000). */
.gd3-thuoc { position: fixed; left: 0; top: 50%; transform: translateY(-50%); z-index: 1300;
  display: flex; flex-direction: column; align-items: stretch;
  background: rgba(17,17,17,.88); color: #fff;
  border: 1px solid rgba(255,255,255,.18); border-left: 0; border-radius: 0 8px 8px 0;
  font: 500 11.5px/1 ui-monospace, SFMono-Regular, Menlo, monospace; overflow: hidden;
  backdrop-filter: blur(3px); }
/* writing-mode dựng chữ theo cột; rotate(180deg) lật lại để đọc từ DƯỚI LÊN thay vì trên xuống. */
.gd3-thuoc-so { writing-mode: vertical-rl; transform: rotate(180deg);
  padding: 12px 6px; white-space: nowrap; letter-spacing: .4px; }
.gd3-thuoc-so b { font-size: 12.5px; font-weight: 700; }
.gd3-thuoc-so span { opacity: .6; }
.gd3-thuoc-chep { border: 0; background: rgba(255,255,255,.1); color: #fff; height: 26px; cursor: pointer;
  display: grid; place-items: center; font-size: 12px; transition: background .15s; }
/* Nút trên tách khỏi dãy số bằng kẻ dưới, nút dưới bằng kẻ trên — hai nút không dính vào nhau
   khi thanh ngắn (màn hình hẹp, chữ ít). */
.gd3-thuoc-chep:first-child { border-bottom: 1px solid rgba(255,255,255,.18); }
.gd3-thuoc-chep:last-child  { border-top: 1px solid rgba(255,255,255,.18); }
.gd3-thuoc-chep:hover { background: var(--aw-nhan); color: #111; }
/* Dãy số giờ là NÚT (bấm mở bảng): bỏ kiểu nút mặc định, giữ nguyên dáng chữ dọc. */
button.gd3-thuoc-so { border: 0; background: none; color: inherit; font: inherit; cursor: pointer; text-align: left; }
button.gd3-thuoc-so:hover, button.gd3-thuoc-so[aria-expanded="true"] { background: rgba(255,255,255,.1); }
.gd3-thuoc-so .gd3-thuoc-gach { opacity: .5; }
.gd3-thuoc.cham .gd3-thuoc-so b { color: #ff8a8a; }

/* Bảng đầy đủ: mở cạnh thanh, giữa màn hình; hẹp thì co theo khung nhìn. */
.gd3-thuoc-bang { position: fixed; left: 34px; top: 50%; transform: translateY(-50%); z-index: 1301;
  width: min(330px, calc(100vw - 44px)); max-height: 82vh; overflow: auto;
  background: rgba(17,17,17,.95); color: #fff; border: 1px solid rgba(255,255,255,.18); border-radius: 10px;
  box-shadow: 0 10px 30px rgba(0,0,0,.35); padding: 10px 12px 12px;
  font: 400 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; }
.gd3-thuoc-bang[hidden] { display: none; }
.gd3-tb-dau { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 2px; }
.gd3-tb-dau b { font-size: 12.5px; }
.gd3-tb-x { border: 0; background: none; color: #fff; opacity: .7; cursor: pointer; width: 26px; height: 26px; border-radius: 6px; }
.gd3-tb-x:hover { opacity: 1; background: rgba(255,255,255,.12); }
.gd3-tb-nhom { margin: 9px 0 3px; font-size: 10.5px; letter-spacing: .6px; text-transform: uppercase; opacity: .55; }
#gd3ThuocNoiDung > div:not(.gd3-tb-nhom) { display: flex; justify-content: space-between; gap: 14px; padding: 2px 0;
  border-bottom: 1px dashed rgba(255,255,255,.08); }
#gd3ThuocNoiDung > div:not(.gd3-tb-nhom) span:first-child { opacity: .75; white-space: nowrap; }
#gd3ThuocNoiDung > div:not(.gd3-tb-nhom) span:last-child { font-weight: 700; text-align: right; word-break: break-all; }
.gd3-tb-chan { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.gd3-tb-chan button, .gd3-tb-chan a { border: 1px solid rgba(255,255,255,.25); background: rgba(255,255,255,.08); color: #fff;
  border-radius: 6px; padding: 5px 9px; font: inherit; text-decoration: none; cursor: pointer; }
.gd3-tb-chan button:hover, .gd3-tb-chan a:hover { background: var(--aw-nhan); color: #111; }

/* ---------------------------------------------------------------- thanh đáy */
.gd3-thanh-day { display: none; }
.totop { position: fixed; right: 14px; bottom: 76px; width: 40px; height: 40px; border: 0; border-radius: 50%;
  background: rgba(0,0,0,.6); color: #fff; cursor: pointer; opacity: 0; pointer-events: none; transition: .2s; z-index: 1000; }
.totop.show { opacity: 1; pointer-events: auto; }

@media (max-width: 991px) {
  .gd3-thanh-day { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; position: fixed; inset: auto 0 0 0;
    background: var(--aw-nhan); border-top: 1px solid var(--aw-nhan-dam); z-index: 1050; }
  .gd3-thanh-day a, .gd3-thanh-day button { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 7px 2px;
    border: 0; background: transparent; color: var(--aw-chu); font: 500 11px/1.2 var(--aw-font-than); text-decoration: none; cursor: pointer; }
  .gd3-thanh-day i { font-size: 17px; }
  .gd3-chan-copy { padding-bottom: 66px; }
  .totop { bottom: 70px; }
}

/* ------------------------------------------------------- bảng chọn kênh liên hệ
   Trượt lên từ đáy chứ không hiện giữa màn: ngón cái với tới được, và nó nối liền với
   đúng cái nút vừa bấm ở thanh đáy. Trên máy tính thì về giữa như hộp thoại thường. */
.gd3-kenh { width: 100%; max-width: 420px; margin: auto auto 0; padding: 16px; border: 0;
  border-radius: 16px 16px 0 0; background: var(--aw-the); color: var(--aw-chu); }
.gd3-kenh::backdrop { background: rgba(0, 0, 0, .5); }
.gd3-kenh-dau { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.gd3-kenh-dau b { font-size: 17px; }
.gd3-kenh-dau button { width: 36px; height: 36px; border: 0; border-radius: 50%;
  background: var(--aw-nen-2); color: var(--aw-chu); font-size: 16px; cursor: pointer; }
.gd3-kenh-phu { margin: 4px 0 12px; font-size: 13px; color: var(--aw-chu-phu); }
/* minmax(0,1fr) cho cột giữa: tên kênh dài (số điện thoại ghép vào "Gọi …") không được
   đẩy giãn cả hàng rồi đẩy mũi tên ra khỏi mép. */
.gd3-kenh-o { display: grid; grid-template-columns: 34px minmax(0, 1fr) 14px; align-items: center;
  gap: 10px; padding: 12px 10px; border: 1px solid var(--aw-ke); border-radius: 12px;
  margin-bottom: 8px; color: var(--aw-chu); text-decoration: none; font-weight: 500; }
.gd3-kenh-o > i:first-child { font-size: 22px; text-align: center; }
.gd3-kenh-o span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gd3-kenh-mui { font-size: 13px; color: var(--aw-chu-phu); }
.gd3-kenh-gio { margin: 10px 0 0; font-size: 12.5px; color: var(--aw-chu-phu); text-align: center; }
@media (hover: hover) {
  .gd3-kenh-o:hover { border-color: var(--aw-nhan); background: var(--aw-nen-2); }
}
@media (min-width: 576px) {
  .gd3-kenh { margin: auto; border-radius: 16px; }
}

/* ---------------------------------------------------------------- thanh xem thử */
.skin-preview-bar { position: sticky; top: 0; z-index: 1200; display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  padding: 8px 16px; background: var(--aw-chu); color: var(--aw-nen); font-size: 13px; }
.skin-preview-bar i { color: #fbbf24; }
.skin-preview-bar b { color: #fff; }
.skin-preview-bar a { margin-left: auto; color: #fff; border: 1px solid rgba(255,255,255,.35); border-radius: 6px; padding: 3px 10px; text-decoration: none; }
.skin-preview-bar a + a { margin-left: 0; }

/* Menu ngang: bản gốc bọc <ul> trong .gd3-main-menu-scroll (có nút trượt trái/phải và mega-menu
   nhiều cột). Ở đây menu đơn giản hơn nên tự giãn khoảng cách, không thì mấy mục dính liền nhau. */
.section-main-memu .ul-main-menu > li { padding-left: 12px; padding-right: 12px; flex: none; white-space: nowrap; }
/* ⚠ KHÔNG BAO GIỜ đặt overflow lên chính thẻ <ul> để menu cuộn ngang.
   CSS quy định: overflow-x khác visible thì overflow-y tự thành auto. Nếu <ul> là mốc
   position:relative của bảng xổ, nó sẽ CẮT bảng xổ xuống còn đúng chiều cao thanh menu —
   bảng vẫn "hiện" (display:block, đo ra 1327x422) nhưng không thấy gì và không bấm được.
   Đã mất một lượt truy lỗi vì chuyện này.
   Cách đúng: mốc định vị là .gd3-menu-thanh ở NGOÀI, vùng cuộn .gd3-menu-cuon nằm GIỮA nó và
   <ul>. Thẻ có overflow chỉ cắt phần tử absolute khi nó nằm giữa phần tử đó và mốc định vị —
   ở đây mốc nằm ngoài vùng cuộn, nên bảng xổ thoát ra được. */
.section-main-memu .ul-main-menu { flex-wrap: nowrap; }

/* Vùng cuộn. Bản gốc đặt mấy thuộc tính này lên .gd3-main-menu-scroll, nhưng class ĐÓ còn kéo theo
   luật `.gd3-main-menu-scroll .list-dropdown { position: fixed }` — fixed thì phải có JS tính toạ độ
   cho bảng xổ. Đặt tên khác để tránh luật đó, giữ bảng xổ absolute neo vào .gd3-menu-thanh. */
.gd3-menu-cuon { flex: 1 1 auto; min-width: 0; overflow-x: auto; overflow-y: visible;
  scroll-behavior: smooth; scrollbar-width: none; }
.gd3-menu-cuon::-webkit-scrollbar { display: none; height: 0; }
.gd3-menu-cuon .ul-main-menu { width: max-content; }
.gd3-menu-cuon .ul-main-menu > li { flex-shrink: 0; margin-right: 14px; }
.gd3-menu-cuon .ul-main-menu > li:last-child { margin-right: 0; }

/* NGƯỠNG MÁY TÍNH: 992px, không phải 1200px.
   Bộ CSS gốc gom toàn bộ cách bày hàng trên của header vào @media (min-width: 1200px), nên khi
   hạ menu ngang xuống lg thì ở khoảng 992–1199px header vẫn còn nằm ở kiểu điện thoại: logo
   đòi nguyên một dòng, ô tìm kiếm rớt xuống dưới. Chép lại đúng mấy luật đó cho ≥992px —
   không sửa main.css vì đó là tệp gốc của giao diện, sửa vào là mất dấu khi cập nhật. */
@media (min-width: 992px) {
  .ul-main-menu > li { padding: 10px 0; }
  .ul-main-menu li a { font-size: 14px; }
  .gd3-header-brand-col { flex: 0 0 auto !important; width: auto !important; max-width: none; }
  .col-flex-5-xl-down   { flex: 1 1 auto !important; width: auto !important; max-width: none; min-width: 0; }
  .gd3-header-cart-col  { flex: 0 0 auto !important; width: auto !important; }
  .gd3-header-search-block { flex: 1 1 160px; min-width: 0; }
}

/* Hai nút trượt: dùng nguyên .gd3-main-menu-wrap / -fade / -nav-group / .is-disabled của bộ CSS gốc,
   chỉ phải gỡ nền mặc định vì bản gốc là <div role=button> còn đây là <button> thật. */
.gd3-main-menu-nav { border: 0; padding: 0; }

/* Hai mục tiện ích ghim ở mép phải, ngoài dải cuộn. flex-shrink 0 để chúng không bao giờ bị
   ép hẹp lại: dải danh mục đã có min-width:0 nên nó nhường chỗ, đúng thứ tự ưu tiên. */
.gd3-menu-ghim { flex: 0 0 auto; margin: 0 10px 0 4px; padding-left: 12px; border-left: 1px solid var(--aw-ke); }
.gd3-menu-ghim > li { flex-shrink: 0; }
.gd3-menu-ghim > li + li { margin-left: 14px; }
@media (prefers-reduced-motion: reduce) { .gd3-menu-cuon { scroll-behavior: auto; } }

/* Bootstrap gạch chân mọi thẻ <a>; bản gốc không dính vì logo là ảnh, còn đây là chữ. */
.gd3-header-brand-col a, .gd3-ten-site { text-decoration: none; color: var(--aw-chu); }

/* ===========================================================================
   MENU XỔ 3 CẤP
   Bảng xổ dùng nguyên .list-dropdown / .list-dropdown-mega / .list-dropdown-compact
   của bộ CSS gốc (xổ bằng :hover, không JS). Dưới đây chỉ là phần cấp 3 và mobile.
   =========================================================================== */
.gd3-menu-caret { font-size: 10px; margin-left: 5px; opacity: .55; }
.menu-item-dropdown:hover .gd3-menu-caret { opacity: 1; }

/* Bảng mega: mỗi cột là một mục cấp 2, dưới nó là các mục cấp 3. */
.list-dropdown-mega .gd3-mega-cols { margin: 0 -8px; }
.list-dropdown-mega .gd3-mega-cols > [class^="col"] { padding: 0 8px 14px; }
.list-dropdown-mega .gd3-tin-mega-tit { margin: 10px 0 8px; font-size: 13.5px; }
.list-dropdown-mega .gd3-tin-mega-tit a { color: var(--aw-chu); text-decoration: none; }
.list-dropdown-mega .gd3-tin-mega-tit a:hover { color: #0b6bcb; }
.list-dropdown-mega ul li a { padding: 3px 6px; border-radius: 5px; color: var(--aw-chu-2); text-decoration: none;
  white-space: normal; transition: background-color .15s, color .15s; }
.list-dropdown-mega ul li a:hover { background: var(--aw-nhan-nhat); color: var(--aw-chu); }
.gd3-mega-them { font-weight: 700; color: #0b6bcb !important; }
/* Cột cuối không có mục cấp 3 thì vẫn giữ đúng nhịp với các cột khác. */
.list-dropdown-mega .col-3 { min-width: 220px; }

/* Bảng xổ phải nằm ngay dưới MỤC ĐANG RÊ. Bản gốc đặt left:0 + width:100% so với cả thanh
   menu, nên mọi bảng đều bật ra ở mép trái và rộng bằng cả thanh — rê vào mục cuối thì bảng
   hiện cách con trỏ gần trọn màn hình. Toạ độ do JS cuối layout.php nạp vào --gd3-dd-x
   (không làm bằng CSS thuần được: mốc định vị buộc phải nằm ngoài vùng cuộn ngang, xem ghi
   chú overflow ở trên). max-height để danh mục nhiều mục con không tràn khỏi màn hình. */
.menu-item-dropdown .list-dropdown {
  left: var(--gd3-dd-x, 0); width: max-content; min-width: 230px;
  max-width: min(92vw, 1080px); max-height: min(72vh, 540px); overflow-y: auto; }

/* Mở được bằng bàn phím, không chỉ bằng chuột: Tab tới mục cha là bảng xổ ra. */
.menu-item-dropdown:focus-within .list-dropdown,
.menu-item-dropdown:focus-within > a::after,
.menu-item-dropdown:focus-within > a::before { display: block; }

/* Bảng xổ Hỗ trợ: ba cột thay vì bốn. Bộ CSS gốc chỉ có luật cho .col-3. */
.list-dropdown-mega .col-4 { min-width: 230px; }
.gd3-ht ul li { margin-bottom: 2px; }
.gd3-ht-camket { display: flex; align-items: flex-start; gap: 7px; padding: 3px 6px; font-size: 13px;
  color: var(--aw-chu-2); line-height: 1.45; white-space: normal; }
.gd3-ht-camket i { color: var(--aw-nhan-dam); margin-top: 3px; }
.gd3-ht-hotline { font-weight: 800 !important; color: var(--aw-nhan-dam) !important; font-size: 14.5px !important; letter-spacing: .3px; }

/* ===========================================================================
   TRANG DANH SÁCH THƯƠNG HIỆU (/brand)
   =========================================================================== */
.gd3-th-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr)); gap: 12px; }
/* Trang /brand (29/09/2026, chủ shop: "mỗi hàng 3 thương hiệu"): điện thoại + máy tính bảng 3 cột cố định,
   máy tính 6 cột. Ô nhỏ lại thì logo vuông ăn theo bề ngang ô (như dải logo trang chủ), không chặn cao 104px. */
.gd3-th-luoi:not(.gd3-th-luoi-tc) { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
@media (min-width: 992px) { .gd3-th-luoi:not(.gd3-th-luoi-tc) { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 12px; } }
@media (max-width: 991px) {
  .gd3-th-luoi:not(.gd3-th-luoi-tc) .gd3-th-o { padding: 10px 6px; }
  .gd3-th-luoi:not(.gd3-th-luoi-tc) .gd3-th-anh { height: auto; aspect-ratio: 1 / 1; width: 100%; max-width: 92px; margin: 0 auto 6px; }
  .gd3-th-luoi:not(.gd3-th-luoi-tc) .gd3-th-anh img { max-height: none; width: 100%; height: 100%; object-fit: contain; }
  .gd3-th-luoi:not(.gd3-th-luoi-tc) .gd3-th-ten { font-size: 12.5px; line-height: 1.25; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .gd3-th-luoi:not(.gd3-th-luoi-tc) .gd3-th-so { font-size: 11px; }
}
.gd3-th-o { display: block; padding: 14px 10px; border: 1px solid var(--aw-ke); border-radius: 10px;
  background: var(--aw-the); text-align: center; color: inherit; text-decoration: none; transition: border-color .15s, box-shadow .15s; }
.gd3-th-o:hover { border-color: var(--aw-nhan); box-shadow: 0 6px 18px rgba(31,26,26,.08); }
/* Logo hãng là ảnh RỘNG trên nền trắng — contain chứ không cover, nếu không mỗi cái bị cắt
   mất một đầu chữ và không còn nhận ra hãng nào. */
/* 29/09/2026: 56px → 104px. Mọi logo hãng (29 cũ + 68 mới) là ảnh VUÔNG có lề trắng; chặn cao 56px thì
   logo chỉ rộng ~46px giữa ô rộng 170px, chữ hãng li ti. 104px: logo to gấp đôi, không cắt xén logo nào.
   Dải logo trang chủ (.gd3-th-luoi-tc) có luật riêng bên dưới, không bị ảnh hưởng. */
.gd3-th-anh { display: flex; align-items: center; justify-content: center; height: 104px; margin-bottom: 6px; }
.gd3-th-anh img { max-width: 100%; max-height: 104px; width: auto; height: auto; object-fit: contain; }
.gd3-th-ten { display: block; font-weight: 700; font-size: 14px; }
.gd3-th-chu { display: block; max-width: 100%; font-weight: 800; font-size: 18px; line-height: 1.15; letter-spacing: .6px;
  text-transform: uppercase; color: var(--aw-chu); text-align: center; overflow-wrap: anywhere; }
.gd3-th-so { display: block; font-size: 12px; color: var(--aw-chu-phu); margin-top: 2px; }

/* ---- dải thương hiệu ở TRANG CHỦ (.gd3-th-luoi-tc) ----
   Trang /brand để auto-fill vì ở đó liệt kê hết là đúng việc. Trang chủ thì KHÔNG: phải
   ghim số cột, vì có ghim mới giấu được phần thừa theo hàng. auto-fill thì số cột đổi
   theo bề ngang, nên :nth-child(n+13) cắt giữa hàng ở một khổ màn hình nào đó — đúng cái
   bẫy ghi trong AGENTS.md ("lưới auto-fill không ẩn được theo hàng bằng nth-child").
   12 ô, HAI HÀNG ở cả hai khổ: máy tính 6 cột x 2; điện thoại 3 cột x 2 = 6, giấu 6 ô cuối.
   Muốn xem hết thì bấm nút dưới khối sang /brand — không nở thêm ô tại chỗ. */
.section-brands { padding: 10px 0 26px; }
.section-brands .gd3-tin-cd-dau { margin-bottom: 16px; }

.gd3-th-luoi-tc { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
@media (min-width: 992px) {
    .gd3-th-luoi-tc { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 12px; }
}
@media (max-width: 991px) {
    .gd3-th-luoi-tc > :nth-child(n+7) { display: none; }
}

/* Ô logo VUÔNG, ăn theo bề ngang ô — không phải cao 56px như trang /brand.
   Đo 18 logo đang có: toàn bộ là ảnh vuông 197×197 hoặc 200×200, không cái nào rộng.
   Chặn theo CHIỀU CAO trên ảnh vuông thì logo chỉ rộng đúng bằng chiều cao đó (42px
   nằm giữa một ô rộng 110px), nhìn như ô bị lỗi thiếu ảnh. Chặn theo bề ngang thì
   logo lớn đúng theo ô.
   Vẫn object-fit: contain chứ không cover — mai kia chủ shop tải lên một logo dài
   thì nó co lại vừa khung, không bị cắt mất một đầu chữ. */
.gd3-th-luoi-tc .gd3-th-anh {
    height: auto; aspect-ratio: 1 / 1; width: 100%; max-width: 88px; margin: 0 auto 8px;
}
.gd3-th-luoi-tc .gd3-th-anh img { max-height: none; width: 100%; height: 100%; object-fit: contain; }

/* Ở khổ điện thoại ô chỉ rộng chừng 110px: giữ nguyên cỡ chữ của trang /brand thì tên
   hãng hai chữ bị xuống dòng và các ô cao thấp so le nhau. */
@media (max-width: 767px) {
    .gd3-th-luoi-tc .gd3-th-o   { padding: 10px 6px; }
    .gd3-th-luoi-tc .gd3-th-anh { max-width: 70px; margin-bottom: 6px; }
    .gd3-th-luoi-tc .gd3-th-ten { font-size: 12.5px; }
    .gd3-th-luoi-tc .gd3-th-so  { font-size: 10.5px; }
}

.list-dropdown-compact .title-category-dropdown-menu { margin-bottom: 6px; }
.list-dropdown-compact ul li a { white-space: normal; color: var(--aw-chu-2); text-decoration: none; }

/* Bảng xổ THƯƠNG HIỆU: xếp 2 cột để bỏ hẳn thanh trượt.
   .list-dropdown gốc kẹp max-height 437px; 12 hãng + dòng "Xem tất cả" là 13 dòng một cột,
   vượt mức đó nên đẻ ra thanh cuộn — bảng xổ mà phải cuộn thì hầu như không ai cuộn, người ta
   chỉ thấy danh sách bị cắt cụt rồi bỏ đi. Hai cột gói gọn trong một màn, hết cuộn.
   Thứ tự do SQL định (ORDER BY số sản phẩm DESC) và lưới đổ theo HÀNG, nên hãng nhiều hàng
   nhất nằm đúng ô trên cùng bên trái. Dòng "Xem tất cả" trải hết bề ngang để luôn ở cuối. */
.gd3-menu-ghim .list-dropdown-compact { max-height: none; overflow: visible; }
.gd3-menu-ghim .list-dropdown-compact > ul { display: grid; grid-template-columns: repeat(2, minmax(136px, 1fr));
  column-gap: 12px; }
.gd3-menu-ghim .list-dropdown-compact > ul > li:last-child { grid-column: 1 / -1; margin-top: 6px;
  padding-top: 7px; border-top: 1px solid var(--aw-ke); }

/* ---------------------------------------------------------------- mobile 3 cấp
   Xếp tầng bằng <details>: không JS, bàn phím và trình đọc màn hình hiểu sẵn. */
.gd3-menu-truot .gd3-mt-muc { display: block; padding: 11px 16px; color: var(--aw-nen-2); text-decoration: none;
  border-bottom: 1px solid rgba(255,255,255,.08); font-size: 14px; }
.gd3-menu-truot .gd3-mt-muc i { width: 18px; color: var(--aw-nhan-sang); }
.gd3-menu-truot .gd3-mt-muc:hover { background: rgba(255,255,255,.08); color: var(--aw-nhan-sang); }

.gd3-mt-cap1 > summary, .gd3-mt-cap2 > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px;
  padding: 11px 16px; border-bottom: 1px solid rgba(255,255,255,.08); font-size: 14px; color: var(--aw-nen-2); }
.gd3-mt-cap1 > summary::-webkit-details-marker, .gd3-mt-cap2 > summary::-webkit-details-marker { display: none; }
.gd3-mt-cap1 > summary i { width: 18px; color: var(--aw-nhan-sang); }
.gd3-mt-cap1 > summary span, .gd3-mt-cap2 > summary span { flex: 1; }
/* Dấu + / − tự đổi theo trạng thái mở, để biết còn cấp con bên trong. */
.gd3-mt-cap1 > summary::after, .gd3-mt-cap2 > summary::after { content: "+"; font-size: 17px; line-height: 1; color: var(--aw-nhan-sang); }
.gd3-mt-cap1[open] > summary::after, .gd3-mt-cap2[open] > summary::after { content: "–"; }
.gd3-mt-cap1[open] > summary { background: rgba(255,255,255,.06); }

.gd3-mt-cap2 { background: rgba(255,255,255,.04); }
.gd3-mt-cap2 > summary { padding-left: 32px; font-size: 13.5px; }
.gd3-menu-truot .gd3-mt-c2 { padding-left: 32px; font-size: 13.5px; }
.gd3-menu-truot .gd3-mt-c3 { padding-left: 48px; font-size: 13px; color: var(--aw-ke-dam); }
.gd3-mt-tatca { display: block; padding: 8px 16px 8px 32px; font-size: 12.5px; color: var(--aw-nhan-sang); text-decoration: none;
  border-bottom: 1px solid rgba(255,255,255,.08); }
.gd3-mt-cap2 .gd3-mt-tatca { padding-left: 48px; }
.gd3-mt-tatca:hover { background: rgba(255,255,255,.08); }

/* ===========================================================================
   THẺ SẢN PHẨM ĐỀU NHAU
   Thẻ so le cao thấp là do ba thứ dài ngắn khác nhau: ruy-băng giảm giá, nhãn
   "Sale cực đỉnh", và tên sản phẩm 1 hay 2 dòng. Hai cái đầu đã luôn được in ra
   (trống thì ẩn, xem parts/product-card.php); còn lại xử bằng flex ở đây:
   thân thẻ giãn hết chỗ, dòng giá bị đẩy xuống đáy — nên giá của mọi thẻ nằm
   trên cùng một đường dù tên dài ngắn ra sao.
   =========================================================================== */
.gd3-o-trong { visibility: hidden; }

.product-item { display: flex; flex-direction: column; }
.product-item > .p-2 { flex: 1 1 auto; display: flex; flex-direction: column; }
.product-item .gd3-card-gia { margin-top: auto; }

/* Trong băng chuyền, hai thẻ của một cột chia đôi chiều cao bằng nhau.
   ⚠ PHẢI có row-gap VÀ phải huỷ margin-bottom của thẻ trên. Cho thẻ `height:100%` để hai thẻ
   bằng nhau thì thẻ chiếm trọn ô lưới, `mb-3` (16px) của nó bị đẩy ra ngoài ô và MẤT TÁC DỤNG —
   hai thẻ dính sát nhau, đo ra khe dọc đúng 0px. Khoảng cách phải do chính lưới tạo ra.
   Bản gốc để 16px giữa hai thẻ (slide cao 748 = 366 + 16 + 366). */
.wrap-swiper .swiper-slide { display: grid; grid-template-rows: 1fr 1fr; row-gap: 16px; align-items: stretch; }
.wrap-swiper .swiper-slide > .product-item { height: 100%; margin-bottom: 0; }
/* Dải danh mục ở điện thoại chỉ có 1 ô mỗi cột — đừng chia đôi. */
.category-products-mb .swiper-slide { display: block; }

/* ===========================================================================
   THẺ TIN  .gd3-nw-vua  — MỘT khuôn duy nhất, dùng ở trang chủ, danh sách tin và
   khối "Đọc tiếp" cuối bài (parts/post-card.php).

   Trước 22/09/2026 trang chủ có thêm một bộ thẻ RIÊNG (.news-item-main,
   .news-relate, .group-news-items, .gd3-nw-phu*, .gd3-nw-anh, .gd3-nw-hangduoi).
   Khối tin trang chủ nay dùng chung khuôn .gd3-hero với trang /tin-tuc, nên bộ đó
   không còn chỗ bám và đã gỡ khỏi đây — giữ lại chỉ tổ khiến người sau tưởng còn
   dùng rồi đi sửa nhầm file.
   =========================================================================== */
.gd3-nw-vua { display: block; color: inherit; text-decoration: none; }
.gd3-nw-vua-anh { position: relative; display: block; aspect-ratio: 16 / 9; overflow: hidden; border-radius: 8px; background: var(--aw-nen); }
.gd3-nw-vua-anh img { width: 100%; height: 100%; object-fit: cover; transition: transform .4s; }
@media (hover: hover) { .gd3-nw-vua:hover .gd3-nw-vua-anh img { transform: scale(1.06); } }
.gd3-nw-vua-ten { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  margin-top: 8px; font-size: 14.5px; font-weight: 700; line-height: 1.45; }
/* Thẻ tin dùng ở BA nơi nên màu di chuột phải là màu nhấn của bộ màu, không phải
   mã xanh rời rạc còn sót của bản gốc. */
@media (hover: hover) { .gd3-nw-vua:hover .gd3-nw-vua-ten { color: var(--aw-nhan); } }
.gd3-nw-vua-tt { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  margin-top: 5px; font-size: 13px; line-height: 1.5; color: var(--aw-chu-2); font-weight: 400; }
.gd3-nw-vua-meta { display: block; margin-top: 6px; font-size: 12px; color: var(--aw-chu-phu); }

/* ⚠ Ô "chưa có ảnh" mặc định là hình VUÔNG rộng hết chỗ — đúng cho thẻ sản phẩm, nhưng thả vào
   khung tin 16:9 thì nó phình ra và cả khối vỡ. Mỗi chỗ một cỡ riêng. */
.gd3-nw-vua-anh .gd3-khong-anh { position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto; font-size: 20px; }

/* Ô trống của THẺ SẢN PHẨM: cho nó ra dáng một mảng nền có chủ ý thay vì ô xám hỏng.
   (Thẻ tin có bản riêng, nền hồng nhạt — xem .gd3-bv-luoi .gd3-khong-anh ở cuối file.) */
.gd3-khong-anh { background: linear-gradient(135deg, var(--aw-chu) 0%, var(--aw-chu-2) 55%, var(--aw-chu) 100%); color: rgba(242,105,106,.38); }

/* ===========================================================================
   KHUNG ẢNH TRONG THẺ SẢN PHẨM — 1:1, VÌ ẢNH CỦA SHOP NÀY VUÔNG

   22/09/2026 — sửa lại, và lý do cũ ghi ở đây để không ai quay về 4:3 nữa.
   Chỗ này từng ép 4/3 "như bản gốc", với lập luận: bản gốc bán xe nên ảnh ngang, còn
   ảnh VUÔNG thì thẻ vống lên và dải sản phẩm nhìn đặc kịt. Lập luận đó dựa trên ảnh DEMO
   thời chưa có hàng thật.
   Đo trên kho thật (44 ảnh trên trang chủ): 38 ảnh vuông chằn chặn, 6 ảnh xấp xỉ vuông
   (0,97–1,02), KHÔNG CÓ ảnh ngang nào. Ô 4/3 + object-fit:contain nghĩa là ảnh 168x168
   chỉ vẽ được 111x111 giữa ô rộng 149 — thừa 19px trắng MỖI BÊN, trên mọi thẻ, mọi trang.
   Đó đúng là khoảng trắng chủ shop khoanh đỏ trong ảnh chụp.
   Với ảnh vuông thì 1/1 + contain = vừa khít, không méo, không cắt, không thừa. Ảnh cao
   thêm 38px và rộng hết bề ngang thẻ — cũng chính là thứ làm thẻ "đồ sộ" hơn.
   NẾU sau này nhập hàng có ảnh ngang: đừng đổi lại 4/3 (lại thừa trắng cho 38 ảnh vuông),
   mà chuẩn hoá ảnh về vuông lúc tải lên.
   =========================================================================== */
.gd3-card-imgwrap { aspect-ratio: 1 / 1; overflow: hidden; }
.gd3-card-imgwrap img { width: 100%; height: 100%; object-fit: contain; }

/* ===========================================================================
   PHẦN THÔNG TIN TRONG THẺ SẢN PHẨM — thứ tự đọc: GIÁ trước, tên sau
   Trước 22/09/2026 phần này có ba lỗi cùng lúc:
     · Giá bán 13px, trong khi TÊN sản phẩm 15px — con số quan trọng nhất trên thẻ lại là
       chữ nhỏ nhất. Giá giờ 18px/800, đứng đầu bảng thị giác trong thẻ.
     · Giá cũ dán sát giá mới, không có một khoảng trắng nào (markup viết
       `</span><span class="old-price">` liền nhau), lại tự rớt xuống hai dòng. Giờ cả
       hàng giá là flex, gap 8px, cùng đường chân chữ.
     · Mỗi phần tử cách nhau 16px (mt-3 của Bootstrap) nên khối chữ cao 161px trong khi
       ảnh chỉ 111px — thẻ trông gầy và bị kéo dài. Giờ 8px.
   =========================================================================== */
.product-item > .p-2 { padding: 10px 12px 12px !important; }
.product-item .note-installment { margin-left: 0; }

/* Ruy-băng mức giảm: 9,5px in nghiêng thì gần như không đọc được trên điện thoại.
   line-height ghim 14px để tổng cao vẫn đúng 18px — bằng cái tam giác :after dựng bằng
   border 9px+9px ở main.css; đổi cỡ chữ mà không ghim thì tam giác lệch khỏi dải. */
.product-item .note-installment { font-size: 11px; font-style: normal; font-weight: 700; line-height: 14px; }

.product-item .product-item-name { margin-top: 8px !important; font-size: 14px; }

/* margin-top:auto (đặt ở trên, mục thẻ sản phẩm) đẩy hàng giá xuống đáy thẻ để các thẻ
   cùng hàng thẳng nhau — KHÔNG ghi đè margin-top ở đây, chỉ sắp lại bên trong. */
/* GIÁ LUÔN HAI DÒNG, Ở MỌI THẺ (chủ shop 26/09/2026): giá bán dòng trên, giá gạch dòng dưới.
   Bản trước để hai giá chung một hàng flex-wrap — giá ngắn thì giá gạch nằm cạnh, giá dài
   ("3.950.000 ₫") thì giá gạch rớt xuống dòng dưới, nên cùng một hàng thẻ chỗ lên chỗ xuống.
   Đo ở màn 375px (thẻ 145px): 22/24 thẻ đã rớt hai dòng — nên lấy HAI DÒNG làm chuẩn cho
   tất cả, không ép một dòng (ép thì giá dài phải thu nhỏ chữ, mà giá là chữ quan trọng nhất).
   min-height giữ chỗ dòng giá gạch cả ở món KHÔNG giảm giá: khối giá của mọi thẻ cao bằng
   nhau, cộng margin-top:auto ở trên → giá bán của cả hàng thẳng một đường. 43px = dòng giá
   bán 22.5px (18px x 1.25) + khe 2px + dòng giá gạch 18px. */
.product-item .gd3-card-gia { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; min-height: 43px; }
.product-item .discount-price { font-size: 18px; line-height: 1.25; white-space: nowrap; }
.product-item .old-price { font-size: 12px; line-height: 18px; white-space: nowrap; margin: 0; }

/* Vỏ thẻ: cho nó ra dáng một vật thể tách khỏi nền, thay vì mảng trắng trôi trên nền hồng. */
.product-item { border: 1px solid var(--aw-ke); border-radius: 12px; box-shadow: 0 1px 2px rgba(0, 0, 0, .04); }
@media (hover: hover) {
    .product-item { transition: box-shadow .18s ease, transform .18s ease; }
    .product-item:hover { box-shadow: 0 8px 20px rgba(0, 0, 0, .10); transform: translateY(-2px); }
}
@media (prefers-reduced-motion: reduce) {
    .product-item { transition: none; }
    .product-item:hover { transform: none; }
}

/* ===========================================================================
   BỚT LỀ KÉP Ở KHỔ ĐIỆN THOẠI — trả bề ngang lại cho thẻ
   Ở 375px: .block-products có margin 0 13px RỒI padding 0 15px, cộng thêm 1px viền = 29px
   trước khi tới thẻ đầu tiên. Hai lớp lề lồng nhau ăn 58px của 375px, thẻ chỉ còn 148,5px
   nên tên sản phẩm nào cũng bị cắt sau hai dòng.
   Gom lại: lề ngoài 4 + padding 8 = 13px tới thẻ, khe giữa hai thẻ 14px (gap của
   .swiper-wrapper, để 20px thì khe lại rộng hơn cả lề ngoài, nhìn lệch).
   Kết quả: thẻ 167,5px — rộng thêm 19px, tức thêm gần ba ký tự mỗi dòng tên.
   =========================================================================== */
@media (max-width: 767px) {
    .block-products { margin-left: 4px; margin-right: 4px; padding-left: 8px; padding-right: 8px; }
    /* Đổi ĐÚNG MỘT biến — bề ngang thẻ tự tính lại theo nó (xem mục băng chuyền ở đầu tệp). */
    .block-products .wrap-swiper { --gd3-khe: 14px; }
}


/* ==========================================================================
   BẢNG A - SỬA CÁC MẢNG LỚN
   Đổi hex thôi chưa đủ: chỗ nào trước đây lấy VÀNG làm NỀN thì nay phải đổi
   cả tương quan nền/chữ, vì nhấn đất nung là màu tối, không phải màu sáng.
   Nguyên tắc: nhấn chỉ chiếm ~10% diện tích, mảng lớn dùng trắng/kem + kẻ 1px.
   ========================================================================== */

body.bg-gray { background-color: var(--aw-nen); color: var(--aw-chu); }

/* --- Đầu trang: nền vàng -> nền trắng + 1 đường kẻ mảnh --- */
.bg-main { background-color: var(--aw-the); border-bottom: 1px solid var(--aw-ke); }
.gd3-ten-site { color: var(--aw-chu); }
.icon-menu-mobile .rectangle { background-color: var(--aw-chu); }
/* ô tìm kiếm trắng trên nền trắng sẽ biến mất -> cho nền chìm + viền */
/* GÓC BO VỪA (12px), KHÔNG BO TRÒN HẲN. Bo 999px biến hai đầu ô tìm kiếm thành hai nửa
   hình tròn; ở tấm tìm kiếm toàn màn ô cao 48px nên cái vát trái thành một cung tròn to
   đùng, chủ shop khoanh đỏ đúng chỗ đó. 12px là bán kính đang dùng cho thẻ sản phẩm và ô
   danh mục, nên ô tìm kiếm nay cùng một ngôn ngữ hình khối với phần còn lại của trang. */
.input-group-search .form-control {
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); border-right: 0;
  border-radius: 12px 0 0 12px; color: var(--aw-chu); }
.input-group-search .form-control::placeholder { color: var(--aw-chu-phu); }
.input-group-search .input-group-text-search {
  background: var(--aw-chu); border-radius: 0 12px 12px 0; padding-inline: 16px; }
.input-group-search .input-group-text-search i { color: var(--aw-tren-chu); }
.input-group-search .input-group-text-search:hover i { color: var(--aw-nhan-sang); }

/* --- Nút MÁY ẢNH trong ô tìm kiếm: tìm bằng hình ---------------------------------
   Nằm giữa ô nhập và nút kính lúp, cùng nền chìm với ô nhập nên đọc ra là "một phần của
   ô tìm kiếm" chứ không phải một nút lạ dán vào. Có vạch ngăn mảnh bên trái để mắt tách
   được hai việc khác nhau: gõ chữ, và đưa ảnh.
   44px: chạm được bằng ngón tay (mốc tối thiểu của cả Apple lẫn Google). */
.input-group-search .gd3-tk-may {
  display: grid; place-items: center; width: 44px; flex: none;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); border-inline: 0;
  color: var(--aw-chu-phu); font-size: 17px; text-decoration: none; position: relative; }
.input-group-search .gd3-tk-may::before { content: ""; position: absolute; left: 0;
  top: 22%; bottom: 22%; width: 1px; background: var(--aw-ke); }
@media (hover: hover) { .input-group-search .gd3-tk-may:hover { color: var(--aw-nhan); } }
/* Lớp che lúc đang tải ảnh lên. Tải một tấm 4MB mất vài giây, mà trang cũ vẫn đứng im —
   không che lại thì khách tưởng máy ảnh không ăn rồi bấm lại lần nữa. */
.gd3-tk-che { position: fixed; inset: 0; z-index: 3000; display: grid; place-items: center;
  background: rgba(255, 255, 255, .92); }
.gd3-tk-che-hop { display: grid; justify-items: center; gap: 6px; text-align: center; padding: 0 24px; }
.gd3-tk-che-hop i { font-size: 30px; color: var(--aw-nhan); animation: gd3-tk-nhip 1s ease-in-out infinite; }
.gd3-tk-che-hop b { font-size: 16px; }
.gd3-tk-che-hop span { font-size: 13px; color: var(--aw-chu-phu); }
@keyframes gd3-tk-nhip { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
/* Người đặt máy ở chế độ giảm chuyển động thì bỏ nhấp nháy, giữ nguyên lớp che. */
@media (prefers-reduced-motion: reduce) { .gd3-tk-che-hop i { animation: none; } }

/* --- Trang TÌM BẰNG HÌNH ẢNH ------------------------------------------------------ */
.gd3-ta { padding-block: 14px 26px; }
.gd3-ta-tit { font-size: 22px; font-weight: 800; margin: 6px 0 14px; }
/* Ô chọn ảnh to hẳn ra: đây là việc DUY NHẤT của trang này, không cần khiêm tốn. */
.gd3-ta-tha { display: grid; place-items: center; gap: 6px; text-align: center;
  padding: 30px 18px; border: 2px dashed var(--aw-ke-dam); border-radius: 16px;
  background: var(--aw-nen-2); cursor: pointer; }
.gd3-ta-tha i { font-size: 30px; color: var(--aw-nhan); }
.gd3-ta-tha b { font-size: 16px; }
.gd3-ta-tha span { font-size: 13px; color: var(--aw-chu-phu); }
@media (hover: hover) { .gd3-ta-tha:hover { border-color: var(--aw-nhan); } }
.gd3-ta-gui { margin-top: 12px; width: 100%; padding: 12px; border: 0; border-radius: 999px;
  background: var(--aw-nhan); color: var(--aw-tren-nhan); font-size: 15px; font-weight: 700; }
.gd3-ta-gui[disabled] { opacity: .6; }
.gd3-ta-loi, .gd3-ta-dem { margin-top: 16px; font-size: 14px; }
.gd3-ta-loi { color: var(--aw-nhan); }
.gd3-ta-trong { margin-top: 20px; text-align: center; display: grid; gap: 8px; justify-items: center;
  padding: 28px 18px; background: var(--aw-nen-2); border-radius: 16px; }
.gd3-ta-trong i { font-size: 32px; color: var(--aw-chu-phu); }
.gd3-ta-trong b { font-size: 16px; }
.gd3-ta-trong p { max-width: 460px; font-size: 14px; color: var(--aw-chu-phu); margin: 0; }
/* Hai nút cạnh nhau, Zalo là nút CHÍNH — ở màn hình "không tìm thấy" thì nhắn cho người mới
   là việc có kết quả, còn xem cả kho 3.826 món chỉ là đường lui. */
.gd3-ta-loi-di { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; margin-top: 4px; }
.gd3-ta-zalo { display: inline-flex; align-items: center; gap: 8px; padding: 11px 20px;
  border-radius: 999px; background: #0068ff; color: #fff; font-size: 15px; font-weight: 700;
  text-decoration: none; }
@media (hover: hover) { .gd3-ta-zalo:hover { background: #0055d4; color: #fff; } }
/* minmax(0, 1fr) chứ không 1fr: tên sản phẩm dài không ngắt được sẽ phình cột và phá lưới. */
.gd3-ta-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(160px, 100%), 1fr));
  gap: 12px; margin-top: 14px; }
.gd3-ta-o { position: relative; min-width: 0; }
/* Từ 768px trở lên dùng ĐÚNG cỡ ô của trang danh mục (196–206px) chứ không giữ 160px:
   ở 1366 mức 160px cho ra 7 cột, ô hẹp hơn hẳn mọi lưới sản phẩm khác của web, mà khối
   "Cùng loại" 12 món lại gãy thành 7+5. Ở 196px thì 1366 ra 6 cột — 12 món vừa đúng 2
   hàng, và ô bằng ô ở trang danh mục. Dưới 768px giữ 160px: 375 vẫn phải là 2 cột. */
@media (min-width: 768px) { .gd3-ta-luoi { grid-template-columns: repeat(auto-fill, minmax(196px, 1fr)); } }

/* MÓN KHỚP: thẻ NẰM NGANG, ăn trọn bề ngang, một món một hàng.
   Trước đây nó nằm trong lưới 2 cột, mà tuyệt đại đa số lượt chỉ ra ĐÚNG MỘT món khớp —
   thành ra ô bên phải trống trơn, nhìn như trang bị lỗi. Kéo món "cùng loại" lên lấp chỗ
   trống thì mất ranh giới giữa "máy nhận ra món này" và "shop gợi ý thêm".
   Vẫn là thẻ .product-item cũ, chỉ xếp lại bằng grid: cột trái ảnh (ruy-băng giảm giá nằm
   ngay trên ảnh như cũ), cột phải ôm cả khối chữ và chiếm trọn hai hàng. */
.gd3-ta-khop { display: grid; gap: 12px; margin-top: 14px; }

/* ===== KHOANH VÙNG TRONG ẢNH =====
   Ảnh hiện ở khổ thật (aspect-ratio do JS đặt theo ảnh gốc) nhưng cao tối đa 46vh: cao hơn
   nữa thì cái khung đẩy kết quả xuống dưới nếp gấp, mà khách cần NHÌN ĐƯỢC CẢ HAI cùng lúc —
   kéo khung xong phải thấy ngay kết quả đổi thế nào, không thì họ không hiểu mình vừa làm gì. */
.gd3-ta-khung { margin-top: 14px; padding: 12px; border: 1px solid var(--aw-ke);
  border-radius: 14px; background: var(--aw-the); }
.gd3-ta-khung-dau { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin-bottom: 10px; }
.gd3-ta-khung-dau b { font-size: 14px; }
.gd3-ta-khung-dau span { font-size: 13px; color: var(--aw-chu-phu); }
.gd3-ta-khung-dau em { flex: 1 0 100%; font-size: 12.5px; font-style: normal; color: var(--aw-chu-phu); }
.gd3-ta-anh { position: relative; max-height: 40vh; margin-inline: auto; overflow: hidden;
  border-radius: 10px; background: var(--aw-nen-2); touch-action: none; }
.gd3-ta-anh img { display: block; width: 100%; height: 100%; object-fit: contain; }
/* Vùng NGOÀI khung bị tối đi bằng một cái bóng đổ khổng lồ — một thuộc tính, không cần bốn
   tấm che quanh mép. */
/* Viền trắng + một nét đen mảnh ngoài rìa: khung mặc định ôm CẢ tấm ảnh, mà ảnh sản phẩm
   thì nền trắng — viền trắng trên nền trắng là vô hình, khách không biết có cái khung để
   kéo. Nét đen lo phần nhìn thấy, viền trắng lo phần nổi trên ảnh tối. */
.gd3-ta-o-cat { position: absolute; box-sizing: border-box; cursor: move;
  border: 2px solid #fff; border-radius: 4px; outline: 1px solid rgba(0, 0, 0, .35);
  box-shadow: 0 0 0 9999px rgba(0, 0, 0, .45); }
.gd3-ta-o-cat i { position: absolute; width: 26px; height: 26px; }
/* Núm to 26px va chạm được bằng ngón tay, nhưng chỉ VẼ 12px góc vuông bên trong — núm đặc
   26px sẽ che mất chính món hàng ở bốn góc khung. */
.gd3-ta-o-cat i::after { content: ''; position: absolute; width: 12px; height: 12px; border: 3px solid #fff;
  filter: drop-shadow(0 0 1.5px rgba(0, 0, 0, .75)); }
/* Núm nằm HẲN TRONG khung, không thò ra ngoài. Thò ra thì ở khung mặc định (ôm cả tấm
   ảnh) chúng rơi ra ngoài mép ảnh và bị overflow:hidden của khung ảnh cắt mất — khách nhìn
   vào không thấy có gì để kéo. */
.gd3-ta-o-cat i[data-goc="tt"] { top: 0; left: 0; }
.gd3-ta-o-cat i[data-goc="tt"]::after { top: 3px; left: 3px; border-right: 0; border-bottom: 0; border-radius: 3px 0 0 0; }
.gd3-ta-o-cat i[data-goc="tp"] { top: 0; right: 0; }
.gd3-ta-o-cat i[data-goc="tp"]::after { top: 3px; right: 3px; border-left: 0; border-bottom: 0; border-radius: 0 3px 0 0; }
.gd3-ta-o-cat i[data-goc="dt"] { bottom: 0; left: 0; }
.gd3-ta-o-cat i[data-goc="dt"]::after { bottom: 3px; left: 3px; border-right: 0; border-top: 0; border-radius: 0 0 0 3px; }
.gd3-ta-o-cat i[data-goc="dp"] { bottom: 0; right: 0; }
.gd3-ta-o-cat i[data-goc="dp"]::after { bottom: 3px; right: 3px; border-left: 0; border-top: 0; border-radius: 0 0 3px 0; }
.gd3-ta-khung-nut { display: flex; gap: 10px; margin-top: 12px; }
.gd3-ta-nut-tim { flex: 1 1 auto; min-width: 0; padding: 12px; border: 0; border-radius: 999px;
  background: var(--aw-nhan); color: #fff; font-size: 15px; font-weight: 700; cursor: pointer; }
.gd3-ta-nut-ca { flex: none; padding: 12px 16px; border: 1px solid var(--aw-ke); border-radius: 999px;
  background: var(--aw-the); color: var(--aw-chu); font-size: 14px; font-weight: 600; cursor: pointer; }
@media (hover: hover) {
  .gd3-ta-nut-tim:hover { background: var(--aw-nhan-dam); }
  .gd3-ta-nut-ca:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); }
}
/* Đang chờ máy chủ: mờ cái ảnh đi chứ KHÔNG khoá nút. Khoá thì khách kéo khung tiếp không
   được, mà lượt tìm chỉ ~150ms nên khoá chẳng để làm gì ngoài việc làm giao diện giật. */
.gd3-ta-dang .gd3-ta-anh { opacity: .55; }
@media (min-width: 768px) { .gd3-ta-anh { max-width: 520px; } }
.gd3-ta-khop .product-item { display: grid; grid-template-columns: 132px minmax(0, 1fr);
  grid-template-rows: auto 1fr; align-items: center; }
.gd3-ta-khop .note-installment { grid-column: 1; grid-row: 1; align-self: start; }
/* Món KHÔNG giảm giá: trong lưới, ô ruy-băng phải ở lại (ẩn) để ảnh các thẻ cùng hàng
   bắt đầu cùng một độ cao. Ở thẻ nằm ngang thì mỗi hàng chỉ có một thẻ, chẳng phải canh
   với ai — để lại là chừa 18px trắng ngay đỉnh thẻ. Bỏ hẳn khỏi bố cục. */
.gd3-ta-khop .note-installment.gd3-o-trong { display: none; }
.gd3-ta-khop .gd3-card-imgwrap { grid-column: 1; grid-row: 2; margin: 0 !important; }
.gd3-ta-khop .product-item > .p-2 { grid-column: 2; grid-row: 1 / -1; justify-content: center; }
/* Trong thẻ nằm ngang KHÔNG cần margin-top:auto đẩy giá xuống đáy — mỗi hàng chỉ có một
   thẻ nên chẳng phải canh giá cho thẳng với thẻ nào cả, mà đẩy xuống đáy thì tên và giá
   bị kéo xa nhau ra hai đầu một thẻ cao 132px. */
.gd3-ta-khop .product-item .gd3-card-gia { margin-top: 6px; }
.gd3-ta-khop .product-item .product-item-name { margin-top: 0 !important; font-size: 15px; }
@media (min-width: 768px) {
  /* CHẶN BỀ NGANG trên máy tính. Ở 1366 mà để thẻ chạy hết 1.327px thì tên và giá dồn vào
     mép trái, còn hai phần ba thẻ là khoảng trắng nằm TRONG khung viền — đúng cái cảm giác
     "thẻ bị hụt" mà bố cục này sinh ra để chữa. Chặn ở 760px thì thẻ ra dáng một khối kết
     quả gọn gàng, phần trống còn lại nằm NGOÀI viền nên đọc ra là lề trang, không phải ô rỗng. */
  .gd3-ta-khop { max-width: 760px; }
  .gd3-ta-khop .product-item { grid-template-columns: 172px minmax(0, 1fr); }
  .gd3-ta-khop .product-item .product-item-name { font-size: 17px; }
  .gd3-ta-khop .product-item .discount-price { font-size: 22px; }
}
/* Món chỉ GẦN giống thì phải nhìn ra ngay là nó khác hạng với món khớp chắc — cùng một lưới,
   cùng một cỡ chữ mà không đánh dấu thì khách đọc cả 12 món như nhau. */
.gd3-ta-mo { opacity: .82; }
.gd3-ta-nhan { position: absolute; z-index: 2; top: 8px; right: 8px; padding: 3px 9px;
  border-radius: 999px; background: var(--aw-ke-dam); color: #fff; font-size: 11px; font-weight: 700; }
/* Bản GỌN, dùng lại ngay trên trang kết quả: cùng một thẻ, chỉ đổi cách bày. */
/* Đầu khối "Cùng loại" ở trang tìm bằng ảnh: tên danh mục bên trái, "Xem tất cả" bên phải.
   Có đường kẻ trên để tách hẳn với lưới món KHỚP phía trên — hai khối này nói hai chuyện
   khác nhau ("đây là món bạn tìm" và "shop còn loại nào"), dính liền nhau thì khách đọc
   thành một danh sách duy nhất rồi tưởng máy nhận nhầm cả đống. */
.gd3-ta-cl-dau { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  margin: 26px 0 12px; padding-top: 18px; border-top: 1px solid var(--aw-ke); }
.gd3-ta-cl-dau h2 { margin: 0; min-width: 0; font-size: 16px; font-weight: 700; color: var(--aw-chu-phu); }
.gd3-ta-cl-dau h2 b { color: var(--aw-chu); font-weight: 800; }
.gd3-ta-cl-dau a { flex: none; font-size: 13px; font-weight: 700; color: var(--aw-nhan); text-decoration: none; }
@media (hover: hover) { .gd3-ta-cl-dau a:hover { color: var(--aw-nhan-dam); } }
@media (min-width: 992px) { .gd3-ta-cl-dau h2 { font-size: 19px; } }
.gd3-ta-tha.gd3-ta-gon { grid-auto-flow: column; justify-content: center; align-items: center;
  gap: 10px; padding: 12px 16px; border-style: solid; border-width: 1px; }
.gd3-ta-tha.gd3-ta-gon i { font-size: 18px; }
.gd3-ta-tha.gd3-ta-gon b { font-size: 14px; }
.gd3-ta-tha.gd3-ta-gon span { display: none; }
@media (min-width: 992px) { .gd3-ta-tit { font-size: 28px; } .gd3-ta-tha { padding-block: 44px; } }
@media (min-width: 992px) { .gd3-ta-tha.gd3-ta-gon { padding-block: 12px; } }

/* --- 3 lối tắt dưới banner: Khuyến mãi / Kinh nghiệm / Tư vấn ---------------------
   Đặt lớp tên riêng (.gd3-lt-*) thay vì đè lên .item-hot-news của bộ CSS gốc: bộ gốc rải
   luật cho khối đó ở cả main.css lẫn menu-mobile.css, đè từng luật một thì lúc nào cũng
   còn sót. Đổi tên lớp là thoát sạch, không phải đi tìm.
   Nhấn chỉ nằm ở Ô BIỂU TƯỢNG (nền đỏ rất nhạt), không phải một khối đen đặc chiếm 1/4 thẻ. */
.gd3-loi-tat { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.gd3-lt-o { display: flex; align-items: center; gap: 13px; padding: 14px 16px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 14px;
  color: var(--aw-chu); text-decoration: none;
  transition: border-color .16s, box-shadow .16s, transform .16s; }
.gd3-lt-ic { flex: none; width: 46px; height: 46px; display: grid; place-items: center;
  border-radius: 13px; background: var(--aw-nhan-nhat); color: var(--aw-nhan); font-size: 19px; }
.gd3-lt-chu { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.gd3-lt-chu b  { font-size: 15.5px; font-weight: 700; }   /* dòng & chỗ thở cho dấu: luật tiêu đề chung ở cuối file */
.gd3-lt-chu em { font-style: normal; font-size: 13px; line-height: 1.35; color: var(--aw-chu-phu); }
.gd3-lt-mui { margin-left: auto; flex: none; font-size: 12px; color: var(--aw-ke-dam);
  transition: transform .16s, color .16s; }
/* Chỉ máy CÓ CHUỘT mới đổi trạng thái khi rê. Trên iOS thẻ vừa chạm sẽ GIỮ NGUYÊN :hover
   cho tới khi chạm chỗ khác — đúng lý do ô "Tư vấn" trong ảnh chụp màn hình đỏ lên một mình
   trong khi hai ô kia đen, trông như lỗi màu chứ không ai đoán ra đó là vệt chạm còn sót. */
@media (hover: hover) {
  .gd3-lt-o:hover { border-color: var(--aw-nhan-vien); box-shadow: 0 6px 18px rgba(31, 26, 26, .08);
    transform: translateY(-2px); }
  .gd3-lt-o:hover .gd3-lt-mui { transform: translateX(3px); color: var(--aw-nhan); }
}
.gd3-lt-o:active { transform: translateY(0); border-color: var(--aw-nhan-vien); }
/* Dưới 992px VẪN BA Ô MỘT HÀNG NGANG, nhưng đổi cách xếp BÊN TRONG mỗi ô: biểu tượng lên
   trên, chữ canh giữa. Giữ nguyên kiểu "biểu tượng trái – chữ phải" ở bề ngang này thì mỗi ô
   chỉ còn ~128px mà phần chữ ăn mất 46px cho biểu tượng, chữ nằm trong 60px — đó chính là
   cách bản cũ làm vỡ chữ giữa từ. Xếp dọc bên trong thì chữ được trọn bề ngang của ô.
   Cỡ chữ hạ theo: tên 13.5px (dài nhất "Kinh nghiệm" vẫn gọn một dòng), mô tả 11.5px kẹp
   ĐÚNG HAI DÒNG bằng line-clamp — kẹp cứng nên ba ô luôn cao bằng nhau, câu có dài thêm
   cũng không đẩy một ô cao vổng lên. Mũi tên bỏ đi: ô hẹp thế này không còn chỗ cho nó. */
@media (max-width: 991px) {
  .gd3-loi-tat { gap: 10px; }
  .gd3-lt-o  { flex-direction: column; align-items: center; text-align: center;
    gap: 8px; padding: 13px 8px; border-radius: 13px; }
  .gd3-lt-ic { width: 40px; height: 40px; font-size: 17px; border-radius: 12px; }
  .gd3-lt-chu { align-items: center; gap: 1px; width: 100%; }
  .gd3-lt-chu b  { font-size: 13.5px; }
  /* text-wrap: balance chia đều chữ cho hai dòng. Không có nó thì trình duyệt nhồi đầy dòng
     trên rồi vứt phần thừa xuống, ra kiểu "Xem hàng đang giảm / giá" — rơi đúng một chữ xuống
     dòng dưới, nhìn như lỗi. Trình duyệt cũ không hiểu thì bỏ qua, chữ vẫn hiện bình thường. */
  .gd3-lt-chu em { font-size: 11.5px; line-height: 1.35; text-wrap: balance;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
  .gd3-lt-mui { display: none; }
}
/* Máy hẹp dưới 400px (iPhone SE/mini): mỗi ô chỉ còn ~96px, hạ thêm một nấc cho tên khỏi vỡ dòng. */
@media (max-width: 399px) {
  .gd3-loi-tat { gap: 8px; }
  .gd3-lt-o  { padding: 11px 5px; }
  .gd3-lt-ic { width: 36px; height: 36px; font-size: 15px; border-radius: 10px; }
  .gd3-lt-chu b  { font-size: 12.5px; }
  .gd3-lt-chu em { font-size: 11px; }
}

/* --- Nút trên banner: nền nhấn thì chữ phải TRẮNG mới đủ tương phản --- */
.gd3-bn-nut { background: var(--aw-chu); color: var(--aw-tren-chu); }
.gd3-bn:hover .gd3-bn-nut { background: var(--aw-nhan); color: var(--aw-tren-nhan); }

/* --- Nhãn trả góp trên thẻ sản phẩm --- */
.product-item .note-installment { background-color: var(--aw-nhan); color: var(--aw-tren-nhan); }
.product-item .note-installment:after { border-left-color: var(--aw-nhan); }
.product-item:hover .note-installment { background-color: var(--aw-chu); color: var(--aw-tren-chu); }
.product-item:hover .note-installment:after { border-left-color: var(--aw-chu); }

/* --- Nút "Xem tất cả" --- */
.btn-see-all-products { border: 1px solid var(--aw-ke); }
.btn-see-all-products:hover { background-color: var(--aw-chu); color: var(--aw-tren-chu); }

/* --- Ruy băng giảm giá: đỏ tươi gradient -> đỏ trầm phẳng --- */
.product-item .sale { background-image: none; background-color: var(--aw-giam); color: var(--aw-tren-nhan); }

/* --- Tab / chip đang chọn: nền nhấn + chữ trắng --- */
.tab-news-social-item.active,
.col-category-news.active,
.gd3-goiy-tatca:hover, .gd3-goiy-tatca.is-chon { background: var(--aw-nhan); color: var(--aw-tren-nhan); }
.tab-news-social-item.active::after { border-bottom-color: var(--aw-nhan); }

/* --- Thanh dưới cùng trên mobile: nền vàng -> trắng + kẻ mảnh --- */
.gd3-thanh-day { background: var(--aw-the); border-top: 1px solid var(--aw-ke); }
.gd3-thanh-day a, .gd3-thanh-day button { color: var(--aw-chu); }
.gd3-thanh-day .is-active, .gd3-thanh-day a:hover { color: var(--aw-nhan); }

/* --- Menu trượt mobile: đầu menu nền vàng -> nền nhấn chữ trắng --- */
.gd3-menu-truot-dau { background: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-menu-truot-dau button { color: var(--aw-tren-nhan); }

/* --- Menu xổ xuống: nền hover vàng nhạt -> kem nhấn --- */
.list-dropdown-mega ul li a:hover { background: var(--aw-nhan-nhat); color: var(--aw-nhan-dam); }

/* --- Ô ảnh trống: xám lạnh -> kem ấm --- */
.gd3-khong-anh { background: var(--aw-nen-2); color: var(--aw-ke-dam); }

/* --- Nút next/pre của băng chuyền: trắng đục -> trắng + kẻ 1px cho ra dáng --- */
.swiper-button-prev, .swiper-button-next {
  background-color: rgba(255,255,255,.94); border: 1px solid var(--aw-ke); color: var(--aw-chu); }
.swiper-button-prev:hover, .swiper-button-next:hover {
  background-color: var(--aw-chu); border-color: var(--aw-chu); color: var(--aw-tren-chu); }
.swiper-button-prev:hover:after, .swiper-button-next:hover:after { color: var(--aw-tren-chu); }

/* --- Nút next/pre ở cuối thanh menu PC ---
   Trước đây rê chuột vào là ô đổi hẳn sang nền đen chữ trắng: một ô đen 28px nhảy ra
   giữa thanh menu sáng, vừa nặng vừa chuyển tức thì vì không có thời gian chuyển tiếp.
   Nay chỉ hé màu thương hiệu: nền hồng rất nhạt, viền và mũi tên chuyển sang đỏ logo. */
.gd3-main-menu-nav {
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-phu);
  transition: background-color .18s ease, border-color .18s ease, color .18s ease; }
.gd3-main-menu-nav:hover {
  background: var(--aw-nhan-nhat); border-color: var(--aw-nhan-vien); color: var(--aw-nhan); }
.gd3-main-menu-nav:active { background: var(--aw-nhan-vien); color: var(--aw-nhan-dam); }
.gd3-main-menu-nav:focus-visible {
  outline: 2px solid var(--aw-nhan); outline-offset: 2px; color: var(--aw-nhan); }
/* hết đường trượt thì mờ đi và không phản ứng nữa — đang bật hay tắt phải nhìn là biết */
.gd3-main-menu-nav.is-disabled,
.gd3-main-menu-nav[disabled] {
  opacity: .35; pointer-events: none; }

/* menu-mobile.css đặt màu CỨNG cho mũi tên: `.gd3-main-menu-nav i { color: … }`.
   Vì vậy đổi `color` ở NÚT không bao giờ tới được mũi tên — đây đúng là chỗ hỏng của
   kiểu rê chuột cũ: nền đảo sang đen mà mũi tên vẫn giữ màu tối, nhìn như mất luôn.
   Muốn đổi màu mũi tên thì phải nhắm thẳng vào thẻ <i>. */
.gd3-main-menu-nav i { color: var(--aw-chu-phu); transition: color .18s ease; }
.gd3-main-menu-nav:hover i,
.gd3-main-menu-nav:focus-visible i { color: var(--aw-nhan); }
.gd3-main-menu-nav:active i { color: var(--aw-nhan-dam); }

/* --- 3 ảnh nền VÀNG dạng raster của theme gốc: bỏ hẳn, thay bằng thẻ + kẻ 1px.
       (bg-top-products.png, bg-product-see-multiple.png, bg-submenu.png vẫn
        nằm trong assets/gd3/images nếu sau này muốn quay lại) --- */
.block-products.block-top-products {
  background-image: none; background-color: var(--aw-the); border: 1px solid var(--aw-ke); }
.block-products.block-products-see-multiple {
  background-image: none; background-color: var(--aw-nen-2); border: 1px solid var(--aw-ke); }
/* tiêu đề khối này vốn màu trắng vì nằm trên ảnh tối -> nay nền sáng, phải đổi */
.block-product-title.block-products-title-see-multiple { color: var(--aw-chu); }
.menu-item-dropdown .list-dropdown {
  background-image: none; background-color: var(--aw-the);
  border: 1px solid var(--aw-ke); border-top: 2px solid var(--aw-nhan);
  box-shadow: 0 14px 30px rgba(31,26,26,.10); }

/* ==========================================================================
   SLIDER TRANG CHỦ
   Cuộn ngang bằng scroll-snap của trình duyệt — không Swiper, không jQuery.
   Mỗi slide rộng đúng 100% khung, nhờ đó scrollLeft / clientWidth = số thứ tự slide,
   JS ở cuối home.php chỉ việc nhân/chia, không phải đo từng phần tử.
   ========================================================================== */
.aw-slider { position: relative; overflow: hidden; background: var(--aw-nen-2); }
.aw-slider-dai { display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; -ms-overflow-style: none; }
.aw-slider-dai::-webkit-scrollbar { display: none; }
.aw-slide { flex: 0 0 100%; scroll-snap-align: start; display: block; line-height: 0; }
.aw-slide img { width: 100%; height: auto; display: block; }

/* nút trái/phải: ẩn cho tới khi rê chuột vào, để ảnh được yên khi không dùng */
.aw-slider-nut { position: absolute; top: 50%; transform: translateY(-50%); z-index: 3;
  width: 42px; height: 42px; border-radius: 50%; border: 1px solid var(--aw-ke);
  background: rgba(255,255,255,.92); color: var(--aw-chu); cursor: pointer;
  display: grid; place-items: center; font-size: 15px;
  opacity: 0; transition: opacity .2s, background .2s, color .2s; }
.aw-slider:hover .aw-slider-nut, .aw-slider-nut:focus-visible { opacity: 1; }
.aw-slider-nut:hover { background: var(--aw-chu); border-color: var(--aw-chu); color: var(--aw-tren-chu); }
.aw-slider-truoc { left: 14px; }
.aw-slider-sau { right: 14px; }

.aw-slider-cham { position: absolute; left: 0; right: 0; bottom: 14px; z-index: 3;
  display: flex; justify-content: center; gap: 7px; }
.aw-slider-cham button { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255,255,255,.6); cursor: pointer; transition: width .2s, background .2s; }
.aw-slider-cham button.is-chon { width: 24px; border-radius: 4px; background: #fff; }

@media (max-width: 767px) {
  /* trên điện thoại vuốt tay là đủ, bỏ nút cho khỏi che ảnh */
  .aw-slider-nut { display: none; }
  .aw-slider-cham { bottom: 8px; }
}

/* ==========================================================================
   NỀN TẢNG BĂNG CHUYỀN (thay swiper-bundle.min.css + swiper-custom.css)
   Hai file vendor đó nặng 20,9KB nhưng cả trang chỉ ăn ~15 rule, mà phần lớn
   lại bị swiper-custom đè lại ngay. Giữ nguyên tên class .swiper* để markup và
   các rule cũ trong main.css không phải sửa, nhưng bỏ hẳn 2 file.
   KHÔNG có Swiper JS: dải trượt chạy bằng overflow-x + scroll-snap (khối ở đầu file).
   ========================================================================== */
.wrap-swiper { position: relative; }
.swiper { position: relative; width: 100%; height: auto; margin-inline: auto;
  overflow: hidden; list-style: none; padding: 0; z-index: 1; }
.swiper-wrapper { position: relative; z-index: 1; display: flex; width: 100%; height: 100%;
  box-sizing: content-box; }
.swiper-slide { position: relative; flex-shrink: 0; width: 100%; height: 100%; }

.swiper-button-prev, .swiper-button-next {
  position: absolute; top: 50%; z-index: 10; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  width: 38px; height: 70px; margin-top: -35px; transform: translateY(-12px);
  border-radius: 5px; font-size: 15px; }
.swiper-button-prev { left: -15px; }
.swiper-button-next { right: -15px; }
/* Swiper gốc vẽ mũi tên bằng font riêng ở ::after — mình dùng thẻ <i> của
   FontAwesome nên phải chặn, nếu không sẽ hiện 2 mũi tên chồng nhau. */
.swiper-button-prev::after, .swiper-button-next::after { content: ""; display: none; }
@media (min-width: 992px) {
  .swiper-button-prev { left: -38px; }
  .swiper-button-next { right: -38px; }
}

/* ==========================================================================
   THANH ĐẦU TRANG KHI CUỘN
   Header là position:sticky nên lúc cuộn nó chồng lên nội dung. Ở đỉnh trang thì
   để phẳng, chỉ có đường kẻ 1px — sạch, đúng chất bảng màu này. Vừa rời đỉnh thì
   đổ bóng để tách khỏi nền, nếu không chữ và ảnh trôi bên dưới sẽ dính vào nó.
   Lớp `aw-da-cuon` do site.js gắn lên thẻ <html> (chỉ báo trạng thái, không áp đặt
   hình thức) — giao diện khác muốn làm kiểu khác thì tự viết CSS của mình.
   Đổ bóng đặt ở .header-fixed-top chứ không ở .bg-main: đường kẻ của .bg-main là
   vách ngăn giữa ô tìm kiếm và thanh menu bên dưới, không phải mép đáy của header.
   ========================================================================== */
/* ==========================================================================
   DẢI CAM KẾT ĐẦU TRANG (.gd3-camket-*) — 22/09/2026

   Thay cho tấm ảnh banner-dau-*.jpg. Xem chú thích trong layout.php để biết vì sao
   bỏ ảnh (tóm tắt: chữ in vào pixel thì mờ, máy đọc màn hình không đọc được, và
   lời hứa SAI nằm trong ảnh thì phải vẽ lại ảnh mới sửa được).

   Nằm NGOÀI <header> nên nó cuộn đi mất — không ăn một ly nào của thanh dính.
   Nhờ thế mới dám cho nó cao 38–44px thay vì 24px như tấm ảnh cũ.
   ========================================================================== */
.gd3-camket { background: var(--aw-chu); color: var(--aw-tren-chu); padding: 10px 0; }
.gd3-camket-hang {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
    gap: 6px 28px;
}
.gd3-camket-muc {
    display: inline-flex; align-items: center; gap: 8px;
    font-size: 12.5px; letter-spacing: .01em; white-space: nowrap;
}
.gd3-camket-muc i { font-size: 13px; color: var(--aw-nhan-sang); }
.gd3-camket-muc b { font-weight: 600; }
.gd3-camket-ngan { display: none; }   /* bản chữ ngắn, chỉ bật ở khổ điện thoại */

/* Ở khổ 375 cả ba mục không nằm vừa MỘT hàng. Cho nó xuống hai hàng (flex-wrap) thay
   vì thu nhỏ chữ tới mức không đọc nổi — đó đúng là lỗi của tấm ảnh cũ. Hai hàng chữ
   đọc được trông chắc chắn hơn một hàng chữ mờ. */
@media (max-width: 767px) {
    .gd3-camket { padding: 9px 0; }
    .gd3-camket-hang { gap: 0 16px; flex-wrap: nowrap; }   /* nowrap: một hàng, không xuống dòng */
    .gd3-camket-muc { font-size: 11.5px; gap: 6px; }
    .gd3-camket-muc i { font-size: 12px; }
    .gd3-camket-dai { display: none; }
    .gd3-camket-ngan { display: inline; }
    /* Mục "phụ" nhường chỗ ở khổ hẹp — xem lý do chọn mục nào ở layout.php.
       Đo ở 375: hai mục còn lại chiếm ~300px trong 351px lòng trang, vừa một hàng. */
    .gd3-camket-phu { display: none; }
}

/* ==========================================================================
   ĐẦU TRANG Ở KHỔ ĐIỆN THOẠI: HAI HÀNG — 22/09/2026

   Đo bản cũ ở khổ 375: ô NHẬP tìm kiếm rộng đúng 37px. Không phải chật — là hỏng:
   gõ vào không đọc được chữ mình vừa gõ, thực tế chỉ còn cái kính lúp bấm được.
   Nguyên nhân: bốn thứ (☰, logo 146px, ô tìm, giỏ) chia nhau 375px trên MỘT hàng.

   Cách sửa rẻ nhất và chắc nhất: cho cột tìm kiếm xuống HÀNG RIÊNG bằng
   flex-basis 100% + order 10. Không đụng một dòng HTML nào — mà điều đó quan trọng:
   ô tìm kiếm chỉ được phép có MỘT bản trong trang, vì JS gợi ý bám vào #input-search
   và bảng gợi ý định vị theo .gd3-tk. Chép thêm một ô nữa cho màn hẹp là trùng id,
   và là hai chỗ phải sửa song song mãi mãi.
   ========================================================================== */
@media (max-width: 991px) {
    .header-fixed-top .container-head > .row { row-gap: 9px; }

    /* Cột chứa ô tìm kiếm: xuống hàng dưới, chiếm trọn bề ngang. order 10 để nó
       đứng SAU giỏ hàng dù trong HTML nó đứng trước. */
    .col-flex-5-xl-down {
        flex: 0 0 100% !important; max-width: 100% !important; order: 10;
    }
    .gd3-header-flex-zone, .gd3-header-search-block { width: 100%; flex: 1 1 auto; }

    /* Cao 44px = ngưỡng vùng chạm tối thiểu, và đủ để chữ 15px không bị bóp.
       15px cũng là ngưỡng iOS KHÔNG tự phóng to trang khi bấm vào ô nhập. */
    .header-fixed-top .input-group-search { height: 44px; }
    .header-fixed-top #input-search { font-size: 15px; }

    /* KHÔNG cho cột logo nở (flex: 1 1 auto). Thử rồi: nó ăn hết chỗ còn lại của hàng
       trên, đẩy giỏ hàng rớt xuống nằm cạnh ô tìm kiếm, còn logo thì dạt sang mép phải.
       Để nguyên 0 0 auto thì ba thứ tự giãn đều nhờ justify-content-between của hàng:
       ☰ bên trái — logo ở giữa — giỏ bên phải, đúng kiểu đầu trang điện thoại quen thuộc. */

    /* Giỏ hàng: 23x20 là dưới mọi ngưỡng vùng chạm. Nới ô bấm ra 44x44 mà KHÔNG
       phóng to biểu tượng; chấm số phải kéo vào trong vì nó neo theo góc ô bấm,
       ô to ra thì nó văng ra xa biểu tượng. */
    .gd3-cart-link-mb {
        display: inline-flex; align-items: center; justify-content: center;
        width: 44px; height: 44px; font-size: 21px;
    }
    .gd3-cart-link-mb .gd3-cart-badge { top: 3px; right: 1px; }
}

/* ĐẦU TRANG GỌN KHI CUỘN (26/09/2026) — lớp .gd3-dau-gon do layout.php bật khi rời đỉnh trang
   (có hai ngưỡng chống co giãn, xem chú thích ở đó). Theo mẫu chủ shop chụp ở các trang lớn:
   MỘT hàng ☰ · ô tìm (máy ảnh vẫn nằm trong ô) · giỏ, logo tạm ẩn. Lúc đang cuộn khách cần
   tìm và giỏ hàng, không cần nhìn lại logo; hai hàng cũ ăn ~110px của màn 812px.
   Chỉ khổ ≤ 991px: máy tính đầu trang vốn đã một hàng.
   Không thêm HTML: vẫn đúng một ô #input-search (JS gợi ý bám vào nó). */
@media (max-width: 991px) {
    .gd3-dau-gon .header-fixed-top .bg-main { padding-top: 6px !important; padding-bottom: 6px !important; }
    .gd3-dau-gon .header-fixed-top .container-head > .row { flex-wrap: nowrap; row-gap: 0; }
    .gd3-dau-gon .header-fixed-top .gd3-header-brand-col { display: none !important; }
    /* Ô tìm về hàng trên, nằm GIỮA ☰ và giỏ, ăn hết chỗ còn lại. */
    .gd3-dau-gon .header-fixed-top .col-flex-5-xl-down {
        flex: 1 1 auto !important; max-width: none !important; width: auto !important;
        order: 0; min-width: 0; padding-left: 4px; padding-right: 4px;
    }
    /* Cột giỏ hàng là .col (flex 1) — để nguyên thì nó chia đôi bề ngang với ô tìm. */
    .gd3-dau-gon .header-fixed-top .gd3-header-mobileright-col {
        flex: 0 0 auto !important; width: auto !important; max-width: none !important; padding-left: 0;
    }
    .gd3-dau-gon .header-fixed-top .input-group-search { height: 40px; }
}

/* Đường kẻ đáy LÚC CHƯA CUỘN: trước đây đầu trang trắng đặt ngay trên ảnh băng-rôn
   sáng màu, hai mảng dính vào nhau thành một vùng không rõ đâu là đầu trang. Lúc cuộn
   thì đã có bóng đổ (luật ngay dưới) nên kẻ này chỉ lo phần đứng yên. */
.header-fixed-top { border-bottom: 1px solid var(--aw-ke); }
.header-fixed-top { transition: box-shadow .22s ease; }
.aw-da-cuon .header-fixed-top { box-shadow: 0 6px 20px rgba(31, 26, 26, .11); }

@media (prefers-reduced-motion: reduce) {
  .header-fixed-top { transition: none; }
}

/* ==========================================================================
   FONT TIÊU ĐỀ
   main.css đặt `* { font-family }` cho MỌI phần tử, nên font không còn thừa kế
   xuống con — chỉ nhắm vào thẻ tiêu đề thì chữ nằm trong <span>/<a> của nó vẫn
   rơi ngược về font nội dung. Vì vậy phải liệt kê cả `X *`.
   `:is()` có độ đặc hiệu bằng lớp (0,1,0) nên thắng `*` (0,0,0).
   ========================================================================== */
/* Bootstrap có sẵn `body { font-family: var(--bs-body-font-family) }`. Selector `body`
   (0,0,1) thắng `*` của theme (0,0,0) nên body vẫn chạy bằng bộ font của Bootstrap —
   hai nguồn sự thật cho cùng một thứ. Ghi đè để chỉ còn một. */
body { font-family: var(--aw-font-than); }

:is(h1, h2, h3, h4, h5, h6,
    .block-product-title, .block-sub-product-title, .section-sub-title,
    .gd3-lt-chu b, .gd3-chan-tit, .gd3-ten-site),
:is(h1, h2, h3, h4, h5, h6,
    .block-product-title, .block-sub-product-title, .section-sub-title,
    .gd3-lt-chu b, .gd3-chan-tit, .gd3-ten-site) :not(i, svg, [class*="fa-"]) {
  font-family: var(--aw-font-tieu-de);
}
/* `:not(i, svg, [class*="fa-"])` chứ KHÔNG phải `*` — đây là chỗ đã nuốt mọi biểu tượng
   nằm trong tiêu đề. `.fa-solid` của Font Awesome nặng (0,1,0); `:is(…) *` cũng đúng (0,1,0)
   vì dấu sao không cộng gì, mà style.css nạp SAU all.min.css nên cùng điểm thì file sau thắng:
   cái <i> bị kéo về font chữ tiêu đề, còn glyph Font Awesome là mã vùng riêng (\f221…) nên
   Roboto vẽ ra ô rỗng rộng 5px. Nhìn qua tưởng "thiếu icon", thật ra icon có mà không có
   font để vẽ. Đây cũng là lý do cái xe đạp gán sai ở khối danh mục sống sót lâu thế: nó
   chưa bao giờ hiện lên để ai kịp thấy là sai. */

/* ==========================================================================
   CHỖ THỞ CHO DẤU TIẾNG VIỆT TRÊN CHỮ HOA
   Chữ hoa có dấu chồng hai tầng — Ề Ế Ộ Ố Ữ Ự Ằ Ắ — cao hơn chữ hoa trơn khá
   nhiều, và mức cao thêm KHÁC NHAU THEO FONT. Đo ở cỡ 40px, nét chữ vượt lên trên
   so với chữ không dấu:  Roboto +9px · Georgia +9px · Tahoma +11px · Inter +14px
   · Merriweather +14px · Be Vietnam Pro +15px · Lora +16px · Playfair +18px.
   Theme gốc canh hộp dòng vừa khít Roboto, nên đổi sang font có dấu cao hơn là
   phần ngọn dấu bị khối cha (overflow:hidden) cắt mất — đúng lỗi đã gặp ở tiêu đề
   "SẢN PHẨM MUA NHIỀU" với Lora.
   Không sửa bằng cách loại font, mà nới hộp dòng cho font nào cũng đủ chỗ.
   ĐỪNG hạ hai giá trị này xuống khi thấy tiêu đề "hơi thưa".
   ========================================================================== */
:is(h1, h2, h3, h4, h5, h6,
    .block-product-title, .block-sub-product-title, .section-sub-title,
    .gd3-lt-chu b, .gd3-chan-tit, .gd3-ten-site) {
  line-height: 1.45;
  padding-top: .18em;
}

/* ==========================================================================
   CHỮ TRÊN LỚP PHỦ ĐÈ LÊN ẢNH
   Mấy nhãn này nằm trên rgba(0,0,0,.68) — một mặt nền TỐI CỐ ĐỊNH, không đổi theo
   bảng màu. Nên chữ phải luôn sáng. Đã đo: bảng nền tối cho ra chữ #2D191A trên nền
   đen -> 1.27:1, gần như vô hình.
   ========================================================================== */
.gd3-card-badge, .gd3-card-badge b, .gd3-card-badge i,
.gd3-nw-dm, .gd3-ssbar-bo { color: var(--aw-tren-anh); }
.gd3-card-badge.is-video i, .gd3-card-badge.is-album i, .gd3-card-badge.is-360 i { color: var(--aw-tren-anh); }

/* Nút "Xem thêm": ghi rõ cặp nền/chữ thay vì để nó thừa hưởng lung tung — bảng nền tối
   từng cho ra chữ xám trên nền xám (1.24:1). */
.btn-see-all-products { background-color: var(--aw-the); color: var(--aw-chu); border: 1px solid var(--aw-ke); }
.btn-see-all-products span, .btn-see-all-products b { color: inherit; }
.btn-see-all-products:hover { background-color: var(--aw-chu); color: var(--aw-tren-chu); }
.btn-see-all-products:hover span, .btn-see-all-products:hover b { color: inherit; }

/* Pill "Gọi mua hàng" trong header dùng .bg-white-opacity-03 = trắng 62%. Với bảng nền
   tối thì nền pill sáng gần trắng mà chữ cũng sáng -> 1.83:1, gần như không đọc được.
   Đổi sang một lớp nền ăn theo bảng màu: nhạt ở bảng nền sáng, tối ở bảng nền tối.
   style.css nạp SAU main.css nên cùng độ ưu tiên là đủ, không cần !important. */
.bg-white-opacity-03 { background-color: var(--aw-nhan-nhat); }

/* ==========================================================================
   TRANG DANH SÁCH SẢN PHẨM  (/products · danh mục · /brand/<slug> · ?q=)
   Một khuôn cho cả bốn lối vào — xem ghi chú đầu themes/giao-dien-2/products.php.
   ========================================================================== */
.gd3-ds { padding: 14px 0 28px; }

/* --- đường dẫn phân cấp --- */
.gd3-ds-duong { display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  font-size: 12.5px; color: var(--aw-chu-phu); margin-bottom: 12px; }
.gd3-ds-duong a { color: var(--aw-chu-phu); text-decoration: none; }
.gd3-ds-duong a:hover { color: var(--aw-nhan); }
.gd3-ds-duong i { font-size: 9px; color: var(--aw-ke-dam); }
.gd3-ds-duong [aria-current] { color: var(--aw-chu); font-weight: 600; }

/* --- đầu trang: tên + số lượng (+ logo hãng nếu đang xem một hãng) --- */
.gd3-ds-dau { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 4px; }
.gd3-ds-dau-chu { flex: 1 1 260px; min-width: 0; }
.gd3-ds-h1 { margin: 0; font-size: 26px; font-weight: 800; color: var(--aw-chu); }
.gd3-ds-dem { margin: 2px 0 0; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-ds-dem b { color: var(--aw-chu); }
/* Ô logo cố định 72×56 và ảnh `contain`: logo hãng cái ngang cái dọc, thả tự do thì mỗi
   trang thương hiệu một chiều cao đầu trang khác nhau. */
.gd3-ds-logo { flex: none; width: 72px; height: 56px; display: grid; place-items: center;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 10px; padding: 6px; }
.gd3-ds-logo img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.gd3-ds-bo { flex: none; display: inline-flex; align-items: center; gap: 6px; font-size: 13px;
  padding: 7px 13px; border-radius: 999px; text-decoration: none;
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-2); }
.gd3-ds-bo:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); }
/* --- mô tả hãng / danh mục (26/09/2026) — xem ghi chú "TRÌNH BÀY MÔ TẢ" ở themes/…/products.php.
   Đầu trang chỉ còn CÂU DẪN (1 câu, ≤170 ký tự) + "Đọc thêm"; toàn văn xuống khung cuối trang. */
.gd3-ds-mota { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: var(--aw-chu-phu); max-width: 72ch; }
/* "Đọc thêm": màu CHỮ ĐẬM của trang + gạch chân mảnh, KHÔNG đỏ (chủ shop 26/09: đỏ đậm
   nổi quá, lấn cả câu dẫn). Đỏ logo để dành cho giá và nút mua; ở đây chỉ cần nhận ra được
   là chữ bấm — gạch chân làm việc đó. Rê chuột mới chuyển đỏ. */
.gd3-ds-mota-them { white-space: nowrap; font-weight: 600; color: var(--aw-chu-2); margin-left: 2px;
  text-decoration: underline; text-decoration-color: var(--aw-ke-dam); text-decoration-thickness: 1px; text-underline-offset: 3px; }
.gd3-ds-mota-them i { font-size: 10px; color: var(--aw-chu-phu); }

/* Khung "Về …" cuối trang: mặt thẻ trắng như thẻ sản phẩm, chữ 15px/1.75 và tối đa 70 ký tự
   một dòng — cỡ đọc dễ nhất. Chia đoạn 2 câu một: khối chữ liền 18 dòng là thứ khiến trang
   trông "dài và xấu", cùng chữ ấy chia đoạn có khoảng thở thì đọc được. */
.gd3-ds-gt { margin: 32px 0 8px; padding: 20px 20px 14px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 14px; scroll-margin-top: 120px; }
.gd3-ds-gt-dau { margin: 0 0 12px; font-size: 19px; font-weight: 800; color: var(--aw-chu); }
.gd3-ds-gt-dau::after { content: ""; display: block; width: 36px; height: 3px; margin-top: 8px;
  border-radius: 2px; background: var(--aw-nhan); }
.gd3-ds-gt-chu p { margin: 0 0 12px; font-size: 15px; line-height: 1.75; color: var(--aw-chu-2); max-width: 70ch; }
.gd3-ds-gt-chu p:last-child { margin-bottom: 4px; }
/* Thu gọn (chỉ khi > 2 đoạn): cắt ở ~7 dòng, mép dưới mờ dần vào nền thẻ để biết còn chữ. */
.gd3-ds-gt--gon .gd3-ds-gt-chu { position: relative; max-height: 13.2em; overflow: hidden; }
.gd3-ds-gt--gon .gd3-ds-gt-chu::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 4.5em;
  background: linear-gradient(to bottom, rgba(255, 255, 255, 0), var(--aw-the)); pointer-events: none; }
.gd3-ds-gt-tich:checked ~ .gd3-ds-gt-chu,
.gd3-ds-gt:target .gd3-ds-gt-chu { max-height: none; }
.gd3-ds-gt-tich:checked ~ .gd3-ds-gt-chu::after,
.gd3-ds-gt:target .gd3-ds-gt-chu::after { display: none; }
.gd3-ds-gt:target .gd3-ds-gt-nut { display: none; }   /* tới từ "Đọc thêm" → đã mở sẵn */
.gd3-ds-gt-nut { display: inline-flex; align-items: center; gap: 6px; margin-top: 6px; min-height: 44px;
  font-size: 14px; font-weight: 700; color: var(--aw-nhan); cursor: pointer; user-select: none; }
.gd3-ds-gt-nut i { font-size: 12px; }
.gd3-ds-gt-dong { display: none; }
.gd3-ds-gt-tich:checked ~ .gd3-ds-gt-nut .gd3-ds-gt-mo { display: none; }
.gd3-ds-gt-tich:checked ~ .gd3-ds-gt-nut .gd3-ds-gt-dong { display: inline; }
@media (hover: hover) {
  .gd3-ds-gt-nut:hover { color: var(--aw-nhan-dam); }
  .gd3-ds-mota-them:hover { color: var(--aw-nhan); text-decoration-color: currentColor; }
}
@media (max-width: 575.98px) {
  .gd3-ds-gt { padding: 16px 16px 10px; margin-top: 24px; }
  .gd3-ds-gt-dau { font-size: 17px; }
  .gd3-ds-gt-chu p { font-size: 14.5px; }
}

/* --- chip lọc danh mục --- */
.gd3-ds-chip { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 16px; }
/* Trên điện thoại chip CUỘN NGANG một hàng thay vì xuống dòng. Danh mục "Bao Cao Su" có 10 chip,
   bọc dòng ở 430px là 4 hàng ~180px — đẩy sản phẩm đầu tiên xuống dưới màn hình, khách mở trang
   danh mục mà chưa thấy món hàng nào. Mọi chip vẫn nằm trong HTML, chỉ là trượt ngang mới thấy.
   Giấu thanh cuộn: dải chỉ cao 36px, thanh cuộn hệ thống chiếm gần nửa từng đó. */
@media (max-width: 767px) {
  .gd3-ds-chip { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    margin-inline: -12px; padding-inline: 12px; scroll-padding-left: 12px; }
  .gd3-ds-chip::-webkit-scrollbar { display: none; }
  .gd3-chip { flex: none; }
}
.gd3-chip { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px;
  font-size: 13.5px; line-height: 1.3; border-radius: 999px; text-decoration: none;
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-2);
  transition: border-color .15s, color .15s, background-color .15s; }
.gd3-chip.on { background: var(--aw-nhan); border-color: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-chip-lui { color: var(--aw-chu-phu); }
.gd3-chip i { font-size: 10px; }
@media (hover: hover) { .gd3-chip:not(.on):hover { border-color: var(--aw-nhan-vien); color: var(--aw-nhan); background: var(--aw-nhan-nhat); } }

/* --- lưới sản phẩm ---
   auto-fill + minmax thay vì khai cứng số cột cho từng mốc màn hình: thêm một cỡ màn mới
   là lưới tự chia, không phải đẻ thêm media query. 150px là bề rộng nhỏ nhất mà thẻ sản
   phẩm còn đọc được tên và giá (đo ở 320px: vừa đúng 2 cột). */
.gd3-sp-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(206px, 1fr)); gap: 14px; }
@media (max-width: 767px) { .gd3-sp-luoi { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; } }
/* Dưới 576px KHAI CỨNG 2 cột. Để auto-fill thì ở 320px (iPhone SE cũ) hai thẻ 150px cộng khe
   10px thành 310px, vượt 296px lòng khung một chút xíu — lưới lập tức rụng xuống CÒN MỘT CỘT,
   mỗi món chiếm trọn bề ngang. Chênh 14px mà đổi hẳn bố cục, và chỉ lộ ra ở máy hẹp nhất. */
@media (max-width: 575px) { .gd3-sp-luoi { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } }
.gd3-sp-luoi .gd3-sp-o { background: var(--aw-the); border: 1px solid var(--aw-ke);
  border-radius: 12px; margin: 0; padding-top: 12px;
  transition: border-color .16s, box-shadow .16s, transform .16s; }
@media (hover: hover) {
  .gd3-sp-luoi .gd3-sp-o:hover { border-color: var(--aw-nhan-vien);
    box-shadow: 0 8px 22px rgba(31, 26, 26, .09); transform: translateY(-2px); }
}

/* --- phân trang --- */
/* ---- phân trang ----
   Ô 44px chứ không 38: đây là chỗ bấm cuối cùng của một trang danh sách dài, bấm hụt
   là phải cuộn lại từ đầu. 44px là ngưỡng vùng chạm tối thiểu.
   Nút Trước/Sau luôn chiếm chỗ (hết thì .tat làm mờ) — xem lý do ở pager_html(). */
.gd3-phantrang { display: flex; flex-wrap: wrap; justify-content: center; align-items: center;
  gap: 8px; margin: 30px 0 0; }

/* flex: 0 0 100% nên dòng này tự chiếm trọn một hàng, không cần thẻ bọc riêng —
   nhờ thế cấu trúc phẳng của pager_html() dùng chung được cho cả admin. */
.gd3-phantrang .pg-dem { flex: 0 0 100%; margin: 0 0 2px; text-align: center;
  font-size: 13px; color: var(--aw-chu-phu); }
.gd3-phantrang .pg-dem b { color: var(--aw-chu); font-weight: 700; }

.gd3-phantrang a, .gd3-phantrang > span { min-width: 44px; height: 44px; padding: 0 12px;
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  border-radius: 12px; font-size: 15px; font-weight: 600; text-decoration: none; }
.gd3-phantrang a { background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-2);
  transition: border-color .15s, color .15s, background .15s; }
@media (hover: hover) {
  .gd3-phantrang a:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
}
@media (prefers-reduced-motion: reduce) { .gd3-phantrang a { transition: none; } }

.gd3-phantrang .on { background: var(--aw-nhan); color: var(--aw-tren-nhan); font-weight: 800;
  box-shadow: 0 4px 12px rgba(216, 18, 18, .26); }
.gd3-phantrang .gap { color: var(--aw-chu-phu); min-width: 20px; padding: 0; }

/* Hết đường thì MỜ chứ không biến mất: hàng nút giữ nguyên chỗ giữa các trang. */
.gd3-phantrang .tat { border: 1px solid var(--aw-ke); background: var(--aw-nen-2);
  color: var(--aw-ke-dam); }

.gd3-phantrang .pg-lui, .gd3-phantrang .pg-toi { padding: 0 16px; }
.gd3-phantrang .pg-lui i, .gd3-phantrang .pg-toi i { font-size: 13px; }

/* Khổ hẹp: giấu chữ "Trước"/"Sau", giữ nguyên ô 44px. Đo ở 375 với 5 trang:
   44*5 + 20 + gaps = 324px, vừa trong 351px lòng trang. */
@media (max-width: 575px) {
  .gd3-phantrang { gap: 6px; }
  .gd3-phantrang .pg-chu { display: none; }
  .gd3-phantrang .pg-lui, .gd3-phantrang .pg-toi { padding: 0 12px; }
}

/* ---- "Xem thêm sản phẩm" ở TRANG KẾT QUẢ TÌM (thay cho phân trang) ----
   Nút rộng, cao 50px, nằm giữa: đây là hành động duy nhất ở cuối một danh sách dài,
   không phải một nút trong dãy nút. Kèm số "24 / 110 sản phẩm" để khách biết còn
   bao nhiêu nữa — thiếu con số đó thì bấm mà không biết bấm tới bao giờ. */
.gd3-them { display: flex; flex-direction: column; align-items: center; gap: 10px; margin-top: 30px; }
.gd3-them-dem { margin: 0; font-size: 13.5px; color: var(--aw-chu-phu); }
.gd3-them-dem b { color: var(--aw-chu); font-weight: 700; }
.gd3-them-nut {
    display: inline-flex; align-items: center; justify-content: center; gap: 9px;
    min-width: min(280px, 100%); height: 50px; padding: 0 28px;
    border: 1px solid var(--aw-nhan-vien); border-radius: 999px;
    background: var(--aw-the); color: var(--aw-nhan);
    font-size: 15px; font-weight: 700; text-decoration: none;
    transition: background .15s, border-color .15s;
}
.gd3-them-nut i { font-size: 13px; }
@media (hover: hover) {
    .gd3-them-nut:hover { background: var(--aw-nhan); border-color: var(--aw-nhan); color: var(--aw-tren-nhan); }
}
@media (prefers-reduced-motion: reduce) { .gd3-them-nut { transition: none; } }
/* Đang tải: mờ + chặn bấm tiếp, nhưng KHÔNG đổi kích thước nút (chữ "Đang tải…" ngắn
   hơn "Xem thêm sản phẩm") — min-width giữ nút đứng yên để ngón tay không hụt. */
.gd3-them.dang-tai .gd3-them-nut { opacity: .6; pointer-events: none; }

/* --- không có kết quả --- */
.gd3-ds-rong { display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 8px; padding: 46px 20px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 14px; }
.gd3-ds-rong > i { font-size: 30px; color: var(--aw-ke-dam); margin-bottom: 4px; }
.gd3-ds-rong b { font-size: 16px; color: var(--aw-chu); }
.gd3-ds-rong span { font-size: 13.5px; color: var(--aw-chu-phu); max-width: 46ch; line-height: 1.6; }
.gd3-ds-nut { margin-top: 8px; display: inline-flex; align-items: center; padding: 10px 20px;
  border-radius: 999px; background: var(--aw-nhan); color: var(--aw-tren-nhan);
  font-size: 14px; font-weight: 600; text-decoration: none; }
.gd3-ds-nut:hover { background: var(--aw-nhan-dam); color: var(--aw-tren-nhan); }

@media (max-width: 575px) {
  .gd3-ds-h1 { font-size: 21px; }
  .gd3-ds { padding: 10px 0 22px; }
}

/* ==========================================================================
   TRANG KHUYẾN MÃI  (/khuyen-mai)
   Dùng lại .gd3-sp-luoi / .gd3-chip / .gd3-phantrang / .gd3-ds-rong của trang danh sách —
   hai trang cùng bày một dãy sản phẩm thì không có lý do gì dựng hai bộ lưới khác nhau.
   ========================================================================== */
/* Dải đầu trang: nền đỏ rất nhạt chứ KHÔNG phải nền đỏ đặc. Đỏ đặc trải hết bề ngang sẽ
   nuốt mất màu nhấn của chính các nhãn "Giảm 38%" trên thẻ sản phẩm ngay bên dưới. */
.gd3-km-dau { background: linear-gradient(180deg, var(--aw-nhan-nhat), var(--aw-nen));
  border-bottom: 1px solid var(--aw-nhan-vien); padding: 14px 0 22px; margin-bottom: 20px; }
.gd3-km-duong { margin-bottom: 10px; }
.gd3-km-h1 { margin: 0; font-size: 30px; font-weight: 800; color: var(--aw-chu);
  display: flex; align-items: center; gap: 11px; }
.gd3-km-h1 i { font-size: 24px; color: var(--aw-nhan); }
.gd3-km-phu { margin: 6px 0 0; font-size: 14px; color: var(--aw-chu-phu); }

.gd3-km-so { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.gd3-km-so-o { flex: 1 1 170px; background: var(--aw-the); border: 1px solid var(--aw-nhan-vien);
  border-radius: 13px; padding: 13px 16px; }
.gd3-km-so-o b { display: block; font-size: 23px; font-weight: 800; color: var(--aw-nhan); line-height: 1.2; }
.gd3-km-so-o span { display: block; margin-top: 2px; font-size: 12.5px; color: var(--aw-chu-phu); }

.gd3-km-tit { display: flex; align-items: center; gap: 9px; font-size: 18px; font-weight: 800;
  color: var(--aw-chu); margin: 0 0 13px; }
.gd3-km-tit i { color: var(--aw-nhan); font-size: 16px; }
.gd3-km-top, .gd3-km-dm { margin-bottom: 26px; }
/* Khối "giảm sâu nhất" luôn 6 món một hàng trên màn rộng: đây là khối ĐIỂM NHẤN, để nó tự
   chia theo auto-fill thì có màn ra 5 món lẻ một chỗ trống, nhìn như thiếu hàng. */
@media (min-width: 1200px) { .gd3-km-luoi-top { grid-template-columns: repeat(6, minmax(0, 1fr)); } }

.gd3-km-dm-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; }
.gd3-km-dm-o { display: block; padding: 13px 15px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 12px; text-decoration: none;
  transition: border-color .15s, box-shadow .15s, transform .15s; }
.gd3-km-dm-o b { display: block; font-size: 14.5px; font-weight: 700; color: var(--aw-chu); }
.gd3-km-dm-o span { display: block; margin-top: 2px; font-size: 12.5px; color: var(--aw-nhan); font-weight: 600; }
@media (hover: hover) {
  .gd3-km-dm-o:hover { border-color: var(--aw-nhan-vien); transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(31, 26, 26, .08); }
}

/* Thanh lọc: chip mức giảm bên trái, ô sắp xếp bên phải. */
.gd3-km-loc { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
.gd3-km-chip { flex: 1 1 320px; margin: 0; }
.gd3-km-chip-bo { border-color: var(--aw-nhan); color: var(--aw-nhan); background: var(--aw-the); font-weight: 600; }
.gd3-km-chip-bo i { font-size: 11px; margin-left: 2px; }
.gd3-km-chip-bo:hover { background: var(--aw-nhan-nhat); }
.gd3-km-dem { margin: 0 0 14px; }

.gd3-km-sx { position: relative; flex: none; }
/* <summary> mặc định có tam giác của trình duyệt — bỏ đi, đã có mũi tên riêng. Phải khai cả
   list-style lẫn ::-webkit-details-marker: Safari cũ chỉ nghe cái thứ hai. */
.gd3-km-sx-nut { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px;
  font: inherit; font-size: 13.5px; cursor: pointer; border-radius: 999px; list-style: none;
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-2); }
.gd3-km-sx-nut::-webkit-details-marker { display: none; }
.gd3-km-sx-mui { font-size: 10px; color: var(--aw-chu-phu); transition: transform .14s; }
.gd3-km-sx[open] .gd3-km-sx-nut { border-color: var(--aw-nhan); color: var(--aw-nhan); }
.gd3-km-sx[open] .gd3-km-sx-mui { transform: rotate(180deg); color: var(--aw-nhan); }
/* Việc ẨN/HIỆN để NGUYÊN cho <details> lo — không khai thêm visibility/opacity ở đây.
   Bản trước tôi khai `visibility:hidden` rồi mở lại bằng `.gd3-km-sx[open] ...`, tức là dựng
   tầng ẩn THỨ HAI chồng lên tầng ẩn sẵn có của <details>. Thừa, và khi nó hỏng thì bảng không
   bao giờ mở ra dù thẻ details đã `open` — đúng lỗi vừa gặp, mất một lúc mới lần ra vì nhìn
   CSS thì thấy hoàn toàn hợp lý. Ít tầng thì ít chỗ hỏng.
   Hiệu ứng trượt xuống dùng animation chứ không transition: phần tử chỉ tồn tại khi đã mở,
   nên animation chạy đúng một lần lúc xuất hiện, không cần trạng thái "đang đóng" nào cả. */
.gd3-km-sx-bang { position: absolute; right: 0; top: calc(100% + 6px); z-index: 30; min-width: 200px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 12px; padding: 6px;
  box-shadow: 0 14px 30px rgba(31, 26, 26, .12); animation: gd3-xo-xuong .14s ease; }
@keyframes gd3-xo-xuong { from { opacity: 0; transform: translateY(-4px); } }
@media (prefers-reduced-motion: reduce) { .gd3-km-sx-bang { animation: none; } }
.gd3-km-sx-bang a { display: block; padding: 8px 11px; border-radius: 8px; font-size: 13.5px;
  color: var(--aw-chu-2); text-decoration: none; white-space: nowrap; }
.gd3-km-sx-bang a:hover { background: var(--aw-nhan-nhat); color: var(--aw-nhan); }
.gd3-km-sx-bang a.on { background: var(--aw-nhan); color: var(--aw-tren-nhan); font-weight: 600; }

@media (max-width: 767px) {
  .gd3-km-h1 { font-size: 22px; } .gd3-km-h1 i { font-size: 19px; }
  .gd3-km-so-o { flex: 1 1 calc(50% - 5px); padding: 11px 13px; }
  .gd3-km-so-o b { font-size: 19px; }
  .gd3-km-tit { font-size: 16px; }
  .gd3-km-dm-luoi { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Ô sắp xếp xuống hàng riêng và trải hết bề ngang — nhét cạnh dải chip đang cuộn ngang
     thì ngón tay vuốt chip rất dễ chạm nhầm vào nó. */
  .gd3-km-sx { width: 100%; }
  .gd3-km-sx-nut { width: 100%; justify-content: space-between; }
  .gd3-km-sx-bang { left: 0; right: 0; }
}

/* ---- Dải ưu đãi trên đầu trang khuyến mãi ----
   Hai ô ĐIỀU KIỆN MUA (freeship, quà tặng) viền đỏ nền trắng để nổi hẳn; ô năng lực phục vụ
   để trung tính. Ba ô cùng một sắc đỏ thì chẳng ô nào nổi, mà thứ khách cần thấy trước là
   hai cái có ngưỡng tiền. */
.gd3-km-uudai { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 12px; }
.gd3-km-ud-o { display: flex; align-items: flex-start; gap: 11px; padding: 13px 15px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 13px; }
.gd3-km-ud-manh { border-color: var(--aw-nhan-vien); box-shadow: 0 2px 10px rgba(216, 18, 18, .06); }
.gd3-km-ud-ic { flex: none; width: 40px; height: 40px; display: grid; place-items: center;
  border-radius: 11px; background: var(--aw-nen-2); color: var(--aw-chu-2); font-size: 16px; }
.gd3-km-ud-manh .gd3-km-ud-ic { background: var(--aw-nhan-nhat); color: var(--aw-nhan); }
.gd3-km-ud-chu { min-width: 0; }
.gd3-km-ud-chu b  { display: block; font-size: 14.5px; font-weight: 700; color: var(--aw-chu); line-height: 1.3; }
.gd3-km-ud-chu em { display: block; margin-top: 3px; font-style: normal; font-size: 12.5px;
  line-height: 1.45; color: var(--aw-chu-phu); }
/* Ngưỡng tiền gạch chân mảnh thay vì bôi đỏ: đây là CON SỐ phải nhớ, không phải lời rao. */
.gd3-km-ud-chu u { color: var(--aw-chu); font-weight: 700; text-decoration-color: var(--aw-nhan-vien);
  text-underline-offset: 2px; }

/* ---- Hỏi đáp cuối trang ---- */
.gd3-km-hoidap { padding: 6px 0 30px; }
.gd3-km-hd-luoi { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; align-items: start; }
.gd3-km-hd { background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 12px; }
.gd3-km-hd > summary { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 13px 16px; cursor: pointer; list-style: none; font-size: 14.5px; font-weight: 600;
  color: var(--aw-chu); }
.gd3-km-hd > summary::-webkit-details-marker { display: none; }
.gd3-km-hd > summary i { flex: none; font-size: 12px; color: var(--aw-chu-phu); transition: transform .14s; }
.gd3-km-hd[open] > summary i { transform: rotate(180deg); color: var(--aw-nhan); }
.gd3-km-hd[open] { border-color: var(--aw-nhan-vien); }
.gd3-km-hd p { margin: 0; padding: 0 16px 14px; font-size: 13.5px; line-height: 1.65; color: var(--aw-chu-2); }
.gd3-km-hd p a { color: var(--aw-nhan); font-weight: 600; text-decoration: none; }
.gd3-km-hd p a:hover { text-decoration: underline; }

/* ---- Lối gọi người thật, chốt trang ---- */
.gd3-km-goi { display: flex; align-items: center; justify-content: space-between; gap: 16px;
  flex-wrap: wrap; margin-top: 16px; padding: 18px 22px; border-radius: 14px;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); }
.gd3-km-goi b { display: block; font-size: 16px; color: var(--aw-chu); }
.gd3-km-goi span { display: block; margin-top: 3px; font-size: 13px; color: var(--aw-chu-phu); }
/* align-items: stretch chứ không center — hai nút cạnh nhau có nhịp đệm khác nhau nên lệch
   nhau 2px (41 vs 43); stretch cho cái thấp cao bằng cái cao, không phải gõ min-height bằng
   một con số sẽ lệch lại ngay lần đổi cỡ chữ sau. Bên trong mỗi nút vẫn inline-flex căn giữa
   nên chữ không bị kéo lệch. */
.gd3-km-goi-nut { display: flex; align-items: stretch; gap: 10px; flex-wrap: wrap; }
.gd3-km-goi-nut .gd3-ds-nut { margin-top: 0; gap: 8px; }
.gd3-km-goi-phu { display: inline-flex; align-items: center; gap: 8px; padding: 10px 18px;
  border-radius: 999px; font-size: 14px; font-weight: 600; text-decoration: none;
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-2); }
.gd3-km-goi-phu:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); }

@media (max-width: 991px) { .gd3-km-uudai { grid-template-columns: 1fr; } }
@media (max-width: 767px) {
  .gd3-km-hd-luoi { grid-template-columns: 1fr; }
  .gd3-km-goi { flex-direction: column; align-items: stretch; text-align: center; }
  .gd3-km-goi-nut { justify-content: center; }
}

/* ---- Ba mã giảm giá, dạng vé xé ----
   Hai vết khuyết tròn + nét đứt giữa hai nửa: hình dáng nói luôn "đây là phiếu giảm giá",
   khỏi cần chú thích. Vết khuyết vẽ bằng radial-gradient chứ không phải hai thẻ con —
   thêm thẻ chỉ để làm hai chấm tròn là rác markup, và trình đọc màn hình đọc phải chúng. */
.gd3-km-ma { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; }
.gd3-km-ma-o { display: flex; align-items: stretch; border-radius: 13px; overflow: hidden;
  background: var(--aw-the); border: 1px solid var(--aw-nhan-vien); position: relative; }
.gd3-km-ma-o::before, .gd3-km-ma-o::after {
  content: ""; position: absolute; left: 92px; width: 14px; height: 7px; background: var(--aw-nhan-nhat); }
.gd3-km-ma-o::before { top: -1px; border-radius: 0 0 14px 14px; border-bottom: 1px solid var(--aw-nhan-vien); }
.gd3-km-ma-o::after  { bottom: -1px; border-radius: 14px 14px 0 0; border-top: 1px solid var(--aw-nhan-vien); }
.gd3-km-ma-trai { flex: none; width: 92px; display: flex; flex-direction: column; align-items: center;
  justify-content: center; padding: 12px 6px; background: var(--aw-nhan-nhat);
  border-right: 1px dashed var(--aw-nhan-vien); }
.gd3-km-ma-trai b { font-size: 24px; font-weight: 800; line-height: 1; color: var(--aw-nhan); }
.gd3-km-ma-trai span { margin-top: 2px; font-size: 11.5px; color: var(--aw-chu-phu); }
/* Nửa phải xếp NGANG: chữ bên trái, nút sao chép dạt hẳn sang phải. Bản trước xếp dọc nên
   nút nằm nép bên trái và bỏ trống gần nửa tấm vé — nhìn như thẻ bị cắt mất nội dung. */
.gd3-km-ma-phai { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px 12px;
  padding: 11px 14px; flex-wrap: wrap; }
/* flex-wrap + bề rộng cơ sở 120px thay cho một mốc màn hình đoán bừa: nút tự xuống hàng đúng
   lúc phần chữ không còn đủ chỗ, chứ không phải đúng lúc màn hình hẹp hơn một con số tôi bịa.
   Đặt mốc cứng 479px thì ở 430px — bề ngang mà xếp ngang vẫn vừa — vé bị kéo cao vô cớ. */
.gd3-km-ma-chu { flex: 1 1 120px; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.gd3-km-ma-nhan { font-size: 11px; letter-spacing: .04em; text-transform: uppercase; color: var(--aw-chu-phu); }
/* Ngưỡng tiền KHÔNG được ngắt dòng: "Đơn từ 10.000.000 ₫" mà vỡ làm ba dòng thì vừa xấu vừa
   khó đọc đúng con số — và ba vé lập tức cao lệch nhau vì ngưỡng dài ngắn khác nhau. */
.gd3-km-ma-dk { font-style: normal; font-size: 12.5px; color: var(--aw-chu-phu); white-space: nowrap; }
.gd3-km-ma-dk b { color: var(--aw-chu); font-weight: 700; }
/* Mã dùng font đều nét: O và 0, I và 1 phải phân biệt được — khách gõ lại hoặc đọc qua điện thoại. */
.gd3-km-ma-code { font-family: var(--aw-font-ma, ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace);
  font-size: 17px; font-weight: 700; letter-spacing: .06em; color: var(--aw-chu); }
.gd3-km-ma-chep { flex: none; display: inline-flex; align-items: center; gap: 6px; padding: 7px 13px;
  font: inherit; font-size: 12px; cursor: pointer; border-radius: 999px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); color: var(--aw-chu-phu); }
.gd3-km-ma-chep:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); }
.gd3-km-ma-chep.xong { border-color: var(--aw-nhan); background: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-km-ma-note { display: flex; align-items: flex-start; gap: 7px; margin: 9px 0 0;
  font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }
.gd3-km-ma-note i { margin-top: 3px; color: var(--aw-ke-dam); }

@media (max-width: 991px) {
  .gd3-km-ma { grid-template-columns: 1fr; }
  /* Nới nút sao chép trên máy cảm ứng: 28px là vừa mắt nhưng hụt so với đầu ngón tay, bấm
     hụt một hai lần là khách bỏ luôn ý định chép mã. */
  .gd3-km-ma-chep { padding: 8px 14px; font-size: 13px; }
}

/* ==========================================================================
   TRANG CHI TIẾT SẢN PHẨM
   Dùng lại .gd3-ds-duong / .gd3-chip / .gd3-km-tit / .gd3-km-hd / .gd3-ds-nut / .gd3-sp-o
   của các trang đã có — cùng một website thì không dựng hai bộ nút, hai kiểu chip.
   ========================================================================== */
.gd3-sp { padding: 14px 0 30px; }
/* KHUNG TRANG CHI TIẾT CHẶN Ở 1200px.
   Khung chung của web gần như tràn viền — ở màn 1366 nó rộng 1327px, chỉ chừa 12px mỗi bên.
   Với các khối xếp dọc thì không sao, nhưng hàng trên của trang này là HAI CỘT có ảnh VUÔNG:
   ảnh phải có trần chiều rộng (không thì ở 1366 nó thành hình vuông 759px, cao hơn cả màn),
   mà có trần thì phần dư 199px rơi hết vào khe giữa — khai báo khe 28px nhưng đo ra 227px.
   Nhìn ra là ảnh dạt hẳn sang trái, khối mua dạt hẳn sang phải, giữa là một dải trống chạy dọc.

   Chặn khung rồi căn giữa thì phần dư ra NẰM Ở HAI MÉP NGOÀI đều nhau — mắt đọc là lề trang,
   không phải khe hở. Chặn ở .gd3-sp nên MỌI khối của trang này cùng lùi vào một mức, không có
   khối nào lệch so với khối nào. Dưới 1200px không đổi gì.
   Thanh mua dính đáy cũng chặn theo cho thẳng hàng với nội dung. */
/* !important ở đây KHÔNG phải làm ẩu: main.css có sẵn `.container { max-width: unset !important }`
   (luật cũ để ép khung tràn viền). Đã có !important ở phía kia thì luật thường không bao giờ
   thắng, dù viết cụ thể đến đâu. Bộ chọn này cụ thể hơn (.gd3-sp > .container) nên giữa hai
   luật cùng !important thì nó thắng — và chỉ tác động đúng trang chi tiết, không đụng trang khác. */
.gd3-sp > .container, .gd3-sp-thanh > .container { max-width: 1200px !important; margin-inline: auto; }
/* HAI CỘT trên màn rộng: thư viện | mua hàng.
   Trước đây có cột thứ ba đựng hộp "Cần tư vấn thêm?"; hộp đó đã dọn xuống sau khối hỏi đáp
   (xem .gd3-km-goi), nên giữ cột thứ ba là chừa một khoảng trống 300px.

   CHỖ DỄ SAI: bỏ cột thứ ba rồi để cột mua hàng ăn 1fr thì ở màn 1280 nó rộng 697px và hai
   nút "Thêm vào giỏ" / "Mua ngay" mỗi cái 344px — dài gần gang tay, trông như banner chứ
   không ra nút. Nên ĐẢO LẠI: cột mua hàng có TRẦN 540px, cột ảnh ăn phần dư.
   Ảnh cũng có trần 560px (ở .gd3-sp-anh) — không có trần thì ở màn rộng ảnh vuông phình cao
   hơn cả màn hình. Phần dư còn lại rơi vào KHE GIỮA hai cột, nên hai mép ngoài vẫn thẳng
   hàng với các khối bên dưới; nếu cho dư ra mép phải thì thành một lỗ trống lệch. */
.gd3-sp-tren { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 540px);
  gap: 28px; align-items: start; }
@media (max-width: 1199px) {
  .gd3-sp-tren { grid-template-columns: minmax(0, 1fr) minmax(0, 440px); gap: 22px; }
}

/* ---- Thư viện ảnh: đổi ảnh bằng radio ẩn, KHÔNG JavaScript ----
   Radio đứng ngay trước mỗi khung ảnh nên chọn được bằng bộ chọn anh em `+`. Nhờ vậy bàn phím
   và trình đọc màn hình dùng được sẵn, và trang vẫn đổi ảnh khi JS lỗi hoặc bị chặn. */
.gd3-sp-radio { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
/* min-width:0 ở cả hai tầng bọc: cận dưới của ô lưới đã mở, nhưng nếu thẻ bọc bên trong vẫn
   giữ bề rộng nội dung nhỏ nhất thì nó lại đẩy ngược ra. */
/* Trần ảnh 600px: trong khung 1200 thì 600 + khe 28 + cột mua 540 = 1168, vừa kín hàng nên
   không còn phần dư nào để biến thành khe. */
.gd3-sp-anh { min-width: 0; max-width: 600px; }
.gd3-sp-xem { position: relative; min-width: 0; }
.gd3-sp-boc { position: relative; min-width: 0; }
.gd3-sp-khung { min-width: 0; }
.gd3-sp-anh-lon { display: none; position: relative; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 14px; overflow: hidden; aspect-ratio: 1 / 1; }
/* Thư viện CHỈ CÓ MỘT ô thì nó luôn hiện. Bắt buộc `:only-child`, không phải `:first-child`:
   luật `#gd3spK:checked ~ … :nth-child(K)` (sinh theo từng sản phẩm, trong product.php) chỉ
   được sinh khi có từ hai ô trở lên, nên ô một phải tự lo lấy mình — nhưng viết `:first-child`
   thì ô 1 hiện ĐÈ LÊN cả ô đang chọn, bấm ảnh thứ tư ra hai ảnh chồng nhau (đã dẫm 23/09/2026,
   bắt được lúc đo ở khổ 1366). */
.gd3-sp-khung > .gd3-sp-anh-lon:only-child { display: block; }

/* ---- VUỐT TRÁI/PHẢI trên điện thoại (23/09/2026) ----
   Trước đó thư viện chỉ đổi ảnh bằng cách bấm ô nhỏ — đúng thói quen máy tính, sai hẳn thói
   quen điện thoại: ai cũng vuốt trước rồi mới tìm nút. Ở đây mọi ô cùng hiện, xếp ngang, để
   trình duyệt tự cuộn và tự "cắn" đúng ô (scroll-snap) — cuộn của hệ điều hành bao giờ cũng
   mượt hơn mọi thứ tự viết bằng JS, và không tốn pin.
   `.gd3-sp-vuot` do JS gắn, KHÔNG viết thẳng vào media query: tắt JS thì dải ảnh nhỏ vẫn là
   cách đổi ảnh duy nhất và nó chạy y như cũ, chứ không rơi vào cảnh vuốt được mà bấm ô nhỏ
   thì không thấy gì đổi. */
@media (max-width: 991px) {
  .gd3-sp-vuot .gd3-sp-khung { display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
    scrollbar-width: none; -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain; }
  .gd3-sp-vuot .gd3-sp-khung::-webkit-scrollbar { display: none; }
  /* !important để thắng luật sinh theo sản phẩm (nó đặt display cho đúng MỘT ô). */
  .gd3-sp-vuot .gd3-sp-khung > .gd3-sp-anh-lon { display: block !important;
    flex: 0 0 100%; scroll-snap-align: center; }
}
/* Số ô đang xem — chỉ hiện khi vuốt được. Không có nó thì khách không biết còn ảnh phía sau:
   ô lớn chiếm trọn bề ngang nên không hé ra mép ảnh kế tiếp như các dải cuộn khác. */
.gd3-sp-dem { position: absolute; right: 10px; bottom: 10px; z-index: 2; padding: 3px 10px;
  border-radius: 999px; background: rgba(0, 0, 0, .55); color: #fff;
  font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; pointer-events: none; }
.gd3-sp-anh-lon > img, .gd3-sp-anh-lon > video { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-sp-video { background: #000; }
.gd3-sp-khong { display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 8px; color: var(--aw-ke-dam); font-size: 13px; }
.gd3-sp-khong i { font-size: 34px; }
.gd3-sp-giam { position: absolute; top: 12px; left: 12px; padding: 5px 11px; border-radius: 999px;
  background: var(--aw-nhan); color: var(--aw-tren-nhan); font-size: 13px; font-weight: 800; }

/* Dải ảnh nhỏ cuộn ngang: 12 ảnh mà bọc dòng thì đẩy cột phải tụt xuống cả màn hình. */
.gd3-sp-dai { display: flex; gap: 8px; margin-top: 10px; scroll-behavior: smooth; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
.gd3-sp-dai::-webkit-scrollbar { display: none; }
.gd3-sp-nho { flex: none; width: 72px; height: 72px; border-radius: 10px; overflow: hidden; cursor: pointer;
  background: var(--aw-the); border: 1px solid var(--aw-ke); position: relative; display: block; }
.gd3-sp-nho img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-sp-nho-video::after { content: ""; position: absolute; inset: 0; background: rgba(0,0,0,.42); }
.gd3-sp-nho-video i { position: absolute; inset: 0; display: grid; place-items: center;
  color: #fff; font-size: 17px; z-index: 1; }
/* Ảnh nhỏ nào đang được chọn thì viền đỏ. :has() để lần ngược từ radio sang label tương ứng
   là không làm được, nên dùng :checked + thứ tự — giữ đơn giản: chỉ tô khi rê và khi bấm. */
.gd3-sp-nho:hover { border-color: var(--aw-nhan); }

/* ---- Cột mua hàng ---- */
/* Một hàng cho nhãn hãng + chip danh mục, tự xuống dòng khi hết chỗ. */
.gd3-sp-nhan { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
/* Nhãn hãng và chip danh mục là MỘT CẶP, nên dùng CHUNG cả khuôn lẫn MÀU: bong bóng tròn
   26px + chữ, nền hồng nhạt --aw-nhan-nhat, viền hồng --aw-nhan-vien. Cùng cao 38px, cùng
   nằm trên một đường tim.
   Trước đây tôi để danh mục nền trung tính cho hãng nổi hơn — sai: hai thứ đứng sát nhau mà
   một hồng một xám thì đọc ra thành "một cái quan trọng, một cái thừa" chứ không ra một cặp.
   Việc phân cấp để cho CHỮ lo: tên hãng in đậm màu đỏ logo, tên danh mục chữ thường. */
.gd3-sp-hang, .gd3-sp-chip-dm { display: inline-flex; align-items: center; gap: 8px;
  padding: 5px 13px 5px 6px; border-radius: 999px; text-decoration: none;
  font-size: 13px; line-height: 1.25; color: var(--aw-chu-2);
  background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); }
/* Bong bóng: viền vẽ bằng box-shadow inset chứ không bằng border — border cộng thêm 2px vào
   kích thước (theme này không đặt box-sizing: border-box cho mọi thẻ), lệch đúng 2px là hai
   chip lệch nhau một nấc và mắt thấy ngay. */
.gd3-sp-hang img, .gd3-sp-chip-dm i { width: 26px; height: 26px; flex: none; border-radius: 50%;
  background: var(--aw-the); box-shadow: inset 0 0 0 1px var(--aw-nhan-vien); }
.gd3-sp-hang img { object-fit: contain; }
.gd3-sp-chip-dm i { display: grid; place-items: center; font-size: 12px; color: var(--aw-nhan); }
.gd3-sp-hang b { color: var(--aw-nhan); }
/* 29/09/2026 (chủ shop: "đưa về 1 hàng"): có hãng thì hàng này chỉ có 2 chip (hãng + 1 danh mục) — giữ
   MỘT HÀNG. Chip hãng giữ nguyên; chip danh mục co lại, tên dài quá thì "…" (tên đầy đủ ở title).
   Không có hãng thì vẫn tự xuống dòng như cũ (lúc đó bày nhiều danh mục). */
.gd3-sp-nhan-1 { flex-wrap: nowrap; }
.gd3-sp-nhan-1 .gd3-sp-hang { flex: none; }
.gd3-sp-nhan-1 .gd3-sp-chip-dm { flex: 0 1 auto; min-width: 0; }
.gd3-sp-nhan-1 .gd3-sp-hang span, .gd3-sp-nhan-1 .gd3-sp-chip-dm span { white-space: nowrap; }
.gd3-sp-nhan-1 .gd3-sp-chip-dm span { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
@media (max-width: 480px) {
  .gd3-sp-nhan-1 { gap: 6px; }
  .gd3-sp-nhan-1 .gd3-sp-hang, .gd3-sp-nhan-1 .gd3-sp-chip-dm { gap: 6px; padding: 4px 11px 4px 5px; font-size: 12.5px; }
}
/* @media (hover: hover): trên iOS trạng thái :hover DÍNH lại sau khi chạm, chip vừa bấm xong
   cứ đổi màu mãi cho tới khi bấm chỗ khác. */
@media (hover: hover) {
  .gd3-sp-hang:hover, .gd3-sp-chip-dm:hover { border-color: var(--aw-nhan-sang); }
}
.gd3-sp-ten { margin: 11px 0 0; font-size: 25px; font-weight: 800; line-height: 1.35; color: var(--aw-chu); }
.gd3-sp-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 18px; margin-top: 9px;
  font-size: 13px; color: var(--aw-chu-phu); }
.gd3-sp-meta b { color: var(--aw-chu); }
.gd3-sp-con { color: #1a7f4b; } .gd3-sp-het { color: var(--aw-nhan); }

.gd3-sp-gia { display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px; margin-top: 14px;
  padding: 14px 18px; background: var(--aw-nhan-nhat); border-radius: 13px; }
.gd3-sp-gia-nay { font-size: 30px; font-weight: 800; color: var(--aw-giam); line-height: 1.1; }
.gd3-sp-gia-goc { font-size: 16px; color: var(--aw-chu-phu); text-decoration: line-through; }
.gd3-sp-gia-giam { font-size: 13px; font-weight: 600; color: var(--aw-chu-2); }
.gd3-sp-tomtat { margin: 14px 0 0; font-size: 14px; line-height: 1.65; color: var(--aw-chu-2); }
/* Khung "Thông tin sản phẩm" (29/09/2026) — thay đoạn tóm tắt dính liền ở 41 món không có mô tả.
   Cùng dáng thẻ viền trắng với "Gọi tư vấn"/"Nhắn shop" ngay trên để khỏi lạc tông; mỗi mục một
   đoạn, nhãn in đậm đứng riêng một dòng nhỏ phía trên chữ. */
.gd3-sp-tt { margin: 14px 0 0; padding: 14px 16px; background: var(--aw-the); border: 1px solid var(--aw-ke);
  border-radius: 12px; }
.gd3-sp-tt-tit { margin: 0 0 8px; font-size: 15px; font-weight: 700; color: var(--aw-chu); }
.gd3-sp-tt-tit i { color: var(--aw-nhan); margin-right: 4px; }
.gd3-sp-tt-mo, .gd3-sp-tt-muc { margin: 0; font-size: 14px; line-height: 1.6; color: var(--aw-chu-2); }
.gd3-sp-tt-muc { margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--aw-ke); }
.gd3-sp-tt-muc b { display: block; margin-bottom: 2px; font-size: 13px; font-weight: 700; color: var(--aw-chu); }
/* "Xem thêm" của mô tả ngắn NẰM TRONG dòng chữ, không phải một nút riêng: nó chỉ là lối đi
   tiếp xuống khối mô tả, không phải một việc đáng cho khách cân nhắc. Làm nút viền là lại
   thêm một thứ tranh chỗ với "Thêm vào giỏ" — xem ghi chú ở .gd3-sp-motanut.
   white-space: nowrap để chữ và mũi tên không bị tách ra hai dòng. */
/* KHÔNG dùng màu đỏ: chữ này đứng cách nút "Thêm vào giỏ" chưa đầy một đốt ngón tay, để đỏ
   là mắt bị kéo về nó thay vì về nút mua. Giữ đúng màu chữ của đoạn văn, chỉ gạch chân mảnh
   cho biết bấm được — xem quy ước ở .gd3-sp-motanut: đỏ dành riêng cho hành động tiêu tiền. */
.gd3-sp-tomtat-them { white-space: nowrap; font-weight: 600; color: var(--aw-chu-2);
  text-decoration: none; border-bottom: 1px solid var(--aw-ke-dam); }
.gd3-sp-tomtat-them i { font-size: 10px; color: var(--aw-chu-phu); }
@media (hover: hover) { .gd3-sp-tomtat-them:hover { color: var(--aw-chu); border-bottom-color: var(--aw-chu-phu); } }
/* ---- Bảng thông số: BUNG TẠI CHỖ ----
   Cả trang chỉ còn MỘT bảng, nằm ngay dưới giá. Sáu dòng đầu hiện sẵn, phần còn lại ẩn sau
   ô đánh dấu — cùng một lối làm với nút "Xem thêm" của khối mô tả bên dưới, nên hai nút trên
   cùng một trang trông và bấm y như nhau (dùng lại luôn .gd3-sp-motanut).
   Trước đây luật .gd3-sp-tsk-gon đặt ở ĐÂY mà luật .gd3-sp-tsk lại đặt ở DƯỚI, hai cái cùng
   độ ưu tiên (1 lớp + 1 thẻ) nên cái dưới thắng — bảng "rút gọn" thật ra đang mặc áo của bảng
   đầy đủ suốt. Giờ một bảng một bộ luật, hết cửa lệch. */
.gd3-sp-tsk { margin-top: 14px; }
.gd3-sp-tscb { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
/* display:none rồi table-row — KHÔNG dùng visibility/height vì hàng bảng không co theo chiều
   cao, để lại một dải trắng đúng bằng số hàng ẩn. Dòng ẩn vẫn nằm trong HTML nên Google đọc đủ. */
.gd3-sp-tscb ~ .gd3-sp-tsk .gd3-sp-tsan { display: none; }
.gd3-sp-tscb:checked ~ .gd3-sp-tsk .gd3-sp-tsan { display: table-row; }
/* Nút thông số ĐƯA RA GIỮA: nó nằm giữa bảng thông số và cặp nút mua, canh trái thì nó nối
   đuôi cột chữ bên trái và đọc như một hành động chính. Ra giữa là nó tách hẳn ra, thành một
   cái "gạch nối" giữa hai khối chứ không tranh chỗ với nút nào.
   width: fit-content + margin auto — khối cấp trên tự canh giữa, không cần thêm thẻ bọc. */
/* Canh giữa nay nằm ở luật gốc .gd3-sp-motanut (cả nút thông số lẫn nút mô tả đều ra giữa),
   nên ở đây không còn gì phải đè. Lớp .gd3-sp-tsnut vẫn cần để các luật bung/thu bám vào. */
.gd3-sp-tscb ~ .gd3-sp-tsnut .gd3-thu { display: none; }
.gd3-sp-tscb:checked ~ .gd3-sp-tsnut .gd3-xem { display: none; }
.gd3-sp-tscb:checked ~ .gd3-sp-tsnut .gd3-thu { display: inline; }
.gd3-sp-tscb:checked ~ .gd3-sp-tsnut i { transform: rotate(180deg); }
/* Ô đánh dấu ẩn nên viền focus phải tự vẽ lên nhãn, không thì người dùng bàn phím lạc chỗ. */
.gd3-sp-tscb:focus-visible ~ .gd3-sp-tsnut { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }

/* Ô số lượng và hai nút mua nằm CÙNG MỘT HÀNG. Trước đây ô số lượng chiếm trọn một dòng
   riêng rồi mới tới nút — một dòng cao 46px chỉ để đựng con số "1" mà hầu hết khách không
   bao giờ đổi, lại đẩy nút mua xuống thấp thêm 58px trên màn điện thoại.
   align-items: stretch để ô số lượng cao bằng nút, hai thứ thành một khối liền mạch. */
.gd3-sp-form { margin-top: 16px; display: flex; flex-wrap: wrap; align-items: stretch; gap: 10px; }
.gd3-sp-sl { flex: none; }
/* Không còn lớp bọc .gd3-sp-nut: ô số lượng, "Thêm vào giỏ" và "Mua ngay" là ba con trực
   tiếp của .gd3-sp-form nên cùng nằm trên MỘT lưới co, xuống dòng theo ý mình đặt. */
/* Dòng "chỉ còn N sản phẩm" luôn xuống dòng riêng, không chen vào hàng nút. */
.gd3-sp-form > .gd3-sp-sap { flex: 1 1 100%; margin-top: 0; }
.gd3-sp-sl { display: inline-flex; align-items: center; border: 1px solid var(--aw-ke);
  border-radius: 999px; overflow: hidden; background: var(--aw-the); }
.gd3-sp-sl .qb { width: 40px; height: 44px; border: 0; background: none; cursor: pointer;
  font-size: 18px; color: var(--aw-chu-2); }
.gd3-sp-sl .qb:hover { background: var(--aw-nen-2); color: var(--aw-nhan); }
/* Giỏ hàng: số lượng = 1 thì nút "−" là thùng rác, màu nhấn cho khách biết bấm là bỏ món. */
.gd3-sp-sl .qb.qb-bo { font-size: 15px; color: var(--aw-nhan); }
/* Dòng hàng vừa bỏ: thu gọn êm thay vì biến mất làm cả trang giật lên. */
.gd3-gio-dong.dang-bo { opacity: 0; transform: scale(.98); transition: opacity .22s, transform .22s; }
.gd3-gio-dong.dang-cho .gd3-gio-tien { opacity: .45; transition: opacity .15s; }
.gd3-sp-sl input { width: 52px; height: 44px; border: 0; text-align: center; font: inherit;
  font-weight: 700; background: none; color: var(--aw-chu); -moz-appearance: textfield; }
.gd3-sp-sl input::-webkit-outer-spin-button, .gd3-sp-sl input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
/* white-space: nowrap để nếu chỗ THẬT SỰ không đủ thì chữ tràn ra cho thấy ngay, chứ không
   âm thầm xuống dòng làm nút cao gấp đôi mà không ai để ý. */
.gd3-sp-gio, .gd3-sp-ngay { white-space: nowrap; display: inline-flex; align-items: center; justify-content: center;
  gap: 9px; height: 50px; padding: 0 20px; border-radius: 999px; font: inherit; font-size: 15px;
  font-weight: 700; cursor: pointer; text-decoration: none; border: 1px solid transparent; }
/* "Thêm vào giỏ" ăn hết chỗ còn lại của hàng trên, cạnh ô số lượng. */
.gd3-sp-gio { flex: 1 1 140px; background: var(--aw-the); border-color: var(--aw-nhan); color: var(--aw-nhan); }
/* "MUA NGAY" CHIẾM TRỌN MỘT HÀNG RIÊNG. flex-basis 100% vừa ép nó xuống dòng mới, vừa cho nó
   kéo hết bề ngang — không cần thêm thẻ ngắt dòng nào. Đây là nút chính của cả trang: đứng
   một mình, to nhất, đỏ đặc, không có gì cạnh tranh trên cùng hàng. */
.gd3-sp-ngay { flex: 1 1 100%; }
.gd3-sp-gio:hover { background: var(--aw-nhan-nhat); }
.gd3-sp-ngay { background: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-sp-ngay:hover { background: var(--aw-nhan-dam); color: var(--aw-tren-nhan); }
.gd3-sp-sap { margin: 10px 0 0; font-size: 13px; color: var(--aw-nhan); }
/* Màn hẹp: thu ô số lượng và nhịp đệm nút lại để cả ba thứ vẫn đứng được một hàng.
   Số đo ở 406px: ô số lượng 110 + khe 10 + cụm nút 247 (mỗi nút 118) = 367. */
@media (max-width: 575px) {
  .gd3-sp-sl .qb { width: 34px; }
  .gd3-sp-sl input { width: 40px; }
  .gd3-sp-gio, .gd3-sp-ngay { padding: 0 10px; font-size: 13.5px; gap: 6px; }
  .gd3-sp-gio i, .gd3-sp-ngay i { font-size: 13px; }
}

.gd3-sp-hotro { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-top: 14px; }
.gd3-sp-ht-o { display: flex; align-items: center; gap: 11px; padding: 11px 14px; text-decoration: none;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 12px; color: var(--aw-chu); }
.gd3-sp-ht-o:hover { border-color: var(--aw-nhan); }
.gd3-sp-ht-o > i { flex: none; width: 36px; height: 36px; display: grid; place-items: center;
  border-radius: 10px; background: var(--aw-nhan-nhat); color: var(--aw-nhan); font-size: 15px; }
.gd3-sp-ht-o b { display: block; font-size: 14px; }
.gd3-sp-ht-o em { display: block; font-style: normal; font-size: 12px; color: var(--aw-chu-phu); }

.gd3-sp-uudai { list-style: none; margin: 14px 0 0; padding: 13px 16px; display: flex;
  flex-direction: column; gap: 8px; background: var(--aw-nen-2); border-radius: 12px; }
.gd3-sp-uudai li { display: flex; align-items: flex-start; gap: 9px; font-size: 13.5px;
  line-height: 1.5; color: var(--aw-chu-2); }
.gd3-sp-uudai i { margin-top: 3px; color: var(--aw-nhan); font-size: 13px; }

/* ---- Nửa dưới ---- */
/* Nửa dưới giờ chỉ còn MỘT cột: cột hỗ trợ đã chuyển lên cạnh khối mua hàng, nơi người ta
   thật sự phân vân — không phải sau khi đã đọc hết mô tả. */
.gd3-sp-duoi { margin-top: 28px; }
.gd3-sp-khoi { background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 14px;
  padding: 18px 20px; margin-bottom: 16px; }
.gd3-sp-khoi > .gd3-km-tit { margin-bottom: 14px; font-size: 17px; }
.gd3-sp-mota { font-size: 14.5px; line-height: 1.75; color: var(--aw-chu-2); }
/* Kẹp chiều cao mô tả + nút "Xem thêm", chạy bằng một ô đánh dấu ẩn — không JavaScript, nên
   tắt JS vẫn mở ra được, và bàn phím dùng được sẵn (ô đánh dấu nhận Tab và phím cách).
   Nội dung KHÔNG bị cắt khỏi HTML, chỉ bị che — Google vẫn đọc đủ. */
.gd3-sp-motacb { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
.gd3-sp-motacb ~ .gd3-sp-mota { max-height: 380px; overflow: hidden; position: relative; }
/* Dải mờ ở đáy để thấy rõ là còn nữa chứ không phải hết bài. */
.gd3-sp-motacb ~ .gd3-sp-mota::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: 86px; background: linear-gradient(to bottom, transparent, var(--aw-the)); pointer-events: none; }
.gd3-sp-motacb:checked ~ .gd3-sp-mota { max-height: none; }
.gd3-sp-motacb:checked ~ .gd3-sp-mota::after { display: none; }
/* NÚT MỞ RỘNG (thông số / mô tả) — CỐ Ý NHẠT.
   Trước đây nút này viền đỏ chữ đỏ, tức là y hệt nút "Thêm vào giỏ" đứng ngay dưới nó. Hai nút
   cùng một sức nặng thì mắt phải tự chọn, mà nút đúng phải chọn là nút mua.
   Quy ước từ đây: MÀU ĐỎ DÀNH RIÊNG cho hành động tiêu tiền (Thêm vào giỏ, Mua ngay, Gọi).
   Mọi nút chỉ để "xem thêm chữ" đều trung tính — nền chìm, viền kẻ mảnh, chữ thường. */
.gd3-sp-motanut { display: flex; width: fit-content; margin: 12px auto 2px;
  align-items: center; gap: 8px; padding: 9px 20px;
  border-radius: 999px; cursor: pointer; font-size: 14px; font-weight: 600;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); color: var(--aw-chu-2); }
/* @media (hover: hover): trên iOS hover DÍNH lại sau khi chạm, nút vừa bấm cứ đậm mãi. */
@media (hover: hover) {
  .gd3-sp-motanut:hover { border-color: var(--aw-ke-dam); color: var(--aw-chu); }
}
.gd3-sp-motanut i { font-size: 11px; transition: transform .15s; }
.gd3-sp-motanut .gd3-thu { display: none; }
.gd3-sp-motacb:checked ~ .gd3-sp-motanut .gd3-xem { display: none; }
.gd3-sp-motacb:checked ~ .gd3-sp-motanut .gd3-thu { display: inline; }
.gd3-sp-motacb:checked ~ .gd3-sp-motanut i { transform: rotate(180deg); }
/* Viền focus cho người dùng bàn phím — ô đánh dấu ẩn nên phải tự vẽ lên nhãn. */
.gd3-sp-motacb:focus-visible ~ .gd3-sp-motanut { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
.gd3-sp-mota img { max-width: 100%; height: auto; border-radius: 10px; }
.gd3-sp-mota h2, .gd3-sp-mota h3, .gd3-sp-mota h4 { font-size: 17px; margin: 18px 0 8px; color: var(--aw-chu); }
.gd3-sp-mota p { margin: 0 0 12px; }
.gd3-sp-mota table { width: 100%; border-collapse: collapse; margin: 12px 0; }
.gd3-sp-mota td, .gd3-sp-mota th { border: 1px solid var(--aw-ke); padding: 8px 10px; }

.gd3-sp-tsk { width: 100%; border-collapse: collapse; font-size: 14px; }
.gd3-sp-tsk th, .gd3-sp-tsk td { padding: 10px 12px; text-align: left; vertical-align: top;
  border-bottom: 1px solid var(--aw-ke); }
.gd3-sp-tsk tr:last-child th, .gd3-sp-tsk tr:last-child td { border-bottom: 0; }
.gd3-sp-tsk th { width: 40%; font-weight: 600; color: var(--aw-chu-phu); background: var(--aw-nen-2); }
.gd3-sp-tsk td { color: var(--aw-chu); }

.gd3-sp-lq .gd3-sp-luoi { display: grid; grid-template-columns: repeat(auto-fill, minmax(196px, 1fr)); gap: 14px; }

@media (max-width: 991px) {
  /* minmax(0, 1fr) chứ KHÔNG phải 1fr. `1fr` là viết tắt của minmax(AUTO, 1fr), mà cận dưới
     `auto` của một ô lưới bằng bề rộng nội dung nhỏ nhất của nó — dải 9 ảnh nhỏ (9×72 + 8 khe
     ×8 = ĐÚNG 712px) không chịu co, nên ở màn 391px cột vẫn giãn ra 712px và ảnh lớn tràn hẳn
     khỏi màn hình. Đặt cận dưới về 0 là ô chịu co, dải ảnh nhỏ quay lại cuộn ngang như thiết kế.
     Ở mốc ≥1200px không dính lỗi này vì tôi đã viết minmax(0, …) ngay từ đầu. */
  .gd3-sp-tren { grid-template-columns: minmax(0, 1fr); gap: 18px; }
  .gd3-sp-ten { font-size: 20px; }
  .gd3-sp-gia-nay { font-size: 25px; }
  .gd3-sp-khoi { padding: 15px 14px; }
  .gd3-sp-lq .gd3-sp-luoi { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
}
@media (max-width: 575px) {
  .gd3-sp-hotro { grid-template-columns: 1fr; }
  .gd3-sp-tsk th { width: 46%; }
}

/* ---- Mục lục dính trong trang chi tiết ----
   Trang dài 3–4 màn; không có mục lục thì muốn xem Thông số phải cuộn mò qua cả khối mô tả.
   z-index 20: dưới bảng xổ của menu (30) nhưng trên nội dung thường. */
/* Dính DƯỚI đầu trang, không phải ở top:0 — đầu trang cũng position:sticky và cao 104px ở
   màn rộng, nên để top:0 là mục lục chui hẳn ra sau nó (đã dính đúng lỗi này).
   Chiều cao đầu trang do JS đo và đặt vào --gd3-dau-cao, vì nó khác nhau theo bề ngang (104px
   từ 992px trở lên vì có thêm thanh menu, 63px ở dưới mức đó) và sẽ còn đổi mỗi lần sửa đầu
   trang. Số trong var() chỉ là đường lui khi JS không chạy. */
.gd3-sp-mucluc { position: sticky; top: var(--gd3-dau-cao, 63px); z-index: 20; display: flex; gap: 4px; overflow-x: auto;
  scrollbar-width: none; margin: 24px 0 14px; padding: 6px; border-radius: 999px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); }
.gd3-sp-mucluc::-webkit-scrollbar { display: none; }
.gd3-sp-mucluc a { flex: none; padding: 8px 16px; border-radius: 999px; font-size: 13.5px;
  font-weight: 600; color: var(--aw-chu-2); text-decoration: none; white-space: nowrap; }
.gd3-sp-mucluc a:hover { background: var(--aw-nhan-nhat); color: var(--aw-nhan); }
/* Chừa chỗ cho CẢ đầu trang LẪN thanh mục lục khi nhảy tới một mục, không thì tiêu đề khối
   nhảy lên nằm ngay sau hai thứ đang dính ở trên và bị che mất. */
.gd3-sp-khoi[id] { scroll-margin-top: calc(var(--gd3-dau-cao, 63px) + 62px); }
@media (min-width: 992px) { .gd3-sp-mucluc { top: var(--gd3-dau-cao, 104px); }
  .gd3-sp-khoi[id] { scroll-margin-top: calc(var(--gd3-dau-cao, 104px) + 62px); } }

.gd3-km-tit .gd3-sp-xemthem { margin-left: auto; font-size: 13px; font-weight: 600;
  color: var(--aw-nhan); text-decoration: none; }
.gd3-km-tit .gd3-sp-xemthem:hover { text-decoration: underline; }

/* ---- Thanh mua hàng dính đáy (chỉ từ 992px) ---- */
.gd3-sp-thanh { position: fixed; left: 0; right: 0; bottom: 0; z-index: 40; padding: 10px 0;
  background: var(--aw-the); border-top: 1px solid var(--aw-ke);
  box-shadow: 0 -6px 24px rgba(31, 26, 26, .10); }
.gd3-sp-thanh[hidden] { display: none; }
.gd3-sp-thanh .container { display: flex; align-items: center; gap: 14px; }
.gd3-sp-thanh-anh { flex: none; width: 44px; height: 44px; border-radius: 9px; overflow: hidden;
  border: 1px solid var(--aw-ke); background: var(--aw-the); }
.gd3-sp-thanh-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-sp-thanh-ten { flex: 1; min-width: 0; font-size: 14.5px; font-weight: 600; color: var(--aw-chu);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gd3-sp-thanh-gia { flex: none; font-size: 19px; font-weight: 800; color: var(--aw-giam); }
/* Trong thanh dính đáy, "Mua ngay" đứng cạnh tên + giá nên phải co về đúng cỡ chữ của nó —
   đè lại flex: 1 1 100% của luật chung, nếu không nó đẩy tên và giá văng khỏi thanh. */
.gd3-sp-thanh .gd3-sp-ngay { flex: 0 0 auto; height: 44px; }
@media (max-width: 991px) { .gd3-sp-thanh { display: none; } }

/* Nháy nút "Mua ngay" thật sau khi cuộn từ thanh đáy lên — để mắt biết phải bấm vào đâu. */
@keyframes gd3-nhay { 0%,100% { box-shadow: 0 0 0 0 rgba(216,18,18,.5); } 50% { box-shadow: 0 0 0 9px rgba(216,18,18,0); } }
.gd3-sp-ngay.gd3-nhay { animation: gd3-nhay .6s ease 2; }
@media (prefers-reduced-motion: reduce) { .gd3-sp-ngay.gd3-nhay { animation: none; } }

/* ==========================================================================
   TRANG GIỎ HÀNG (/cart.php)
   Dùng lại nguyên các khuôn đã có: .gd3-ds-duong (đường dẫn), .gd3-sp-sl (ô số lượng),
   .gd3-sp-ngay (nút chính), .gd3-km-goi-phu (nút phụ) — cùng một web thì không dựng
   hai bộ nút, hai kiểu ô số lượng.
   ========================================================================== */
.gd3-gio { padding: 14px 0 34px; }
.gd3-gio-dau { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.gd3-gio-dem { font-size: 14px; color: var(--aw-chu-phu); }

/* Lời nhắn sau thao tác (lối dự phòng khi không có JS).
   KHÔNG dùng flex ở đây. Flex biến MỌI thẻ con thành một cột: câu "…phải đúng <b>cả hai</b>,
   và số điện thoại…" liền bị xé ra, chữ "cả hai" nhảy sang một cột riêng bên phải còn phần
   sau nó tụt xuống. Dán biểu tượng bằng position:absolute rồi chừa lề trái — chữ bên trong
   flow bình thường, muốn in đậm hay chèn link ở giữa câu đều được. */
.gd3-gio-nhan { position: relative; margin: 0 0 14px; padding: 11px 15px 11px 40px;
  border-radius: 12px; font-size: 14px; line-height: 1.5; }
.gd3-gio-nhan > i:first-child { position: absolute; left: 15px; top: 14px; }
.gd3-gio-nhan-ok { background: #E9F6EF; border: 1px solid #BFE3D0; color: #14653C; }
.gd3-gio-nhan-loi { background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); color: var(--aw-nhan-dam); }

/* ---- Giỏ rỗng: không phải trang lỗi, nên vẫn có lối đi tiếp ---- */
.gd3-gio-rong { text-align: center; padding: 46px 18px 54px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 16px; }
.gd3-gio-rong > i { font-size: 46px; color: var(--aw-ke-dam); }
.gd3-gio-rong h1 { margin: 16px 0 6px; font-size: 22px; font-weight: 800; color: var(--aw-chu); }
.gd3-gio-rong p { margin: 0 auto 20px; max-width: 420px; font-size: 14.5px; line-height: 1.65; color: var(--aw-chu-phu); }
.gd3-gio-rong-nut { display: flex; flex-wrap: wrap; align-items: stretch; justify-content: center; gap: 10px; }
.gd3-gio-rong-nut .gd3-sp-ngay { flex: 0 0 auto; }

/* ---- Khung hai cột: danh sách | tổng kết ---- */
.gd3-gio-khung { display: grid; grid-template-columns: minmax(0, 1fr) 352px; gap: 20px; align-items: start; }

/* ---- Một dòng hàng ----
   Lưới đặt tên vùng thay vì đếm cột: ở màn rộng năm thứ nằm ngang, ở màn hẹp chúng xếp lại
   hoàn toàn khác — đặt tên thì chỗ nào đi đâu đọc ra ngay, không phải dò số thứ tự. */
.gd3-gio-dong { display: grid; gap: 4px 14px; align-items: center;
  grid-template-columns: 88px minmax(0, 1fr) auto auto 34px;
  grid-template-areas: "anh chu sl tien bo";
  padding: 14px; margin-bottom: 12px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 14px; }
.gd3-gio-anh { grid-area: anh; display: block; width: 88px; height: 88px; border-radius: 10px;
  overflow: hidden; background: var(--aw-nen-2); }
.gd3-gio-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-gio-chu { grid-area: chu; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.gd3-gio-ten { font-size: 15px; font-weight: 700; line-height: 1.4; color: var(--aw-chu); text-decoration: none; }
.gd3-gio-sku { font-size: 12.5px; color: var(--aw-chu-phu); }
.gd3-gio-dongia { font-size: 13.5px; color: var(--aw-chu-2); }
.gd3-gio-dongia del { margin-left: 6px; color: var(--aw-chu-phu); }
.gd3-gio-moi { color: var(--aw-chu-phu); }
.gd3-gio-canh { font-size: 12.5px; color: var(--aw-nhan); }
.gd3-gio-sl { grid-area: sl; display: flex; flex-direction: column; align-items: center; gap: 5px; }
/* Nút "Cập nhật" CHỈ dành cho người tắt JS — có JS thì ô số tự nộp khi đổi, nút này thành thừa.
   Mặc định HIỆN, rồi .co-js (site.js gắn lên thẻ <html>) mới ẩn đi. Làm ngược lại — mặc định
   ẩn rồi nhờ JS hiện — là JS hỏng thì khách không còn cách nào đổi số lượng. */
.gd3-gio-luu { border: 0; background: none; padding: 0; cursor: pointer;
  font: inherit; font-size: 12px; color: var(--aw-nhan); text-decoration: underline; }
.co-js .gd3-gio-luu { display: none; }
.gd3-gio-tien { grid-area: tien; font-size: 16px; font-weight: 800; color: var(--aw-giam); text-align: right; white-space: nowrap; }
/* Nút BỎ: góc riêng, xa hẳn nút +/−. Vùng bấm 34px để ngón tay không trượt sang ô số lượng. */
.gd3-gio-bo { grid-area: bo; justify-self: end; }
.gd3-gio-bo button { width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--aw-ke);
  background: var(--aw-the); color: var(--aw-chu-phu); cursor: pointer; font-size: 14px; }
@media (hover: hover) {
  .gd3-gio-ten:hover { color: var(--aw-nhan); }
  .gd3-gio-bo button:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
}

.gd3-gio-duoi { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; margin-top: 4px; }
.gd3-gio-tiep { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600;
  color: var(--aw-chu-2); text-decoration: none; }
/* Xoá cả giỏ: chữ thường, màu phụ, KHÔNG phải nút đỏ. Việc không lấy lại được thì phải khó
   bấm nhầm, không phải được tô cho nổi. */
.gd3-gio-xoahet { border: 0; background: none; padding: 0; cursor: pointer; font: inherit;
  font-size: 13.5px; color: var(--aw-chu-phu); text-decoration: underline; }
@media (hover: hover) {
  .gd3-gio-tiep:hover { color: var(--aw-nhan); }
  .gd3-gio-xoahet:hover { color: var(--aw-nhan); }
}

/* ---- Hộp tổng kết ---- */
.gd3-gio-tong { position: sticky; top: var(--gd3-dau-cao, 104px); display: flex; flex-direction: column; gap: 12px; }
.gd3-gio-hop { background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 16px; padding: 18px; }
.gd3-gio-hop-tit { margin: 0 0 14px; font-size: 17px; font-weight: 800; color: var(--aw-chu); }
.gd3-gio-ship { margin-bottom: 14px; }
.gd3-gio-ship p { margin: 0 0 8px; font-size: 13.5px; line-height: 1.55; color: var(--aw-chu-2); }
.gd3-gio-thanh { height: 7px; border-radius: 999px; background: var(--aw-nen-2); overflow: hidden; }
.gd3-gio-thanh span { display: block; height: 100%; background: var(--aw-nhan); border-radius: 999px; }
.gd3-gio-ship-xong { margin: 0 0 14px; font-size: 13.5px; color: #14653C; }
.gd3-gio-bang { margin: 0; display: grid; grid-template-columns: 1fr auto; gap: 9px 12px; font-size: 14px; }
.gd3-gio-bang dt { color: var(--aw-chu-phu); }
.gd3-gio-bang dd { margin: 0; text-align: right; color: var(--aw-chu); font-weight: 600; }
.gd3-gio-mienphi { color: #14653C; }
.gd3-gio-cong { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  margin-top: 13px; padding-top: 13px; border-top: 1px solid var(--aw-ke); font-size: 15px; color: var(--aw-chu); }
.gd3-gio-cong b { font-size: 24px; font-weight: 800; color: var(--aw-giam); }
.gd3-gio-thanhtoan { margin-top: 14px; width: 100%; }

/* Mã giảm giá — mới chỉ BÁO TÌNH TRẠNG, chưa trừ tiền (chưa có bộ máy áp mã). Nền chìm chứ
   không tô đỏ, để không ai tưởng số tổng ở trên đã được giảm. */
.gd3-gio-ma { margin-top: 14px; padding: 12px 14px; border-radius: 12px; background: var(--aw-nen-2);
  border: 1px solid var(--aw-ke); font-size: 13px; line-height: 1.55; color: var(--aw-chu-2); }
.gd3-gio-ma p { margin: 0 0 6px; }
.gd3-gio-ma p:last-child { margin-bottom: 0; }
.gd3-gio-ma-dat b { color: var(--aw-nhan); }
.gd3-gio-ma-luu { color: var(--aw-chu-phu); font-size: 12.5px; }

.gd3-gio-yen { list-style: none; margin: 14px 0 0; padding: 14px 0 0; border-top: 1px solid var(--aw-ke);
  display: grid; gap: 9px; font-size: 13px; line-height: 1.5; color: var(--aw-chu-phu); }
/* Từng dòng KHÔNG phải lưới. Lưới cắt mọi thẻ con thành một ô riêng, kể cả thẻ <a> nằm GIỮA
   câu: dòng "Đổi trả theo <a>chính sách đổi trả</a>" liền bị đẩy cái link xuống hàng dưới,
   rơi đúng vào cột biểu tượng rộng 16px, thành mỗi dòng một chữ.
   Dán biểu tượng bằng position:absolute rồi chừa lề trái — chữ chảy bình thường, chèn link
   hay in đậm ở bất cứ đâu trong câu cũng không sao. Cùng một lẽ với .gd3-gio-nhan. */
.gd3-gio-yen li { position: relative; padding-left: 25px; }
.gd3-gio-yen li > i:first-child { position: absolute; left: 0; top: 3px; width: 16px; text-align: center;
  color: var(--aw-nhan); font-size: 13px; }

.gd3-gio-hoi b { display: block; font-size: 14.5px; color: var(--aw-chu); }
.gd3-gio-hoi p { margin: 4px 0 12px; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-gio-hoi .gd3-km-goi-phu { display: flex; justify-content: center; width: 100%; margin-bottom: 8px; }
.gd3-gio-hoi .gd3-km-goi-phu:last-child { margin-bottom: 0; }

/* ---- Màn hẹp ----
   Dưới 992px hộp tổng kết xuống dưới danh sách và thôi dính: dính một hộp cao 400px trên màn
   cao 700px là nó nuốt hơn nửa màn hình, khách không còn chỗ xem hàng. */
@media (max-width: 991px) {
  .gd3-gio-khung { grid-template-columns: minmax(0, 1fr); }
  .gd3-gio-tong { position: static; }
}
/* Dưới 700px một dòng hàng xếp lại: ảnh bên trái kéo hết hai hàng, chữ ở hàng trên, ô số
   lượng và thành tiền ở hàng dưới. Giữ nguyên 5 thứ trên một hàng ngang ở màn 375px thì tên
   sản phẩm chỉ còn ~90px, xuống 4–5 dòng.

   CỘT BA PHẢI LÀ `auto`, KHÔNG PHẢI 34px. Lưới dùng CHUNG cột cho mọi hàng: đặt 34px cho vừa
   nút bỏ ở hàng trên thì thành tiền ở hàng dưới cũng bị ép vào đúng 34px và "5.000.000 đ" bị
   cắt cụt ngay mép thẻ. `auto` lấy theo thứ RỘNG NHẤT trong cột — tức là theo thành tiền —
   còn nút bỏ thì justify-self: end nên vẫn nằm sát mép phải. */
@media (max-width: 699px) {
  .gd3-gio-dong { grid-template-columns: 72px minmax(0, 1fr) auto;
    grid-template-areas: "anh chu bo" "anh sl tien"; gap: 8px 10px; padding: 12px; }
  .gd3-gio-anh { width: 72px; height: 72px; align-self: start; }
  .gd3-gio-ten { font-size: 14.5px; }
  .gd3-gio-sl { align-items: flex-start; }
  .gd3-gio-tien { font-size: 15px; }
  .gd3-gio-rong { padding: 34px 14px 40px; }
  .gd3-gio-rong h1 { font-size: 19px; }
}
/* Màn rất hẹp: ảnh thôi kéo hai hàng, ô số lượng và thành tiền chiếm trọn hàng dưới — còn
   giữ ảnh ở cột trái thì ô số lượng chỉ còn ~120px, chạm đúng ngưỡng vỡ. */
@media (max-width: 420px) {
  .gd3-gio-dong { grid-template-areas: "anh chu bo" "sl sl tien"; }
  .gd3-gio-sl { flex-direction: row; align-items: center; gap: 10px; }
  .gd3-gio-tien { align-self: center; }
}

/* ---- LỜI NHẮN NỔI (toast) ----
   assets/js/site.js tạo thẻ .site-toast cho mọi phản hồi giỏ hàng ("Đã thêm … vào giỏ",
   "Chỉ còn N sản phẩm"), nhưng TRƯỚC ĐÂY không giao diện nào vẽ nó: thẻ ra đời với
   position:static, nền trong suốt, rơi xuống tận đáy trang — khách bấm "Thêm vào giỏ" rồi
   không thấy gì hồi đáp. Giờ fetch chạy nên trang cũng không nạp lại nữa, càng phải có.

   Đặt ở ĐÁY GIỮA, nhấc lên trên thanh điều hướng đáy của màn hẹp (.gd3-thanh-day cao 47px,
   z-index 1050) — đè lên nó thì lời nhắn che mất nút "Giỏ hàng" đúng lúc khách muốn bấm.
   z-index 1060: trên thanh đáy, dưới menu trượt (1100) để menu mở ra vẫn che được nó. */
/* Canh giữa bằng left+right+margin:auto, KHÔNG dùng left:50% + translate(-50%). Với left:50%
   thì khối chứa chỉ còn NỬA PHẢI màn hình, nên hộp co theo nội dung bị chặn ở ~195px và câu
   thông báo dài dồn thành 5 dòng cao 125px. Trải hai mép rồi để lề tự động là hộp được dùng
   cả bề ngang màn để co giãn.
   Tên sản phẩm có thể rất dài nên kẹp 3 dòng; kẹp rồi thì bo góc 14px chứ không bo tròn 999px
   — viên thuốc ba dòng trông như cái hạt đậu. */
.site-toast { position: fixed; left: 14px; right: 14px; margin: 0 auto;
  bottom: calc(47px + 14px + env(safe-area-inset-bottom, 0px));
  width: fit-content; max-width: min(92vw, 420px); z-index: 1060;
  padding: 12px 18px; border-radius: 14px; font-size: 14px; font-weight: 600; line-height: 1.45;
  text-align: center; color: var(--aw-tren-chu); background: var(--aw-chu);
  box-shadow: 0 10px 30px rgba(31, 26, 26, .28);
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  opacity: 0; visibility: hidden; pointer-events: none; transform: translateY(14px);
  transition: opacity .18s ease, transform .18s ease, visibility .18s; }
.site-toast.show { opacity: 1; visibility: visible; transform: translateY(0); }
.site-toast.err { background: var(--aw-nhan-dam); color: var(--aw-tren-nhan); }
/* Màn rộng không có thanh đáy nên hạ lời nhắn xuống sát đáy hơn. */
@media (min-width: 992px) { .site-toast { bottom: 26px; } }
@media (prefers-reduced-motion: reduce) { .site-toast { transition: opacity .18s ease, visibility .18s; transform: none; } }

/* ==========================================================================
   ĐẶT HÀNG (/checkout.php) và KẾT QUẢ ĐƠN (/order.php)
   Hai trang dùng chung một bộ: cùng khung hai cột, cùng hộp, cùng bảng tiền — vì chúng là
   hai chặng liền nhau của một việc, đổi kiểu giữa chừng là khách tưởng lạc sang web khác.
   Dùng lại .gd3-ds-duong, .gd3-gio-bang, .gd3-gio-cong, .gd3-gio-yen, .gd3-sp-ngay,
   .gd3-km-goi-phu của các trang đã có.
   ========================================================================== */
.gd3-dh { padding: 14px 0 34px; }

/* ---- Thanh ba bước ---- */
.gd3-dh-buoc { list-style: none; display: flex; flex-wrap: wrap; gap: 6px 10px; margin: 0 0 16px; padding: 0;
  font-size: 13px; color: var(--aw-chu-phu); }
.gd3-dh-buoc li { display: flex; align-items: center; gap: 7px; }
.gd3-dh-buoc li + li::before { content: ""; width: 16px; height: 1px; background: var(--aw-ke-dam); margin-right: 4px; }
.gd3-dh-buoc span { display: grid; place-items: center; width: 22px; height: 22px; border-radius: 50%;
  background: var(--aw-nen-2); color: var(--aw-chu-phu); font-size: 12px; font-weight: 700;
  box-shadow: inset 0 0 0 1px var(--aw-ke); }
.gd3-dh-buoc .xong span { background: var(--aw-nhan-nhat); color: var(--aw-nhan); box-shadow: inset 0 0 0 1px var(--aw-nhan-vien); }
.gd3-dh-buoc .dang { color: var(--aw-chu); font-weight: 700; }
.gd3-dh-buoc .dang span { background: var(--aw-nhan); color: var(--aw-tren-nhan); box-shadow: none; }

/* ---- Khung hai cột, cùng tỉ lệ với trang giỏ để hai bước nối nhau cho mượt ---- */
.gd3-dh-khung { display: grid; grid-template-columns: minmax(0, 1fr) 352px; gap: 20px; align-items: start; }
.gd3-dh-trai { min-width: 0; }
.gd3-dh-phai { position: sticky; top: var(--gd3-dau-cao, 104px); display: flex; flex-direction: column; gap: 12px; }
.gd3-dh-hop { background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 16px; padding: 18px; margin-bottom: 12px; }
.gd3-dh-phai .gd3-dh-hop { margin-bottom: 0; }
.gd3-dh-tit { display: flex; align-items: center; gap: 9px; margin: 0 0 16px; font-size: 16px; font-weight: 800; color: var(--aw-chu); }
.gd3-dh-tit i { color: var(--aw-nhan); font-size: 14px; }

/* ---- Ô nhập ---- */
.gd3-dh-luoi2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 14px; }
.gd3-dh-truong { display: block; margin-bottom: 14px; }
.gd3-dh-nhan { display: block; margin-bottom: 6px; font-size: 13.5px; font-weight: 600; color: var(--aw-chu-2); }
.gd3-dh-nhan b { color: var(--aw-nhan); }
.gd3-dh-nhan em { font-style: normal; font-weight: 400; color: var(--aw-chu-phu); }
.gd3-dh-o { width: 100%; padding: 11px 14px; border-radius: 11px; border: 1px solid var(--aw-ke-dam);
  background: var(--aw-the); font: inherit; font-size: 14.5px; color: var(--aw-chu); }
textarea.gd3-dh-o { resize: vertical; min-height: 54px; line-height: 1.55; }
.gd3-dh-o::placeholder { color: var(--aw-ke-dam); }
.gd3-dh-o:focus { outline: 2px solid var(--aw-nhan); outline-offset: 1px; border-color: var(--aw-nhan); }
.gd3-dh-o-loi { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
.gd3-dh-loi { display: flex; align-items: flex-start; gap: 6px; margin-top: 6px; font-size: 12.5px;
  line-height: 1.5; color: var(--aw-nhan-dam); }
.gd3-dh-goi { display: block; margin-top: 6px; font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }
.gd3-dh-goi-tren { margin: 0 0 14px; }
.gd3-dh-goi a { color: var(--aw-nhan); font-weight: 600; }

/* Bẫy bot: giấu khỏi MẮT nhưng không dùng display:none — vài con bot bỏ qua ô bị ẩn hẳn,
   ô còn nằm trong luồng thì chúng mới điền vào và tự lộ. */
.gd3-dh-bay { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* ---- Chọn hình thức thanh toán ---- */
.gd3-dh-tt { display: flex; align-items: flex-start; gap: 11px; padding: 13px 15px; margin-bottom: 10px;
  border: 1px solid var(--aw-ke); border-radius: 12px; cursor: pointer; background: var(--aw-the); }
.gd3-dh-tt:last-child { margin-bottom: 0; }
.gd3-dh-tt input { margin-top: 2px; accent-color: var(--aw-nhan); width: 18px; height: 18px; flex: none; }
.gd3-dh-tt-chu b { display: block; font-size: 14.5px; color: var(--aw-chu); }
.gd3-dh-tt-chu em { display: block; margin-top: 3px; font-style: normal; font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }
.gd3-dh-tt:has(input:checked) { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
.gd3-dh-tt:has(input:focus-visible) { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }

/* ---- Danh sách hàng trong cột tóm tắt ---- */
.gd3-dh-mon > summary { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  list-style: none; cursor: pointer; padding: 2px 0 12px; font-size: 13.5px; font-weight: 600; color: var(--aw-chu-2); }
.gd3-dh-mon > summary::-webkit-details-marker { display: none; }
.gd3-dh-mon > summary i { font-size: 12px; color: var(--aw-chu-phu); transition: transform .15s; }
.gd3-dh-mon[open] > summary i { transform: rotate(180deg); }
.gd3-dh-ds { list-style: none; margin: 0 0 14px; padding: 0; display: grid; gap: 12px; }
.gd3-dh-ds li { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; gap: 11px; align-items: center; }
/* KHÔNG overflow:hidden ở đây. Huy hiệu số lượng đính ra ngoài mép ảnh (top/right = −6px), mà
   overflow:hidden thì cắt cụt đúng phần nhô ra — nhìn như một vết bẩn ở góc ảnh. Bo góc chuyển
   xuống cho chính thẻ <img>, vừa tròn góc vừa không cắt gì. */
.gd3-dh-anh { position: relative; width: 52px; height: 52px; background: var(--aw-nen-2);
  border-radius: 9px; }
.gd3-dh-anh img { width: 100%; height: 100%; object-fit: contain; display: block; border-radius: 9px; }
/* Số lượng đính lên góc ảnh thay vì một cột riêng: tiết kiệm đúng chỗ hẹp nhất của cột phải. */
.gd3-dh-sl { position: absolute; top: -6px; right: -6px; min-width: 20px; height: 20px; padding: 0 5px;
  border-radius: 999px; background: var(--aw-chu); color: var(--aw-tren-chu);
  font-size: 11px; font-weight: 700; line-height: 20px; text-align: center; }
.gd3-dh-ten { font-size: 13px; line-height: 1.45; color: var(--aw-chu-2); text-decoration: none;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.gd3-dh-ten em { display: block; font-style: normal; margin-top: 2px; }
.gd3-dh-tien { font-size: 13.5px; font-weight: 700; color: var(--aw-chu); white-space: nowrap; }
.gd3-dh-ds-ro li { grid-template-columns: 52px minmax(0, 1fr) auto; }
.gd3-dh-ds-ro .gd3-dh-ten { font-size: 14px; -webkit-line-clamp: 3; }

.gd3-dh-nut { width: 100%; margin-top: 14px; }
.gd3-dh-yen-tam { margin: 10px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--aw-chu-phu); text-align: center; }
.gd3-dh-muatiep { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%;
  padding: 13px 18px; border-radius: 999px; background: var(--aw-chu); color: #fff; font-size: 15px;
  font-weight: 700; text-decoration: none; }
.gd3-dh-muatiep:hover { color: #fff; opacity: .9; }
.gd3-dh-muatiep i { font-size: 13px; }
.gd3-dh-quaylai { display: flex; align-items: center; justify-content: center; gap: 7px; margin-top: 12px;
  font-size: 13.5px; font-weight: 600; color: var(--aw-chu-2); text-decoration: none; }
.gd3-dh-cam { margin-top: 0; padding: 16px 18px; background: var(--aw-the);
  border: 1px solid var(--aw-ke); border-radius: 16px; }
.gd3-dh-cam a { color: var(--aw-nhan); font-weight: 600; }
/* Câu "chưa gồm phí ship": phải đọc được, nhưng KHÔNG tô đỏ như lỗi — nó là điều kiện bình
   thường của đơn, không phải chuyện hỏng. */
.gd3-gio-chuagom { margin: 9px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--aw-chu-phu); }
.gd3-gio-baosau { color: var(--aw-chu-2); font-weight: 600; }

/* ---- Đặt xong ---- */
.gd3-dh-xong { text-align: center; padding: 30px 18px 34px; margin-bottom: 16px;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 16px; }
.gd3-dh-xong > i { font-size: 46px; color: #1a7f4b; }
.gd3-dh-xong h1 { margin: 14px 0 8px; font-size: 24px; font-weight: 800; color: var(--aw-chu); }
.gd3-dh-xong p { margin: 0 auto 6px; max-width: 520px; font-size: 14.5px; line-height: 1.65; color: var(--aw-chu-2); }
.gd3-dh-ma { margin-top: 14px !important; font-size: 16px !important; }
.gd3-dh-ma b { display: inline-block; margin-left: 6px; padding: 5px 14px; border-radius: 999px;
  background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); color: var(--aw-nhan);
  font-size: 17px; letter-spacing: .4px; }
.gd3-dh-luu { font-size: 13px !important; color: var(--aw-chu-phu) !important; }

/* ---- Thanh tiến trình đơn ---- */
.gd3-dh-tiendo { list-style: none; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  margin: 0 0 16px; padding: 16px 18px; background: var(--aw-the); border: 1px solid var(--aw-ke);
  border-radius: 16px; font-size: 12.5px; color: var(--aw-chu-phu); text-align: center; }
.gd3-dh-tiendo li { position: relative; padding-top: 24px; }
/* Đường nối vẽ bằng ::before của từng chặng, cắt ở tâm chấm — không kẻ một đường dài phía sau
   rồi che, vì bề rộng mỗi chặng đổi theo độ dài chữ và theo bề ngang màn. */
.gd3-dh-tiendo li::before { content: ""; position: absolute; top: 6px; left: -50%; width: 100%; height: 2px;
  background: var(--aw-ke); }
.gd3-dh-tiendo li:first-child::before { display: none; }
.gd3-dh-tiendo li.qua::before { background: var(--aw-nhan); }
.gd3-dh-cham { position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  width: 14px; height: 14px; border-radius: 50%; background: var(--aw-the);
  box-shadow: inset 0 0 0 2px var(--aw-ke); }
.gd3-dh-tiendo .qua .gd3-dh-cham { background: var(--aw-nhan); box-shadow: inset 0 0 0 2px var(--aw-nhan); }
.gd3-dh-tiendo .nay { color: var(--aw-chu); font-weight: 700; }
.gd3-dh-tiendo .nay .gd3-dh-cham { box-shadow: inset 0 0 0 2px var(--aw-nhan), 0 0 0 4px var(--aw-nhan-nhat); }

/* ---- Bảng thông tin giao hàng ---- */
/* Mỗi mục MỘT HÀNG: nhãn trái, giá trị phải, kẻ mảnh giữa các hàng — cùng kiểu khối "Số tiền"
   (chủ shop 28/09/2026: bản nhãn trên / giá trị dưới trên điện thoại trông lỏng lẻo, dài lê thê). */
.gd3-dh-tt-bang { margin: 0; display: grid; grid-template-columns: max-content minmax(0, 1fr); column-gap: 0; font-size: 14px; }
.gd3-dh-tt-bang dt, .gd3-dh-tt-bang dd { margin: 0; padding: 9px 0; border-top: 1px solid var(--aw-ke); }
.gd3-dh-tt-bang dt:first-of-type, .gd3-dh-tt-bang dd:first-of-type { border-top: 0; padding-top: 2px; }
.gd3-dh-tt-bang dt { color: var(--aw-chu-phu); padding-right: 16px; }   /* khoảng cách bằng padding, không dùng gap: gap làm đứt đường kẻ */
.gd3-dh-tt-bang dd { color: var(--aw-chu); font-weight: 600; line-height: 1.5; text-align: right; overflow-wrap: anywhere; }
/* iPhone tự biến số điện thoại thành link xanh gạch chân — giữ màu chữ thường cho gọn. */
.gd3-dh-tt-bang a[href^="tel"] { color: inherit; text-decoration: none; }

.gd3-dh-tra { max-width: 620px; }

/* ---- Màn hẹp ---- */
@media (max-width: 991px) {
  .gd3-dh-khung { grid-template-columns: minmax(0, 1fr); }
  /* Cột tóm tắt thôi dính và ĐẢO LÊN TRƯỚC form: trên điện thoại khách cần thấy mình đang đặt
     cái gì, hết bao nhiêu, rồi mới yên tâm gõ địa chỉ. order trong lưới đổi được thứ tự trông
     thấy mà không phải đổi thứ tự trong HTML — bàn phím và trình đọc màn hình vẫn đi form trước. */
  .gd3-dh-phai { position: static; }
  .gd3-dh-buoc { font-size: 12.5px; }
}
@media (max-width: 575px) {
  .gd3-dh-luoi2 { grid-template-columns: minmax(0, 1fr); }
  .gd3-dh-hop { padding: 15px 14px; }
  .gd3-dh-xong h1 { font-size: 20px; }
  .gd3-dh-ma b { font-size: 15px; }
  /* Bốn chặng ngang ở 375px thì mỗi chặng còn ~80px, chữ "Đã xác nhận" vỡ ba dòng. */
  .gd3-dh-tiendo { font-size: 11.5px; padding: 14px 10px; }
  /* Thanh ba bước: bỏ gạch nối và thu nhịp để ba bước đứng gọn MỘT hàng. Xuống hai dòng thì
     nó chiếm 50px chỉ để nói "bạn đang ở bước 2", trong khi cả màn chỉ cao 600px. */
  .gd3-dh-buoc { gap: 4px 8px; font-size: 12px; }
  .gd3-dh-buoc li + li::before { display: none; }
  .gd3-dh-buoc span { width: 20px; height: 20px; font-size: 11px; }
}

/* ---- Danh sách đơn đã đặt trên máy này (trang /order) ----
   Mỗi dòng là MỘT vùng bấm to trọn bề ngang, không phải một cái link chữ nhỏ: ngón tay trên
   điện thoại cần ít nhất 44px chiều cao mới bấm trúng chắc chắn. */
.gd3-dh-cu { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 8px; }
.gd3-dh-cu a { display: grid; grid-template-columns: minmax(0, 1fr) auto 12px; gap: 4px 12px;
  align-items: center; padding: 12px 14px; border: 1px solid var(--aw-ke); border-radius: 12px;
  background: var(--aw-the); text-decoration: none; }
.gd3-dh-cu-ma { grid-column: 1; font-size: 14.5px; font-weight: 700; color: var(--aw-chu); letter-spacing: .3px; }
.gd3-dh-cu-phu { grid-column: 1; grid-row: 2; font-size: 12.5px; color: var(--aw-chu-phu); }
.gd3-dh-cu-tt { grid-column: 2; grid-row: 1 / span 2; padding: 4px 11px; border-radius: 999px;
  font-size: 12px; font-weight: 600; white-space: nowrap;
  background: var(--aw-nen-2); color: var(--aw-chu-2); }
.gd3-dh-cu a > i { grid-column: 3; grid-row: 1 / span 2; font-size: 12px; color: var(--aw-ke-dam); }
/* Màu trạng thái: chỉ hai thứ đáng tô — xong (yên tâm) và huỷ (bất thường). Ba trạng thái
   giữa đường đều là "đang chạy bình thường", tô hết thì chẳng còn gì nổi. */
.gd3-dh-cu .gd3-tt-done { background: #E9F6EF; color: #14653C; }
.gd3-dh-cu .gd3-tt-cancelled { background: var(--aw-nhan-nhat); color: var(--aw-nhan-dam); }
@media (hover: hover) { .gd3-dh-cu a:hover { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); } }
@media (max-width: 420px) {
  .gd3-dh-cu a { grid-template-columns: minmax(0, 1fr) auto; }
  .gd3-dh-cu a > i { display: none; }
}

/* ---- Biểu tượng "Đơn của tôi" cạnh giỏ hàng ----
   Chỉ mọc ra khi máy này từng đặt đơn (xem layout.php). Cùng cỡ, cùng màu với giỏ hàng: hai
   thứ ngang hàng nhau về vai trò, không cái nào nổi hơn cái nào. */
.gd3-don-link { margin-right: 16px; }
@media (max-width: 991px) { .gd3-don-link { margin-right: 14px; } }

/* Cảnh báo chuyển khoản: nền chìm, viền mảnh — nghiêm túc nhưng KHÔNG đỏ rực như báo lỗi.
   Đây là lời dặn để khách khỏi mất tiền, không phải chuyện gì đang hỏng. */
.gd3-dh-canh { display: block; margin-top: 4px; color: var(--aw-chu-2); font-weight: 600; }
.gd3-dh-canh-hop { display: flex; align-items: flex-start; gap: 10px; margin: 12px 0 0;
  padding: 12px 14px; border-radius: 12px; background: var(--aw-nen-2);
  border: 1px solid var(--aw-ke-dam); font-size: 13px; line-height: 1.55; color: var(--aw-chu-2); }
.gd3-dh-canh-hop > i { flex: none; margin-top: 2px; color: var(--aw-nhan); font-size: 14px; }

/* ---- Khối chuyển khoản trên trang đơn ---- */
/* Số tài khoản và nội dung phải ĐỌC RÕ TỪNG CHỮ SỐ — đây là chỗ khách chép tay. font chữ đều
   (tabular-nums) để các số không co giãn lệch nhau, letter-spacing rộng cho dễ dò. */
.gd3-dh-bank dd { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px 10px; }
.gd3-dh-bank dd > b { font-size: 16px; letter-spacing: .6px; font-variant-numeric: tabular-nums; }
.gd3-dh-chep { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px;
  border-radius: 999px; border: 1px solid var(--aw-ke-dam); background: var(--aw-the);
  font: inherit; font-size: 12px; font-weight: 600; color: var(--aw-chu-2); cursor: pointer;
  white-space: nowrap; }
.gd3-dh-chep i { font-size: 11px; }
.gd3-dh-chep.xong { border-color: #1a7f4b; color: #1a7f4b; }
@media (hover: hover) { .gd3-dh-chep:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); } }

/* ---- Mã QR chuyển khoản + gửi ảnh biên lai (trang /order) ---- */
.gd3-dh-qr { display: flex; align-items: center; gap: 16px; margin-top: 14px; padding: 14px;
  border: 1px solid var(--aw-ke); border-radius: 14px; background: var(--aw-the); }
/* Khung QR cố định: mã là SVG nên phóng to bao nhiêu cũng nét, nhưng phải đủ to để camera bắt
   được — dưới ~150px nhiều điện thoại quét rất vất vả. */
.gd3-dh-qr-anh { flex: none; width: 168px; height: 168px; }
.gd3-dh-qr-anh svg { width: 100%; height: 100%; display: block; }
.gd3-dh-qr-chu b { display: block; font-size: 15px; color: var(--aw-chu); }
.gd3-dh-qr-chu p { margin: 5px 0 6px; font-size: 13px; line-height: 1.55; color: var(--aw-chu-2); }
.gd3-dh-qr-chu span { font-size: 12.5px; color: var(--aw-chu-phu); }

.gd3-dh-bienlai { display: flex; gap: 14px; align-items: center; margin-bottom: 14px; padding: 12px;
  border: 1px solid var(--aw-ke); border-radius: 12px; background: var(--aw-nen-2); }
.gd3-dh-bienlai a { flex: none; width: 84px; height: 84px; border-radius: 10px; overflow: hidden;
  background: var(--aw-the); display: block; }
.gd3-dh-bienlai img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gd3-dh-bienlai b { display: block; font-size: 13.5px; color: var(--aw-chu); }
.gd3-dh-bienlai b i { color: var(--aw-warn, #c77700); }
.gd3-dh-bienlai span { display: block; margin-top: 4px; font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }

/* Ô chọn tệp gốc rất xấu và mỗi trình duyệt một kiểu; giấu nó đi rồi bọc bằng <label> để
   toàn bộ khối thành vùng bấm. Ô thật vẫn nằm trong luồng nên bàn phím Tab tới được. */
.gd3-dh-chonanh { display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 16px; border: 1px dashed var(--aw-ke-dam); border-radius: 12px; cursor: pointer;
  font-size: 14px; font-weight: 600; color: var(--aw-chu-2); background: var(--aw-nen-2); }
.gd3-dh-chonanh i { font-size: 16px; color: var(--aw-nhan); }
.gd3-dh-chonanh input[type=file] { position: absolute; width: 1px; height: 1px; opacity: 0; }
.gd3-dh-chonanh:focus-within { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
@media (hover: hover) { .gd3-dh-chonanh:hover { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); } }

.gd3-dh-datien { display: flex; align-items: center; gap: 13px; }
.gd3-dh-datien > i { font-size: 26px; color: #1a7f4b; flex: none; }
.gd3-dh-datien b { display: block; font-size: 15px; color: var(--aw-chu); }
.gd3-dh-datien span { display: block; margin-top: 3px; font-size: 13px; color: var(--aw-chu-phu); }

@media (max-width: 575px) {
  .gd3-dh-qr { flex-direction: column; text-align: center; }
  .gd3-dh-qr-anh { width: 200px; height: 200px; }
  .gd3-dh-bienlai { flex-direction: column; text-align: center; }
}

/* ===========================================================================
   TRANG CHỦ — DẢI "DANH MỤC SẢN PHẨM"
   ---------------------------------------------------------------------------
   Ô biểu tượng gốc (menu-mobile.css ~dòng 520) là hình vuông NỀN ĐEN, icon đỏ,
   rộng 100% ô lưới. Hai vấn đề:

   1. Màu: nền đen + icon vàng là bộ nhận diện ĐEN-VÀNG của bản mẫu cũ. Site này
      đã chuyển sang đỏ logo trên nền kem ngả hồng, nên 9 ô đen xếp hàng ngang là
      mảng tối nặng nhất trang chủ, hút mắt hơn cả banner và sản phẩm.
   2. Kích thước: `width:100%` + `aspect-ratio:1/1` nghĩa là ô PHÌNH THEO cột lưới
      — ở 1366px mỗi cột ~126px nên ra 9 ô vuông 126×126. Dải danh mục lẽ ra chỉ
      là thanh điều hướng phụ lại chiếm gần nửa màn hình đầu tiên.

   Cách sửa: giữ nguyên `aspect-ratio` (đặt chỗ sẵn nên không xô lệch khi font
   Awesome nạp xong), nhưng CHẶN TRẦN bằng max-width rồi căn giữa. Nền chuyển
   sang hồng rất nhạt + viền hồng, icon đỏ — cùng đúng bộ màu với chip thương
   hiệu / danh mục ở trang chi tiết sản phẩm.

   Mọi luật di chuột bọc trong @media (hover: hover): trên điện thoại (80% khách)
   trạng thái :hover dính lại sau khi chạm, ô cứ đỏ mãi cho tới lúc chạm chỗ khác.
   =========================================================================== */
.gd3-category-icon-box {
  width: 100%;
  max-width: 84px;
  margin-inline: auto;
  aspect-ratio: 1 / 1;
  background: var(--aw-nhan-nhat);
  border: 1px solid var(--aw-nhan-vien);
  border-radius: 18px;
  display: grid;
  place-items: center;
  transition: background-color .18s, border-color .18s, transform .18s, box-shadow .18s;
}
.gd3-category-icon-box i {
  font-size: 30px;
  line-height: 1;
  color: var(--aw-nhan);
  transition: color .18s;
}
/* Tên danh mục: 2 dòng là kịch — "Kéo dài thời gian" hay "Kích Dục Nữ" dài ngắn
   khác nhau, không khoá chiều cao thì hàng dưới so le. min-height = 2 dòng × 1.35. */
.category-products-item {
  margin-bottom: 24px;
}
.category-products-item .font-14 {
  font-weight: 600;
  color: var(--aw-chu-2);
  line-height: 1.35;
  min-height: 2.7em;
}
.category-products-item:focus-visible {
  outline: 2px solid var(--aw-nhan);
  outline-offset: 3px;
  border-radius: 12px;
}

@media (hover: hover) {
  .category-products-item:hover .gd3-category-icon-box {
    background: var(--aw-nhan);
    border-color: var(--aw-nhan);
    transform: translateY(-3px);
    box-shadow: 0 8px 20px rgba(216, 18, 18, .22);
  }
  .category-products-item:hover .gd3-category-icon-box i { color: #fff; transform: none; }
  .category-products-item:hover .font-14 { color: var(--aw-nhan-dam); }
}

/* Điện thoại: ô nhỏ lại cho lọt 3 ô rưỡi một màn 375px — để hở nửa ô thứ tư là
   tín hiệu "còn vuốt được nữa", khỏi cần mũi tên. */
@media (max-width: 767.98px) {
  .gd3-category-icon-box { max-width: 68px; border-radius: 16px; }
  .gd3-category-icon-box i { font-size: 26px; }
  .category-products-item { margin-bottom: 8px; }
}

@media (prefers-reduced-motion: reduce) {
  .gd3-category-icon-box, .gd3-category-icon-box i { transition: none; }
  .category-products-item:hover .gd3-category-icon-box { transform: none; }
}

/* Bề rộng ô trượt: 104px cố định thì ở màn 375px vừa đúng 3 ô + 3 khoảng hở = tràn sát mép,
   ô thứ 4 rơi hẳn ra ngoài. Khách thấy 3 ô đứng gọn trong khung, không có gì gợi ý là còn
   vuốt được nữa — mất luôn 6 danh mục còn lại (không có nút mũi tên trên điện thoại, xem
   luật ẩn nút ở trên). Tính theo phần trăm để LUÔN hở nửa ô thứ tư, dù máy 360 hay 430px:
   3,5 ô + 3 khoảng hở 12px = đúng bề ngang nhìn thấy. Chặn trần 104px cho máy tính bảng,
   không thì ô phình to lố ở 768px. */
@media (max-width: 991.98px) {
  .category-products-mb .swiper-wrapper { gap: 12px; }
  .category-products-mb .swiper-slide { width: clamp(84px, calc((100% - 36px) / 3.5), 104px); }
}

/* Biểu tượng cạnh tên khối ("♀ SEXTOY NỮ"): gốc để color:inherit nên nó đen y hệt chữ,
   trông như một ký tự lạ dính vào đầu dòng. Cho đỏ logo thì nó thành dấu mốc phân khối,
   đúng vai, và khớp luôn với ô biểu tượng ở dải danh mục ngay bên trên. */
.gd3-section-title-icon { color: var(--aw-nhan); }

/* ===========================================================================
   ĐÁNH GIÁ SẢN PHẨM (.gd3-dg*)
   ---------------------------------------------------------------------------
   Ngôi sao phải RA NGÔI SAO nên dùng màu hổ phách riêng, không mượn đỏ logo:
   sao đỏ đọc thành "cảnh báo", và cạnh nút "Mua ngay" cũng màu đỏ thì hai thứ
   tranh nhau. Đây là biến DUY NHẤT thêm vào bảng màu, và nó không nằm trong bộ
   khách tự đổi ở Admin → Tuỳ chỉnh — vì sao vàng là quy ước chung, đổi màu sao
   theo thương hiệu là làm khó người đọc chứ không phải làm đẹp.
   =========================================================================== */
:root { --aw-sao: #F2A93B; }

.gd3-sao { display: inline-flex; gap: 2px; color: var(--aw-sao); font-size: 13px; line-height: 1; }
.gd3-sao .fa-regular { color: var(--aw-ke-dam); }
.gd3-sao-to { font-size: 17px; gap: 3px; }

/* --- Sao tóm tắt cạnh tên sản phẩm --- */
.gd3-sp-sao { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; color: var(--aw-chu-2); }
.gd3-sp-sao b { font-weight: 800; }
/* :not(.gd3-sao) — BẮT BUỘC. Dải sao cũng là một <span>, nên `.gd3-sp-sao span` (0,1,1)
   trùm luôn nó và thắng `.gd3-sao` (0,1,0): sao bị đổi sang màu chữ phụ và bị gạch chân.
   Đây đúng là cái bẫy "đặt kiểu theo THẺ trong khối có nhiều loại con" đã ghi trong AGENTS.md. */
.gd3-sp-sao span:not(.gd3-sao) { color: var(--aw-chu-phu); text-decoration: underline; text-underline-offset: 2px; }
@media (hover: hover) { .gd3-sp-sao:hover span:not(.gd3-sao) { color: var(--aw-nhan); } }

/* --- Bảng tổng: điểm bên trái, phân bố bên phải --- */
.gd3-dg-tong { display: flex; flex-wrap: wrap; align-items: center; gap: 18px 26px;
  padding: 14px 16px; margin-bottom: 14px; border-radius: 12px;
  background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); }
.gd3-dg-diem { display: grid; gap: 4px; justify-items: center; flex: 0 0 auto; min-width: 104px; }
.gd3-dg-diem b { font-size: 32px; font-weight: 800; line-height: 1; color: var(--aw-chu); }
.gd3-dg-diem span { font-size: 12.5px; color: var(--aw-chu-phu); }

/* minmax(0,1fr) chứ không 1fr: cột giữa chứa thanh tỉ lệ, để 1fr thì nội dung tối thiểu
   của nó giữ chỗ và hai cột số bị đẩy tràn ở màn hẹp. */
.gd3-dg-cot { list-style: none; margin: 0; padding: 0; flex: 1 1 200px; min-width: 0; display: grid; gap: 5px; }
.gd3-dg-cot li { display: grid; grid-template-columns: 40px minmax(0, 1fr) 26px; align-items: center; gap: 9px; }
.gd3-dg-cot-so { font-size: 12.5px; color: var(--aw-chu-2); white-space: nowrap; }
.gd3-dg-cot-so i { color: var(--aw-sao); font-size: 10px; }
.gd3-dg-cot-thanh { display: block; height: 7px; border-radius: 99px; background: #fff; overflow: hidden; }
.gd3-dg-cot-thanh i { display: block; height: 100%; background: var(--aw-sao); border-radius: 99px; }
.gd3-dg-cot-n { font-size: 12.5px; color: var(--aw-chu-phu); text-align: right; }

/* --- Danh sách đánh giá --- */
.gd3-dg-ds { list-style: none; margin: 0; padding: 0; }
.gd3-dg-o { padding: 14px 0; border-top: 1px solid var(--aw-ke); }
.gd3-dg-o:first-child { border-top: 0; padding-top: 0; }
.gd3-dg-dau { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-bottom: 6px; }
.gd3-dg-ten { font-weight: 700; font-size: 14.5px; color: var(--aw-chu); }
.gd3-dg-ngay { margin-left: auto; font-size: 12px; color: var(--aw-chu-phu); }
.gd3-dg-that { display: inline-flex; align-items: center; gap: 5px; padding: 2px 9px; border-radius: 99px;
  font-size: 11.5px; font-weight: 700; color: #16794a; background: #E7F6EE; border: 1px solid #BFE6D2; }
.gd3-dg-noi { margin: 6px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--aw-chu-2); }

/* Câu trả lời của shop thụt vào + vạch bên trái: đọc lướt là biết ngay ai đang nói. */
.gd3-dg-traloi { margin: 10px 0 0 14px; padding: 9px 13px; border-left: 3px solid var(--aw-nhan-vien);
  background: var(--aw-nen-2); border-radius: 0 10px 10px 0; }
.gd3-dg-traloi b { display: block; font-size: 12.5px; color: var(--aw-nhan-dam); margin-bottom: 3px; }
.gd3-dg-traloi b i { margin-right: 5px; }
.gd3-dg-traloi p { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--aw-chu-2); }

.gd3-dg-them { margin: 12px 0 0; text-align: center; }
.gd3-dg-them a { font-weight: 700; font-size: 14px; color: var(--aw-nhan); text-decoration: none; }
@media (hover: hover) { .gd3-dg-them a:hover { text-decoration: underline; } }

/* --- Ba dòng thông báo. KHÔNG dùng flex: chúng chứa <b> giữa câu, mà flex biến mỗi thẻ con
       thành một ô riêng nên "<b>Đã mua hàng</b>" bị tách ra đứng một mình một cột (đúng cái
       bẫy đã dính ở .gd3-gio-nhan và .gd3-gio-yen). Biểu tượng cho ra position:absolute rồi
       chừa chỗ bằng padding-left — chữ vẫn chảy liền một mạch. --- */
.gd3-dg-xong, .gd3-dg-trong, .gd3-dg-loi, .gd3-dg-rieng { position: relative; padding-left: 28px; }
.gd3-dg-xong > i:first-child, .gd3-dg-trong > i:first-child,
.gd3-dg-loi > i:first-child, .gd3-dg-rieng > i:first-child { position: absolute; left: 6px; top: 3px; }

.gd3-dg-xong { margin: 0 0 14px; padding: 11px 14px 11px 34px; border-radius: 10px; font-size: 14px; line-height: 1.55;
  color: #16794a; background: #E7F6EE; border: 1px solid #BFE6D2; }
.gd3-dg-xong > i:first-child { left: 13px; top: 13px; }
.gd3-dg-trong { margin: 0; padding: 14px 14px 14px 36px; border-radius: 10px; font-size: 14px; line-height: 1.6;
  color: var(--aw-chu-2); background: var(--aw-nen-2); border: 1px dashed var(--aw-ke-dam); }
.gd3-dg-trong > i:first-child { left: 14px; top: 16px; color: var(--aw-ke-dam); }
.gd3-dg-loi { margin: 0 0 12px; padding: 10px 13px 10px 32px; border-radius: 10px; font-size: 13.5px;
  color: #9a2020; background: #FDECEC; border: 1px solid #F3C4C4; }
.gd3-dg-loi > i:first-child { left: 12px; top: 12px; }
.gd3-dg-rieng { margin: 8px 0 14px; font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }
.gd3-dg-rieng > i:first-child { left: 4px; top: 3px; color: var(--aw-ke-dam); }
.gd3-dg-rieng b { color: #16794a; }

/* --- Form --- */
.gd3-dg-mo { margin-top: 16px; border-top: 1px solid var(--aw-ke); padding-top: 14px; }
.gd3-dg-mo > summary { display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  padding: 9px 16px; border-radius: 99px; font-size: 14px; font-weight: 700;
  color: var(--aw-chu-2); background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien);
  list-style: none; }
.gd3-dg-mo > summary::-webkit-details-marker { display: none; }
.gd3-dg-mo > summary i { color: var(--aw-nhan); font-size: 13px; }
.gd3-dg-mo > summary:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
@media (hover: hover) { .gd3-dg-mo > summary:hover { background: var(--aw-nhan); color: #fff; border-color: var(--aw-nhan); }
  .gd3-dg-mo > summary:hover i { color: #fff; } }

.gd3-dg-form { margin-top: 14px; }
.gd3-dg-sao { border: 0; margin: 0 0 14px; padding: 0; }
.gd3-dg-sao legend { padding: 0; margin-bottom: 6px; font-size: 14px; font-weight: 700; color: var(--aw-chu); }
.gd3-dg-bb { color: var(--aw-nhan); }

/* Bộ chọn sao không cần một dòng JS nào: 5→1 trong HTML, row-reverse khi vẽ, rồi
   `input:checked ~ label` tô đúng ngôi sao đang chọn và mọi sao BÊN TRÁI nó (vì bên trái
   trên màn hình = đứng SAU trong HTML). Vẫn là <input type=radio> thật nên bàn phím mũi
   tên, đọc màn hình và "gửi mà chưa chọn" của trình duyệt đều chạy sẵn. */
.gd3-dg-chon { display: flex; flex-direction: row-reverse; justify-content: flex-end; gap: 2px; }
.gd3-dg-chon input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.gd3-dg-chon label { display: grid; place-items: center; width: 40px; height: 40px; cursor: pointer;
  font-size: 25px; color: var(--aw-ke-dam); transition: color .12s, transform .12s; }
.gd3-dg-chon input:checked ~ label { color: var(--aw-sao); }
.gd3-dg-chon input:focus-visible + label { outline: 2px solid var(--aw-nhan); outline-offset: -2px; border-radius: 8px; }
@media (hover: hover) {
  .gd3-dg-chon:hover label { color: var(--aw-ke-dam); }
  .gd3-dg-chon label:hover, .gd3-dg-chon label:hover ~ label { color: var(--aw-sao); }
  .gd3-dg-chon label:hover { transform: scale(1.12); }
}

.gd3-dg-hang { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 12px; }
.gd3-dg-o-nhap { display: block; margin-bottom: 12px; }
.gd3-dg-o-nhap > span:first-child { display: block; margin-bottom: 5px; font-size: 13.5px; font-weight: 600; color: var(--aw-chu-2); }
.gd3-dg-o-nhap input, .gd3-dg-o-nhap textarea {
  width: 100%; padding: 11px 13px; border: 1px solid var(--aw-ke-dam); border-radius: 10px;
  background: #fff; color: var(--aw-chu); font: inherit; font-size: 15px; }
.gd3-dg-o-nhap textarea { resize: vertical; min-height: 96px; line-height: 1.55; }
.gd3-dg-o-nhap input:focus, .gd3-dg-o-nhap textarea:focus { outline: 2px solid var(--aw-nhan); outline-offset: -1px; border-color: var(--aw-nhan); }
.gd3-dg-o-nhap [aria-invalid="true"] { border-color: #d24; background: #FFF7F7; }
.gd3-dg-loi-o { display: block; margin-top: 4px; font-size: 12.5px; color: #9a2020; }

.gd3-dg-gui { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; }
.gd3-dg-gui .gd3-sp-gio { flex: 0 0 auto; }
.gd3-dg-cho { font-size: 12.5px; color: var(--aw-chu-phu); }

/* 15px là ngưỡng iOS Safari TỰ PHÓNG TO trang khi con trỏ vào ô nhập (dưới 16px thì phóng).
   Ở đây để 16px trên điện thoại: phóng xong trang lệch hẳn, khách phải chụm tay thu lại —
   lỗi nhỏ nhưng đủ để bỏ dở một cái đánh giá. */
@media (max-width: 767.98px) {
  .gd3-dg-hang { grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); gap: 8px; }   /* tên ngắn, SĐT 10 số cần chỗ hơn */
  .gd3-dg-hang .gd3-dg-o-nhap { margin-bottom: 8px; }
  .gd3-dg-hang .gd3-dg-o-nhap > span:first-child { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .gd3-dg-hang .gd3-dg-o-nhap input { padding: 10px 11px; }
  .gd3-dg-rieng { margin: 0 0 12px; }
  .gd3-dg-o-nhap input, .gd3-dg-o-nhap textarea { font-size: 16px; }
  .gd3-dg-tong { gap: 14px 18px; padding: 13px; }
  .gd3-dg-diem { min-width: 88px; }
  .gd3-dg-diem b { font-size: 27px; }
  .gd3-dg-chon label { width: 44px; height: 44px; font-size: 27px; }   /* ngón tay: 44px là mức tối thiểu */
  .gd3-dg-ngay { margin-left: 0; width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  .gd3-dg-chon label { transition: none; }
  .gd3-dg-chon label:hover { transform: none; }
}

/* Sao trên THẺ sản phẩm: nhỏ, đứng ngay dưới tên, trước giá. Chỉ hiện khi sản phẩm đã có
   đánh giá — thẻ không có sao KHÔNG để chỗ trống bù lại, vì gần như cả trang sẽ không có
   sao trong thời gian đầu và chừa chỗ cho tất cả là thêm 20px trắng vào mỗi thẻ. */
.gd3-card-sao { display: flex; align-items: center; gap: 5px; margin-top: 4px; font-size: 12px; }
.gd3-card-sao .gd3-sao { font-size: 11px; }
.gd3-card-sao span:not(.gd3-sao) { color: var(--aw-chu-phu); }   /* cùng lý do như .gd3-sp-sao ở trên */

/* ĐẶC ĐIỂM NỔI BẬT trên thẻ (bản thử 26/09/2026, includes/dac_diem.php).
   Mỗi mẩu là MỘT VIÊN riêng, không xuống dòng giữa viên. Bản đầu viết thành một đoạn chữ
   cắt ở 2 dòng: đo ở màn 375px (thẻ rộng 142px) thì 15/53 thẻ bị cắt ngang mẩu thứ ba —
   "Chống nước IP…". Một sự thật bị cắt nửa chừng là thông tin sai. Nay viên nào không vừa
   3 hàng thì ẩn TRỌN viên (flex-wrap + max-height), không bao giờ cắt giữa.
   3 hàng chứ không 2 (chủ shop 26/09): viên chức năng như "5 chế độ xoay thụt" chiếm trọn
   một hàng ở thẻ 142px, nên 2 hàng thì máy có 3 chức năng chỉ khoe được 2 — khách tưởng
   hàng ít công dụng. Chức năng xếp đầu (includes/dac_diem.php), ẩn bớt là ẩn phần đuôi.
   Chiều cao cố định theo hàng viên (22px) chứ không theo số viên: giá vẫn có margin-top:auto
   nên các thẻ cùng hàng vẫn thẳng giá dù thẻ có 1 hay 3 viên. */
.product-item .gd3-card-dd {
  margin: 6px 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: 4px;
  max-height: 74px; overflow: hidden;           /* 3 hàng x 22px + 2 khe 4px */
}
.product-item .gd3-card-dd span {
  background: #f3f4f6; color: #4b5563; border-radius: 6px;
  font-size: 11.5px; line-height: 18px; padding: 2px 6px;   /* 6 chứ không 7: "Điều khiển qua ứng dụng" lố 2px ở thẻ 142px */
  white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
}
@media (min-width: 992px) { .product-item .gd3-card-dd span { font-size: 12px; } }

/* ===========================================================================
   BA KHỐI CUỐI TRANG SẢN PHẨM: HIỆN 4 MÓN, BẤM MỚI BUNG HẾT
   ---------------------------------------------------------------------------
   Số 4 phải TRÙNG BIÊN HÀNG, nếu không thì hàng cuối bị cắt dở trông như lỗi.
   Vì vậy lưới ở đây phải GHIM SỐ CỘT, không dùng auto-fill được nữa:

     auto-fill, minmax(196px, 1fr) cho ra 4 cột ở 992px nhưng 5 cột từ ~1050px
     và 5 cột ở 1200px — số cột đổi liên tục theo từng pixel bề ngang, nên
     không có con số "ẩn từ món thứ N" nào đúng ở mọi bề ngang.

   Ghim: 2 cột dưới 992px (4 món = 2 hàng), 4 cột từ 992px (4 món = 1 hàng).
   Thẻ ở 1366px rộng ra 283px thay vì 206px — khối ngắn đi mà thẻ lại dễ nhìn hơn.
   =========================================================================== */
@media (min-width: 992px) {
  .gd3-sp-lq .gd3-sp-luoi { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Ô chọn ẩn nhưng KHÔNG display:none — display:none là bàn phím Tab không tới được,
   mất luôn đường bung cho người không dùng chuột. */
.gd3-lq-cb { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.gd3-lq-cb:not(:checked) ~ .gd3-sp-luoi > :nth-child(n + 5) { display: none; }

.gd3-lq-nut { display: flex; align-items: center; justify-content: center; gap: 8px;
  width: fit-content; margin: 14px auto 0; padding: 9px 20px; border-radius: 999px;
  font-size: 14px; font-weight: 600; color: var(--aw-chu-2); cursor: pointer;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke-dam);
  transition: background-color .15s, border-color .15s, color .15s; }
.gd3-lq-nut i { font-size: 12px; color: var(--aw-chu-phu); transition: transform .18s; }
/* Nền trung tính, KHÔNG đỏ: đỏ trên trang này dành cho "Thêm vào giỏ" và "Mua ngay".
   Thêm một nút đỏ ở đuôi trang là chia bớt sự chú ý của đúng hai nút ra tiền. */
@media (hover: hover) {
  .gd3-lq-nut:hover { background: var(--aw-nhan-nhat); border-color: var(--aw-nhan-vien); color: var(--aw-nhan-dam); }
  .gd3-lq-nut:hover i { color: var(--aw-nhan); }
}
.gd3-lq-cb:focus-visible ~ .gd3-lq-nut { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
.gd3-lq-cb:checked ~ .gd3-lq-nut .gd3-lq-mo { display: none; }
.gd3-lq-cb:not(:checked) ~ .gd3-lq-nut .gd3-lq-dong { display: none; }
.gd3-lq-cb:checked ~ .gd3-lq-nut i { transform: rotate(180deg); }

/* ---- Khối "Bạn vừa xem" ---- */
.gd3-daxem-xoa { margin-left: auto; }
.gd3-daxem-xoa button { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px;
  border-radius: 999px; font: inherit; font-size: 12.5px; font-weight: 600; line-height: 1.2;
  color: var(--aw-chu-phu); background: transparent; border: 1px solid var(--aw-ke); cursor: pointer; }
.gd3-daxem-xoa button i { font-size: 11px; }
.gd3-daxem-xoa button:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
@media (hover: hover) { .gd3-daxem-xoa button:hover { color: var(--aw-nhan-dam); border-color: var(--aw-nhan-vien); background: var(--aw-nhan-nhat); } }

/* Biểu tượng cho ra position:absolute, KHÔNG dùng flex: dòng này có <b> giữa câu ở các khối
   khác cùng khuôn, mà flex thì mỗi thẻ con thành một ô riêng và câu bị xé làm đôi
   (đúng cái bẫy đã dính ở .gd3-gio-nhan và .gd3-gio-yen). */
.gd3-daxem-ghi { position: relative; margin: 12px 0 0; padding-left: 24px;
  font-size: 12.5px; line-height: 1.5; color: var(--aw-chu-phu); }
.gd3-daxem-ghi > i:first-child { position: absolute; left: 4px; top: 3px; color: var(--aw-ke-dam); }

@media (max-width: 575px) {
  /* Tiêu đề khối "Bạn vừa xem" + nút xoá: 2 dòng ở màn hẹp, không ép cùng hàng rồi
     bóp tên khối còn một chữ. */
  #daxem .gd3-km-tit { flex-wrap: wrap; }
  .gd3-daxem-xoa { margin-left: 0; width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  .gd3-lq-nut, .gd3-lq-nut i { transition: none; }
}

/* ===========================================================================
   BÀI VIẾT & TRANG TĨNH  (.gd3-bv-*)
   Ba trang dùng chung khối này: chi tiết bài viết, danh sách tin, trang tĩnh.
   Lý do gộp: cả ba đều là "một cột chữ dài để đọc", chỉ khác phần đầu trang.
   Tách ba bộ class thì mỗi lần chỉnh cỡ chữ thân bài phải sửa ba nơi.

   Bề rộng dòng chốt ở 780px chứ không kéo full container: quá ~90 ký tự một dòng
   là mắt bắt đầu trượt dòng khi xuống hàng. Thẻ và lưới thì vẫn full.
   =========================================================================== */
.gd3-bv { padding: 14px 0 28px; }
.gd3-bv-bai { max-width: 780px; margin-inline: auto; }

/* ---- đầu bài ---- */
.gd3-bv-dau { margin: 14px 0 16px; }
.gd3-bv-nhan { display: inline-block; margin-bottom: 10px; padding: 4px 11px; border-radius: 999px;
  font-size: 12px; font-weight: 700; text-decoration: none; letter-spacing: .2px;
  color: var(--aw-nhan); background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); }
@media (hover: hover) { .gd3-bv-nhan:hover { background: var(--aw-nhan); color: var(--aw-tren-nhan); border-color: var(--aw-nhan); } }

.gd3-bv-h1 { margin: 0; font-size: 24px; line-height: 1.3; font-weight: 800; color: var(--aw-chu); }
@media (min-width: 768px) { .gd3-bv-h1 { font-size: 30px; } }

/* Mỗi mẩu meta là một <span> có icon riêng -> flex ở đây an toàn: KHÔNG có câu chữ
   liền mạch nào bị xé, vì mỗi ô vốn đã là một mẩu rời. */
.gd3-bv-meta { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 10px 0 0;
  font-size: 13px; color: var(--aw-chu-phu); }
.gd3-bv-meta span { display: inline-flex; align-items: center; gap: 6px; }
.gd3-bv-meta i { font-size: 12px; color: var(--aw-ke-dam); }

.gd3-bv-tom { margin: 14px 0 0; font-size: 15.5px; line-height: 1.7; font-weight: 500; color: var(--aw-chu-2);
  padding-left: 14px; border-left: 3px solid var(--aw-nhan-vien); }

.gd3-bv-bia { margin: 18px 0 0; }
.gd3-bv-anh { width: 100%; height: auto; border-radius: 12px; display: block; }

/* ---- mục lục ---- */
.gd3-bv-mucluc { margin: 20px 0 4px; padding: 14px 16px; border-radius: 12px;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); }
.gd3-bv-mucluc > b { display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
  font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--aw-chu-phu); }
.gd3-bv-mucluc > b i { color: var(--aw-nhan); }
.gd3-bv-mucluc ol { margin: 0; padding-left: 20px; }
.gd3-bv-mucluc li { margin: 5px 0; font-size: 14.5px; line-height: 1.5; }
.gd3-bv-mucluc a { color: var(--aw-chu-2); text-decoration: none; }
@media (hover: hover) { .gd3-bv-mucluc a:hover { color: var(--aw-nhan); text-decoration: underline; } }
@media (min-width: 768px) { .gd3-bv-mucluc ol { columns: 2; column-gap: 28px; } .gd3-bv-mucluc li { break-inside: avoid; } }

/* ---- thân bài ----
   Nội dung do người viết gõ trong trình soạn thảo: chỉ có thẻ HTML trần, không class.
   Nên mọi luật ở đây phải bám THẺ, và vì vậy phải khoanh trong .gd3-bv-noi. */
.gd3-bv-noi { margin-top: 20px; font-size: 16px; line-height: 1.8; color: var(--aw-chu-2); }
.gd3-bv-noi > :first-child { margin-top: 0; }
.gd3-bv-noi p { margin: 0 0 16px; }
.gd3-bv-noi h2 { margin: 34px 0 12px; font-size: 20px; line-height: 1.35; font-weight: 800; color: var(--aw-chu);
  scroll-margin-top: 90px; }   /* neo mục lục: chừa chỗ cho thanh đầu trang dính */
.gd3-bv-noi h3 { margin: 26px 0 8px; font-size: 17px; line-height: 1.4; font-weight: 700; color: var(--aw-chu);
  scroll-margin-top: 90px; }
.gd3-bv-noi h4 { margin: 20px 0 6px; font-size: 15.5px; font-weight: 700; color: var(--aw-chu); }
@media (min-width: 768px) { .gd3-bv-noi { font-size: 16.5px; } .gd3-bv-noi h2 { font-size: 23px; } .gd3-bv-noi h3 { font-size: 18.5px; } }

.gd3-bv-noi ul, .gd3-bv-noi ol { margin: 0 0 16px; padding-left: 22px; }
.gd3-bv-noi li { margin: 0 0 8px; }
.gd3-bv-noi li > ul, .gd3-bv-noi li > ol { margin-top: 8px; }
.gd3-bv-noi strong, .gd3-bv-noi b { color: var(--aw-chu); font-weight: 700; }
.gd3-bv-noi a { color: var(--aw-nhan); text-decoration: underline; text-underline-offset: 2px; }
@media (hover: hover) { .gd3-bv-noi a:hover { color: var(--aw-nhan-dam); } }
.gd3-bv-noi img { max-width: 100%; height: auto; border-radius: 10px; margin: 8px 0; }
.gd3-bv-noi hr { margin: 30px 0; border: 0; border-top: 1px solid var(--aw-ke); }
.gd3-bv-noi blockquote { margin: 18px 0; padding: 12px 16px; border-left: 3px solid var(--aw-nhan-vien);
  background: var(--aw-nen-2); border-radius: 0 10px 10px 0; color: var(--aw-chu-2); }
.gd3-bv-noi blockquote p:last-child { margin-bottom: 0; }
.gd3-bv-noi code { font-family: ui-monospace, "Cascadia Mono", Consolas, monospace; font-size: .92em;
  padding: 2px 6px; border-radius: 5px; background: var(--aw-nen-2); }
.gd3-bv-noi pre { margin: 16px 0; padding: 12px 14px; overflow-x: auto; border-radius: 10px;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke); }
.gd3-bv-noi pre code { padding: 0; background: none; }

/* BẢNG: display:block để bảng TỰ cuộn ngang thay vì bóp cột còn hai chữ một dòng, hoặc
   đẩy cả trang rộng ra sinh thanh cuộn ngang toàn trang. min-width ở ô là thứ ép nó
   cuộn thật trên điện thoại — không có nó thì bảng 5 cột vẫn cố nhét vừa 375px. */
.gd3-bv-noi table { display: block; width: 100%; overflow-x: auto; border-collapse: collapse;
  margin: 18px 0; font-size: 14.5px; }
.gd3-bv-noi th, .gd3-bv-noi td { min-width: 96px; padding: 9px 12px; border: 1px solid var(--aw-ke);
  text-align: left; vertical-align: top; line-height: 1.6; }
.gd3-bv-noi th { background: var(--aw-nen-2); color: var(--aw-chu); font-weight: 700; }
.gd3-bv-noi tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--aw-nen-2) 45%, transparent); }

/* ---- chân bài ---- */
.gd3-bv-chan { margin-top: 26px; padding-top: 16px; border-top: 1px solid var(--aw-ke); }
.gd3-bv-capnhat { margin: 0 0 10px; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-bv-ve { display: inline-flex; align-items: center; gap: 7px; padding: 9px 16px; border-radius: 999px;
  font-size: 13.5px; font-weight: 600; text-decoration: none;
  color: var(--aw-chu-2); border: 1px solid var(--aw-ke); }
.gd3-bv-ve i { font-size: 11px; }
@media (hover: hover) { .gd3-bv-ve:hover { color: var(--aw-nhan); border-color: var(--aw-nhan-vien); background: var(--aw-nhan-nhat); } }

/* ---- khối cuối trang (sản phẩm nhắc tới, đọc tiếp) ---- */
.gd3-bv-khoi { margin-top: 34px; padding-top: 22px; border-top: 1px solid var(--aw-ke); }
.gd3-bv-tit { display: flex; align-items: center; gap: 9px; margin: 0 0 14px;
  font-size: 18px; font-weight: 800; color: var(--aw-chu); }
.gd3-bv-tit i { font-size: 16px; }

/* ---- lưới thẻ bài ----
   minmax(0, 1fr) chứ không phải 1fr: 1fr có min-width auto, nên một tiêu đề dài không
   ngắt được sẽ đẩy cột phình ra và phá cả lưới. */
.gd3-bv-luoi { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; }
@media (min-width: 576px) { .gd3-bv-luoi { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 992px) { .gd3-bv-luoi { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px; } }
/* Bài chưa có ảnh đại diện: ô 16:9 xám trơn trông như ảnh hỏng. Cho nó nền hồng nhạt của
   bộ màu + biểu tượng to, để nó đọc ra là "bài chưa có ảnh" chứ không phải "trang lỗi".
   Đây là biện pháp che tạm — bài có ảnh thật vẫn hơn hẳn. */
.gd3-bv-luoi .gd3-khong-anh { background: var(--aw-nhan-nhat); color: var(--aw-nhan-vien); font-size: 40px; }

/* ---- hàng chip danh mục con ---- */
.gd3-ds-chip-con { margin-top: -6px; align-items: center; }
.gd3-chip-nhan { font-size: 12.5px; color: var(--aw-chu-phu); align-self: center; white-space: nowrap; }
.gd3-chip-nhan b { color: var(--aw-chu); }
/* Trên điện thoại hàng chip CUỘN NGANG (luật ở .gd3-ds-chip phía trên). Nhãn "Trong <mục>:"
   ăn mất ~90px đầu hàng, đủ để đẩy chip ĐANG CHỌN ra ngoài màn hình — khách mở trang mà không
   thấy mình đang ở mục nào. Bỏ nhãn đi: tên mục đã nằm ngay trên tiêu đề H1 và ở breadcrumb. */
@media (max-width: 767px) { .gd3-chip-nhan { display: none; } }

/* ===========================================================================
   MỤC TIN TỨC — khối nổi bật, hàng theo chủ đề, cột bên  (.gd3-hero-*, .gd3-tin-*, .gd3-ben-*)
   Chỉ dùng ở trang danh sách tin. Thẻ bài vẫn là .gd3-nw-vua dùng chung với
   trang chủ và cuối bài — ở đây không đẻ thêm kiểu thẻ thứ hai.
   =========================================================================== */

/* ---- khối nổi bật: 1 bài lớn + 4 bài bên cạnh ---- */
.gd3-hero { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; margin: 16px 0 6px; }
@media (min-width: 992px) { .gd3-hero { grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); gap: 24px; } }

.gd3-hero-to { display: block; color: inherit; text-decoration: none; overflow: hidden;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 14px; }
.gd3-hero-anh { position: relative; display: block; aspect-ratio: 16 / 9; overflow: hidden; background: var(--aw-nen); }
.gd3-hero-anh img { width: 100%; height: 100%; object-fit: cover; transition: transform .4s; }
.gd3-hero-anh .gd3-khong-anh { position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto;
  background: var(--aw-nhan-nhat); color: var(--aw-nhan-vien); font-size: 46px; }
@media (hover: hover) { .gd3-hero-to:hover .gd3-hero-anh img { transform: scale(1.04); } }

.gd3-hero-chu { display: block; padding: 16px 18px 18px; }
.gd3-hero-ten { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  margin: 0; font-size: 20px; line-height: 1.32; font-weight: 800; color: var(--aw-chu); }
@media (min-width: 992px) { .gd3-hero-ten { font-size: 26px; } .gd3-hero-chu { padding: 20px 24px 24px; } }
@media (hover: hover) { .gd3-hero-to:hover .gd3-hero-ten { color: var(--aw-nhan); } }
.gd3-hero-tt { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  margin-top: 8px; font-size: 14px; line-height: 1.6; color: var(--aw-chu-2); }
.gd3-hero-meta { display: block; margin-top: 10px; font-size: 12.5px; color: var(--aw-chu-phu); }

/* Danh sách bên cạnh: mỗi dòng là ảnh nhỏ + tên. Kẻ ngăn giữa các dòng chứ không
   viền từng thẻ — bốn cái khung lồng trong một khung nữa là quá nhiều đường kẻ. */
/* Cột phải luôn thấp hơn thẻ lớn bên trái (ảnh 16:9 + tiêu đề + tóm tắt thì cao hơn
   bốn dòng tin). space-between kéo bốn dòng giãn đều cho hết chiều cao, thay vì dồn lên
   trên và bỏ lại một mảng trắng ở đáy. */
.gd3-hero-ds { display: flex; flex-direction: column; justify-content: space-between;
  background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 14px; padding: 4px 14px; }
.gd3-hero-nho { display: flex; gap: 12px; align-items: flex-start; padding: 13px 0;
  color: inherit; text-decoration: none; border-top: 1px solid var(--aw-ke); }
.gd3-hero-nho:first-child { border-top: 0; }
.gd3-hero-nho-anh { position: relative; flex: none; width: 104px; aspect-ratio: 16 / 10;
  overflow: hidden; border-radius: 8px; background: var(--aw-nen); }
/* Ảnh bìa bài viết có chữ trên đó; dưới 130px thì chữ nát thành vệt xám. Màn rộng còn chỗ
   thì cho to lên một bậc. */
@media (min-width: 1200px) { .gd3-hero-nho-anh { width: 136px; } }
.gd3-hero-nho-anh img { width: 100%; height: 100%; object-fit: cover; }
.gd3-hero-nho-anh .gd3-khong-anh { position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto;
  background: var(--aw-nhan-nhat); color: var(--aw-nhan-vien); font-size: 18px; }
.gd3-hero-nho-chu { min-width: 0; }
.gd3-hero-nho-ten { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 14px; line-height: 1.42; font-weight: 700; color: var(--aw-chu); }
@media (hover: hover) { .gd3-hero-nho:hover .gd3-hero-nho-ten { color: var(--aw-nhan); } }
.gd3-hero-nho-meta { display: block; margin-top: 5px; font-size: 12px; color: var(--aw-chu-phu); }
.gd3-hero-nho-meta b { color: var(--aw-chu-2); font-weight: 600; }

/* ---- khối tin ở TRANG CHỦ: cùng khuôn .gd3-hero, chỉ khác số bài trên điện thoại ----
   Trang chủ vốn đã rất dài; bốn dòng tin nhỏ ăn thêm gần một màn hình nữa mà không
   thêm được thông tin gì khách chưa thấy. Bài thứ tư vẫn nằm trong HTML (Google đọc
   được, và màn rộng vẫn hiện) — chỉ ẩn ở khổ hẹp. */
@media (max-width: 991.98px) { .gd3-nha-tin .gd3-hero-nho:nth-child(n + 4) { display: none; } }
.section-news { padding: 6px 0 24px; }
.section-news .gd3-tin-cd-dau { margin-bottom: 16px; }

/* ---- hàng theo chủ đề ---- */
.gd3-tin-cd { margin-top: 30px; }
.gd3-tin-cd-dau { display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
  padding-bottom: 10px; border-bottom: 2px solid var(--aw-nhan-vien); }
.gd3-tin-cd-dau .gd3-bv-tit { margin: 0; }
.gd3-tin-cd-them { flex: none; font-size: 13px; font-weight: 600; color: var(--aw-nhan); text-decoration: none; white-space: nowrap; }
.gd3-tin-cd-them i { font-size: 10px; }
@media (hover: hover) { .gd3-tin-cd-them:hover { color: var(--aw-nhan-dam); text-decoration: underline; } }
.gd3-tin-cd-mota { margin: 10px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--aw-chu-phu); max-width: 78ch; }
.gd3-tin-cd .gd3-bv-luoi { margin-top: 16px; }
@media (min-width: 1200px) { .gd3-bv-luoi-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* ---- thân trang: lưới + cột bên ---- */
.gd3-tin-than { display: grid; grid-template-columns: minmax(0, 1fr); gap: 26px; margin-top: 34px; }
@media (min-width: 992px) { .gd3-tin-than { grid-template-columns: minmax(0, 1fr) 312px; gap: 32px; } }
.gd3-tin-tit-kho { padding-bottom: 10px; border-bottom: 2px solid var(--aw-nhan-vien); margin-bottom: 18px; }
.gd3-tin-chinh .gd3-phantrang { margin-top: 22px; }

/* Cột bên dính theo cuộn: kho bài dài hơn cột bên rất nhiều, không dính thì cuộn tới
   giữa trang là cột bên biến mất và còn một dải trắng chạy dài. */
.gd3-tin-ben { align-self: start; }
@media (min-width: 992px) { .gd3-tin-ben { position: sticky; top: 88px; } }

.gd3-ben-o { background: var(--aw-the); border: 1px solid var(--aw-ke); border-radius: 14px;
  padding: 16px 18px; margin-bottom: 16px; }
.gd3-ben-o:last-child { margin-bottom: 0; }
.gd3-ben-tit { display: flex; align-items: center; gap: 8px; margin: 0 0 6px;
  font-size: 15px; font-weight: 800; color: var(--aw-chu); }
.gd3-ben-tit i { font-size: 14px; }

.gd3-ben-ds { list-style: none; margin: 0; padding: 0; counter-reset: none; }
.gd3-ben-ds li { display: flex; gap: 12px; align-items: flex-start; padding: 11px 0; border-top: 1px solid var(--aw-ke); }
.gd3-ben-ds li:first-child { border-top: 0; }
.gd3-ben-so { flex: none; width: 24px; font-size: 20px; font-weight: 800; line-height: 1.2;
  color: var(--aw-nhan-vien); font-variant-numeric: tabular-nums; }
.gd3-ben-ds a { min-width: 0; color: inherit; text-decoration: none; }
.gd3-ben-ten { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 13.8px; line-height: 1.45; font-weight: 600; color: var(--aw-chu-2); }
@media (hover: hover) { .gd3-ben-ds a:hover .gd3-ben-ten { color: var(--aw-nhan); } }
.gd3-ben-meta { display: block; margin-top: 4px; font-size: 11.5px; color: var(--aw-chu-phu); }

.gd3-ben-dm { list-style: none; margin: 0; padding: 0; }
.gd3-ben-dm li { border-top: 1px solid var(--aw-ke); }
.gd3-ben-dm li:first-child { border-top: 0; }
.gd3-ben-dm a { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 0; font-size: 14px; color: var(--aw-chu-2); text-decoration: none; }
.gd3-ben-dm a span { flex: none; min-width: 26px; text-align: center; padding: 2px 7px; border-radius: 999px;
  font-size: 11.5px; font-weight: 700; color: var(--aw-chu-phu); background: var(--aw-nen-2); }
@media (hover: hover) { .gd3-ben-dm a:hover { color: var(--aw-nhan); } }
/* Mục con thụt vào và có gạch dẫn — nhìn là biết nó nằm trong mục nào, khỏi cần thêm chữ. */
.gd3-ben-dm li.con a { padding-left: 18px; position: relative; font-size: 13.5px; }
.gd3-ben-dm li.con a::before { content: ""; position: absolute; left: 2px; top: 50%; width: 8px; height: 1px; background: var(--aw-ke-dam); }

.gd3-ben-ho p { margin: 4px 0 12px; font-size: 13.5px; line-height: 1.6; color: var(--aw-chu-phu); }
.gd3-ben-nut { display: block; margin-top: 8px; padding: 10px 14px; border-radius: 999px; text-align: center;
  font-size: 13.5px; font-weight: 600; text-decoration: none;
  color: var(--aw-chu-2); background: var(--aw-nen-2); border: 1px solid var(--aw-ke); }
@media (hover: hover) { .gd3-ben-nut:hover { color: var(--aw-nhan); border-color: var(--aw-nhan-vien); background: var(--aw-nhan-nhat); } }

/* ---- trang tra cứu đơn: danh sách bốn bước ở cột phải --------------------
   Số thứ tự vẽ bằng ::before chứ không dùng dấu chấm mặc định của <ol>: cần nó
   là một ô tròn có nền, mà dấu chấm mặc định thì không tạo kiểu được. */
.gd3-dh-buocds { list-style: none; margin: 4px 0 0; padding: 0; counter-reset: buoc; }
.gd3-dh-buocds li { position: relative; counter-increment: buoc; padding: 0 0 14px 38px; }
.gd3-dh-buocds li::before { content: counter(buoc); position: absolute; left: 0; top: 0;
  width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center;
  font-size: 13px; font-weight: 800; color: var(--aw-nhan);
  background: var(--aw-nhan-nhat); border: 1px solid var(--aw-nhan-vien); }
/* Đường nối dọc giữa các bước — bước cuối thì thôi, kẻo thành cái đuôi thừa. */
.gd3-dh-buocds li::after { content: ""; position: absolute; left: 13px; top: 28px; bottom: 2px;
  width: 2px; background: var(--aw-ke); }
.gd3-dh-buocds li:last-child { padding-bottom: 0; }
.gd3-dh-buocds li:last-child::after { display: none; }
.gd3-dh-buocds b { display: block; font-size: 14px; font-weight: 700; color: var(--aw-chu); line-height: 1.4; }
.gd3-dh-buocds span { display: block; margin-top: 3px; font-size: 12.5px; line-height: 1.55; color: var(--aw-chu-phu); }

/* Nút gọi là hành động chính trong ô hỗ trợ — tô màu nhấn, hai nút nhắn tin để viền. */
.gd3-dh-goi-nut { color: var(--aw-tren-nhan); background: var(--aw-nhan); border-color: var(--aw-nhan); }
@media (hover: hover) { .gd3-dh-goi-nut:hover { color: var(--aw-tren-nhan); background: var(--aw-nhan-dam); border-color: var(--aw-nhan-dam); } }
.gd3-dh-phai .gd3-ben-nut i { margin-right: 6px; }
/* Ô "Đọc thêm" dùng lại .gd3-ben-dm của cột bên trang tin, nhưng ở đây không có số đếm. */
.gd3-dh-phai .gd3-ben-dm a { justify-content: flex-start; }


/* ==========================================================================
   LƯỚI DANH MỤC SẢN PHẨM (.gd3-dm-*) — thay dải cuộn ngang, 22/09/2026

   Bản cũ ở khổ điện thoại là băng chuyền: 9 danh mục nằm trên một dải cuộn ngang mà
   màn hình chỉ chứa 3 cái rưỡi, lại không có dấu hiệu nào cho biết là vuốt được. Khách
   không vuốt thì 5 danh mục coi như không tồn tại — trong đó có cả nhóm hàng lớn nhất.
   Lưới tĩnh không phải học cách dùng: nhìn là thấy hết.

   Ô ĐỀU NHAU HẾT (sửa 22/09/2026). Bản đầu có một ô to gấp bốn cho danh mục nhiều hàng
   nhất, kèm cả một ràng buộc `cột x hàng - 4 = 8` để lưới khít. Chủ shop nói lệch cỡ thế
   nhìn không hợp lý — và đúng: mấy nhóm hàng là lối vào ngang nhau, cho một cái to gấp bốn
   là nói với khách rằng nhóm đó quan trọng hơn. Bỏ ô lớn thì mất luôn cả ràng buộc đếm ô:
   thêm hay bớt danh mục bao nhiêu cũng không phải tính lại số cột.

   minmax(0, 1fr) chứ không phải 1fr: 1fr có min-width auto nên một tên danh mục dài
   (“Kéo dài thời gian”) sẽ nong cột rộng ra và phá đều lưới.
   ========================================================================== */
.gd3-dm-dau { padding-top: 26px; text-align: center; }
.gd3-dm-tit { margin: 0; font-size: 22px; font-weight: 800; color: var(--aw-chu); }
.gd3-dm-phu { margin: 6px 0 0; font-size: 13px; color: var(--aw-chu-phu); }

.gd3-dm-luoi {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 10px;
    margin: 18px 0 8px;
}
/* SỐ CỘT: 3 ở điện thoại, 6 từ 992px. Chọn 3 và 6 vì shop đang có 6 danh mục hiện ra —
   cả hai đều chia hết nên không có hàng nào hụt ô (3 cột x 2 hàng, hoặc 6 cột x 1 hàng).
   Mốc 6 cột ở 992px chứ không phải 768px: ở 768 thì sáu cột chỉ còn 112px mỗi ô, chữ tên
   danh mục vỡ thành ba dòng. Ở 1366 mà để 4 cột thì ngược lại — ô rộng 321 cao 394, to hơn
   cả thẻ sản phẩm (233x410), và cả lưới cao 1209px, đẩy mọi thứ khác xuống dưới màn hình. */
@media (min-width: 768px) {
    .gd3-dm-luoi { gap: 14px; }
    .gd3-dm-dau { padding-top: 34px; }
    .gd3-dm-tit { font-size: 26px; }
}
@media (min-width: 992px) {
    .gd3-dm-luoi { grid-template-columns: repeat(6, minmax(0, 1fr)); }
}

/* Ô: ảnh trên, chữ dưới. Cả ô là một thẻ <a> nên không cần bắt sự kiện gì bằng JS. */
.gd3-dm-o {
    display: flex; flex-direction: column;
    background: #fff; border: 1px solid var(--aw-ke); border-radius: 12px;
    overflow: hidden; text-decoration: none; color: inherit;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .04);
}
.gd3-dm-anh {
    display: block; position: relative;
    aspect-ratio: 1 / 1;                 /* ảnh sản phẩm của shop này VUÔNG — xem mục khung ảnh thẻ SP */
    /* NỀN TRẮNG, không phải nền hồng chìm: ảnh sản phẩm của shop chụp trên nền TRẮNG, mà
       object-fit:contain thì ảnh không vuông sẽ chừa hai dải nền ở hai bên — dải hồng ôm lấy
       một tấm ảnh nền trắng nhìn ra ngay là hai mảng ghép vào nhau. */
    background: #fff;
}
.gd3-dm-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
/* Không có ảnh thì rơi về biểu tượng, đặt giữa ô — không để lỗ trống. */
.gd3-dm-anh i {
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    font-size: 30px; color: var(--aw-nhan);
}
/* CĂN GIỮA phần chữ cho khớp với ảnh.
   Ảnh sản phẩm nằm giữa ô (object-fit: contain, món hàng ở chính giữa khung), mà tên và
   số lượng lại dính mép trái — chủ shop nhìn phát hiện ngay: "ảnh căn giữa chữ thì thụt
   ra ngoài". Trong một ô nhỏ chỉ có hai dòng chữ, căn giữa là cách duy nhất ăn nhập với
   tấm ảnh; căn trái chỉ hợp khi chữ dài nhiều dòng. Tiêu đề khối bên trên cũng đang căn
   giữa, nên cả khối về một mối. */
.gd3-dm-chu { display: flex; flex-direction: column; gap: 2px; padding: 8px 10px 10px;
  text-align: center; }
.gd3-dm-ten {
    font-size: 13px; font-weight: 700; line-height: 1.35; color: var(--aw-chu);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    min-height: 2.7em;                   /* chốt 2 dòng để đáy các ô cùng hàng thẳng nhau */
    overflow-wrap: break-word;
}
.gd3-dm-so { font-size: 11.5px; color: var(--aw-chu-phu); }

@media (hover: hover) {
    .gd3-dm-o { transition: box-shadow .18s ease, transform .18s ease, border-color .18s ease; }
    .gd3-dm-o:hover { border-color: var(--aw-nhan); box-shadow: 0 8px 20px rgba(0, 0, 0, .10); transform: translateY(-2px); }
    .gd3-dm-o:hover .gd3-dm-ten { color: var(--aw-nhan-dam, var(--aw-nhan)); }
}
@media (prefers-reduced-motion: reduce) {
    .gd3-dm-o { transition: none; }
    .gd3-dm-o:hover { transform: none; }
}


/* ==========================================================================
   BẢNG GỢI Ý TÌM KIẾM (.gd3-tk-*) — 22/09/2026

   Ô tìm kiếm cũ không có gợi ý: khách phải gõ đủ từ rồi bấm Enter mới biết shop
   có gì. Với 3.827 món thì đó là bắt người ta đoán đúng từ khoá ngay lần đầu.

   z-index 1200: phải cao hơn thanh menu dính (sticky) của đầu trang, nếu không
   bảng gợi ý chui XUỐNG DƯỚI menu và chỉ thấy được hai dòng đầu.
   ========================================================================== */
.gd3-tk { position: relative; width: 100%; }

.gd3-tk-bang {
    position: absolute; z-index: 1200; top: calc(100% + 6px); left: 0; right: 0;
    max-height: min(70vh, 460px); overflow-y: auto;
    background: #fff; border: 1px solid var(--aw-ke); border-radius: 12px;
    box-shadow: 0 12px 32px rgba(0, 0, 0, .16);
    padding: 6px;
    overscroll-behavior: contain;   /* cuộn hết bảng thì DỪNG, không đẩy cả trang chạy theo */
}

.gd3-tk-nhom {
    padding: 8px 10px 4px;
    font-size: 11px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
    color: var(--aw-chu-phu);
}

.gd3-tk-dong {
    display: flex; align-items: center; gap: 10px;
    padding: 7px 10px; border-radius: 9px;
    text-decoration: none; color: inherit;
}
/* Chuột VÀ bàn phím dùng CÙNG một kiểu nền: người dùng bàn phím phải thấy rõ mình
   đang ở dòng nào, y như người dùng chuột. */
.gd3-tk-dong.la-chon { background: var(--aw-nen-2, #f5edec); }
@media (hover: hover) { .gd3-tk-dong:hover { background: var(--aw-nen-2, #f5edec); } }

.gd3-tk-anh {
    flex: none; width: 40px; height: 40px; border-radius: 7px; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: var(--aw-nen-2, #f5edec); color: var(--aw-nhan); font-size: 14px;
}
.gd3-tk-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }

/* minmax(0,1fr) bằng min-width:0 — thiếu dòng này thì tên sản phẩm dài nong cả
   bảng rộng ra và text-overflow không bao giờ chạy. */
.gd3-tk-chu { min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.gd3-tk-chu b {
    font-size: 13.5px; font-weight: 600; line-height: 1.35; color: var(--aw-chu);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    overflow-wrap: anywhere;
}
.gd3-tk-chu em { font-style: normal; font-size: 12.5px; font-weight: 800; color: var(--aw-giam); }

.gd3-tk-khong { padding: 14px 12px; font-size: 13px; color: var(--aw-chu-phu); text-align: center; }

/* Ở khổ điện thoại bảng gợi ý CHỈ phải hạ trần chiều cao. Trước ngày 22/09/2026 chỗ này
   còn một mớ luật nữa (neo mép phải, width: max-content, nong quá bề ngang ô nhập) — cần
   thiết vì hồi đó ô nhập bị đầu trang bóp còn 37px, bảng gợi ý mà hẹp bằng nó thì vô dụng.
   Giờ ô tìm kiếm đã có hàng riêng rộng 351px nên bảng chỉ việc trùng khít với nó: đó là
   thứ mắt mong đợi, và bớt được một chỗ có thể lệch.
   Vẫn giữ keoVaoManHinh() bên JS: nó đo rồi mới kéo, không có gì để kéo thì nó không kéo. */
@media (max-width: 991px) {
    .gd3-tk-bang { max-height: 62vh; }
}

/* ==========================================================================
   TẤM TÌM KIẾM TOÀN MÀN Ở ĐIỆN THOẠI (body.gd3-tks) — 22/09/2026

   Chạm vào ô tìm là cả khung .gd3-tk bung ra chiếm trọn màn hình. KHÔNG có ô nhập
   thứ hai, không có lớp phủ riêng — chỉ là chính nó đổi position: relative -> fixed
   bằng một lớp trên <body>. Nhờ vậy toàn bộ phần đã chạy (chờ 180ms, huỷ lượt cũ,
   bàn phím lên/xuống, escape bằng textContent) dùng nguyên, không có bản thứ hai
   để lệch nhau.

   Vì sao phải toàn màn chứ không nới bảng gợi ý cho to: trên điện thoại bàn phím ăn
   mất khoảng nửa màn. Một bảng lơ lửng dưới đầu trang chỉ còn chỗ khoe ba dòng, mà
   tìm kiếm thì cần nhìn nhiều lựa chọn một lúc mới có nghĩa.
   ========================================================================== */
body.gd3-tks { overflow: hidden; }   /* khoá cuộn nền: vuốt trong tấm không kéo trang phía sau */

.gd3-tk-quay {
    display: none;                    /* mặc định tắt hẳn — khổ máy tính không bao giờ có nút này */
    background: transparent; border: 0; padding: 0;
    width: 40px; height: 48px; align-items: center; justify-content: center;
    font-size: 19px; color: var(--aw-chu); cursor: pointer;
}

/* Gợi ý sẵn khi chưa gõ gì */
.gd3-tk-goc { padding: 8px 2px 2px; }
.gd3-tk-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; }
.gd3-tk-chip {
    display: inline-flex; align-items: center; padding: 9px 14px;
    border: 1px solid var(--aw-ke); border-radius: 999px;
    background: var(--aw-nen-2); color: var(--aw-chu);
    font-size: 13.5px; font-weight: 600; text-decoration: none;
}
@media (hover: hover) {
    .gd3-tk-chip:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
}

@media (max-width: 991px) {
    /* `will-change: transform` trên đầu trang (có sẵn trong CSS gốc, để cuộn mượt) TẠO RA
       KHỐI CHỨA cho mọi con position:fixed — y hệt transform. Nên `inset: 0` của tấm tìm
       kiếm không tính theo màn hình mà tính theo cái đầu trang cao 72px: đo ra tấm nằm ở
       y=56, cao 72, chứ không phủ kín màn. Mất một lúc mới thấy vì CSS trông hoàn toàn đúng.
       Gỡ gợi ý đó ĐÚNG LÚC tấm mở (lúc đó không ai cuộn đầu trang nữa), và nâng z-index
       của chính đầu trang lên: tấm nằm trong ngữ cảnh xếp lớp của nó, nên tấm có z-index
       2000 mà đầu trang chỉ 1000 thì vẫn bị thanh đáy điện thoại đè lên. */
    body.gd3-tks .header-fixed-top { will-change: auto; z-index: 2000; }

    body.gd3-tks .gd3-tk {
        position: fixed; inset: 0; z-index: 2000; background: #fff;
        display: grid;
        grid-template-columns: 40px minmax(0, 1fr);
        grid-template-rows: auto minmax(0, 1fr);
        grid-template-areas: "quay form"
                             "ds   ds";
        align-content: start;
        column-gap: 6px; row-gap: 8px;
        padding: 10px 12px;
    }
    body.gd3-tks .gd3-tk-quay { grid-area: quay; display: inline-flex; }
    body.gd3-tks .gd3-tk > form { grid-area: form; }
    body.gd3-tks .gd3-tk-bang,
    body.gd3-tks .gd3-tk-goc { grid-area: ds; }

    /* Bảng gợi ý thôi làm hộp nổi, thành DANH SÁCH của tấm: bỏ neo tuyệt đối, bỏ viền,
       bỏ bóng, bỏ trần chiều cao — trong một tấm trắng toàn màn thì viền và bóng là rác,
       còn trần chiều cao thì cắt mất đúng thứ vừa mở ra để xem. */
    body.gd3-tks .gd3-tk-bang {
        position: static; max-height: none; min-height: 0;
        border: 0; box-shadow: none; border-radius: 0; padding: 0;
        overflow-y: auto; -webkit-overflow-scrolling: touch;
    }

    /* Rộng rãi hơn hẳn bản thả xuống: ở đây màn hình là của riêng nó. */
    body.gd3-tks .input-group-search { height: 48px; }
    body.gd3-tks #input-search { font-size: 16px; }
    body.gd3-tks .gd3-tk-dong { padding: 9px 8px; }
    body.gd3-tks .gd3-tk-anh { width: 46px; height: 46px; }
    body.gd3-tks .gd3-tk-chu b { font-size: 14.5px; }
    body.gd3-tks .gd3-tk-nhom { padding-left: 8px; }
}

/* --------------------------------------------------------------------------
   KHỐI "BÀI VIẾT VỀ …" Ở TRANG KẾT QUẢ TÌM (.gd3-kqbai-*)

   Không dùng chung kiểu với thẻ bài viết ở trang tin: ở đây nó là LỐI RA của một
   lượt tìm, nên phải đọc được ý ngay (tiêu đề + mấy chữ mở đầu) mà không cần ảnh.
   Ảnh bài viết ở đây chỉ làm khối cao thêm gấp đôi và đẩy phân trang xuống dưới màn.
   -------------------------------------------------------------------------- */
.gd3-kqbai { margin-top: 26px; padding-top: 20px; border-top: 1px solid var(--aw-ke); }
.gd3-kqbai-dau {
    margin: 0 0 12px; font-size: 17px; font-weight: 800; color: var(--aw-chu);
    display: flex; align-items: center; gap: 8px;
}
.gd3-kqbai-dau i { color: var(--aw-nhan); font-size: 15px; }

/* auto-fill: một cột ở điện thoại, hai–ba cột ở máy tính, không cần media query. */
.gd3-kqbai-luoi {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
    gap: 12px;
}
.gd3-kqbai-o {
    display: flex; flex-direction: column; gap: 6px;
    padding: 14px 16px; border: 1px solid var(--aw-ke); border-radius: 12px;
    background: #fff; text-decoration: none; color: inherit;
    transition: border-color .15s, box-shadow .15s;
}
.gd3-kqbai-o b {
    font-size: 14.5px; font-weight: 700; line-height: 1.4; color: var(--aw-chu);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.gd3-kqbai-o span {
    font-size: 13px; line-height: 1.5; color: var(--aw-chu-phu);
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.gd3-kqbai-o em {
    margin-top: auto; font-style: normal; font-size: 12.5px; font-weight: 800; color: var(--aw-nhan);
    display: flex; align-items: center; gap: 6px;
}
@media (hover: hover) {
    .gd3-kqbai-o:hover { border-color: var(--aw-nhan); box-shadow: 0 6px 18px rgba(0, 0, 0, .07); }
}
@media (prefers-reduced-motion: reduce) { .gd3-kqbai-o { transition: none; } }


/* Chân bảng: dòng "Xem tất cả N sản phẩm". Kẻ một vạch ngăn với danh sách phía trên,
   vì nó không phải một gợi ý nữa mà là đường ra trang kết quả. */
.gd3-tk-chan { border-top: 1px solid var(--aw-ke); margin-top: 6px; padding-top: 4px; }
.gd3-tk-chan .gd3-tk-chu b { font-weight: 800; color: var(--aw-nhan); }

/* --------------------------------------------------------------------------
   KHỔ MÁY TÍNH (>= 992px) — BẢNG HAI CỘT

   Ở đây ô tìm kiếm rộng ~1.100px. Một cột dòng cao 54px trên nền rộng thế thì
   hơn nửa bảng bên phải là khoảng trắng: trông như cái menu bị kéo dãn, không
   ra bảng tìm kiếm. Chia việc theo đúng ba loại ý khách gõ:
     · cột trái  (258px) — DANH MỤC rồi BÀI VIẾT: chữ ngắn, không cần ảnh
     · cột phải  (còn lại) — SẢN PHẨM, lưới 2 ô/hàng, ảnh 52px
     · hàng dưới — đường ra trang kết quả, nằm ngang hết bảng
   Ảnh to hơn (52 so với 40) chỉ bật ở đây: ở khổ điện thoại 52px sẽ ăn mất
   chỗ của tên sản phẩm, mà tên mới là thứ khách đọc.
   -------------------------------------------------------------------------- */
@media (min-width: 992px) {
    .gd3-tk-bang { padding: 10px; max-height: min(74vh, 540px); }

    .gd3-tk-bang.co-phu {
        display: grid;
        grid-template-columns: 258px minmax(0, 1fr);   /* minmax(0,…): tên dài không nong cột */
        grid-template-areas: "dm  sp"
                             "bai sp"
                             "chan chan";
        align-content: start;
        column-gap: 10px;
    }
    /* Thiếu nhóm nào thì vùng đó rỗng và tự xẹp về 0 — "sp" vẫn trải hai hàng,
       nên không có nhóm "Bài viết" cũng không để lại lỗ. */
    .gd3-tk-bang.co-phu > [data-vung="dm"]  { grid-area: dm; }
    .gd3-tk-bang.co-phu > [data-vung="bai"] { grid-area: bai; }
    .gd3-tk-bang.co-phu > [data-vung="sp"]  {
        grid-area: sp;
        border-left: 1px solid var(--aw-ke); padding-left: 12px;
    }
    .gd3-tk-bang.co-phu > .gd3-tk-chan { grid-area: chan; }

    /* Lưới sản phẩm: auto-fill chứ không đếm cột tay. Bề ngang cột phải thay đổi
       theo hai thứ cùng lúc — khổ màn hình VÀ có cột trái hay không — nên đếm tay
       thì phải viết bốn luật và vẫn sai một khổ. Đo ở 1024: cột phải còn 467px,
       chia hai là mỗi ô 230px, tên sản phẩm bị cắt ngay chữ thứ tư. Đặt sàn 300px
       thì 467px tự cho MỘT cột, 809px (1366 có cột trái) cho hai, 1.080px (không
       có cột trái) cho ba. */
    .gd3-tk-bang [data-vung="sp"] .gd3-tk-ds {
        display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 2px 6px;
    }
    .gd3-tk-bang [data-vung="sp"] .gd3-tk-anh { width: 52px; height: 52px; }
    .gd3-tk-bang [data-vung="sp"] .gd3-tk-dong { padding: 8px 10px; align-items: flex-start; }
}

/* ẢNH MÓN HÀNG BAY VÀO GIỎ (26/09/2026) — assets/js/site.js dựng thẻ này lúc bấm thêm giỏ và
   điều khiển đường bay bằng Web Animations; ở đây chỉ lo hình thức. Nền trắng + viền trắng
   để ảnh sản phẩm (phần lớn nền trắng) vẫn thành một "tấm" rõ ràng khi bay qua ảnh khác. */
.gd3-bay-anh {
  position: fixed; z-index: 2147483000; pointer-events: none;
  border-radius: 14px; border: 2px solid #fff;
  background: #fff center / contain no-repeat;
  box-shadow: 0 10px 28px rgba(31, 26, 26, .28);
  will-change: transform, opacity; transform-origin: center;
}

/* ============================ KHÁCH HÀNG NÓI GÌ (trang chủ, 26/09/2026) ============================
   Dải trượt ngang như hàng chip: điện thoại thấy 2 thẻ + mép thẻ thứ ba (gợi ý còn nữa, kéo
   sang), máy tính 5 thẻ. Thẻ cao bằng nhau (align-items: stretch) để hàng thẳng dù lời dài ngắn
   khác nhau. Ảnh khách vuông 1:1, cover — ảnh điện thoại dọc/ngang lẫn lộn, để contain thì mỗi
   thẻ một kiểu viền trắng. */
.gd3-kk { padding: 8px 0 22px; }
.gd3-kk .gd3-tin-cd-dau { margin-bottom: 14px; }
.gd3-kk-dai { display: flex; gap: 14px; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; padding-bottom: 4px; }
.gd3-kk-dai::-webkit-scrollbar { display: none; }
.gd3-kk-the { flex: 0 0 calc((100% - 4 * 14px) / 5); min-width: 0; margin: 0; scroll-snap-align: start;
  display: flex; flex-direction: column; background: var(--aw-the); border: 1px solid var(--aw-ke);
  border-radius: 14px; overflow: hidden; }
.gd3-kk-anh { aspect-ratio: 1 / 1; background: var(--aw-nen-2); overflow: hidden; }
.gd3-kk-anh img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gd3-kk-trich { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 10px;
  padding: 16px; text-align: center; background: var(--aw-nhan-nhat); }
.gd3-kk-trich > .fa-quote-left { font-size: 34px; color: var(--aw-nhan); opacity: .35; }
.gd3-kk-sao { display: inline-flex; gap: 2px; color: #f5a623; font-size: 14px; }
.gd3-kk-nguon { font-size: 12px; color: var(--aw-chu-2); line-height: 1.5; }
.gd3-kk-nguon b { color: var(--aw-xanh, #1a7f37); font-weight: 600; white-space: nowrap; }
.gd3-kk-chu { display: flex; flex-direction: column; gap: 8px; padding: 12px; flex: 1 1 auto; }
.gd3-kk-ten { font-size: 13px; font-style: italic; color: var(--aw-chu-phu); }
.gd3-kk-sp { display: flex; align-items: center; gap: 8px; padding: 5px; border-radius: 10px;
  background: var(--aw-nen-2); text-decoration: none; color: var(--aw-chu); }
.gd3-kk-sp-anh { flex: none; width: 40px; height: 40px; border-radius: 7px; overflow: hidden; background: #fff; }
.gd3-kk-sp-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-kk-sp-ten { font-size: 12.5px; font-weight: 600; line-height: 1.35; min-width: 0;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
@media (hover: hover) { .gd3-kk-sp:hover .gd3-kk-sp-ten { color: var(--aw-nhan); } }
.gd3-kk-loi { margin: 0; font-size: 14px; line-height: 1.5; color: var(--aw-chu);
  display: -webkit-box; -webkit-line-clamp: 6; -webkit-box-orient: vertical; overflow: hidden; }
@media (max-width: 991px) { .gd3-kk-the { flex-basis: calc((100% - 2 * 14px) / 3); } }
/* Điện thoại: 2 thẻ (42%) + ~10% thẻ thứ ba ló ra bên phải. Dải tràn sát mép màn (bù padding của
   .container) để thẻ trượt ra khỏi mép chứ không bị cắt cụt giữa chừng. */
@media (max-width: 575px) {
  .gd3-kk-dai { gap: 10px; margin-inline: -12px; padding-inline: 12px; scroll-padding-left: 12px; }
  .gd3-kk-the { flex-basis: 42%; }
  .gd3-kk-chu { padding: 10px; gap: 7px; }
  .gd3-kk-loi { font-size: 13.5px; }
}

/* ==========================================================================================
   RÀ SOÁT ĐIỆN THOẠI 27/09/2026 — năm lỗi đo được ở 375px (80% khách dùng điện thoại)
   Gom một chỗ ở CUỐI tệp để thắng luật cũ theo thứ tự nạp, không phải leo độ ưu tiên.
   ========================================================================================== */

/* ---- 1. THANH MUA DÍNH ĐÁY TRÊN ĐIỆN THOẠI ----
   Trước đây tắt hẳn dưới 992px. Đo trang một hộp bao cao su ở 375: nút "Thêm vào giỏ" nằm ở
   y≈908 (màn cao 812), trang cao 6.500px, thanh đáy chỉ có Danh mục · Nhắn shop · Đơn của tôi —
   đọc xong mô tả là KHÔNG còn đường mua. Nay thanh mua THAY CHỖ thanh đáy (JS gắn lớp
   gd3-co-thanh-mua lên <body> khi khối mua đã trôi lên khỏi màn), không chồng hai thanh.
   Ở điện thoại bỏ ảnh và tên (tên sản phẩm dài, 375px không đủ chỗ cho cả tên lẫn hai nút) —
   chỉ giữ giá, vì giá là thứ khách cần nhìn lại lúc quyết định bấm. */
.gd3-sp-thanh-gio { display: none; }
.gd3-sp-thanh-gia s { display: none; }
@media (max-width: 991px) {
  .gd3-sp-thanh { display: block; z-index: 1050;
    padding: 8px 0 calc(8px + env(safe-area-inset-bottom, 0px)); }
  .gd3-sp-thanh .container { gap: 8px; }
  .gd3-sp-thanh-anh, .gd3-sp-thanh-ten { display: none; }
  .gd3-sp-thanh-gia { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column;
    font-size: 17px; line-height: 1.15; }
  .gd3-sp-thanh-gia s { display: block; font-size: 12px; font-weight: 400; color: var(--aw-chu-phu); }
  .gd3-sp-thanh-gio, .gd3-sp-thanh .gd3-sp-ngay { flex: 0 0 auto; height: 44px; padding: 0 14px;
    font-size: 14px; gap: 6px; }
  .gd3-sp-thanh-gio { display: inline-flex; align-items: center; justify-content: center;
    border-radius: 999px; border: 1px solid var(--aw-nhan); background: var(--aw-the);
    color: var(--aw-nhan); font: inherit; font-size: 14px; font-weight: 700; white-space: nowrap; cursor: pointer; }
  body.gd3-co-thanh-mua .gd3-thanh-day { display: none; }
  /* Lời nhắn "Đã thêm vào giỏ" và nút lên đầu trang đang canh theo thanh đáy cao 47px;
     thanh mua cao ~60px nên nhấc thêm cho khỏi đè. */
  body.gd3-co-thanh-mua .site-toast { bottom: calc(60px + 14px + env(safe-area-inset-bottom, 0px)); }
  body.gd3-co-thanh-mua .totop { bottom: 80px; }
}
/* Màn 360 trở xuống: bỏ chữ "Thêm giỏ", giữ icon (nút vẫn có aria-label) — ba khối phải vừa
   một hàng, "Mua ngay" là nút chính nên không được co. */
@media (max-width: 360px) { .gd3-sp-thanh-gio span { display: none; } }

/* ---- 2. SẮP XẾP + LỌC (trang danh sách) ----
   Một hàng hai nút chia đôi: [Lọc] [Sắp xếp ▾]. Bảng lọc là <details> — mở/gập không cần JS —
   thả xuống ngay dưới hàng nút, phủ lên lưới hàng. KHÔNG dùng `display: contents` trên
   <details> để bảng tràn ra ngoài: Safari cũ xử lý thẻ đó sai. JS nhỏ trong template đóng
   bảng khi bấm ra ngoài / bấm Esc. Chip trong bảng DÙNG LẠI .gd3-chip, không đẻ kiểu mới. */
.gd3-loc { position: relative; display: flex; gap: 10px; margin: 4px 0 14px; }
.gd3-loc-bang, .gd3-loc-sx { flex: 1 1 0; min-width: 0; margin: 0; }
.gd3-loc-mo, .gd3-loc-sx label { display: flex; align-items: center; justify-content: center; gap: 8px;
  height: 42px; padding: 0 14px; border: 1px solid var(--aw-ke); border-radius: 999px; background: var(--aw-the);
  color: var(--aw-chu); font-size: 14px; font-weight: 600; cursor: pointer; list-style: none; user-select: none; }
.gd3-loc-mo::-webkit-details-marker { display: none; }
.gd3-loc-bang[open] .gd3-loc-mo { border-color: var(--aw-nhan); color: var(--aw-nhan); background: var(--aw-nhan-nhat); }
.gd3-loc-so { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px;
  border-radius: 999px; background: var(--aw-nhan); color: var(--aw-tren-nhan); font-size: 12px; font-weight: 700; }
.gd3-loc-sx label { position: relative; margin: 0; }
.gd3-loc-sx label i { color: var(--aw-chu-phu); }
/* <select> phủ trọn nút nhưng trong suốt nền: vùng bấm là cả nút, chữ vẫn là chữ của select nên
   luôn khớp lựa chọn đang có. appearance:none để tự vẽ mũi tên, không lệ thuộc từng trình duyệt. */
/* Select phải PHỦ KÍN chiều cao nút: bản đầu select chỉ cao 24px giữa nút 42px, chạm vào phần
   viền trên/dưới của nút thì không mở được danh sách (nhãn <label> chỉ chuyển tiêu điểm, không mở). */
.gd3-loc-sx select { flex: 1 1 auto; min-width: 0; align-self: stretch; height: auto; appearance: none; -webkit-appearance: none; border: 0;
  background: transparent url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%237A6F6F' stroke-width='1.6'/%3E%3C/svg%3E") no-repeat right center;
  padding-right: 16px; font: inherit; font-size: 14px; font-weight: 600; color: var(--aw-chu);
  text-overflow: ellipsis; cursor: pointer; }
.gd3-loc-sx select:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 4px; border-radius: 4px; }
.gd3-loc-noi { position: absolute; left: 0; right: 0; top: calc(100% + 8px); z-index: 30;
  max-height: min(70vh, 520px); overflow-y: auto; overscroll-behavior: contain;
  padding: 14px; border: 1px solid var(--aw-ke); border-radius: 14px; background: var(--aw-the);
  box-shadow: 0 14px 34px rgba(31, 26, 26, .16); display: grid; gap: 16px; }
.gd3-loc-nhom { min-width: 0; }
.gd3-loc-tit { margin: 0 0 8px; font-size: 13px; font-weight: 700; color: var(--aw-chu); }
.gd3-loc-chon { display: flex; flex-wrap: wrap; gap: 8px; }
.gd3-loc-chon .gd3-chip small, .gd3-loc-dang .gd3-chip small { font-size: 12px; opacity: .7; }
.gd3-loc-gia { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 10px; }
.gd3-loc-gia label { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-loc-gia input { width: 96px; height: 40px; padding: 0 10px; border: 1px solid var(--aw-ke);
  border-radius: 10px; font: inherit; color: var(--aw-chu); background: var(--aw-the); }
.gd3-loc-gia em { font-style: normal; }
.gd3-loc-gia button { height: 40px; padding: 0 16px; border: 0; border-radius: 999px; font: inherit;
  font-size: 14px; font-weight: 700; background: var(--aw-chu); color: var(--aw-tren-chu); cursor: pointer; }
.gd3-loc-dang { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: -4px 0 14px; }
.gd3-loc-xoa { font-size: 13.5px; font-weight: 600; color: var(--aw-nhan); text-decoration: none;
  display: inline-block; padding: 8px 4px; }
@media (hover: hover) {
  .gd3-loc-mo:hover, .gd3-loc-sx label:hover { border-color: var(--aw-nhan-vien); }
  .gd3-loc-xoa:hover { text-decoration: underline; }
}
/* Máy tính: hai nút co về cỡ chữ, dạt về hai đầu hàng thay vì kéo dài 600px mỗi nút. */
@media (min-width: 992px) {
  .gd3-loc { justify-content: space-between; }
  .gd3-loc-bang, .gd3-loc-sx { flex: 0 0 auto; }
  .gd3-loc-mo { padding: 0 20px; }
  .gd3-loc-sx label { min-width: 230px; }
  .gd3-loc-noi { right: auto; width: min(760px, 100%); grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; }
}

/* ---- 3. Ô NHẬP 16px TRÊN ĐIỆN THOẠI ----
   iPhone (Safari) TỰ PHÓNG TO trang khi chạm vào ô có chữ dưới 16px, và không tự thu lại — khách
   đang điền địa chỉ đặt hàng phải lấy hai ngón thu nhỏ ở từng ô. Trang đặt hàng đang dùng
   14,5px, ô tìm kiếm 15px. !important có lý do: ô tìm ở đầu trang bị đặt cỡ bằng bộ chọn có
   #id (độ ưu tiên 1-1-0), luật chung không thắng nổi nếu không có nó. Chỉ màn hẹp — máy tính
   không có chuyện tự phóng to nên giữ nguyên cỡ đã thiết kế. */
@media (max-width: 991px) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="hidden"]),
  select, textarea { font-size: 16px !important; }
}

/* ---- 4. CHỮ DƯỚI 12px ----
   Đo 7 trang ở 375: 11 chỗ in chữ 10,5–11,8px (số sản phẩm dưới danh mục, viên đặc điểm trên
   thẻ, nhãn "Giảm 5%", dòng cam kết đầu trang…). 12px là ngưỡng dưới — chữ nhỏ hơn là người
   ngoài 40 tuổi phải nheo mắt, mà khách shop này phần đông ở tuổi đó.
   Áp cho MỌI khổ màn, không riêng điện thoại: đo ở 1366 cũng còn 44 chỗ 11–11,5px. */
.gd3-camket-ngan, .gd3-lt-chu em, .gd3-dm-so, .product-item .note-installment,
.product-item .gd3-card-dd span, .gd3-th-luoi-tc .gd3-th-so, .gd3-nw-dm, .gd3-ben-meta,
.gd3-ben-dm a span, .gd3-chip small { font-size: 12px; }
@media (max-width: 991px) { .gd3-thanh-day a, .gd3-thanh-day button { font-size: 12px; } }

/* ---- 5. VÙNG BẤM DƯỚI 32px ----
   Link chân trang cao 16px, đường dẫn phân cấp 19px, chấm slider 8×8px — ngón tay (~9mm, tức
   ~34px) bấm trượt sang dòng bên cạnh. Mẹo nới vùng bấm MÀ KHÔNG ĐỔI BỐ CỤC: đệm trên dưới 8px
   rồi lề âm 8px — khung viền (hộp lề) giữ nguyên cao cũ nên dòng không giãn, còn vùng nhận
   chạm thì cao thêm 16px. */
@media (max-width: 991px) {
  .gd3-chan p > a, .gd3-chan-phaply a, .gd3-ds-duong a, .gd3-dh-goi a, .gd3-gio-tiep,
  .gd3-gio-xoahet, .gd3-tin-cd-them, .gd3-chan-hotline, .gd3-chan-them,
  .gd3-dh-quaylai, .gd3-sp-xemthem, .gd3-dh-cam li a {
    display: inline-block; padding-block: 8px; margin-block: -8px; }
  /* Các dòng chân trang cách nhau 21px + 7px lề = 28px, vùng bấm 32px thì hai link kề nhau chồng
     lên nhau 4px. Nới lề dưới lên 11px cho đủ 32px một dòng. */
  .gd3-chan-luoi p { margin-bottom: 11px; }
  .gd3-daxem-xoa button { min-height: 36px; }
}
/* Chấm slider: giữ nguyên chấm 8px cho đẹp, nới vùng bấm bằng một lớp giả trong suốt. */
.aw-slider-cham button { position: relative; }
.aw-slider-cham button::after { content: ''; position: absolute; inset: -14px -4px; }

/* ---- BẢNG THÔNG SỐ trong mô tả sản phẩm (27/09/2026) ----
   includes/html.php → content_bang_thong_so() đổi mục "Thông số…" dạng gạch đầu dòng thành bảng lúc
   in ra. Hai cột nhãn | giá trị; dòng không có nhãn trải hết bề ngang (.gd3-bang-ts-ghi).
   Kẻ NGANG giữa các hàng, không kẻ ô — lưới ô vuông trên 375px trông như bảng tính, nặng mắt.
   Cột nhãn nền chìm để mắt quét dọc được; khung bo góc + cuộn ngang phòng giá trị một từ quá dài
   (mã sản phẩm, đường dẫn) — tràn ngang trang là lỗi tính điểm ở mốc 375. */
.gd3-sp-mota .gd3-bang-ts-khung { margin: 10px 0 18px; border: 1px solid var(--aw-ke); border-radius: 12px;
  overflow-x: auto; background: var(--aw-the); }
.gd3-sp-mota .gd3-bang-ts { width: 100%; margin: 0; border-collapse: collapse; font-size: 14.5px; line-height: 1.55; }
.gd3-sp-mota .gd3-bang-ts th, .gd3-sp-mota .gd3-bang-ts td { border: 0; border-top: 1px solid var(--aw-ke);
  padding: 10px 14px; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
.gd3-sp-mota .gd3-bang-ts tr:first-child > * { border-top: 0; }
.gd3-sp-mota .gd3-bang-ts th { width: 36%; font-weight: 600; color: var(--aw-chu); background: var(--aw-nen-2); }
.gd3-sp-mota .gd3-bang-ts td { color: var(--aw-chu-2); }
.gd3-sp-mota .gd3-bang-ts td.gd3-bang-ts-ghi { background: var(--aw-the); color: var(--aw-chu-2); }
/* Máy tính: nhãn chỉ vài chữ, 36% của khung 1.134px là 408px bỏ trống — thu về ~26%. */
@media (min-width: 992px) { .gd3-sp-mota .gd3-bang-ts th { width: 26%; } }
@media (max-width: 575px) {
  .gd3-sp-mota .gd3-bang-ts { font-size: 14px; }
  .gd3-sp-mota .gd3-bang-ts th, .gd3-sp-mota .gd3-bang-ts td { padding: 9px 11px; }
  .gd3-sp-mota .gd3-bang-ts th { width: 40%; }
}

/* Mô tả: khối đầu/cuối không mang lề ra ngoài khung (27/09/2026). Lề dưới 12px của đoạn cuối +
   lề của hình cuối cộng dồn thành một dải trống trước nút "Thu gọn"; bản nhập hay bọc cả bài trong
   một <div> nên phải xét cả con của lớp bọc đó. */
.gd3-sp-mota > :first-child, .gd3-sp-mota > div:first-child > :first-child { margin-top: 0; }
.gd3-sp-mota > :last-child, .gd3-sp-mota > div:last-child > :last-child { margin-bottom: 0; }
.gd3-sp-mota figure { margin: 0 0 14px; }
.gd3-sp-mota figcaption { margin-top: 6px; font-size: 13px; line-height: 1.5; color: var(--aw-chu-phu); }
/* <p></p> do TRÌNH DUYỆT tự đẻ ra khi HTML cũ lồng sai (<p><div>…</p>) — không dọn được ở chuỗi, dọn ở đây */
.gd3-sp-mota p:empty { display: none; }

/* CỠ CHỮ MÔ TẢ SẢN PHẨM (27/09/2026, chủ shop: "chữ đọc thấy hơi nhỏ" trên điện thoại). Trước là 14.5px —
   nhỏ hơn cả bài viết (.gd3-bv-noi 16px) trong khi mô tả là chỗ khách đọc lâu nhất. Nay bằng bài viết:
   16px (16.5px từ 768px), tiêu đề, bảng thông số, chú thích ảnh nâng theo. 67 mô tả nhập về có
   style="font-size:…" gõ tay (12–13px) → ép theo cỡ chung, không để từng đoạn to nhỏ lung tung. */
.gd3-sp-mota { font-size: 16px; line-height: 1.75; }
.gd3-sp-mota [style*="font-size"] { font-size: inherit !important; }
.gd3-sp-mota h2, .gd3-sp-mota h3, .gd3-sp-mota h4 { font-size: 18.5px; line-height: 1.4; font-weight: 700; margin: 22px 0 10px; }
.gd3-sp-mota p { margin: 0 0 14px; }
.gd3-sp-mota ul, .gd3-sp-mota ol { margin: 0 0 14px; padding-left: 22px; }
.gd3-sp-mota li { margin: 0 0 6px; }
.gd3-sp-mota .gd3-bang-ts { font-size: 15.5px; }
.gd3-sp-mota figcaption { font-size: 14px; }
.gd3-sp-motacb ~ .gd3-sp-mota { max-height: 420px; }
@media (max-width: 575px) { .gd3-sp-mota .gd3-bang-ts { font-size: 15px; } }
@media (min-width: 768px) { .gd3-sp-mota { font-size: 16.5px; } .gd3-sp-mota h2, .gd3-sp-mota h3, .gd3-sp-mota h4 { font-size: 20px; } }
.gd3-sp-tsk { font-size: 15px; }

/* RÀ CỠ CHỮ TOÀN TRANG (27/09/2026, sau khi nâng mô tả sản phẩm lên 16px). Đo ở bề ngang 390px mọi
   đoạn văn ≥ 50 ký tự: các đoạn khách phải ĐỌC (câu hỏi đáp, lời dẫn, ghi chú cách làm) đang 12.5–14.5px
   — nhỏ hơn cả mô tả. Luật: đoạn đọc ≥ 15px; ghi chú phụ một hai dòng ≥ 14px; nhãn/huy hiệu vẫn 12px. */
.gd3-km-hd > summary { font-size: 15.5px; }
.gd3-km-hd p { font-size: 15px; line-height: 1.7; }
.gd3-km-hd p a { display: inline-block; padding: 6px 0; margin: -6px 0; }       /* "Xem chính sách →": vùng bấm cao 28px */
.gd3-ds-mota, .gd3-ds-dem, .gd3-km-phu, .gd3-tin-cd-mota, .gd3-ben-o p, .gd3-ben-ds li { font-size: 15px; }
.gd3-ds-gt-chu p { font-size: 15.5px; }
.gd3-gio-rong p { font-size: 15.5px; }
.gd3-dg-trong { font-size: 15px; }
.gd3-dh-goi, .gd3-km-ma-note, .gd3-dg-rieng, .gd3-daxem-ghi { font-size: 14px; line-height: 1.6; }
.gd3-ds-mota-them { display: inline-block; padding: 8px 0; margin: -8px 0; }     /* "Đọc thêm" cao 17px → 33px */
#gd3-btn-close-menu { min-width: 44px; min-height: 44px; }                        /* nút × đóng menu 26×28 → 44×44 */
.gd3-dh-yen-tam { font-size: 14px; line-height: 1.6; }
.gd3-dm-phu { font-size: 14.5px; }
.gd3-mt-muc { font-size: 15px; }
.gd3-mt-muc.gd3-mt-c2 { font-size: 14.5px; }

/* ẢNH THỰC TẾ KÈM ĐÁNH GIÁ (27/09/2026) — ô chọn ảnh trong form + ảnh dưới mỗi đánh giá + khung xem. */
.gd3-dg-anh { margin: 4px 0 16px; }
.gd3-dg-anh-nhan { display: block; margin-bottom: 8px; font-size: 15px; font-weight: 600; color: var(--aw-chu); }
.gd3-dg-anh-nhan small { font-size: 13px; font-weight: 400; color: var(--aw-chu-phu); }
.gd3-dg-anh-hang { display: flex; flex-wrap: wrap; gap: 10px; }
.gd3-dg-anh-xem { display: contents; }
.gd3-dg-anh-nho, .gd3-dg-anh-nut { position: relative; width: 84px; height: 84px; border-radius: 12px; overflow: hidden; flex: none; }
.gd3-dg-anh-nho img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gd3-dg-anh-nho button { position: absolute; top: 4px; right: 4px; width: 28px; height: 28px; border: 0; border-radius: 50%;
  background: rgba(0,0,0,.62); color: #fff; font-size: 18px; line-height: 1; cursor: pointer; }
.gd3-dg-anh-nho button::after { content: ""; position: absolute; inset: -6px; }        /* vùng bấm 40px */
.gd3-dg-anh-nut { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  border: 1.5px dashed var(--aw-ke-dam); background: var(--aw-nen-2); color: var(--aw-chu-2); font-size: 13px; font-weight: 600; cursor: pointer; }
.gd3-dg-anh-nut[hidden] { display: none; }
.gd3-dg-anh-nut i { font-size: 22px; color: var(--aw-nhan); }
.gd3-dg-anh-nut.dang { opacity: .55; pointer-events: none; }
.gd3-dg-anh-tep { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; font-size: 16px; }
@media (hover: hover) { .gd3-dg-anh-nut:hover { border-color: var(--aw-nhan); } }
.gd3-dg-anh-nut:focus-within { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
.gd3-dg-anh-ghi { display: block; margin: 8px 0 0; font-size: 14px; line-height: 1.55; color: var(--aw-chu-phu); }
.gd3-dg-anh-ghi i { margin-right: 4px; }

.gd3-dg-anhs { display: flex; flex-wrap: wrap; gap: 8px; margin: 10px 0 4px; }
.gd3-dg-anh-o { display: block; width: 88px; height: 88px; border-radius: 10px; overflow: hidden; background: var(--aw-nen-2); }
.gd3-dg-anh-o img { width: 100%; height: 100%; object-fit: cover; display: block; }

.gd3-dg-lb { padding: 0; border: 0; background: transparent; max-width: 100vw; max-height: 100vh; width: 100vw; height: 100vh; margin: 0; }
.gd3-dg-lb[open] { display: flex; align-items: center; justify-content: center; }
.gd3-dg-lb::backdrop { background: rgba(0,0,0,.88); }
.gd3-dg-lb img { max-width: calc(100vw - 24px); max-height: calc(100vh - 110px); object-fit: contain; border-radius: 8px; }
.gd3-dg-lb button { position: absolute; border: 0; background: rgba(255,255,255,.14); color: #fff; width: 46px; height: 46px;
  border-radius: 50%; font-size: 22px; cursor: pointer; display: flex; align-items: center; justify-content: center; }
.gd3-dg-lb-dong { top: 14px; right: 14px; font-size: 28px !important; }
.gd3-dg-lb-lui { left: 10px; top: 50%; transform: translateY(-50%); }
.gd3-dg-lb-toi { right: 10px; top: 50%; transform: translateY(-50%); }
.gd3-dg-lb.mot .gd3-dg-lb-lui, .gd3-dg-lb.mot .gd3-dg-lb-toi { display: none; }

/* MÃ SẢN PHẨM (27/09/2026) — nút chép mã ở dòng meta trang sản phẩm + dòng nhắc trong bảng "Nhắn shop". */
.gd3-sp-ma { display: inline-flex; align-items: center; gap: 5px; min-height: 32px; padding: 4px 10px; margin: -4px 0;
  border: 1px dashed var(--aw-ke-dam); border-radius: 8px; background: var(--aw-nen-2); color: var(--aw-chu-2);
  font: inherit; font-size: 13.5px; cursor: pointer; }
.gd3-sp-ma b { color: var(--aw-chu); letter-spacing: .02em; }
.gd3-sp-ma i { font-size: 12px; color: var(--aw-chu-phu); }
.gd3-sp-ma.da-chep, .gd3-kenh-ma.da-chep { border-color: #1f8a4c; color: #14653C; background: #E9F6EF; }
@media (hover: hover) { .gd3-sp-ma:hover { border-color: var(--aw-nhan); } }
.gd3-kenh-ma { display: flex; align-items: center; gap: 10px; width: 100%; margin: 0 0 10px; padding: 10px 12px;
  border: 1px dashed var(--aw-ke-dam); border-radius: 10px; background: var(--aw-nen-2); color: var(--aw-chu-2);
  font: inherit; font-size: 14px; line-height: 1.45; text-align: left; cursor: pointer; }
.gd3-kenh-ma b { color: var(--aw-chu); }

/* THẺ SẢN PHẨM GỌN HƠN (27/09/2026, chủ shop: "khoảng cách to nhìn chưa sang"). Đo ở 390px:
   - khe giữa hai cột: 14px ở các dải trang chủ, 10px ở trang danh sách — mỗi nơi một kiểu;
   - trong thẻ: 16px đệm + nhãn "Giảm x%" nằm TRONG dòng chảy + 16px lề → ảnh bắt đầu ở 51px, tức là
     một dải trắng to trên đầu mọi thẻ, cộng 16px nữa dưới ảnh.
   Các sàn lớn (Shopee, Tiki, Lazada) dùng khe 6–8px và ảnh tràn sát mép trên thẻ, nhãn giảm giá đè
   lên góc ảnh. Làm theo: khe 6px mọi nơi trên điện thoại, ảnh sát mép trên, nhãn nổi trên ảnh. */
.product-item { position: relative; overflow: hidden; padding-top: 0 !important; }
.product-item > .note-installment { position: absolute; top: 8px; left: 0; z-index: 2; margin: 0; }
.product-item > .gd3-card-imgwrap { margin: 0 !important; }
.product-item > .p-2 { padding-top: 8px !important; }
.product-item > .p-2 > .product-item-name { margin-top: 0; }
@media (max-width: 767px) {
    /* 6px (chủ shop: "giảm đi" sau bản 8px) — bằng Shopee. Khối danh mục trang chủ (Sextoy nam/nữ…,
       .products-bike) dựng bằng cột Bootstrap: khe = đệm 12px mỗi bên cột = 24px, và thẻ có mb-3 (16px)
       — phải sửa riêng, không ăn theo biến --gd3-khe. */
    .wrap-swiper, .block-products .wrap-swiper { --gd3-khe: 6px; }
    .wrap-swiper .swiper-slide { row-gap: 6px; }
    .gd3-sp-luoi, .gd3-sp-lq .gd3-sp-luoi { gap: 6px; }
    .products-bike > .row { margin-left: -3px; margin-right: -3px; }
    .products-bike .col-product-item { padding-left: 3px; padding-right: 3px; margin-bottom: 6px; display: flex; }
    /* thẻ kéo cao bằng thẻ bên cạnh: thẻ ít dòng thông số hơn không để lại khoảng trống dưới chân */
    .products-bike .col-product-item > .product-item { margin-bottom: 0 !important; flex: 1 1 auto; height: auto !important; }
    .product-item { box-shadow: none; }                 /* khe hẹp + bóng đổ = viền nhoè; viền 1px là đủ tách thẻ */
}

/* ===== Mũi tên lướt ảnh sản phẩm (27/09/2026) =====
   Tròn trắng mờ, bóng nhẹ — nổi được trên cả ảnh nền trắng lẫn ảnh tối. Vùng bấm 40px (ngón tay),
   phần nhìn thấy 34px ở điện thoại cho đỡ che ảnh. Nằm giữa chiều cao ảnh, sát mép. */
.gd3-sp-mui { position: absolute; top: 50%; z-index: 3; width: 40px; height: 40px; margin-top: -20px;
  display: flex; align-items: center; justify-content: center; padding: 0; border: 0;
  background: transparent; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.gd3-sp-mui[hidden] { display: none; }
.gd3-sp-mui::before { content: ""; position: absolute; inset: 3px; border-radius: 50%;
  background: rgba(255,255,255,.88); box-shadow: 0 1px 6px rgba(0,0,0,.22); transition: background .15s; }
.gd3-sp-mui i { position: relative; font-size: 15px; color: #333; }
.gd3-sp-mui-lui { left: 4px; }
.gd3-sp-mui-toi { right: 4px; }
.gd3-sp-mui:hover::before { background: #fff; }
.gd3-sp-mui:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 1px; border-radius: 50%; }
@media (min-width: 992px) {
  .gd3-sp-mui { width: 44px; height: 44px; margin-top: -22px; }
  .gd3-sp-mui-lui { left: 10px; } .gd3-sp-mui-toi { right: 10px; }
  /* Máy tính: chỉ hiện rõ khi rê chuột vào ảnh, bình thường mờ — không phá ảnh sản phẩm. */
  .gd3-sp-mui { opacity: .55; transition: opacity .15s; }
  .gd3-sp-boc:hover .gd3-sp-mui, .gd3-sp-mui:focus-visible { opacity: 1; }
}

/* ===== Khối danh mục trang chủ: đầu khối + dải tab nhóm hàng (27/09/2026) =====
   Theo mẫu shopkiss.net chủ shop chụp, làm "chuyên nghiệp, đồ sộ" hơn: đầu khối có ô biểu
   tượng đỏ + tên lớn + số hàng thật; tab dạng viên thuốc có số lượng, tab chọn đỏ đặc nổi bóng.
   Dải tab trượt ngang, mép mờ + nút cuộn chỉ hiện ở phía còn tab khuất. */
.gd3-khoi-dau { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding-bottom: 14px; margin-bottom: 14px; border-bottom: 1px solid var(--aw-ke); position: relative; }
/* (Gạch đỏ ngắn dưới tên khối đã bỏ 28/09/2026 — chỉ để trang trí, khách tưởng là thanh trượt.) */
.gd3-khoi-ten { display: flex; align-items: center; gap: 12px; min-width: 0; color: var(--aw-chu); text-decoration: none; }
.gd3-khoi-ten:hover { color: var(--aw-chu); }
.gd3-khoi-icon { flex: 0 0 auto; display: grid; place-items: center; width: 46px; height: 46px; border-radius: 14px;
  background: linear-gradient(135deg, #E8383B 0%, var(--aw-nhan) 55%, var(--aw-nhan-dam) 100%);
  color: var(--aw-tren-nhan); font-size: 20px; box-shadow: 0 6px 16px rgba(216,18,18,.28); }
.gd3-khoi-chu { display: flex; flex-direction: column; min-width: 0; }
.gd3-khoi-h { font-size: 21px; line-height: 1.2; font-weight: 800; letter-spacing: .3px; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.gd3-khoi-phu { margin-top: 3px; font-size: 13.5px; color: var(--aw-chu-phu); font-weight: 500; }
.gd3-khoi-tatca { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px;
  border-radius: 999px; background: var(--aw-nhan-nhat); color: var(--aw-nhan); font-size: 14px; font-weight: 700;
  text-decoration: none; transition: background .15s, color .15s; }
.gd3-khoi-tatca i { font-size: 11px; }
.gd3-khoi-tatca:hover { background: var(--aw-nhan); color: var(--aw-tren-nhan); }

.gd3-khoi-tabboc { position: relative; margin: 0 0 16px; }
.gd3-khoi-tabs { display: flex; gap: 8px; overflow-x: auto; padding: 4px 2px 10px;
  scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.gd3-khoi-tabs::-webkit-scrollbar { display: none; }
.gd3-khoi-tabboc.co-phai .gd3-khoi-tabs { -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 32px), transparent);
  mask-image: linear-gradient(90deg, #000 calc(100% - 32px), transparent); }
.gd3-khoi-tabboc.co-trai .gd3-khoi-tabs { -webkit-mask-image: linear-gradient(90deg, transparent, #000 32px);
  mask-image: linear-gradient(90deg, transparent, #000 32px); }
.gd3-khoi-tabboc.co-trai.co-phai .gd3-khoi-tabs { -webkit-mask-image: linear-gradient(90deg, transparent, #000 32px, #000 calc(100% - 32px), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 32px, #000 calc(100% - 32px), transparent); }
.gd3-khoi-tab { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 7px;
  height: 40px; padding: 0 16px; border-radius: 999px; border: 1px solid var(--aw-ke); background: var(--aw-the);
  color: var(--aw-chu-2); font-size: 15px; font-weight: 600; white-space: nowrap; text-decoration: none;
  box-shadow: 0 1px 2px rgba(31,26,26,.04); transition: background .15s, color .15s, border-color .15s, box-shadow .15s; }
.gd3-khoi-tab:hover { border-color: var(--aw-nhan-vien); color: var(--aw-nhan); }
.gd3-khoi-so { display: inline-block; min-width: 24px; padding: 1px 7px; border-radius: 999px; background: var(--aw-nen-2);
  color: var(--aw-chu-phu); font-size: 12px; font-weight: 700; text-align: center; line-height: 18px; }
.gd3-khoi-tab.is-chon { background: linear-gradient(135deg, #E8383B, var(--aw-nhan) 60%, var(--aw-nhan-dam));
  border-color: transparent; color: var(--aw-tren-nhan); box-shadow: 0 6px 14px rgba(216,18,18,.28); }
.gd3-khoi-tab.is-chon .gd3-khoi-so { background: rgba(255,255,255,.22); color: var(--aw-tren-nhan); }
.gd3-khoi-tab:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }

.gd3-khoi-cuon { position: absolute; top: 4px; z-index: 2; width: 40px; height: 40px; border-radius: 50%;
  border: 1px solid var(--aw-ke); background: var(--aw-the); color: var(--aw-chu); display: none;
  align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(31,26,26,.12); cursor: pointer; }
.gd3-khoi-cuon-lui { left: -6px; } .gd3-khoi-cuon-toi { right: -6px; }
.gd3-khoi-cuon:hover { border-color: var(--aw-nhan); color: var(--aw-nhan); }
@media (hover: hover) and (min-width: 992px) { .gd3-khoi-cuon:not([hidden]) { display: flex; } }

/* Đang tải nhóm mới: lưới mờ đi + vòng xoay, giữ nguyên chiều cao để trang không giật. */
.gd3-khoi-luoi { position: relative; transition: opacity .2s; }
.gd3-khoi-luoi.dang-tai { opacity: .4; pointer-events: none; }
.gd3-khoi-luoi.dang-tai::after { content: ""; position: absolute; top: 90px; left: 50%; width: 34px; height: 34px;
  margin-left: -17px; border-radius: 50%; border: 3px solid var(--aw-nhan-vien); border-top-color: var(--aw-nhan);
  animation: gd3-xoay .7s linear infinite; }
@keyframes gd3-xoay { to { transform: rotate(360deg); } }

@media (min-width: 992px) {
  .gd3-khoi-icon { width: 54px; height: 54px; font-size: 23px; border-radius: 16px; }
  .gd3-khoi-h { font-size: 26px; }
  .gd3-khoi-phu { font-size: 14.5px; }
  .gd3-khoi-tab { height: 44px; padding: 0 20px; font-size: 15.5px; }
}
@media (max-width: 575px) {
  .gd3-khoi-dau { padding-bottom: 12px; margin-bottom: 12px; }
  .gd3-khoi-icon { width: 42px; height: 42px; font-size: 18px; border-radius: 12px; }
  .gd3-khoi-h { font-size: 19px; }
  .gd3-khoi-tatca { padding: 7px 12px; font-size: 13.5px; }
  .gd3-khoi-tabs { gap: 7px; }
  .gd3-khoi-tab { padding: 0 14px; }
}

/* Bỏ nút "Xem tất cả" ở đầu khối → mũi tên nhỏ sau tên khối báo "bấm được" (27/09/2026). */
.gd3-khoi-mui { margin-left: 8px; font-size: .62em; vertical-align: .18em; color: var(--aw-nhan); transition: transform .15s; }
.gd3-khoi-ten:hover .gd3-khoi-mui { transform: translateX(3px); }

/* ===== Chân trang: đơn vị vận chuyển (27/09/2026) =====
   MỘT HÀNG 6 ô trắng nhỏ đều nhau; máy tính: tiêu đề bên trái, ô bên phải cùng một dòng.
   Logo co theo chiều cao ô — logo vuông (Be) hay dài (GHN) đều cân. */
.gd3-chan-vc { border-top: 1px solid var(--aw-chu-2); padding: 16px 0; }
.gd3-chan-vc-hang { display: flex; align-items: center; gap: 12px 20px; }
.gd3-chan-vc-tit { flex: 0 0 auto; color: var(--aw-nhan-sang); font-weight: 800; font-size: 14px; white-space: nowrap; }
.gd3-chan-vc-tit i { margin-right: 4px; }
.gd3-chan-vc-o { flex: 1 1 auto; list-style: none; margin: 0; padding: 0; display: grid;
  grid-template-columns: repeat(6, minmax(0, 118px)); gap: 8px; }
.gd3-chan-vc-o li { height: 40px; border-radius: 8px; background: #fff; display: flex; align-items: center; justify-content: center;
  padding: 5px 9px; overflow: hidden; }
.gd3-chan-vc-o img { max-width: 100%; max-height: 22px; width: auto; height: auto; object-fit: contain; display: block; }
.gd3-chan-vc-be-cu { padding: 4px !important; }
.gd3-chan-vc-be-cu img { max-height: 30px; border-radius: 6px; }
.gd3-chan-vc-ghn img { max-height: 26px; }
.gd3-chan-vc-chu { display: inline-flex; align-items: center; gap: 5px; color: #1F1A1A; font-weight: 800; font-size: 12.5px; white-space: nowrap; }
.gd3-chan-vc-chu i { width: auto; color: var(--aw-nhan); font-size: 14px; }
@media (max-width: 767px) {
  .gd3-chan-vc { padding: 14px 0; }
  .gd3-chan-vc-hang { flex-direction: column; align-items: stretch; gap: 10px; }
  .gd3-chan-vc-o { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 5px; }
  .gd3-chan-vc-o li { height: 34px; padding: 4px 5px; border-radius: 6px; }
  .gd3-chan-vc-o img { max-height: 16px; }
  .gd3-chan-vc-be-cu { padding: 3px !important; }
  .gd3-chan-vc-be-cu img { max-height: 28px; border-radius: 5px; }
  .gd3-chan-vc-ghn img { max-height: 22px; }
  .gd3-chan-vc-chu { flex-direction: column; gap: 1px; font-size: 9.5px; line-height: 1.1; }
  .gd3-chan-vc-chu i { font-size: 12px; }
}

/* Ô giá hồng — "Tiết kiệm" thành viên trắng chữ đỏ (27/09/2026; bỏ bản thử kiểu giá đen ?gia=2/3). */
.gd3-sp-gia { align-items: center; }
.gd3-sp-gia-giam { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px;
  background: rgba(255,255,255,.7); color: var(--aw-chu-2); font-size: 13.5px; font-weight: 500; line-height: 1.35; white-space: nowrap; }
.gd3-sp-gia-giam b { font-weight: 700; color: var(--aw-chu); }
.gd3-sp-gia-giam i { width: auto; font-size: 11px; color: var(--aw-giam); opacity: .75; }
@media (max-width: 575px) {
  .gd3-sp-gia { gap: 8px 10px; padding: 12px 14px; }
  .gd3-sp-gia-nay { font-size: 27px; }
  .gd3-sp-gia-goc { font-size: 14.5px; }
  .gd3-sp-gia-giam { font-size: 13px; padding: 3px 9px; }
}

/* ===== Tiêu đề khối "Giảm giá sâu nhất" — kiểu tạp chí 3A (27/09/2026) =====
   Font Playfair Display tự lưu (assets/fonts/, cắt còn đúng ký tự tiêu đề + số + %, ~7,5KB/tệp).
   "GIẢM / ĐẾN" dùng font thân trang (Roboto) — chữ nhỏ giãn, không cần tải thêm font. */
/* (bản 700 cho phần chữ đã bỏ — chữ tiêu đề dùng phông thân trang; chỉ còn bản 800 cho con số) */
@font-face { font-family: "PF Tieu De"; font-style: normal; font-weight: 800; font-display: swap;
  src: url("fonts/playfair-tieu-de-800-v2.woff2") format("woff2"); }
.gd3-tieu-tc { display: flex; align-items: center; justify-content: center; gap: 10px; text-align: left; }
.gd3-tieu-tc-truoc { font: 700 11.5px/1.35 var(--aw-font-than); letter-spacing: .22em; text-transform: uppercase;
  color: var(--aw-chu-phu); text-align: right; }
.gd3-tieu-tc-so { font: 800 56px/0.9 "PF Tieu De", Georgia, serif; color: var(--aw-nhan); white-space: nowrap; }
.gd3-tieu-tc-so small { font-size: .45em; vertical-align: top; margin-left: 2px; }
.gd3-tieu-tc-chu { border-left: 1px solid rgba(31,26,26,.25); padding-left: 12px;
  font: 700 24px/1.15 "PF Tieu De", Georgia, serif; color: var(--aw-chu); }
.gd3-tieu-tc-chu-don { border-left: 0; padding-left: 0; text-align: center; font-size: 30px; }
@media (min-width: 992px) {
  .gd3-tieu-tc { gap: 14px; }
  .gd3-tieu-tc-truoc { font-size: 13px; }
  .gd3-tieu-tc-so { font-size: 72px; }
  .gd3-tieu-tc-chu { font-size: 30px; padding-left: 16px; }
}
/* Tiêu đề "Danh mục sản phẩm" dùng chung kiểu tạp chí — h2 giữ vai trò tiêu đề, cỡ chữ do các span quyết. */
.gd3-dm-tit.gd3-tieu-tc { font-size: inherit; font-weight: inherit; }
.gd3-dm-dau .gd3-dm-phu { margin-top: 10px; }
/* Cụm tạp chí nằm TRONG <h2> thì luật chung `:is(h1…h6) :not(i, svg…)` (điểm 0,2,1 — vì trong :is() có `.gd3-lt-chu b`) ép font tiêu đề
   lên mọi span con → số và chữ rơi về Roboto. Lặp lớp .gd3-tieu-tc (0,3,0) để thắng, không cần !important. */
.gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-so, .gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-chu { font-family: "PF Tieu De", Georgia, serif; }
.gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-truoc { font-family: var(--aw-font-than); }
.gd3-dm-tit.gd3-tieu-tc { padding-top: 0; line-height: 1; }
/* Tiêu đề chỉ có chữ (không cụm số): bỏ vạch + lề trái ở mọi khổ — luật máy tính của .gd3-tieu-tc-chu
   nằm sau nên phải nêu lại với điểm cao hơn. */
.gd3-tieu-tc .gd3-tieu-tc-chu-don { border-left: 0; padding-left: 0; text-align: center; font-size: 30px; white-space: nowrap; }
@media (min-width: 992px) { .gd3-tieu-tc .gd3-tieu-tc-chu-don { font-size: 36px; } }
/* Phần CHỮ của hai tiêu đề (Giảm giá sâu nhất, Danh mục sản phẩm) về lại phông thân trang — chủ shop thấy
   chữ có chân rối mắt (27/09/2026). Chỉ con số % còn Playfair để giữ chất "tạp chí".
   Cùng điểm (0,3,0) với luật trên nhưng đứng SAU nên thắng. */
.gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-chu { font-family: var(--aw-font-than); font-weight: 800; letter-spacing: -.2px; line-height: 1.2; }
.gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-chu-don { font-size: 26px; }
@media (min-width: 992px) { .gd3-tieu-tc.gd3-tieu-tc .gd3-tieu-tc-chu-don { font-size: 32px; } }
/* Tab nhóm hàng đang chọn: dịu lại (27/09/2026 — chủ shop: đỏ đặc + bóng "rối, chói"). Nền hồng nhạt,
   viền hồng, chữ đỏ đậm, không bóng — vẫn nhận ra ngay tab nào đang chọn nhưng không tranh với ảnh
   sản phẩm. Ô biểu tượng đầu khối cũng bớt bóng cho cùng tông. */
.gd3-khoi-tab.is-chon { background: var(--aw-nhan-nhat); border-color: var(--aw-nhan-vien); color: var(--aw-nhan);
  box-shadow: none; font-weight: 700; }
.gd3-khoi-tab.is-chon .gd3-khoi-so { background: var(--aw-the); color: var(--aw-nhan); }
.gd3-khoi-icon { box-shadow: 0 2px 6px rgba(216,18,18,.14); }

/* Tiêu đề khối "Cùng thương hiệu…/Cùng <danh mục>" ở trang sản phẩm: MỘT DÒNG (27/09/2026).
   Tên dài thì cắt "…", nút "Xem tất cả →" giữ nguyên một khối bên phải. */
.gd3-sp-lq .gd3-km-tit { flex-wrap: nowrap; }
.gd3-km-tit-chu { flex: 1 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gd3-sp-lq .gd3-km-tit .gd3-sp-xemthem { flex: 0 0 auto; white-space: nowrap; }
@media (max-width: 575px) { .gd3-sp-lq .gd3-km-tit { font-size: 16px; gap: 7px; } }
.gd3-hien-dt { display: none; }
@media (max-width: 575px) { .gd3-sp-lq .gd3-an-dt { display: none; } .gd3-sp-lq .gd3-hien-dt { display: inline; } }

/* ===== "Bạn vừa xem": tiêu đề + nút xoá MỘT DÒNG, danh sách thành dải trượt ngang (27/09/2026) ===== */
#daxem .gd3-km-tit { flex-wrap: nowrap; }
#daxem .gd3-daxem-xoa { margin-left: auto; width: auto; flex: 0 0 auto; }
.gd3-truot { position: relative; }
/* proximity, KHÔNG mandatory (28/09/2026): mandatory trên iPhone chặn đà trôi, bắt dừng ở thẻ kế — khách tưởng
   hết dải. proximity để dải trôi hết đà, chỉ khẽ căn thẻ khi dừng gần mép thẻ. */
.gd3-truot-dai { display: flex; gap: 12px; overflow-x: auto; scroll-snap-type: x proximity; scrollbar-width: none;
  -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain; }
.gd3-truot-dai::-webkit-scrollbar { display: none; }
.gd3-truot-dai > * { flex: 0 0 calc((100% - 48px) / 5); min-width: 0; scroll-snap-align: start; }
@media (max-width: 991px) { .gd3-truot-dai > * { flex-basis: calc((100% - 24px) / 3.3); } }
@media (max-width: 575px) { .gd3-truot-dai { gap: 6px; } .gd3-truot-dai > * { flex-basis: 44%; } }
.gd3-truot-nut { position: absolute; top: 34%; z-index: 2; width: 40px; height: 40px; margin-top: -20px; border-radius: 50%;
  border: 1px solid var(--aw-ke); background: var(--aw-the); color: var(--aw-chu); display: none;
  align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(31,26,26,.14); cursor: pointer; }
.gd3-truot-lui { left: -12px; } .gd3-truot-toi { right: -12px; }
.gd3-truot-nut:hover { color: var(--aw-nhan); border-color: var(--aw-nhan-vien); }
@media (hover: hover) and (min-width: 768px) { .gd3-truot-nut:not([hidden]) { display: flex; } }

/* Nút "Xem tất cả N sản phẩm" cuối khối danh mục trang chủ: GIỮ NGUYÊN hình nút, chỉ chữ nhỏ hơn và mờ
   hơn một bậc (28/09/2026 — chủ shop: chữ to đậm tranh với đầu khối kế tiếp). Bản thử nút nhỏ + đường
   kẻ ngăn khối đã bị chê "xấu", bỏ. */
/* Áp cho MỌI nút "Xem thêm / Xem tất cả" (giảm sâu, thương hiệu, khối danh mục) cho đồng bộ. */
.btn-see-all-products.btn-see-all-products { font-size: 14px; color: var(--aw-chu-phu); }
.btn-see-all-products.btn-see-all-products span, .btn-see-all-products.btn-see-all-products b { font-size: inherit; color: inherit; font-weight: 500; }
.btn-see-all-products.btn-see-all-products i { font-size: .85em; opacity: .8; }
@media (hover: hover) { .btn-see-all-products.btn-see-all-products:hover { color: var(--aw-tren-chu); } }

/* Logo ShopKiss (28/09/2026): bản chân trang có dòng khẩu hiệu nhỏ bên dưới → cao hơn chút cho đọc được. */
.gd3-chan-th img { height: 52px; }

/* CUỐI FORM ĐÁNH GIÁ — "đẹp sang hơn" (28/09/2026). Ô thêm ảnh = dải rộng hết khung, nút gửi = nút đặc
   rộng hết khung, dòng "shop duyệt" canh giữa ngay dưới. Hết cảnh nút nhỏ lọt thỏm bên trái + khoảng trống. */
.gd3-dg-anh { margin: 6px 0 18px; }
.gd3-dg-anh-hang .gd3-dg-anh-nut { width: 100%; height: auto; min-height: 76px; flex: 1 1 100%;
  flex-direction: row; justify-content: flex-start; gap: 14px; padding: 14px 16px; text-align: left;
  border: 1.5px dashed var(--aw-ke-dam); border-radius: 14px; background: var(--aw-nen-2);
  transition: border-color .15s, background-color .15s; }
.gd3-dg-anh-bt { flex: none; width: 46px; height: 46px; border-radius: 50%; display: grid; place-items: center;
  background: var(--aw-the); box-shadow: 0 1px 4px rgba(31,26,26,.1); }
.gd3-dg-anh-nut .gd3-dg-anh-bt i { font-size: 19px; color: var(--aw-nhan); }
.gd3-dg-anh-chu { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.gd3-dg-anh-chu b { font-size: 15px; font-weight: 700; color: var(--aw-chu); }
.gd3-dg-anh-chu small { font-size: 13px; font-weight: 400; color: var(--aw-chu-phu); }
@media (hover: hover) { .gd3-dg-anh-hang .gd3-dg-anh-nut:hover { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); } }
/* Đã có ảnh: dải thu về ô vuông đứng sau ảnh, chỉ còn biểu tượng. */
.gd3-dg-anh-hang:has(.gd3-dg-anh-nho) .gd3-dg-anh-nut { width: 84px; height: 84px; min-height: 0; flex: none;
  padding: 0; justify-content: center; }
.gd3-dg-anh-hang:has(.gd3-dg-anh-nho) .gd3-dg-anh-chu { display: none; }
.gd3-dg-anh-hang:has(.gd3-dg-anh-nho) .gd3-dg-anh-bt { width: 40px; height: 40px; box-shadow: none; background: transparent; }

.gd3-dg-gui { display: flex; flex-direction: column; align-items: stretch; gap: 10px; }
.gd3-dg-gui-nut { display: inline-flex; align-items: center; justify-content: center; gap: 9px; width: 100%; height: 52px;
  border: 0; border-radius: 14px; background: var(--aw-nhan); color: #fff; font-size: 16px; font-weight: 700;
  letter-spacing: .2px; cursor: pointer; box-shadow: 0 4px 14px rgba(185,28,28,.22); transition: filter .15s, transform .1s; }
.gd3-dg-gui-nut i { font-size: 15px; }
@media (hover: hover) { .gd3-dg-gui-nut:hover { filter: brightness(1.07); } }
.gd3-dg-gui-nut:active { transform: translateY(1px); }
.gd3-dg-gui-nut:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 3px; }
.gd3-dg-gui .gd3-dg-cho { text-align: center; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-dg-gui .gd3-dg-cho i { margin-right: 4px; color: var(--aw-chu-phu); font-size: 12px; }
@media (min-width: 768px) { .gd3-dg-gui-nut { width: auto; min-width: 260px; align-self: flex-start; padding: 0 28px; }
  .gd3-dg-gui { flex-direction: row; align-items: center; gap: 16px; } .gd3-dg-gui .gd3-dg-cho { text-align: left; } }

/* KHUNG SOẠN GỌN (28/09/2026, lần 2 — "gọn, chiếm ít diện tích hơn"): ô cảm nhận + thêm ảnh + gửi trong MỘT khung. */
.gd3-dg-soan-nhan { display: block; margin-bottom: 5px; font-size: 13.5px; font-weight: 600; color: var(--aw-chu-2); }
.gd3-dg-soan { border: 1px solid var(--aw-ke-dam); border-radius: 12px; background: #fff; overflow: hidden; }
.gd3-dg-soan:focus-within { border-color: var(--aw-nhan); box-shadow: 0 0 0 1px var(--aw-nhan); }
.gd3-dg-soan.loi { border-color: #d24; }
.gd3-dg-soan textarea { display: block; width: 100%; min-height: 78px; padding: 11px 13px 6px; border: 0; outline: 0; resize: none;
  background: transparent; color: var(--aw-chu); font: inherit; font-size: 15px; line-height: 1.55; }
.gd3-dg-soan-anh { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 10px 6px; }
.gd3-dg-soan-anh:empty { display: none; }
.gd3-dg-soan-anh .gd3-dg-anh-nho { width: 56px; height: 56px; border-radius: 8px; }
.gd3-dg-soan-anh .gd3-dg-anh-nho button { top: 2px; right: 2px; width: 22px; height: 22px; font-size: 15px; }
.gd3-dg-soan-day { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 6px 6px 8px;
  border-top: 1px solid var(--aw-ke); background: var(--aw-nen-2); }
.gd3-dg-soan-cam { position: relative; display: inline-flex; align-items: center; gap: 6px; height: 38px; padding: 0 10px;
  border-radius: 9px; color: var(--aw-chu-2); font-size: 13.5px; font-weight: 600; cursor: pointer; overflow: hidden; }
.gd3-dg-soan-cam[hidden] { display: none; }
.gd3-dg-soan-cam i { font-size: 17px; color: var(--aw-nhan); }
.gd3-dg-soan-cam.dang { opacity: .55; pointer-events: none; }
.gd3-dg-soan-cam:focus-within { outline: 2px solid var(--aw-nhan); outline-offset: 1px; }
@media (hover: hover) { .gd3-dg-soan-cam:hover { background: var(--aw-the); } }
.gd3-dg-soan-gui { display: inline-flex; align-items: center; gap: 7px; height: 38px; padding: 0 16px; margin-left: auto;
  border: 0; border-radius: 9px; background: var(--aw-nhan); color: #fff; font-size: 14px; font-weight: 700; cursor: pointer; }
.gd3-dg-soan-gui i { font-size: 13px; }
@media (hover: hover) { .gd3-dg-soan-gui:hover { filter: brightness(1.07); } }
.gd3-dg-soan-gui:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
.gd3-dg-soan-ghi { margin: 7px 0 0; font-size: 12.5px; color: var(--aw-chu-phu); }
.gd3-dg-soan-ghi i { margin: 0 4px 0 2px; font-size: 11.5px; }
@media (max-width: 767.98px) { .gd3-dg-soan textarea { font-size: 16px; } }   /* 16px: iOS không tự phóng to trang */

/* "Bạn chấm mấy sao?" + 5 sao CÙNG MỘT DÒNG (28/09/2026). Legend thả trôi (float) thì thành phần tử thường,
   hàng sao là flex nên đứng ngay bên phải. Điện thoại hẹp: sao 38px (vẫn dễ bấm), chữ 14px — vừa khít 336px. */
.gd3-dg-sao legend { float: left; width: auto; margin: 0 10px 0 0; line-height: 44px; white-space: nowrap; }
.gd3-dg-sao legend + * { clear: none; }   /* Bootstrap đặt legend{width:100%} + legend+*{clear:left} — gỡ cả hai */
.gd3-dg-sao .gd3-dg-chon { min-height: 44px; align-items: center; }
.gd3-dg-sao .gd3-dg-loi-o { clear: both; }
@media (max-width: 767.98px) {
  .gd3-dg-sao legend { margin-right: 6px; }
  .gd3-dg-sao .gd3-dg-chon { gap: 0; }
  .gd3-dg-sao .gd3-dg-chon label { width: 38px; height: 44px; font-size: 25px; }
}

/* LỖI "BẤM 2 LẦN MỚI VÀO SẢN PHẨM" TRÊN IPHONE (28/09/2026). Safari iOS: nếu lần chạm đầu làm thẻ đổi giao diện
   kiểu :hover (ở đây main.css phóng ảnh 1.1 có hiệu ứng 0,5s, nút so sánh mờ→rõ, tên chuyển đỏ), nó coi lần chạm
   đó là "rê chuột" và KHÔNG mở link — phải chạm lần hai. Máy cảm ứng (hover: none) thì triệt hết hiệu ứng hover
   của thẻ: trông y như lúc chưa chạm, nên một chạm là vào luôn. Máy tính có chuột giữ nguyên. */
@media (hover: none) {
  .product-item:hover { color: var(--aw-chu); }
  .product-item img, .product-item:hover img { transition: none; transform: none; }
  .product-item:hover .gd3-card-badge { background-color: rgba(0, 0, 0, .68); }
  .product-item:hover .note-installment { background-color: var(--aw-nhan); color: var(--aw-tren-nhan); }
  .product-item:hover .note-installment::after { border-left-color: var(--aw-nhan); }
  .gd3-ss-them { opacity: 1; transition: none; }     /* nút so sánh: máy cảm ứng không có "rê chuột" nên luôn hiện rõ */
}

/* Quay lại trang: phần bù chiều cao đầu trang gộp (xem layout.php) gắn sẵn từ <head> qua biến --gd3-bu, để lần
   vẽ ĐẦU TIÊN đã đúng — script cuối trang sau đó ghi đè bằng style trực tiếp như lúc cuộn bình thường. */
@media (max-width: 991px) { .gd3-dau-gon .header-fixed-top { margin-bottom: var(--gd3-bu, 0px); } }

/* Biểu tượng SVG vẽ thẳng (đầu trang + thanh đáy, xem gd3_ic() trong layout.php): giữ thẻ <i> bọc ngoài để mọi
   luật cỡ/màu cũ (.gd3-cart-link i, .gd3-thanh-day i…) vẫn ăn; SVG cao đúng 1em và hạ 0,125em như glyph font. */
.gd3-ic-o { display: inline-block; font-style: normal; line-height: 1; vertical-align: -.125em; }
.gd3-ic { display: block; height: 1em; width: auto; fill: currentColor; overflow: visible; }

/* PHÂN TRANG MỘT DÒNG trên điện thoại (28/09/2026, chủ shop: "cho một dòng thôi"). 9 ô × 44px + khe > bề ngang
   màn 360–390px nên nút "›" rớt xuống hàng hai. Nay các ô CO GIÃN chia đều (tối đa 44px, gốc 0) — màn nào cũng
   vừa một hàng; dấu … giữ bề ngang riêng. Dòng "Trang 3 / 49" vẫn ở trên như cũ. */
@media (max-width: 575px) {
  .gd3-phantrang { gap: 5px; }
  .gd3-phantrang a, .gd3-phantrang > span { flex: 1 1 0; min-width: 0; max-width: 44px; height: 42px; padding: 0 !important; }
  .gd3-phantrang .gap { flex: 0 0 auto; min-width: 12px; }
}

/* THANH MUA DÍNH ĐÁY CÓ ẢNH NHỎ trên điện thoại (28/09/2026, chủ shop thấy shop khác làm đẹp): ảnh 44px bên trái để
   khách lướt xa vẫn biết đang mua món nào. Lấy chỗ bằng cách thu "Thêm giỏ" thành nút tròn chỉ có biểu tượng giỏ
   (vẫn có aria-label "Thêm vào giỏ"); "Mua ngay" là nút chính nên giữ nguyên chữ. */
@media (max-width: 991px) {
  .gd3-sp-thanh-anh { display: block; width: 44px; height: 44px; border-radius: 8px; }
  .gd3-sp-thanh-gio { width: 44px; padding: 0 !important; border-radius: 50%; }
  .gd3-sp-thanh-gio span { display: none; }
  .gd3-sp-thanh-gio i { font-size: 17px; }
}

/* Logo ShopKiss mới rộng ~213px: màn 375px thì ☰ + logo + giỏ (62+237+82) quá 375 → giỏ rớt xuống hàng dưới.
   Cột logo được co (flex 1, min-width 0), logo thu nhỏ theo tỉ lệ khi thiếu chỗ — màn ≥390px vẫn y như cũ. */
@media (max-width: 991px) {
  .header-fixed-top .gd3-header-brand-col { flex: 1 1 0% !important; min-width: 0; }   /* main.css ép 0 0 auto !important */
  .header-fixed-top .gd3-header-brand-col a { display: flex; justify-content: center; min-width: 0; max-width: 100%; }
  .header-fixed-top #logo-head { max-width: 100%; width: auto; height: auto; max-height: 46px; object-fit: contain; }
}

/* ============ Ô CHAT TRÊN WEB (28/09/2026) — khung + nút mở; hành vi ở layout.php ============
   Điện thoại: phủ kín màn như app nhắn tin (JS co theo visualViewport khi bàn phím bật).
   Máy tính: khung nổi 370px góc phải dưới + nút tròn mở khung. Chữ tin nhắn 15px, ô gõ 16px (iOS không phóng to). */
.gd3-kenh-chat { width: 100%; font: inherit; text-align: left; cursor: pointer;
  border: 1.5px solid var(--aw-nhan); background: var(--aw-nhan-nhat); }
.gd3-kenh-chat > i:first-child { color: var(--aw-nhan); }
.gd3-kenh-chat span { display: flex; flex-direction: column; gap: 1px; white-space: normal; }
.gd3-kenh-chat span b { font-size: 15px; }
.gd3-kenh-chat span small { font-size: 12.5px; font-weight: 400; color: var(--aw-chu-phu); }

.skc { position: fixed; z-index: 1200; display: flex; flex-direction: column; background: var(--aw-the);
  color: var(--aw-chu); inset: 0; height: 100vh; height: 100dvh; }
.skc[hidden] { display: none; }
.skc-dau { display: flex; align-items: center; gap: 10px; padding: 10px 10px 10px 14px;
  border-bottom: 1px solid var(--aw-ke); background: var(--aw-the); flex: none; }
.skc-anh img { display: block; width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--aw-ke); object-fit: cover; }
.skc-ten { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.skc-ten b { font-size: 15.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.skc-ten small { font-size: 12.5px; color: var(--aw-chu-phu); }
.skc-ten small i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #22a55a; margin-right: 4px; vertical-align: 0; }
.skc-dong { flex: none; width: 44px; height: 44px; border: 0; border-radius: 50%; background: transparent;
  color: var(--aw-chu); font-size: 22px; cursor: pointer; }
.skc-tin { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 14px 12px;
  display: flex; flex-direction: column; gap: 8px; background: var(--aw-nen-2); }
.skc-b { max-width: 82%; padding: 9px 12px; border-radius: 16px; font-size: 15px; line-height: 1.5;
  white-space: pre-wrap; overflow-wrap: anywhere; }
.skc-b small { display: block; margin-top: 3px; font-size: 12px; opacity: .72; }
.skc-b.shop { align-self: flex-start; background: var(--aw-the); border: 1px solid var(--aw-ke); border-bottom-left-radius: 5px; }
.skc-b.khach { align-self: flex-end; background: var(--aw-nhan); color: var(--aw-tren-nhan, #fff); border-bottom-right-radius: 5px; }
.skc-b.khach small { text-align: right; }
.skc-b.dang { opacity: .6; }
.skc-b.loi { background: #FBE3E3; color: #8A1F1F; border: 1px solid #E8B4B4; opacity: 1; }
.skc-hoi { flex: none; align-self: flex-start; margin: 8px 12px 0; padding: 7px 12px; border: 1px dashed var(--aw-nhan);
  border-radius: 999px; background: var(--aw-the); color: var(--aw-nhan); font: 600 13.5px/1.3 var(--aw-font-than); cursor: pointer; }
.skc-gui { flex: none; display: flex; align-items: flex-end; gap: 8px; padding: 10px 12px 6px; background: var(--aw-the); border-top: 1px solid var(--aw-ke); }
.skc-gui textarea { flex: 1; min-width: 0; min-height: 44px; max-height: 120px; resize: none; padding: 11px 16px;
  border: 1px solid var(--aw-ke-dam); border-radius: 22px; background: #fff; color: var(--aw-chu);
  font: 16px/1.35 var(--aw-font-than); }
.skc-gui textarea:focus { outline: none; border-color: var(--aw-nhan); box-shadow: 0 0 0 1px var(--aw-nhan); }
.skc-gui button { flex: none; width: 44px; height: 44px; border: 0; border-radius: 50%; background: var(--aw-nhan);
  color: var(--aw-tren-nhan, #fff); font-size: 17px; cursor: pointer; }
.skc-gui button:disabled { opacity: .5; cursor: default; }
.skc-chan { flex: none; margin: 0; padding: 0 12px calc(8px + env(safe-area-inset-bottom, 0px)); background: var(--aw-the);
  font-size: 12px; color: var(--aw-chu-phu); text-align: center; }
html.skc-mo, html.skc-mo body { overflow: hidden; }

/* Chấm đỏ "shop đã trả lời, bạn chưa xem" — trên nút Nhắn shop (thanh đáy) và nút tròn (máy tính). */
.gd3-thanh-day > button { position: relative; }
.skc-cham { position: absolute; top: 5px; left: calc(50% + 7px); width: 11px; height: 11px; border-radius: 50%;
  background: #E11D2E; border: 2px solid var(--aw-the); }
.skc-cham[hidden] { display: none; }
.skc-noi { display: none; }

@media (min-width: 992px) {
  .skc { inset: auto 20px 20px auto; width: 370px; height: min(560px, calc(100vh - 40px));
    border: 1px solid var(--aw-ke); border-radius: 16px; overflow: hidden; box-shadow: 0 18px 50px rgba(31, 26, 26, .22); }
  html.skc-mo, html.skc-mo body { overflow: visible; }      /* máy tính: khung nổi, trang sau vẫn cuộn được */
  .skc-noi { position: fixed; right: 20px; bottom: 20px; z-index: 1100; display: grid; place-items: center;
    width: 56px; height: 56px; border: 0; border-radius: 50%; background: var(--aw-nhan); color: var(--aw-tren-nhan, #fff);
    font-size: 24px; cursor: pointer; box-shadow: 0 8px 22px rgba(31, 26, 26, .25); }
  .skc-noi .skc-cham { top: 4px; left: auto; right: 4px; }
  html.skc-mo .skc-noi { display: none; }
  .totop { bottom: 88px; right: 28px; }                                /* nhường góc cho nút chat */
}
@media (hover: hover) {
  .skc-dong:hover { background: var(--aw-nen-2); }
  .skc-noi:hover { filter: brightness(1.07); }
}

/* Khối lưới/dải sản phẩm ở trang sản phẩm (Cùng hãng, Cùng danh mục, Bạn vừa xem) trên điện thoại: đệm trong
   14px + lề trang 12px = thẻ cách mép màn 27px, chủ shop thấy hai bên thừa (28/09/2026). Giảm đệm còn 6px →
   thẻ cách mép ~19px, ảnh sản phẩm to thêm ~8px mỗi thẻ. Khối chữ (hỏi đáp, đánh giá) giữ đệm cũ cho dễ đọc. */
@media (max-width: 575px) {
  .gd3-sp-khoi.gd3-sp-lq { padding-left: 6px; padding-right: 6px; }
  .gd3-sp-khoi.gd3-sp-lq > .gd3-km-tit, .gd3-sp-khoi.gd3-sp-lq > .gd3-daxem-ghi { padding-left: 8px; padding-right: 8px; }
}

/* BIỂU TƯỢNG KÊNH CÓ MÀU trong bảng "Nhắn shop" (28/09/2026) — màu nhận diện của từng ứng dụng. */
.gd3-kenh-o > i:first-child { justify-self: center; }
.gd3-kenh-telegram > i:first-child { color: #2AABEE; font-size: 28px; }
.gd3-kenh-messenger > i:first-child { font-size: 27px; color: #0A7CFF;
  background: linear-gradient(45deg, #0A7CFF 0%, #A033FF 60%, #FF5280 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
.gd3-kenh-whatsapp > i:first-child { color: #25D366; font-size: 28px; }
.gd3-kenh-viber > i:first-child { color: #7360F2; font-size: 28px; }
.gd3-kenh-sms > i:first-child,
.gd3-kenh-goi > i:first-child { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px;
  background: #34C759; color: #fff; font-size: 16px; }
.gd3-kenh-goi > i:first-child { border-radius: 50%; }
.gd3-kenh-o > i.gd3-kenh-bt:first-child { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px;
  background: #0068FF; color: #fff; font-family: var(--aw-font-than); font-size: 10.5px; font-weight: 700; font-style: normal;
  line-height: 1; letter-spacing: -.2px; }

/* THANH ĐÁY ĐIỆN THOẠI — bản "sang" (28/09/2026, chủ shop: đồ hoạ chưa đẹp). Bỏ đường kẻ cứng, thay bằng bóng
   mềm; biểu tượng to rõ hơn, chữ thanh hơn. Chừa vùng an toàn đáy iPhone (thanh vuốt). */
@media (max-width: 991px) {
  .gd3-thanh-day { background: var(--aw-the); border-top: 0; overflow: visible;
    box-shadow: 0 -1px 0 rgba(31, 26, 26, .05), 0 -8px 24px rgba(31, 26, 26, .08);
    padding-bottom: env(safe-area-inset-bottom, 0px); }
  .gd3-thanh-day a, .gd3-thanh-day button { gap: 4px; padding: 9px 2px 8px; color: var(--aw-chu-2);
    font: 500 11.5px/1.2 var(--aw-font-than); letter-spacing: .1px; }
  .gd3-thanh-day .gd3-ic-o { font-size: 20px; color: var(--aw-chu); }
  /* Đã thử nút tròn đỏ nổi ("nổi quá") và biểu tượng đỏ ("đỏ giữa hai icon đen chưa hài hoà") — 28/09/2026.
     Chốt: ba nút đồng màu, đồng dáng. */
}
@media (hover: hover) and (max-width: 991px) { .gd3-thanh-day a:hover { color: var(--aw-nhan); } }

/* DANH SÁCH BÀI VIẾT TRÊN ĐIỆN THOẠI: ẢNH TRÁI — CHỮ PHẢI (28/09/2026, chủ shop khoanh mẫu). Trước là ảnh rộng hết
   màn rồi mới tới tiêu đề: mỗi bài ăn ~400px, lướt 20 bài rất mỏi. Nay mỗi bài một hàng ~110px, thấy 5–6 bài một màn.
   Nhãn danh mục thu nhỏ theo khung ảnh nhỏ. Máy tính bảng / máy tính giữ lưới thẻ dọc như cũ. */
@media (max-width: 575px) {
  .gd3-bv-luoi { gap: 16px; }
  .gd3-bv-luoi .gd3-nw-vua { display: grid; grid-template-columns: 40% minmax(0, 1fr); grid-template-rows: auto auto 1fr;
    column-gap: 12px; align-items: start; }
  .gd3-bv-luoi .gd3-nw-vua-anh { grid-row: 1 / 4; aspect-ratio: 4 / 3; border-radius: 8px; }
  .gd3-bv-luoi .gd3-nw-vua-ten { grid-column: 2; margin-top: 0; font-size: 15px; line-height: 1.4; -webkit-line-clamp: 3; }
  .gd3-bv-luoi .gd3-nw-vua-tt { grid-column: 2; -webkit-line-clamp: 2; }
  .gd3-bv-luoi .gd3-nw-vua-meta { grid-column: 2; margin-top: 5px; }
  .gd3-bv-luoi .gd3-nw-dm { top: 5px; left: 5px; padding: 3px 6px; font-size: 10px; letter-spacing: .1px; border-radius: 5px; }
}

/* NÚT ZALO NỔI (28/09/2026) — ô tròn xanh Zalo chữ trắng, góc phải, ngay trên nút lên-đầu-trang. */
.gd3-zalo-noi { position: fixed; right: 14px; bottom: 122px; z-index: 1040; display: grid; place-items: center;
  width: 48px; height: 48px; border-radius: 50%; background: #0068FF; color: #fff; text-decoration: none;
  font: 700 13px/1 var(--aw-font-than); letter-spacing: -.2px;
  box-shadow: 0 0 0 3px rgba(255, 255, 255, .9), 0 6px 16px rgba(0, 72, 180, .35); }
.gd3-zalo-noi:visited, .gd3-zalo-noi:focus { color: #fff; }
html.skc-mo .gd3-zalo-noi { display: none; }
body.gd3-co-thanh-mua .gd3-zalo-noi { bottom: 134px; }      /* trang sản phẩm: thanh mua cao hơn thanh đáy */
@media (min-width: 992px) {
  .gd3-zalo-noi { right: 22px; bottom: 88px; width: 52px; height: 52px; font-size: 14px; }   /* trên nút chat tròn */
  .totop { bottom: 152px; }
}
@media (hover: hover) { .gd3-zalo-noi:hover { color: #fff; filter: brightness(1.08); } }

/* QUẦNG TOẢ quanh nút Zalo nổi (28/09/2026, chủ shop thấy bên khác đẹp): một vòng nhạt đứng yên + một vòng
   toả ra rồi mờ dần, lặp 2,4 giây — mắt bắt được nút mà không nhấp nháy gắt. Máy bật "giảm chuyển động" thì chỉ
   giữ vòng đứng yên. Vòng nằm SAU nút (z-index -1) nên không che chữ, không ăn thao tác bấm. */
.gd3-zalo-noi { box-shadow: 0 6px 16px rgba(0, 72, 180, .35); isolation: isolate; }
.gd3-zalo-noi::before, .gd3-zalo-noi::after { content: ""; position: absolute; inset: -8px; border-radius: 50%;
  background: rgba(0, 104, 255, .18); z-index: -1; pointer-events: none; }
.gd3-zalo-noi::after { inset: 0; background: rgba(0, 104, 255, .35); animation: gd3-zalo-toa 2.4s ease-out infinite; }
@keyframes gd3-zalo-toa { 0% { transform: scale(1); opacity: .9; } 70%, 100% { transform: scale(1.75); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .gd3-zalo-noi::after { animation: none; opacity: 0; } }

/* Nhích nút Zalo lên cao hơn (28/09/2026, chủ shop: vướng nút mũi tên lên đầu trang). Quầng toả rộng thêm ~18px mỗi
   phía, nên chừa khoảng hở ≥ 30px giữa đáy nút Zalo và đỉnh nút mũi tên. */
.gd3-zalo-noi { bottom: 146px; }
body.gd3-co-thanh-mua .gd3-zalo-noi { bottom: 156px; }
@media (min-width: 992px) {
  .gd3-zalo-noi { bottom: 96px; }
  .totop { bottom: 184px; }
}

/* CHỌN PHIÊN BẢN ở trang sản phẩm (28/09/2026, migration 128). Nút chia đều hàng (2 bản = 2 cột), tên bản
   đậm + giá bản đó ngay dưới để khách so luôn. Bản đang chọn: viền đỏ + nền hồng nhạt + dấu tích góc. */
.gd3-sp-pb { margin: 14px 0 4px; }
.gd3-sp-pb-nhan { display: block; margin-bottom: 8px; font-size: 14px; font-weight: 700; color: var(--aw-chu); }
.gd3-sp-pb-ds { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; }
.gd3-sp-pb-o { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 3px; min-height: 58px;
  padding: 9px 12px; border: 1.5px solid var(--aw-ke-dam); border-radius: 10px; background: var(--aw-the); color: var(--aw-chu);
  font: inherit; text-align: left; cursor: pointer; }
.gd3-sp-pb-o b { font-size: 14.5px; font-weight: 600; line-height: 1.3; }
.gd3-sp-pb-o small { font-size: 13.5px; font-weight: 700; color: var(--aw-giam, var(--aw-nhan)); }
.gd3-sp-pb-o.on { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); box-shadow: inset 0 0 0 1px var(--aw-nhan); }
.gd3-sp-pb-o.on::after { content: ""; position: absolute; top: -1px; right: -1px; width: 22px; height: 20px; border-radius: 0 9px 0 9px;
  background: var(--aw-nhan) no-repeat center / 11px url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 10'%3E%3Cpath d='M1 5l3.5 3.5L11 1.5' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.gd3-sp-pb-o:focus-visible { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
@media (hover: hover) { .gd3-sp-pb-o:hover { border-color: var(--aw-nhan); } }

/* ---- Tên phiên bản ở giỏ / đặt hàng / trang đơn (28/09/2026) ----
   Tên sản phẩm dài bị cắt "…", nên bản khách chọn đứng thành một nhãn riêng ngay dưới tên. */
.gd3-dh-chu { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.gd3-ban { display: inline-block; max-width: 100%; padding: 2px 8px; border-radius: 6px;
  background: var(--aw-nen-2); border: 1px solid var(--aw-ke);
  font-size: 12px; line-height: 1.45; color: var(--aw-chu-2); }
.gd3-ban b { font-weight: 700; color: var(--aw-chu); }
.gd3-gio-chu .gd3-ban { align-self: flex-start; margin: 1px 0 2px; }

/* ---- Giỏ trên điện thoại: bỏ cột trắng bên phải (28/09/2026) ----
   Nút × từng giữ nguyên một cột riêng suốt chiều cao hàng trên → tên, nhãn phiên bản, đơn giá bị ép
   hẹp, bên phải trống trơn. Giờ × đính góc trên-phải của thẻ, phần chữ trải hết bề ngang; chỉ riêng
   tên chừa lề phải cho × khỏi đè chữ. */
@media (max-width: 699px) {
  .gd3-gio-dong { position: relative; grid-template-areas: "anh chu chu" "anh sl tien"; }
  .gd3-gio-bo { grid-area: auto; position: absolute; top: 8px; right: 8px; }
  .gd3-gio-bo button { width: 30px; height: 30px; font-size: 13px; }
  .gd3-gio-chu .gd3-gio-ten { padding-right: 30px; }
}
@media (max-width: 420px) {
  .gd3-gio-dong { grid-template-areas: "anh chu chu" "sl sl tien"; }
}

/* Ô giá một hàng (JS ở product.php gắn class khi bản dài nhất không vừa): chữ gọn lại chút. */
.gd3-sp-gia.gd3-sp-gia-gon { gap: 6px 8px; }
.gd3-sp-gia-gon .gd3-sp-gia-nay { font-size: 22px; }
.gd3-sp-gia-gon .gd3-sp-gia-goc { font-size: 13px; }
.gd3-sp-gia-gon .gd3-sp-gia-giam { font-size: 12px; padding: 3px 8px; }
.gd3-sp-gia-gon .gd3-sp-gia-giam i { display: none; }

/* ---- Ô chọn phiên bản: hài hoà hơn (28/09/2026) ----
   Trước: viền nâu đậm + giá đỏ ở MỌI ô + ô chọn nền hồng viền đỏ → cả khối đỏ lốm đốm, tranh với
   ô giá hồng ngay trên. Giờ: ô thường viền mảnh nhạt, chữ xám đậm; chỉ ô đang chọn mới có viền đen
   ngả hồng (cùng tông thanh dưới đáy) + giá đỏ trầm. Đỏ chỉ còn đúng một chỗ khách cần nhìn. */
.gd3-sp-pb-o { border: 1px solid var(--aw-ke-dam); background: var(--aw-the); color: var(--aw-chu-2);
  transition: border-color .15s, box-shadow .15s; }
.gd3-sp-pb-o b { font-weight: 500; }
.gd3-sp-pb-o small { font-weight: 600; color: var(--aw-chu-phu); }
.gd3-sp-pb-o.on { border-color: var(--aw-chu); background: var(--aw-the); color: var(--aw-chu);
  box-shadow: inset 0 0 0 1px var(--aw-chu); }
.gd3-sp-pb-o.on b { font-weight: 600; }
.gd3-sp-pb-o.on small { font-weight: 700; color: var(--aw-giam); }
.gd3-sp-pb-o.on::after { background-color: var(--aw-chu); }
.gd3-sp-pb-o:focus-visible { outline-color: var(--aw-chu); }
@media (hover: hover) { .gd3-sp-pb-o:hover { border-color: var(--aw-chu-phu); } .gd3-sp-pb-o.on:hover { border-color: var(--aw-chu); } }

/* Chấm màu trước tên bản màu ("Màu hồng", "Màu xanh da trời"…). Viền mảnh để màu trắng/be vẫn thấy. */
.gd3-sp-pb-cham { display: inline-block; width: 12px; height: 12px; margin: 0 7px 0 0; border-radius: 50%;
  vertical-align: -1px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.14); }

/* Ô chọn bằng ẢNH (mọi bản đều có ảnh riêng — thường là màu): ô vuông ảnh + tên ngắn, kiểu web quốc tế. */
.gd3-sp-pb-ds.gd3-sp-pb-anh { grid-template-columns: repeat(auto-fill, 72px); gap: 10px; }
.gd3-sp-pb-anh .gd3-sp-pb-o { min-height: 0; padding: 3px; align-items: stretch; gap: 0; border-radius: 10px; }
.gd3-sp-pb-anh .gd3-sp-pb-o img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; border-radius: 7px;
  background: var(--aw-nen-2); }
.gd3-sp-pb-anh .gd3-sp-pb-o b { font-size: 12px; line-height: 1.25; text-align: center; }
.gd3-sp-pb-nhan b { font-weight: 600; }

/* ---- Ô chọn màu bằng ảnh: KHÁC HẲN dải ảnh nhỏ của thư viện (28/09/2026) ----
   Chủ shop: ô chọn màu và dải ảnh liên quan trông y hệt nhau → khách không phân biệt được đâu là ảnh
   để xem, đâu là nút để chọn. Chuẩn các web lớn: mẫu màu TRÒN nhỏ, ảnh phóng to vào thân sản phẩm,
   đang chọn thì có VÒNG viền đen cách một khe trắng (không dấu tích góc, không khung vuông). */
.gd3-sp-pb-ds.gd3-sp-pb-anh { display: flex; flex-wrap: wrap; gap: 14px; padding: 4px 2px; }
.gd3-sp-pb-anh .gd3-sp-pb-o { width: 50px; height: 50px; padding: 0; border: 0; border-radius: 50%; overflow: hidden;
  background: var(--aw-nen-2); box-shadow: 0 0 0 1px var(--aw-ke-dam); transition: box-shadow .15s; }
.gd3-sp-pb-anh .gd3-sp-pb-o img { width: 100%; height: 100%; aspect-ratio: auto; border-radius: 50%;
  object-fit: cover; object-position: 62% 55%; transform: scale(1.55); }
.gd3-sp-pb-anh .gd3-sp-pb-o.on { background: var(--aw-nen-2);
  box-shadow: 0 0 0 2px var(--aw-nen), 0 0 0 3.5px var(--aw-chu); }
.gd3-sp-pb-anh .gd3-sp-pb-o.on::after { display: none; }
/* 29/09/2026 (chủ shop: "cho thành 1 hàng, phần trắng bên phải thừa nhiều"): chọn màu bằng ô ảnh tròn thì nhãn
   "Màu: Da nâu" và các ô ảnh đứng CÙNG MỘT HÀNG. Nhiều màu quá bề ngang thì các ô tự xuống dòng bên phải nhãn.
   :has() — trình duyệt cũ không hiểu thì vẫn như trước (nhãn trên, ô dưới), không vỡ gì. */
.gd3-sp-pb:has(> .gd3-sp-pb-anh) { display: flex; align-items: center; gap: 14px; }
.gd3-sp-pb:has(> .gd3-sp-pb-anh) .gd3-sp-pb-nhan { margin-bottom: 0; flex-shrink: 0; white-space: nowrap; min-width: 7.6em; } /* đổi "Da nâu"↔"Da trắng" không làm ô ảnh xê dịch */
.gd3-sp-pb:has(> .gd3-sp-pb-anh) .gd3-sp-pb-anh { flex: 1; min-width: 0; }
@media (hover: hover) {
  .gd3-sp-pb-anh .gd3-sp-pb-o:hover { box-shadow: 0 0 0 2px var(--aw-nen), 0 0 0 3.5px var(--aw-chu-phu); }
  .gd3-sp-pb-anh .gd3-sp-pb-o.on:hover { box-shadow: 0 0 0 2px var(--aw-nen), 0 0 0 3.5px var(--aw-chu); }
}

/* ---- Cách giao hàng ở trang đặt hàng (28/09/2026, includes/giao_hang.php) ---- */
.gd3-giao-km { margin: 0 0 10px; font-size: 13.5px; line-height: 1.5; color: var(--aw-chu-2); }
.gd3-giao-km b { color: var(--aw-chu); }
.gd3-giao-km span { color: var(--aw-chu-phu); font-size: 12.5px; }
.gd3-giao-vitri { display: inline-flex; align-items: center; gap: 7px; margin: 0 0 12px; padding: 8px 12px;
  border: 1px solid var(--aw-ke-dam); border-radius: 999px; background: var(--aw-the); color: var(--aw-chu);
  font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.gd3-giao-vitri em { font-style: normal; font-weight: 400; color: var(--aw-chu-phu); }
.gd3-giao-vitri:disabled { opacity: .6; cursor: progress; }
.gd3-giao-o .gd3-dh-tt-chu { flex: 1; min-width: 0; }
.gd3-giao-o b { display: flex; justify-content: space-between; gap: 10px; align-items: baseline; }
.gd3-giao-phi { font-weight: 700; color: var(--aw-giam); white-space: nowrap; }
.gd3-dh-tt.gd3-giao-khoa { opacity: .45; }
.gd3-giao-tt-ghi { margin: 8px 0 0; font-size: 13px; color: var(--aw-chu-2); }

/* CHẠM ĐÚP KHÔNG PHÓNG TO TRANG (29/09/2026 — chủ shop: đang lướt ảnh trên iPhone thì cả trang tự phóng to).
   Safari hiểu hai cú chạm nhanh trên slide/nút là "chạm đúp để zoom". manipulation chỉ tắt đúng kiểu zoom đó,
   vẫn cho khách dùng hai ngón để phóng to xem kỹ ảnh. */
html { touch-action: manipulation; }

/* ---------------------------------------------------------------- biểu tượng danh mục vẽ riêng
   (29/09/2026) Thay FontAwesome ở menu, chip danh mục trang sản phẩm, trang chủ — xem cat_ic() trong
   includes/functions.php và assets/img/dm-icons.svg. Hình phẳng 2 tông đỏ–hồng; màu là biến
   --dm1 (nét chính) / --dm2 (mảng phụ) / --dm3 (chi tiết khoét trắng), nên trên nền đỏ hoặc
   nền tối chỉ đổi biến chứ không cần bộ hình thứ hai. */
i.dm-ic { display: inline-flex; align-items: center; justify-content: center; vertical-align: middle;
  line-height: 1; font-style: normal; }
i.dm-ic svg { display: block; width: 1.55em; height: 1.55em; overflow: visible; }
/* Chip danh mục ở trang sản phẩm: bong bóng tròn 26px, hình ~20px. */
.gd3-sp-chip-dm i.dm-ic svg { width: 20px; height: 20px; }
/* Menu ngang đầu trang (nền sáng): hình to hơn chữ một chút như icon cũ. */
i.dm-ic.gd3-menu-icon svg { width: 22px; height: 22px; }
/* Menu trượt trên điện thoại — nền tối: đỏ tươi + hồng nhạt, chi tiết khoét lấy màu nền. */
.gd3-menu-truot i.dm-ic { --dm1: #F2696A; --dm2: #FBD3D4; --dm3: #1F1A1A; }
.gd3-menu-truot i.dm-ic { width: 22px; }
.gd3-menu-truot i.dm-ic svg { width: 21px; height: 21px; }
.gd3-mt-muc i.dm-ic, .gd3-mt-cap1 > summary i.dm-ic { margin-right: 4px; }
/* Ô vuông đỏ tiêu đề khối trang chủ: hình trắng + hồng nhạt, chi tiết khoét màu đỏ. */
.gd3-khoi-icon i.dm-ic { --dm1: #fff; --dm2: rgba(255,255,255,.62); --dm3: #C81E24; }
.gd3-khoi-icon i.dm-ic svg { width: 1.6em; height: 1.6em; }
/* Ô danh mục trang chủ chưa có ảnh: hình giữa ô. */
.gd3-dm-anh i.dm-ic svg { width: 56px; height: 56px; }

/* ---------------------------------------------------------------- menu trượt: đầu menu + thẳng hàng (29/09/2026)
   Chủ shop: khối đỏ "Danh mục" + "Trang chủ" trơ trọi "chưa hợp lý". Đầu menu nền tối liền thân,
   logo chữ trắng + nút đóng tròn; MỌI dòng cấp 1 (trang chủ, danh mục, khuyến mãi, trang hỗ trợ)
   chung một cột biểu tượng 24px và chữ bắt đầu cùng một vạch; nhãn nhóm nhỏ chia khu. */
.gd3-menu-truot .gd3-menu-truot-dau { position: sticky; top: 0; z-index: 2; background: #161212; color: #fff;
  padding: 14px 12px 14px 16px; border-bottom: 1px solid rgba(255,255,255,.1); }
.gd3-menu-truot .gd3-mt-logo { padding: 0; border: 0; display: inline-flex; align-items: center; }
.gd3-menu-truot .gd3-mt-logo:hover { background: none; }
.gd3-menu-truot .gd3-mt-logo img { height: 28px; width: auto; display: block; }
.gd3-menu-truot .gd3-mt-logo b { font-size: 19px; color: #fff; }
.gd3-menu-truot-dau button { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.1); color: #fff; font-size: 17px; }
.gd3-menu-truot-dau button:hover { background: var(--aw-nhan); }
.gd3-mt-nhan { padding: 16px 16px 6px; font-size: 11.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase;
  color: rgba(255,255,255,.45); }
.gd3-menu-truot .gd3-mt-muc:not(.gd3-mt-c2):not(.gd3-mt-c3), .gd3-mt-cap1 > summary { display: flex; align-items: center; gap: 12px; }
.gd3-menu-truot .gd3-mt-muc > i, .gd3-mt-cap1 > summary > i { flex: 0 0 24px; width: 24px; margin: 0; text-align: center; font-size: 17px; }
.gd3-menu-truot .gd3-mt-muc > i.dm-ic, .gd3-menu-truot .gd3-mt-cap1 > summary > i.dm-ic { display: inline-flex; justify-content: center; width: 24px; margin: 0; }
/* Mục con thụt vào đúng vạch chữ của cấp 1 (16 + 24 + 12 = 52px). */
.gd3-menu-truot .gd3-mt-c2, .gd3-mt-cap2 > summary, .gd3-mt-cap1 > .gd3-mt-tatca { padding-left: 52px; }
.gd3-menu-truot .gd3-mt-c3, .gd3-mt-cap2 .gd3-mt-tatca { padding-left: 68px; }

/* 29/09/2026 (thêm màu cho 276 SP, có SP tới 5–6 màu): nhiều ô màu hơn bề ngang một hàng thì nhãn "Màu: …"
   lên TRÊN, các ô xếp một dải bên dưới — thay vì ô tràn xuống dòng thứ hai lơ lửng bên phải nhãn.
   Điện thoại: từ 4 màu; màn rộng: từ 7 màu. */
@media (max-width: 575.98px) {
  .gd3-sp-pb:has(> .gd3-sp-pb-anh > .gd3-sp-pb-o:nth-child(4)) { display: block; }
  .gd3-sp-pb:has(> .gd3-sp-pb-anh > .gd3-sp-pb-o:nth-child(4)) .gd3-sp-pb-nhan { margin-bottom: 8px; }
}
@media (min-width: 576px) {
  .gd3-sp-pb:has(> .gd3-sp-pb-anh > .gd3-sp-pb-o:nth-child(7)) { display: block; }
  .gd3-sp-pb:has(> .gd3-sp-pb-anh > .gd3-sp-pb-o:nth-child(7)) .gd3-sp-pb-nhan { margin-bottom: 8px; }
}

/* 29/09/2026 (chủ shop: nút "Lọc giá" rơi xuống dòng riêng, "đưa lên cho gọn"): ô Từ – đến và nút Lọc đứng
   CÙNG MỘT HÀNG ở mọi bề ngang — hai ô tự co giãn chia phần còn lại, nút giữ nguyên cỡ. */
.gd3-loc-gia { flex-wrap: nowrap; gap: 6px; }
.gd3-loc-gia label { flex: 1 1 0; min-width: 0; gap: 5px; }
.gd3-loc-gia label span { flex: none; }
.gd3-loc-gia input { width: auto; flex: 1 1 auto; min-width: 0; }
.gd3-loc-gia button { flex: none; padding: 0 18px; }

/* ===== MUA KÈM (29/09/2026, migration 137) — ô tích món phụ trong khung mua, trên ô số lượng ===== */
.gd3-sp-form > .gd3-mk { flex: 1 1 100%; }
.gd3-mk { display: flex; flex-direction: column; gap: 8px; }
.gd3-mk-tieu { margin: 0; font-size: 14px; font-weight: 700; color: var(--aw-chu); display: flex; align-items: center; gap: 7px; }
.gd3-mk-tieu i { color: var(--aw-nhan); }
.gd3-mk-o { position: relative; display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--aw-ke); border-radius: 10px;
  background: var(--aw-the); cursor: pointer; transition: border-color .15s, background .15s; }
.gd3-mk-o:hover { border-color: var(--aw-nhan-vien); }
.gd3-mk-o input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.gd3-mk-tich { flex: 0 0 22px; width: 22px; height: 22px; border: 1.5px solid var(--aw-ke-dam); border-radius: 6px; display: grid; place-items: center;
  color: transparent; font-size: 12px; background: var(--aw-the); transition: background .15s, border-color .15s; }
.gd3-mk-anh { flex: 0 0 56px; width: 56px; height: 56px; border-radius: 8px; overflow: hidden; background: var(--aw-nen-2); }
.gd3-mk-anh img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gd3-mk-chu { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.gd3-mk-chu b { font-size: 14px; font-weight: 600; line-height: 1.35; color: var(--aw-chu-2); }
.gd3-mk-gia { font-size: 14.5px; font-weight: 700; color: var(--aw-giam, var(--aw-nhan)); }
.gd3-mk-gia del { font-size: 12.5px; font-weight: 400; color: var(--aw-chu-phu); margin-left: 4px; }
.gd3-mk-o:has(input:checked) { border-color: var(--aw-nhan); background: var(--aw-nhan-nhat); box-shadow: inset 0 0 0 1px var(--aw-nhan); }
.gd3-mk-o input:checked + .gd3-mk-tich { background: var(--aw-nhan); border-color: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-mk-o input:focus-visible + .gd3-mk-tich { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }

/* Mua kèm — ảnh bấm xem to (29/09/2026) */
.gd3-mk-anh { position: relative; padding: 0; border: 0; cursor: zoom-in; }
.gd3-mk-anh i { position: absolute; right: 3px; bottom: 3px; width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center;
  font-size: 10px; background: rgba(0,0,0,.55); color: #fff; }
.gd3-mk-lb[open] { flex-direction: column; gap: 14px; }
.gd3-mk-lb img { max-height: calc(100vh - 190px); background: #fff; }
.gd3-mk-lb-duoi { display: flex; align-items: center; gap: 12px; width: min(560px, calc(100vw - 24px)); color: #fff; }
.gd3-mk-lb-duoi span { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.gd3-mk-lb-duoi b { font-size: 14.5px; font-weight: 600; line-height: 1.35; }
.gd3-mk-lb-duoi em { font-style: normal; font-weight: 700; color: #ffb3b3; }
.gd3-mk-lb .gd3-mk-lb-chon { position: static; width: auto; height: 44px; padding: 0 16px; border-radius: 22px; background: var(--aw-nhan); color: var(--aw-tren-nhan);
  font-size: 14px; font-weight: 700; white-space: nowrap; display: inline-flex; align-items: center; gap: 7px; cursor: pointer; }
.gd3-mk-lb .gd3-mk-lb-chon.on { background: #15803d; }

/* Mua kèm — nhiều món thì gập (29/09/2026); ảnh dài mảnh nên để trọn (contain) trên nền trắng */
.gd3-mk:not(.mo) .gd3-mk-them { display: none; }
.gd3-mk.mo .gd3-mk-xem { display: none; }
.gd3-mk-xem { align-self: flex-start; border: 0; background: none; padding: 2px 0; color: var(--aw-nhan); font-weight: 700; font-size: 14px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px; }
.gd3-mk-anh { background: #fff; border: 1px solid var(--aw-ke); }
.gd3-mk-anh img { object-fit: contain; }

/* ===== QUÀ TẶNG TỰ CHỌN (29/09/2026, migration 139) — trang sản phẩm (trong form mua) + giỏ hàng ===== */
.gd3-sp-form > .gd3-qt { flex: 1 1 100%; }
.gd3-qt { border: 1px dashed var(--aw-nhan-vien); background: var(--aw-nhan-nhat); border-radius: 12px; padding: 10px 12px 12px; margin: 0; min-width: 0; }
.gd3-qt-gio { margin: 0 0 14px; }
.gd3-qt-tieu { margin: 0 0 8px; padding: 0; font-size: 14px; font-weight: 600; color: var(--aw-chu); display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.gd3-qt-tieu i { color: var(--aw-nhan); }
.gd3-qt-ds { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.gd3-qt-o { position: relative; display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 8px 6px; border: 1px solid var(--aw-ke);
  border-radius: 10px; background: var(--aw-the); cursor: pointer; text-align: center; transition: border-color .15s, box-shadow .15s; }
.gd3-qt-o input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.gd3-qt-anh { width: 64px; height: 64px; display: block; }
.gd3-qt-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-qt-ten { font-size: 12.5px; line-height: 1.3; color: var(--aw-chu-2); font-weight: 500; }
.gd3-qt-mien { font-size: 11.5px; font-weight: 700; color: #15803d; }
.gd3-qt-o:has(input:checked) { border-color: var(--aw-nhan); box-shadow: inset 0 0 0 1px var(--aw-nhan); }
.gd3-qt-o:has(input:checked)::after { content: ""; position: absolute; top: -1px; right: -1px; width: 22px; height: 20px; border-radius: 0 9px 0 9px;
  background: var(--aw-nhan) no-repeat center / 11px url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 10'%3E%3Cpath d='M1 5l3.5 3.5L11 1.5' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.gd3-qt-o input:focus-visible ~ .gd3-qt-anh { outline: 2px solid var(--aw-nhan); outline-offset: 2px; }
.gd3-qt-luu { margin-top: 8px; }
.gd3-qt-them { margin: 0 0 14px; padding: 9px 12px; border-radius: 10px; background: var(--aw-nhan-nhat); font-size: 13.5px; color: var(--aw-chu-2); }
.gd3-qt-them i { color: var(--aw-nhan); margin-right: 4px; }
.gd3-dh-qua .gd3-dh-ten i { color: var(--aw-nhan); }
.gd3-dh-qua .gd3-dh-tien { color: #15803d; font-weight: 700; }
@media (min-width: 900px) { .gd3-sp-form .gd3-qt-ds { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

.gd3-qt-tieu { display: block; } .gd3-qt-tieu i { margin-right: 6px; }   /* chữ liền mạch, không bị flex tách khoảng */

/* ===== GEL MUA KÈM ĐỒ CHƠI NỮ −30% (30/09/2026, migration 140) — dải thẻ cuộn ngang ===== */
.gd3-gk { margin: 16px 0 0; padding: 12px 0 4px; border-top: 1px solid var(--aw-ke); min-width: 0; }
.gd3-gk-gio { margin: 6px 0 14px; padding: 12px; border: 1px solid var(--aw-ke); border-radius: 12px; background: var(--aw-the); }
.gd3-gk-tieu { margin: 0; font-size: 15px; font-weight: 600; color: var(--aw-chu); }
.gd3-gk-tieu i { color: var(--aw-nhan); margin-right: 6px; }
.gd3-gk-tieu b { color: var(--aw-nhan); }
.gd3-gk-ghi { margin: 3px 0 10px; font-size: 13px; color: var(--aw-chu-phu); }
.gd3-gk-ds { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory; padding-bottom: 6px; -webkit-overflow-scrolling: touch; }
.gd3-gk-o { flex: 0 0 132px; scroll-snap-align: start; display: flex; flex-direction: column; gap: 5px; padding: 8px; border: 1px solid var(--aw-ke);
  border-radius: 10px; background: var(--aw-the); }
.gd3-gk-anh { display: block; width: 100%; aspect-ratio: 1; }
.gd3-gk-anh img { width: 100%; height: 100%; object-fit: contain; display: block; }
.gd3-gk-ten { font-size: 12.5px; line-height: 1.3; color: var(--aw-chu-2); text-decoration: none; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 2.6em; }
.gd3-gk-gia { font-size: 12px; color: var(--aw-chu-phu); }
.gd3-gk-gia b { font-size: 14px; color: var(--aw-giam, var(--aw-nhan)); margin-right: 3px; }
.gd3-gk-them { margin-top: auto; border: 1px solid var(--aw-nhan); background: var(--aw-the); color: var(--aw-nhan); border-radius: 8px; height: 32px;
  font-size: 13px; font-weight: 700; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 5px; }
.gd3-gk-them:hover { background: var(--aw-nhan); color: var(--aw-tren-nhan); }
.gd3-gk-them:disabled { opacity: .6; }
.gd3-gk-tag { display: inline-block; margin-top: 3px; font-size: 12px; font-weight: 600; color: #15803d; }
.gd3-gk-tag i { margin-right: 3px; }
.gd3-gk-gia b, .gd3-gk-gia del { white-space: nowrap; }
.gd3-gk-gia { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 4px; }
/* Vòng lặp vô hạn: thanh cuộn chỉ gây hiểu nhầm (luôn đứng giữa) nên ẩn đi. */
.gd3-gk-ds { scrollbar-width: none; } .gd3-gk-ds::-webkit-scrollbar { display: none; }
.gd3-gk-tieu { margin-bottom: 10px; }
.gd3-giao-km[hidden] { display: none !important; }
/* Dải mua kèm nằm dưới mô tả (30/09): dùng khung .gd3-sp-khoi như các khối nửa dưới. */
.gd3-sp-khoi.gd3-gk-duoi { border-top: 1px solid var(--aw-ke); margin: 0 0 16px; padding: 18px 20px; }
@media (max-width: 767px) { .gd3-sp-khoi.gd3-gk-duoi { padding: 15px 14px; } }
.gd3-gk-duoi .gd3-gk-tieu { margin-bottom: 12px; }
.gd3-gk-duoi .gd3-gk-o { flex-basis: 150px; }

/* Ảnh có width/height (img_tag() gắn tỉ lệ thật để chống giật trang): giữ đúng tỉ lệ khi CSS chỉ đặt bề rộng.
   :where() = độ ưu tiên 0 → mọi luật riêng (height:100% + object-fit…) vẫn thắng. */
:where(img[width][height]) { height: auto; }
