/**
Theme Name: Jelly Key
Author: Joiha
Author URI: https://www.joiha.com
Description: Artisan keycaps for mechanical keyboards. Let’s go back to the beginning, to the origin of our core philosophy: artisanship. we will discover the depth of this word, to understand why it plays a vital role in everything we do. And most importantly, in how we make artisan keycaps at Jelly Key
Version: 2.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: jelly-key
*/

/* ============================================================
   CSS tuỳ biến (chuyển từ Additional CSS / Customizer vào child theme
   để version-control. Nội dung giữ NGUYÊN. 2026-06-27)
   ============================================================ */

/* ============================================================
   ROOT FONT SIZE — FIX rem-base. Astra quy đổi mọi size sang rem theo
   base = body (18px), nhưng html root mặc định Astra là 106.25% (17px)
   → declaration rem thắng px → chữ render ~17px thay vì 19 (nhỏ ~11%).
   Đặt root=112.5% (=18px) để 1rem=18, khớp base Astra → size hiện ĐÚNG. 2026-07-01
   ============================================================ */
html { font-size: 112.5% !important; } /* 18px root */

/* ============================================================
   SELF-HOSTED FONT — Source Sans 3 (variable), 1 bộ cho CẢ SITE. 2026-08-12
   ============================================================
   Quay lại từ Inter. Lịch sử để người sau khỏi tưởng nhầm là chưa từng thử:
   2026-08-09 Hùng chê Source Sans "chán và lỗi thời" và chọn Inter sau khi so hai
   bản render; 2026-08-12, sau 3 ngày nhìn Inter chạy thật, anh chốt ngược lại —
   "Inter nhìn trên site không hợp" — và yêu cầu về Source Sans Pro. Đây là quyết
   định thẩm mỹ của chủ, bản nào cũng đã được nhìn tận mắt; đừng tự ý đổi tiếp.

   Tên họ font là 'Source Sans Pro' (không phải 'Source Sans 3') CÓ CHỦ ĐÍCH:
   Astra Customizer vẫn in `font-family:"Source Sans Pro"` vào <head>, đặt trùng
   tên là mọi khai báo của Astra tự phân giải về đúng file này, khỏi phải đè.

   Sáu mặt font, chọn theo `unicode-range` + `font-style` nên khách Anh ngữ chỉ tải
   1 file latin (~28KB, nhẹ hơn Inter ~19KB); italic chỉ tải khi trang thật sự có
   chữ nghiêng. CÓ ITALIC THẬT từ đợt này — trước đây không có file nghiêng nào mà
   `font-synthesis: none` lại cấm nghiêng giả, nên mọi <em>/<i> hiện thành chữ đứng
   suốt từ 2026-07-01 mà không ai thấy (đo bề ngang italic = normal trên prod mới lộ).
   vietnamese: cho tên cổng thanh toán tiếng Việt (chỉ hiện với khách VN).
   Tự host, KHÔNG gọi Google Fonts (file lấy từ bản đã cắt của Google, v19, SIL OFL 1.1).
   ============================================================ */
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Variable-latin.woff2') format('woff2');font-weight:200 900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Variable-latinext.woff2') format('woff2');font-weight:200 900;font-style:normal;font-display:swap;unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Variable-vietnamese.woff2') format('woff2');font-weight:200 900;font-style:normal;font-display:swap;unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Italic-latin.woff2') format('woff2');font-weight:200 900;font-style:italic;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Italic-latinext.woff2') format('woff2');font-weight:200 900;font-style:italic;font-display:swap;unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:'Source Sans Pro';src:url('fonts/SourceSans3-Italic-vietnamese.woff2') format('woff2');font-weight:200 900;font-style:italic;font-display:swap;unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}

/* ============================================================
   FONT THỨ HAI — JetBrains Mono, cho NHÃN và THÔNG SỐ. 2026-08-08
   ============================================================
   Vì sao có font thứ hai: khách của Jelly Key là dân bàn phím cơ, phần lớn là lập
   trình viên — JetBrains Mono là font của giới đó, dùng nó là tín hiệu nhận diện
   chứ không phải trang trí. Chi tiết phạm vi ở mục JK-MONO cuối file.

   Cũng tự host như Source Sans, KHÔNG gọi Google Fonts (file tải về từ bản đã cắt
   theo bộ ký tự của Google, rồi đặt vào đây). 1 file variable gánh 400–700.
   latin ~31KB; latin-ext ~11KB nằm im tới khi gặp ký tự có dấu (unicode-range).
   ============================================================ */
@font-face{font-family:'JetBrains Mono';src:url('fonts/JetBrainsMono-Variable-latin.woff2') format('woff2');font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'JetBrains Mono';src:url('fonts/JetBrainsMono-Variable-latinext.woff2') format('woff2');font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}

/* ============================================================
   TYPOGRAPHY — Source Sans Pro cho chữ đọc, JetBrains Mono cho nhãn/số
   ============================================================
   🛑 Đổi font thì sửa BIẾN, đừng đi rải tên font. Astra và Elementor đều khai tên
   font cụ thể ở tầng của chúng, nên bên dưới có một luật gom lại — xem chú thích ở đó. */
:root {
  --jk-font-sans: 'Source Sans Pro', system-ui, -apple-system, 'Segoe UI', sans-serif;
}
* { font-optical-sizing: auto; font-synthesis: none; }
body {
  font-family: var(--jk-font-sans);
  line-height: 1.7;
  /* BỎ chống răng cưa (2026-08-13, Hùng yêu cầu): XOÁ dòng của mình chưa đủ — Astra
     frontend.min.css cũng khai `body{-webkit-font-smoothing:antialiased}` (đo bằng
     duyệt styleSheets, không đoán). Phải ép ngược về auto. Chế độ antialiased trên
     macOS còn làm chữ MẢNH đi một nấc — ngược yêu cầu "đỡ mỏng" cùng ngày. Các luật
     antialiased của FONT BIỂU TƯỢNG (astra-icon, eicon, dashicons) giữ nguyên: icon
     font cần nó, và chúng khai trên chính phần tử icon nên không bị dòng này đè. */
  -webkit-font-smoothing: auto;
  -moz-osx-font-smoothing: auto;
  text-rendering: optimizeLegibility;
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
}
/* Luật gom: Astra in `font-family:"Source Sans Pro"` vào <head> cho body, heading, nút và ô
   nhập; Elementor khai riêng cho từng widget. Đổi font ở `body` thôi thì hai tầng đó vẫn kéo
   trang về font cũ, mà `font-family` không kế thừa qua một khai báo cụ thể hơn.
   ⚠️ Danh sách này KHÔNG có `span`, `div`, `li` trần — mono đang sống ở những thẻ đó
   (nhãn, chip, giá, mã đơn) và một luật trần sẽ nuốt hết. Muốn thêm chỗ nào thì thêm đúng
   selector của chỗ đó. */
body,
button, input, select, textarea,
h1, h2, h3, h4, h5, h6,
/* Link BÊN TRONG tiêu đề: Astra khai font riêng cho nó, nên tên bài trên trang blog là chỗ
   duy nhất còn sót lại font cũ sau vòng quét đầu. Mono không sống trong heading nào có link
   (nhãn cột chân trang là h3 nhưng khai ở tầng class nên vẫn thắng luật này).
   ⚠️ Astra Addon nhắm `.blog .entry-title a` = (0,2,1), nên `:is(h1…h6) a` = (0,0,2) THUA.
   Phải khớp đúng độ mạnh đó rồi dựa vào việc child theme nạp sau. Đã đo lại sau khi sửa. */
:is(h1, h2, h3, h4, h5, h6) a,
:is(.blog, .archive, .search, .single) :is(.entry-title, .entry-title a),
.entry-content :where(h1, h2, h3, h4, h5, h6),
.elementor-widget-container :where(h1, h2, h3, h4, h5, h6, p, li, a, strong, em, blockquote) {
	font-family: var(--jk-font-sans);
}
/* (Luật bù giãn chữ cho Inter từng đứng ở đây đã xoá 2026-08-12: nó bị chính khối
   h1/h2/h3 ngay dưới đè từ ngày đầu — cùng specificity, nạp sau thắng — nên CHƯA BAO
   GIỜ chạy; và các giá trị dưới vốn tinh cho Source Sans từ 2026-07, nay lại đúng font.) */

/* Heading: cùng font. SIZE và WEIGHT do Astra Customizer quản.
 *
 * ⚠ ĐỌC TRƯỚC KHI ĐỊNH SỬA WEIGHT Ở ĐÂY. Ba dòng này từng khai font-weight 700/700/600
 * kèm chú thích "đè weight 200 mảnh cũ" — nhưng CHƯA BAO GIỜ CHẠY. Astra in CSS
 * Customizer thẳng vào <head>, trong đó có `.entry-content :where(h2){font-weight:200}`
 * = specificity (0,1,0) vì `.entry-content` là một class (`:where()` tính 0). Muốn đè
 * phải từ (0,1,1) trở lên, `h2` trần hay `body h2` đều thua. Đã đo 2026-08-08.
 *
 * Lịch sử "ĐỪNG đè": bản 08-08 dặn giữ nguyên nét 200 vì tương phản với <strong> 700
 * ("One Ball, **One World** artisan keycaps"). 2026-08-13 chính Hùng chốt lại: "H1, H2
 * quá mỏng, chỉnh cho đỡ mỏng hơn (đỡ thôi)" — nên nhích 200 → 300 (font biến thiên
 * 200–900, 300 có thật). 300 vẫn là nét mảnh, <strong> 700 bên trong vẫn tương phản rõ;
 * KHÔNG lên 400+ — đó là câu Hùng đã gạt từ 08-08. Luật nằm ngay dưới ba dòng
 * line-height, dùng :is() để đạt (0,1,1) thắng cả hai luật 200 của Astra.
 *
 * Thang chữ cho GIỎ HÀNG + THANH TOÁN nằm ở khối biến --jk-fs-* trong mục JK-CC. */
h1 { line-height: 1.15; letter-spacing: -0.02em; }
h2 { line-height: 1.2; letter-spacing: -0.015em; }
h3 { line-height: 1.3; letter-spacing: -0.01em; }
/* Nét H1/H2: 200 → 300 (2026-08-13, xem chú thích trên). Chỉ nhắm hai chỗ đang thật sự
   ăn nét 200 của Astra — nội dung bài viết và khối Elementor; các heading Woo (giỏ, tài
   khoản, sản phẩm) đã có luật riêng mạnh hơn, luật này không với tới.
   ⚠️ `.elementor` chứ KHÔNG `.elementor-widget-container`: Elementor "optimized DOM" đã bỏ
   wrapper đó (đo trang chủ 2026-08-13 — querySelector ra RỖNG), còn `.elementor` là class
   gốc của mọi tài liệu Elementor kể cả template Canvas không có .entry-content. */
.entry-content :is(h1, h2),
.elementor :is(h1, h2) {
	font-weight: 300;
}

/* JK-READING START — nhịp đọc kiểu sách + tối ưu hiển thị chữ. 2026-07-01 */
p { text-wrap: pretty; }
h1, h2, h3, h4,
.entry-title, .page-title,
.woocommerce div.product .product_title { text-wrap: balance; }
.entry-content p { margin: 0 0 1.35em; }
.entry-content :is(h2, h3, h4) { margin-top: 1.7em; margin-bottom: .5em; }
.entry-content :is(h2, h3, h4):first-child { margin-top: 0; }
/* JK-READING END */

/* Archive header (vd trang "Artisan Keycaps"): Astra dùng rem base lạ (14) → phóng to
   bất thường ở root 18. Ép px để đúng thang. 2026-07-01
   (2026-08-13: 34 → 32px — tiêu đề trang đã chốt MỘT cỡ 32/700 toàn site từ 08-09;
   dòng 34px này là số cũ còn sót, thua luật 32px phía dưới nên lâu nay không chạy —
   sửa cho hết mâu thuẫn trong file, đúng bài học kiểu-4.) */
.ast-archive-description .ast-archive-title { font-size: 32px !important; line-height: 1.15; }
.ast-archive-description p { font-size: 18px !important; line-height: 1.6; }

/* JK-SPACING START — khe TIÊU ĐỀ TRANG → NỘI DUNG: một mốc sp-6 cho mọi trang.
   Đo 2026-08-13 (Hùng: "khoảng cách không theo nguyên tắc gì cả"): bốn kiểu trang
   ra bốn khe — giỏ/thanh toán/đăng nhập 27px, tài khoản 36px, blog 26px, lưới shop
   45px — toàn mặc định Astra mỗi template một kiểu, không ai chọn. */
#content .entry-header { margin-bottom: var(--jk-sp-6) !important; }
/* Khe thật = max(margin header, margin content) vì hai margin GẬP vào nhau — Astra cho
   .entry-content margin-top 36 nên chỉ set header là chưa đủ (đo 2026-08-13). */
#content .entry-header + .entry-content { margin-top: 0 !important; }
#content .entry-header + .entry-content > :first-child { margin-top: 0; }
/* Blog (.jk-arch tự dựng) và lưới shop (.ast-archive-description của Astra) không đi
   qua .entry-header — set cùng mốc. Chuỗi shop cần thắng padding/margin Astra addon. */
body.ast-woo-shop-archive .ast-archive-description { margin-bottom: var(--jk-sp-6) !important; padding-bottom: 0 !important; }
/* JK-SPACING END */

/* ============================================================
   ACCOUNT / CART / CHECKOUT — phân cấp rõ, tương phản tốt, cảm giác tin cậy.
   Tên SP đậm; biến thể (Gourmet Pastries/Tray) nhạt-gọn, KHÔNG đậm hơn tên;
   giá rõ nét; TỔNG cộng đậm nổi bật; header bảng rõ; nav mục chọn đậm. 2026-07-01
   ============================================================ */
/* Header bảng (Order/Date/Status/Total · Product/Price/Qty/Subtotal) — rõ, chắc */
.woocommerce table.shop_table thead th,
.woocommerce-orders-table thead th,
.woocommerce-cart-form table.cart thead th,
.woocommerce-checkout-review-order-table thead th {
  font-weight: 600; color: #2b2b2b; letter-spacing: .01em;
}
/* Ô dữ liệu bảng — đủ tương phản (không xám lợt) */
.woocommerce-orders-table tbody td,
.woocommerce-cart-form table.cart td { color: #3a3a3a; }

/* Tên SP / số đơn = neo chính: đậm 600, mực đậm */
.woocommerce-cart-form .product-name > a,
.woocommerce-checkout-review-order-table .product-name,
.woocommerce-orders-table__cell-order-number a {
  font-weight: 600; color: #111;
}
.woocommerce-orders-table__cell-order-number a { text-decoration: none; }

/* Biến thể = phụ: nhạt, gọn, KHÔNG đậm hơn tên SP */
.woocommerce .product-name dl.variation,
.woocommerce-checkout-review-order-table .product-name dl.variation {
  margin: 6px 0 0; font-size: .94em; color: #6a6a6a; line-height: 1.5;
}
.woocommerce .product-name dl.variation dt { font-weight: 500; color: #6a6a6a; margin-right: .35em; }
.woocommerce .product-name dl.variation dd,
.woocommerce .product-name dl.variation dd p { font-weight: 400; color: #6a6a6a; margin: 0; }
/* "× 2" là thông số → mono (mục 2b JK-CC). Đo 2026-08-13: checkout ra sans 18/400,
   view-order ra sans 17/700 — cùng một thứ hai kiểu, và luật cũ ở đây không thắng nổi
   strong. Gom cả hai bảng về một kiểu, !important để đè b/strong của Astra. */
.woocommerce-checkout-review-order-table .product-quantity,
.woocommerce-account.logged-in table.order_details .product-quantity {
	font-family: var(--jk-font-mono);
	font-size: var(--jk-fs-label);
	color: #6a6a6a;
	font-weight: 500 !important;
}

/* Giá / tiền: rõ nét, đậm vừa */
.woocommerce-cart-form .product-price,
.woocommerce-cart-form .product-subtotal,
.woocommerce-checkout-review-order-table .product-total,
.woocommerce-orders-table__cell-order-total { color: #111; font-weight: 500; }
/* Subtotal (số tiền mỗi món): in ĐẬM — desktop + mobile.
   !important vì Astra set .woocommerce-cart table.shop_table .woocommerce-Price-amount{400} specificity cao hơn */
.woocommerce-cart-form .product-subtotal .woocommerce-Price-amount { font-weight: 700 !important; color: #111; }

/* Tiêu đề khối checkout — fallback cho heading nào KHÔNG nằm trong danh sách chuẩn
   của JK-CC (thang --jk-fs-title 22px/600 !important, tự thắng luật này ở mọi heading
   nó gọi tên). `.cart_totals > h2` đã bỏ khỏi danh sách 2026-08-12: JK-CC quản nó rồi. */
.woocommerce-checkout h3, #customer_details h3,
.woocommerce-billing-fields > h3, .woocommerce-additional-fields > h3 { font-weight: 700; color: #111; }

/* Nhãn hàng trong tổng (Subtotal/Shipping/Total) */
.cart_totals th,
.woocommerce-checkout-review-order-table tfoot th { color: #2b2b2b; font-weight: 600; }

/* TỔNG cộng: đậm, nổi bật → tin cậy */
.cart_totals .order-total th,
.cart_totals .order-total .amount,
.woocommerce-checkout-review-order-table .order-total th,
.woocommerce-checkout-review-order-table .order-total .amount {
  font-weight: 700; color: #111;
}

/* (Hai luật nav account cũ đã GỠ 2026-08-12: JK-MYACCOUNT (dưới) thắng cả hai bằng
   specificity (0,3,2) > (0,2,3) nên chúng là mã chết từ 08-09 — kiểu 700 cho mục đang
   chọn chưa bao giờ ăn. Nav giờ sống trọn ở JK-MYACCOUNT.) */

/* Form checkout: nhãn dễ đọc */
.woocommerce-checkout .form-row label,
.woocommerce form .form-row label { color: #555; font-weight: 500; }
/* JK-ACCT-CART-CHECKOUT END */

/* ============================================================
   CART MOBILE — thẻ compact: ảnh nhỏ bên TRÁI, thông tin dồn bên PHẢI
   (thay vì ảnh nhỏ nằm giữa 1 block trống to → thừa chỗ). Chỉ <=768.
   Cách: neo ảnh position:absolute trái, tr padding-left chừa chỗ → các td
   (display:block do Astra) tự xếp cột phải. Đè layout mobile Astra. 2026-07-02
   ============================================================ */
@media (max-width: 768px) {
  /* thẻ món: padding trong 20px (khớp khung Cart totals), chừa 84px ảnh bên trái */
  .woocommerce-cart-form table.cart tr.cart_item {
    position: relative; display: block;
    padding: 14px 20px 14px 118px !important;   /* trái 20 lề + 84 ảnh + 14 gap = 118; phải 20 */
    min-height: 104px;
  }
  .woocommerce-cart-form table.cart tr.cart_item + tr.cart_item {
    border-top: 1px solid var(--ast-border-color, #e2e2e2);   /* đường ngăn giữa món */
  }
  /* BẢO HIỂM: mọi td trong món bỏ padding 1rem + border của Astra (đây là nguồn gây thừa khoảng cách) */
  .woocommerce-cart-form table.cart tr.cart_item td {
    padding: 0 !important; margin: 0 !important; border: 0 !important; text-align: left !important;
  }
  .woocommerce-cart-form table.cart tr.cart_item td::before { padding: 0 !important; }
  /* ảnh: neo trái-trên */
  .woocommerce-cart-form table.cart tr.cart_item td.product-thumbnail {
    position: absolute; left: 20px; top: 18px; width: 84px; display: block;
  }
  .woocommerce-cart-form table.cart tr.cart_item td.product-thumbnail img { width: 84px; height: auto; display: block; }
  /* × xoá: góc trên-phải */
  .woocommerce-cart-form table.cart tr.cart_item td.product-remove {
    position: absolute; top: 14px; right: 20px; width: auto;
  }
  .woocommerce-cart-form table.cart tr.cart_item td.product-thumbnail::before,
  .woocommerce-cart-form table.cart tr.cart_item td.product-remove::before,
  .woocommerce-cart-form table.cart tr.cart_item td.product-name::before { display: none !important; }
  /* tên SP: block, đa dòng */
  .woocommerce-cart-form table.cart tr.cart_item td.product-name {
    display: block; padding: 0 34px 8px 0 !important;
  }
  /* Price / Quantity / Subtotal: hàng ĐỀU nhau + SÁT nhau */
  .woocommerce-cart-form table.cart tr.cart_item td.product-price,
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity,
  .woocommerce-cart-form table.cart tr.cart_item td.product-subtotal {
    display: flex !important; align-items: center; min-height: 31px !important;  /* !important: đè min-height 3.25rem của Astra */
    line-height: 1.2; padding: 2px 34px 2px 0 !important;
  }
  /* nhãn: bỏ float trái Astra; KHÔNG in đậm mobile (desktop giữ nguyên) */
  .woocommerce-cart-form table.cart tr.cart_item td.product-price::before,
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity::before,
  .woocommerce-cart-form table.cart tr.cart_item td.product-subtotal::before {
    float: none !important; display: inline; margin-right: .5em; font-weight: 400; color: #3a3a3a;
  }
  /* ô số lượng: ÉP cả input lẫn nút +/- về cùng 30px (reset padding/min-height của input → khỏi lệch) */
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity { display: inline-flex; align-items: center; margin: 0; }
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity input.qty {
    height: 31px !important; min-height: 0 !important; line-height: 31px !important;
    padding: 0 4px !important; box-sizing: border-box !important;
  }
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity .minus,
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity .plus {
    height: 31px !important; line-height: 29px !important; box-sizing: border-box !important;
  }
  /* 🛑 `flex: 0 0 auto` KHÔNG thừa. Ô `td.product-quantity` là flex (nhãn "Quantity:" +
     viên số lượng), mà mặc định flex cho phép CO phần tử con xuống dưới cả bề ngang đã khai.
     Luật width:40px ở khối máy bàn vì thế chỉ là gợi ý: đo 2026-08-28 trên giỏ có 3 món,
     nút trừ/cộng còn **6×31px ở khổ 344** (màn ngoài máy gập) và **11×31px ở khổ 360**
     (Android nhỏ) — nhỏ tới mức bấm không trúng, ngay trên trang khách sửa đơn.
     Số đo tỉ lệ 1:1 với bề ngang cửa sổ, đúng chữ ký của "phần tử flex đang gánh phần
     thiếu chỗ của cả hàng". Khoá lại thì cả ba khổ đều về 40×31px. */
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity { flex: 0 0 auto; }
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity .minus,
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity .plus,
  .woocommerce-cart-form table.cart tr.cart_item td.product-quantity .quantity input.qty { flex: 0 0 auto; min-width: 34px; }
}

.woocommerce-Price-amount, .price {
  font-feature-settings: "tnum" 1;
  font-variant-numeric: lining-nums tabular-nums;
}
.entry-meta, figcaption, .product-meta { font-size: 16px; letter-spacing: 0.01em; line-height: 1.5; }

/* JK-TYPO START — chuẩn hoá typography. Size h4–h6 do Astra quản; đây chỉ weight/màu. 2026-07-01 */
h4, h5, h6 { font-weight: 600; line-height: 1.3; letter-spacing: -0.01em; color: #111; }

/* Tên sản phẩm ở lưới shop: bỏ ép viết-hoa-đầu-từ, nét rõ thay vì 200 mảnh */
.woocommerce ul.products li.product .woocommerce-loop-product__title,
.woocommerce-loop-product__title {
  text-transform: none;
  font-weight: 500;
  color: #111;
  letter-spacing: -0.01em;
  line-height: 1.45;
}

/* Tiêu đề widget (sidebar: Categories / Search / Tags…): chắc nét, không in hoa */
.widget-title, .widget .widget-title {
  font-weight: 600;
  color: #111;
  text-transform: none;
  letter-spacing: -0.01em;
}

/* Bỏ ép capitalize ở post-meta (tôn trọng chữ gốc) */
.entry-meta, .post-meta, .ast-blog-meta-container { text-transform: none; }
/* JK-TYPO END */

/* ============================================================
   BREADCRUMBS
   ============================================================ */
.ast-breadcrumbs-wrapper { padding-bottom: 20px; margin-bottom: 0; border-bottom: 0; }
.ast-breadcrumbs-wrapper .breadcrumb-trail,
.ast-breadcrumbs-wrapper .trail-items { font-size: 16px; letter-spacing: .01em; }
/* #8c887e cho tỉ lệ tương phản 3,54:1 trên nền trắng — dưới chuẩn AA 4,5:1 cho chữ 16px.
   Về token xám của site (--jk-muted #6A6A6A = 5,41:1). Đo 2026-08-16. */
.ast-breadcrumbs-wrapper .trail-items a { color: var(--jk-muted, #6A6A6A) !important; text-decoration: none; transition: color .15s ease; }
/* Rê tới thì ĐẬM MỰC + GẠCH CHÂN, không nhuộm đỏ — xem quy ước ở JK-HOVER cuối file. */
.ast-breadcrumbs-wrapper .trail-items a:hover {
	color: var(--jk-ink) !important;
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
.ast-breadcrumbs-wrapper .trail-items .trail-end { color: #1c1b18 !important; }
.ast-breadcrumbs-wrapper .trail-items li::after { content: ">" !important; padding: 0 .55em !important; color: #c9c4b8 !important; }

/* ============================================================
   LAYOUT
   ============================================================ */
#primary.content-area.primary { margin: 2em 0; }
.woocommerce div.product div.images { margin-bottom: 0.5em; }
fieldset { border: 0; }


/* ============================================================
   NHÃN THUỘC TÍNH — "Designs : Scorched Sands" ...
   ============================================================ */
.woocommerce div.product .variations th.label,
.woocommerce div.product .variations td.label { text-align: left; vertical-align: middle; }
/* Nhãn và GIÁ TRỊ phải khác bậc. Trước đây cả hai cùng 18px/500 — cùng cỡ, cùng nét,
   cùng màu, nên "DESIGNS" và "Copper Canyon" đọc ra một cục chữ to chứ không ra
   "nhãn : giá trị". Font mono + cỡ chữ đặt ở mục JK-MONO cuối file. */
.woocommerce div.product .variations .label label { color: var(--jk-muted); }
.woocommerce div.product .variations .woo-selected-variation-item-name {
  font-weight: 500; letter-spacing: 0; text-transform: none; color: #1c1b18;
}
.woocommerce div.product .variations th.label { line-height: 1 !important; }
.woocommerce div.product .variations .label label {
	display: inline-block;
	line-height: 1;
	margin-top:4px;   /* nhích chữ chạm mép ảnh; chỉnh -1 đến -4 cho vừa mắt */
}

/* ---- Ô CHỌN THẢ XUỐNG khi sản phẩm KHÔNG có swatch ----
   Plugin swatch chỉ đổi <select> thành các viên chọn cho những thuộc tính đã cấu hình.
   Sản phẩm chưa cấu hình thì rơi về <select> gốc — và cái đó chưa ai đụng tới: chữ 18px
   (mọi thứ quanh nó 13–16), cao 44 (ô số lượng 52, nút mua 50), bo 3px (cả khối còn lại
   bo 12), mũi tên là ảnh SVG 26px của Astra dán ở 98% nên lệch hẳn về mép.
   Đo trên "Dessert Boutique": select 492×44 chữ 18px cạnh nút 190×50 chữ 15px.
   Cân lại cho khớp đúng bộ đang dùng ở khối mua. */
.woocommerce div.product .variations select {
	-webkit-appearance: none;
	appearance: none;
	box-sizing: border-box;
	width: 100%;
	height: 52px;
	padding: 0 42px 0 15px;
	border: 1px solid var(--jk-line);
	border-radius: var(--jk-r-ctl);
	background-color: #fff;
	/* Mũi tên tự vẽ: 12px, neo theo MÉP PHẢI (không phải 98% — 98% của ô rộng 492px
	   đẩy mũi tên ra tận rìa, ô hẹp thì lại thụt vào). */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' stroke='%23111111' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 15px center;
	background-size: 12px 8px;
	font-family: var(--jk-font-mono);
	font-size: 15px;
	font-weight: 400;
	letter-spacing: -.01em;
	line-height: 52px;
	color: var(--jk-ink);
	cursor: pointer;
	transition: border-color .15s ease, box-shadow .15s ease;
}
.woocommerce div.product .variations select:hover { border-color: #C9C9C9; }
.woocommerce div.product .variations select:focus {
	border-color: var(--jk-ink);
	box-shadow: 0 0 0 3px var(--jk-red-ring);
	outline: none;
}
/* Hàng nhãn → ô chọn: bảng .variations của Woo xếp mỗi thuộc tính một hàng <tr>;
   cho ô thở đều thay vì dính vào nhãn phía trên. */
.woocommerce div.product .variations td.value { padding-top: 8px; }
/* Khe GIỮA các hàng chỉ được nằm trên Ô NHÃN — nhãn là thứ mở đầu một hàng mới.
   Bản cũ đè 18px lên CẢ td.value: các ô xếp chồng (display:block) nên ô chọn của hàng
   2-3 bị đẩy xa nhãn của CHÍNH NÓ 27px trong khi hàng đầu chỉ 9px — Hùng bắt được trên
   trang không swatch 2026-08-12 ("2 cái dưới form chọn cách xa tên"), và trang swatch
   cũng dính y hệt (đo Pastry Buffet: td.value hàng 2 cũng pad-top 18). */
.woocommerce div.product .variations tr + tr th.label { padding-top: 18px; }
.woocommerce div.product .variations tr + tr td.value { padding-top: 0; }

/* "Out of stock" đang là ĐỎ TƯƠI #FF0000 mặc định của Woo — màu thứ tư, chói hơn cả
   sắc đỏ thương hiệu #D42027 dùng cho nút mua, nên mắt nhảy vào dòng này trước cả giá.
   Cỡ chữ phải viết đủ dài: WooCommerce có `.woocommerce-js div.product form.cart p.stock`
   (4 class + 3 thẻ) đặt 0.9em; chuỗi ngắn `.woocommerce div.product .summary .stock`
   chỉ 4 class + 1 thẻ nên THUA, dù file mình nạp sau. */
.woocommerce div.product form.cart p.stock,
.woocommerce div.product .summary p.stock {
	font-size: 14px;
	line-height: 1.5;
	color: var(--jk-red);
}
.woocommerce div.product form.cart p.stock.in-stock,
.woocommerce div.product .summary p.stock.in-stock { color: var(--jk-muted); }
/* ============================================================
   CART FORM + SỐ LƯỢNG + ADD TO CART
   ============================================================ */
/* (.reset_variations không còn luật ở đây: functions.php trả chuỗi rỗng cho
   woocommerce_reset_variations_link nên link "Clear" không bao giờ render.) */
/* ⚠️ Cả rổ luật layout của Astra cho form này treo sau class `.woocommerce-js` — class
   đó do JS của Woo gắn, mà JS bị FlyingPress hoãn ~3,5s → CLS 0,47 (bảng swatch 2 cột
   sập về 1 cột). GỐC RỄ đã xử ở functions.php: in sẵn `woocommerce-js` vào body từ
   server (filter body_class, tìm "In sẵn class"). Đừng chép luật Astra bỏ tiền tố vào
   đây nữa — đã thử, vá được display:block thì còn lộ padding:0, rồi float nút, đuổi
   không hết; một dòng body_class phủ tất. Hai luật dưới là override CỦA MÌNH đè Astra
   (line-height 1.8 thay 2em), giữ tiền tố .woocommerce-js như cũ để khớp specificity. */
.woocommerce-js div.product form.cart .variations td.label { margin-top: 0; }
.woocommerce-js div.product form.cart .variations td,
.woocommerce-js div.product form.cart .variations th { line-height: 1.8em; }
/* hàng: số lượng + nút */
/* ⚠️ Luật cũ ở đây gộp `.woocommerce-variation-add-to-cart` và `.quantity` vào MỘT
   chuỗi chọn nối bằng dấu phẩy, với một dòng chú thích chen vào giữa. Sửa "cái ô số
   lượng" mà chỉ thay vế thứ hai thì viền mới dính luôn cả khối bọc ngoài — trên điện
   thoại thành một cái khung to bao cả nút mua. Đã tách hẳn ra hai luật. */
/* Khung viền phải nằm ở VỎ NGOÀI. Trước đây viền do ba ô con (− / số / +) tự vẽ, còn vỏ
   `border:0` — nên đặt `border-radius` lên vỏ chẳng bo được gì (không có nét nào để bo),
   và mép trái còn thừa ra một vạch lửng. Giờ: vỏ vẽ khung + bo góc, ba ô con bỏ hết viền,
   chỉ ô số giữ hai nét dọc làm vách ngăn. */
.woocommerce div.product .quantity {
	display: inline-flex; align-items: stretch;
	border: 1px solid var(--jk-line);
	border-radius: var(--jk-r-ctl);
	overflow: hidden;
	background: #fff;
}
.woocommerce div.product .quantity .minus,
.woocommerce div.product .quantity .plus,
.woocommerce div.product .quantity .qty { border: 0 !important; background: #fff; }
.woocommerce div.product .quantity .qty {
	border-left: 1px solid var(--jk-line) !important;
	border-right: 1px solid var(--jk-line) !important;
}
.woocommerce div.product .quantity .minus,
.woocommerce div.product .quantity .plus,
.woocommerce div.product .quantity .qty { height: 50px !important; box-shadow: none !important; vertical-align: middle; }
.woocommerce div.product .quantity .minus,
.woocommerce div.product .quantity .plus { width: 34px; line-height: 48px !important; color: #56534c; }
.woocommerce div.product .quantity .qty { width: 50px; font-weight: 400; }
/* nút add to cart */
.woocommerce div.product form.cart .button.single_add_to_cart_button {
  /* 52px chứ không 50: ô số lượng bên cạnh cao 50px RUỘT + 1px viền trên/dưới = 52px ngoài,
     và ô chọn biến thể phía trên cũng 52px. Để 50 thì nút thấp hơn ô số lượng đúng 2px —
     đủ để hàng mua nhìn ra "lệch" mà không ai chỉ được tại sao. Khu này là họ 52px; nút
     54px của giỏ/thanh toán là họ khác, đừng gộp. */
  min-height: 52px; height: auto;
  width: auto !important;       /* bỏ ép 33% của Astra → nút vừa đủ chữ */
  min-width: 190px;             /* đủ chứa "Add to cart" + dấu ✓ trên 1 dòng */
  padding: 0 28px !important;
  /* 18px/400 là cỡ chữ NỘI DUNG — nút cuối cùng của một đơn hàng không nên trông như
     một câu văn. Cỡ + font mono đặt ở mục JK-MONO. */
  font-weight: 600 !important;
  white-space: nowrap;          /* KHÔNG xuống hàng */
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  /* Đỏ hệ thống, không phải đỏ Astra. 2026-08-09: đo trên prod thấy nút này là #CE1A1A
     (mặc định Astra) trong khi nút Log in, nút "Proceed to checkout" và nút đặt hàng đều
     #D42027 — hai sắc đỏ cho cùng một họ hành động, và cái lệch lại là nút bán hàng.
     Ba nút kia sửa từ đợt trước, riêng nút này chỉ được sửa kích thước nên màu còn sót. */
  background: var(--jk-red) !important;
  color: #fff !important;
}
/* 🛑 Phải loại trừ hai trạng thái xám, nếu không hover THẮNG chúng và nút "chưa chọn
   biến thể" hoá đỏ ngay khi rê chuột: chuỗi hover là (0,6,2), chuỗi `.disabled` bên dưới
   chỉ (0,5,2) — cùng có !important nên hơn nhau đúng một bậc class. */
.woocommerce div.product form.cart
  .button.single_add_to_cart_button:not(.disabled):not(.wc-variation-selection-needed):hover {
  background: var(--jk-red-dark) !important;
}
@media (max-width: 480px) {
  .woocommerce div.product .quantity .minus,
  .woocommerce div.product .quantity .plus { width: 38px; }
  .woocommerce div.product .quantity .qty { width: 46px; }
  .woocommerce div.product form.cart .button.single_add_to_cart_button { flex: 1 1 auto; padding: 0 18px !important; }
}
/* Link "View cart" (Astra Pro single-product AJAX add-to-cart chèn sau nút):
   flex-wrap hàng qty+nút. Desktop: View cart INLINE cạnh nút, canh giữa dọc.
   Mobile (<=768): xuống RIÊNG 1 dòng canh giữa. Không set column-gap → giữ spacing Astra. */
.woocommerce div.product .woocommerce-variation-add-to-cart,
.woocommerce div.product form.cart:not(.variations_form) {
  display: flex; flex-wrap: wrap; align-items: center; row-gap: 12px;
}
.woocommerce div.product .added_to_cart.wc-forward {
  order: 99; align-self: center;   /* nằm cuối hàng, khớp giữa dọc với nút */
  margin: 0 0 0 16px; padding: 0;
  font-size: 17px; font-weight: 400;
  text-decoration: underline; text-underline-offset: 3px;
  white-space: nowrap;
}
@media (max-width: 768px) {
  .woocommerce div.product .added_to_cart.wc-forward {
    flex: 1 0 100%; margin: 0; text-align: center; white-space: normal;
  }
  /* Ô số lượng và nút mua CÙNG MỘT HÀNG trên điện thoại — trước đây nút bị đẩy xuống
     dòng riêng, ăn thêm ~62px chiều cao ở đúng chỗ màn hình hẹp nhất.
     Thủ phạm là `min-width:190px` của nút: 130px (ô số lượng) + 190px + khe > 335px
     bề ngang khả dụng, nên hàng flex bọc xuống. Bỏ min-width, cho nút co giãn.
     Vẫn giữ `flex-wrap: wrap` để link "View cart" xuống dòng riêng như cũ. */
  .woocommerce div.product .woocommerce-variation-add-to-cart,
  .woocommerce div.product form.cart:not(.variations_form) { column-gap: 10px; }
  .woocommerce div.product .quantity { flex: 0 0 auto; margin-right: 0 !important; }
  .woocommerce div.product form.cart .button.single_add_to_cart_button {
    flex: 1 1 auto; min-width: 0 !important; padding: 0 14px !important;
  }
}

/* ============================================================
   VARIATIONS TABLE
   ============================================================ */
.variations, .variations tr, .variations td { border: none !important; }
.ast-variation-button-group .ast-single-variation { padding: 0 0.5em; margin-bottom: 0.5em; margin-right: 0.3em; }
.ast-variation-button-group .ast-single-variation.active { border: 3px solid var(--ast-global-color-0); }

/* ============================================================
   PRODUCT TABS — ẩn cả thanh tab (chỉ còn 1 tab Description, panel vẫn hiện)
   ============================================================
   2026-08-12: trước đây ẩn bằng `font-size: 0` trên <a> + margin âm bù chỗ + tắt
   ::before/::after — ba luật cho một việc, và font-size:0 là đúng anti-pattern đã
   gây tai nạn với mô tả ngắn (một khối font-size nạp sau là chữ tab hiện lại).
   Link rỗng cũng vẫn nhận focus bàn phím — mục tiêu bấm vô hình. `display:none`
   trên cả <ul>: không luật font-size nào đè được, không còn gì để focus. */
.woocommerce div.product .woocommerce-tabs ul.tabs { display: none; }
.woocommerce-js div.product .woocommerce-tabs { padding-top: 0; }

/* ============================================================
   HIDE ELEMENTS
   ============================================================ */
.woocommerce ul.products li.product .ast-shop-product-out-of-stock,
.woocommerce-page ul.products li.product .ast-shop-product-out-of-stock { display: none; }
/* Mô tả ngắn: ẩn hẳn. Từng viết `font-size: 0` ở đây, nhưng khối JK-TYPO3 cuối file đặt lại
   cỡ chữ cho đúng selector này, cùng độ mạnh (0,3,1) và nằm SAU → chữ hiện lại. `display:none`
   khác thuộc tính nên không còn ai đè được, và cũng thu luôn khoảng trắng thừa. */
.single-product div.product .woocommerce-product-details__short-description { display: none; }

/* ============================================================
   WIDGETS / MISC
   ============================================================ */
.paypal-button.paypal-button-shape-rect { border-radius: 0; }
/* (Luật tag cloud 16px !important từng ở đây đã xoá 2026-08-12 — di tích 2026-06,
   bị tầng 15px của mục đám-mây-thẻ và tầng 13px của JK-MONO đè từ lâu.) */

.ast-single-post .entry-header.ast-header-without-markup,
.ast-single-post .entry-header.ast-no-title.ast-no-thumbnail { padding-bottom: 20px; }
/* Cây danh mục cấp 2: trước đây tự vẽ dấu "•" bằng ::before kèm !important. Đã bỏ
   2026-08-08 — cấp 2 giờ gom bằng MỘT nét dọc bên trái (xem mục 7 phần JK-SHOP), nét
   thì đọc ra "nhóm này thuộc mục trên", còn chấm chỉ là chấm.
   ⚠️ Đừng thêm lại: `!important` ở đây đã nuốt mất luật mới, mất một vòng render mới
   tìm ra thủ phạm nằm ngay trong file này chứ không phải Astra. */
.widget .wc-block-product-categories-list--depth-1 .wc-block-product-categories-list-item {
  list-style-type: none; display: list-item; position: relative;
}



/* Nút hiện mật khẩu (cục đỏ) — bỏ nền, đưa vào trong ô password */
.woocommerce-form .password-input { position: relative; }
.woocommerce-form .show-password-input {
  position: absolute !important;
  top: 50% !important; right: 14px !important; transform: translateY(-50%) !important;
  width: 24px !important; height: 24px !important; min-height: 0 !important;
  margin: 0 !important; padding: 0 !important;
  background: transparent !important; border: 0 !important; box-shadow: none !important;
}

/* Hàng checkbox newsletter — tắt hiệu ứng animate, checkbox nhỏ + cùng dòng */
.mailchimp-newsletter.ast-animate-input::before,
.mailchimp-newsletter.ast-animate-input::after { content: none !important; }
.mailchimp-newsletter {
  min-height: 0 !important; padding: 0 !important; margin: 10px 0 4px !important;
}
.mailchimp-newsletter label.inline {
  display: flex !important; align-items: center; gap: 8px;
  margin: 0; font-size: 16px !important; font-weight: 600 !important;
}
/* Checkbox itself: let native page styling handle it (register → .woocommerce-account
   square+checkmark; checkout → .woocommerce-checkout 16px). Do NOT override here — a
   forced position:static previously broke the ::before checkmark (solid dark box). */

/* === Nút lên đầu trang: canh TÂM khớp bong bóng Crisp (Crisp mặc định margin
   20px, bubble 60px → tâm cách mép 50px). Tâm nút = right + width/2 phải = 50px.
   Nếu Crisp dashboard chỉnh offset khác → nudge `right` ở đây cho khớp. === */
#ast-scroll-top.ast-scroll-to-top-right {
  right: 20px !important;         /* 20 + 60/2 = 50px = tâm Crisp desktop */
  width: 60px !important;
  min-width: 60px !important;
  text-align: center !important;
  bottom: 92px !important;        /* ngay trên bubble (bubble cao tới ~80px) */
  margin: 0 !important;
  z-index: 99999;
}
@media (max-width: 768px) {
  #ast-scroll-top.ast-scroll-to-top-right {
    right: 12px !important;       /* 12 + 56/2 = 40px ≈ tâm Crisp mobile */
    width: 56px !important;
    min-width: 56px !important;
    text-align: center !important;
    bottom: 84px !important;
  }
}

/* JK-CHECKOUT-FIX START */
/* Chuẩn hoá giao diện checkout (Astra Modern Checkout). Quản lý bởi JK. */

/* 1) Đồng bộ MỌI heading section: cùng size/đậm/màu/khoảng cách.
   2026-08-12: giá trị đổi 20px/700 → thang chuẩn --jk-fs-title/600 của JK-CC.
   Trước đó trang thanh toán TRỘN hai chuẩn: heading nào JK-CC gọi tên (Customer
   information, Your order…) ra 22px/600, còn Billing details + Additional ra
   20px/700 từ luật này — hai khối !important chọi nhau, thắng thua theo thứ tự
   dòng. Giờ một thang duy nhất; margin/padding vẫn do luật này quản. */
.woocommerce-checkout .ast-checkout-form-heading h3,
.woocommerce-checkout .woocommerce-billing-fields > h3,
.woocommerce-checkout .woocommerce-additional-fields > h3,
.woocommerce-checkout #ast-payment_options_heading,
.woocommerce-checkout #order_review_heading {
	font-size: var(--jk-fs-title) !important;
	font-weight: var(--jk-fw-title, 650) !important;
	line-height: 1.25 !important;
	color: var(--jk-ink) !important;
	margin: 0 0 16px !important;
	padding: 0;
	text-transform: none;
	letter-spacing: -.015em;
}

/* 2) Hàng "Customer information" + "Already have an account? Log in" — cùng dòng, canh giữa */
.woocommerce-checkout .ast-checkout-form-heading {
	display: flex !important;
	align-items: center !important;
	justify-content: space-between !important;
	flex-wrap: wrap;
	gap: 6px 18px;
	margin: 0 0 18px !important;
}
.woocommerce-checkout .ast-checkout-form-heading h3 {
	margin: 0 !important;
}
.woocommerce-checkout .woocommerce-billing-fields__customer-login-label {
	position: static !important;
	float: none !important;
	top: auto !important;
	right: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	font-size: 16px !important;
	font-weight: 400 !important;
	line-height: 1.4 !important;
	color: #444 !important;
	white-space: nowrap;
}

/* 3) Hai dòng checkbox (Ship to a different address? + Subscribe newsletter) GIỐNG HỆT nhau */
.woocommerce-checkout h3#ship-to-different-address {
	margin: 12px 0 14px !important;
	padding: 0 !important;
	border: 0 !important;
}
.woocommerce-checkout h3#ship-to-different-address,
.woocommerce-checkout h3#ship-to-different-address label,
.woocommerce-checkout h3#ship-to-different-address span,
.woocommerce-checkout p.mailchimp-newsletter,
.woocommerce-checkout p.mailchimp-newsletter label,
.woocommerce-checkout p.mailchimp-newsletter span,
.woocommerce-checkout .woocommerce-form__label-for-checkbox,
.woocommerce-checkout .woocommerce-form__label-for-checkbox span {
	font-size: 16px !important;
	font-weight: 600 !important;
	line-height: 1.5 !important;
	color: #1a1a1a !important;
	text-transform: none !important;
	letter-spacing: 0 !important;
}
.woocommerce-checkout h3#ship-to-different-address label,
.woocommerce-checkout p.mailchimp-newsletter label,
.woocommerce-checkout .woocommerce-form__label-for-checkbox {
	display: flex !important;
	align-items: center !important;
	gap: 8px !important;
	margin: 0 !important;
	cursor: pointer;
}
.woocommerce-checkout p.mailchimp-newsletter {
	margin: 6px 0 8px !important;
}
/* Dòng "Welcome Back <tên>" đầu form: bậc nội dung 17, không phải 18 (đo 2026-08-13) */
.woocommerce-checkout .ast-logged-in-customer-info { font-size: var(--jk-fs-body); }
/* (Luật nút tick 16px từng ở đây đã xoá 2026-08-12 — JK-CC vẽ lại checkbox 22px
   bằng appearance:none + ::after ở mục CHECKBOX phía dưới, đè toàn bộ luật này
   từ lâu; kích thước/tick/màu đều do đó quản.) */

/* 4) Nút bấm đồng bộ — bỏ thụt ra/vô */
.woocommerce-checkout #place_order,
.woocommerce-checkout .ast-customer-login-section__login-button,
.woocommerce-checkout .woocommerce-form-coupon .button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin: 0;
	vertical-align: middle;
}
.woocommerce-checkout #place_order {
	width: 100%;
}

/* 5) Ẩn nút "Show password" của Woo: nó dính style nút đỏ của theme (background +
   padding) và mất style gốc (icon con mắt) → hiện thành hộp đỏ rỗng trên nút Login.
   Ẩn hẳn ở mọi form Woo (checkout + my-account + reset password). */
.woocommerce .show-password-input,
.woocommerce-page .show-password-input,
button.show-password-input {
	display: none !important;
}
/* JK-CHECKOUT-FIX END */


/* JK-LOGIN-PAGE START */
/* Tinh chỉnh riêng trang My Account khi CHƯA đăng nhập (form login hiện).
   Scope bằng :has(.woocommerce-form-login) → KHÔNG ảnh hưởng dashboard đã đăng
   nhập hay các trang khác (checkout có form login nhưng body .woocommerce-checkout).

   2026-08-08: phần "khung + ô nhập + nút + link" của ba trang này đã chuyển hẳn
   xuống mục JK-ACCOUNT ở cuối file (dùng chung bộ biến --jk-*). Ở đây chỉ còn
   những thứ KHÔNG liên quan tới hình khối. */

/* 1) Canh giữa tiêu đề trang "My Jelly Key account" — chỉ ở trang login */
.woocommerce-account:has(.woocommerce-form-login) .entry-title {
	text-align: center;
}

/* 2) Ẩn chữ "Required" trong label (giữ dấu *). "Required" nằm trong
   span.screen-reader-text (lẽ ra ẩn cho screen-reader) đang lộ ra. Đưa về
   ẩn-thị-giác đúng chuẩn WP: mất chữ nhưng vẫn đọc được bằng trợ năng. */
.woocommerce-account .woocommerce-form-row .screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	white-space: nowrap;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
}

/* 3) Ô nhập chiếm trọn bề ngang khung (đừng co cụm) */
.woocommerce-account:has(.woocommerce-form-login) .col2-set input:not([type="checkbox"]),
.woocommerce-lost-password .woocommerce-ResetPassword input:not([type="checkbox"]):not([type="submit"]) {
	width: 100%;
	box-sizing: border-box;
}

/* 4) Trang lost-password: căn giữa tiêu đề cho khớp trang login */
.woocommerce-lost-password .entry-title {
	text-align: center;
}
/* JK-LOGIN-PAGE END */


/* JK-ACCOUNT-DETAILS START */
/* Trang Account details (đã đăng nhập). Radio newsletter của Mailchimp
   (Subscribe / Unsubscribe / Receive Order Updates) bị Astra áp kiểu floating-label
   (radio có value → JS thêm animate class) → chữ nhỏ xíu, nhấc lên, dính sát radio.
   Cân lại: label thường, canh giữa theo chiều dọc, có khoảng cách radio↔chữ. */
.woocommerce-account .woocommerce-form-row:has(> label[for^="mailchimp_woocommerce_is_"]) {
	margin: 4px 0 !important;
	padding: 0 !important;
}
.woocommerce-account label[for^="mailchimp_woocommerce_is_"] {
	display: flex !important;
	align-items: center !important;
	gap: 9px !important;
	position: static !important;
	transform: none !important;
	margin: 0 !important;
	padding: 0 !important;
	font-size: 16px !important;
	font-weight: 400 !important;
	line-height: 1.5 !important;
	color: #1a1a1a !important;
	text-transform: none !important;
	letter-spacing: 0 !important;
	cursor: pointer;
}
.woocommerce-account input[name="mailchimp_woocommerce_is_subscribed_radio"] {
	width: 16px !important;
	height: 16px !important;
	min-width: 16px;
	margin: 0 !important;
	flex: 0 0 auto;
	accent-color: #1a1a1a;
	vertical-align: middle;
}
/* JK-ACCOUNT-DETAILS END */


/* (JK-ACCOUNT-DASH đã GỠ 2026-06-30: Astra Modern Account view tự lo style nav; lỗi
   trước là do Astra để File Generation = ghi CSS ra file cache cũ thiếu rule modern,
   ĐÃ tắt File Generation → CSS inline tươi mỗi request. Không phải child theme.) */


/* JK-FOOTER START */
/* Chân trang. Bo góc + thang chữ lấy từ bộ biến `JK-CC` ở cuối file (biến CSS không
   phụ thuộc thứ tự khai báo, dùng trước khai sau vẫn ăn).
   ⚠️ Chú thích cũ ghi "sharp corners" đã lỗi thời — Hùng chốt bo tròn 2026-08-08. */
/* Ẩn footer rỗng của Astra (builder footer_markup vẫn render <footer.site-footer> rỗng
   tạo line + khoảng trống) — footer thật là .jk-foot bên dưới. */
.site-footer#colophon { display: none !important; }
.jk-foot {
	/* NỀN TRẮNG. Đã dò cả một vòng với Hùng và chốt phương án B:
	     - mảng xám #FAFAFA / #F4F4F4 trải hết bề ngang → nặng, "lấn cấn";
	     - bóng hắt lên: .55 gai mắt, .22 mất hút, .38 vẫn chưa ưng.
	   Cái tách chân trang khỏi nội dung là MỘT ĐƯỜNG KẺ ngắn (xem ::before bên dưới),
	   không phải một mảng màu. Đừng đưa nền xám quay lại nếu chưa hỏi. */
	background: #fff;
	color: #5A5A5A;
	font-size: 16px;
	line-height: 1.6;
	margin-top: 56px;
}
/* Đường kẻ chỉ dài bằng NỘI DUNG (1200px), không chạy hết bề ngang màn hình — Hùng chốt
   vậy. Làm bằng ::before chứ không border-top vì border thì không gắn bóng riêng được,
   mà kẻ trơn một nét thì cụt lủn; bóng mềm ngay dưới nét cho nó có chiều sâu. */
.jk-foot__inner { position: relative; max-width: 1240px; margin: 0 auto; padding: 44px 20px 24px; }
.jk-foot__inner::before {
	content: ""; position: absolute; top: 0; left: 20px; right: 20px; height: 1px;
	background: #E4E4E4;
	box-shadow: 0 3px 8px -1px rgba(17, 17, 17, .11);
}
#sub { scroll-margin-top: 90px; }

/* BỐ CỤC: một hàng, bốn khối, bề ngang do NỘI DUNG quyết, khe hở chia đều.
   Bản trước là lưới `1.7fr 1fr 1fr 1.4fr` — nghe thì có hệ thống, nhìn thì không: ô lưới
   rộng 212px trong khi chữ dài nhất 121px, nên ba khe hở ba cỡ khác nhau. Đã thử tách
   khối đăng ký tin ra thành một dải riêng phía trên: hết lệch, nhưng chân trang cao thêm
   ~90px mà giữa hàng lại rỗng một mảng 530px — Hùng gạt vì phí diện tích. */
.jk-foot__top {
	display: flex; align-items: flex-start; justify-content: space-between;
	flex-wrap: wrap; gap: 32px 40px;
	padding-bottom: 36px;
}
.jk-foot__brand { flex: 1 1 300px; max-width: 340px; }
.jk-foot__col { flex: 0 0 auto; min-width: 0; }
/* Thẻ trắng: khối này nhìn thì giống cột thứ tư nhưng ruột là đoạn văn + ô nhập, không
   phải danh sách link. Cho nó một cái thẻ để mắt biết đây là việc khác, không phải cột lệch. */
/* 2026-08-12 (đợt tile, chốt lần 3 TRONG NGÀY): cột Newsletter PHẲNG — không hộp,
   cùng bố cục với hai cột link. Lịch sử một ngày: h3 trong hộp (tụt 20px so với "Studio")
   → h3 ra ngoài hộp, hộp tile bọc nội dung → Hùng: "bỏ khung newsletter luôn đi, chữ
   Be the first to... bằng size menu Studio kế bên, vậy cho gọn". Đừng dựng lại hộp. */
.jk-foot__news { flex: 0 0 320px; max-width: 100%; }
/* Brand */
.jk-foot__logo { display: inline-block; line-height: 0; }
/* 2026-08-10: chân trang nay đeo DẤU TRÒN (vuông 150x150), không còn chữ ký ngang.
   `width:auto` giữ nguyên tỉ lệ nên ảnh vuông ra đúng 52x52; `max-width` giữ lại làm
   chốt chặn phòng khi ai đó đổi lại sang file ngang. */
.jk-foot__logo .jk-foot__logoimg { height: 52px !important; width: auto !important; max-width: 175px !important; }
.jk-foot__tag { margin: 16px 0 20px; max-width: 340px; color: #6A6A6A; font-size: 16px; }
.jk-foot__social { display: flex; gap: 10px; }
/* Chip trắng viền mảnh thay vì 5 khối đen đặc: trên nền xám, 5 chấm đen là thứ NẶNG
   nhất chân trang trong khi nó là thứ ít quan trọng nhất — lấn hết cột liên kết. */
.jk-foot__social a {
	display: inline-flex; align-items: center; justify-content: center;
	width: 40px; height: 40px; border-radius: 50%;
	background: #fff; color: var(--jk-ink); border: 1px solid var(--jk-line);
	transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.jk-foot__social a svg { width: 21px; height: 21px; }
/* Cân quang học từng icon — CÂN BẰNG MỰC, KHÔNG CÂN BẰNG KHUNG (sửa 2026-08-12, Hùng:
   "mấy cái icon social chưa đều"). Bản cũ chỉnh cỡ KHUNG svg theo mắt, nhưng mỗi glyph
   chiếm một tỉ lệ khác trong khung 24×24 (đo getBBox: TikTok choán 100% chiều cao khung,
   YouTube chỉ 38%) nên mực thật ra 19px đứng cạnh 8,4px. Số dưới đây tính ngược từ tỉ lệ
   mực đo được để CHIỀU CAO MỰC ≈ 15px đồng loạt; hai ngoại lệ có lý do: YouTube là khối
   đặc bẹt ngang (mực ~9,5×19 — thấp nhưng đặc nên nặng tương đương), Reddit nét mảnh
   nhiều chi tiết nên nhích thêm 1 nấc (mực ~15,4). Đổi icon thì đo lại getBBox, đừng ước. */
.jk-foot__social a[aria-label="Facebook"] svg { width: 28px; height: 28px; }
/* Instagram (thêm 15/08): glyph choán gần trọn khung 24 như TikTok, nên cùng cỡ khung.
   Đo getBBox trên bản test: mực 15,0px — khớp cả hàng. */
.jk-foot__social a[aria-label="Instagram"] svg { width: 15px; height: 15px; }
.jk-foot__social a[aria-label="X"] svg        { width: 17px; height: 17px; }
.jk-foot__social a[aria-label="YouTube"] svg  { width: 25px; height: 25px; }
.jk-foot__social a[aria-label="TikTok"] svg   { width: 15px; height: 15px; }
.jk-foot__social a[aria-label="Reddit"] svg   { width: 24px; height: 24px; }
/* Hover về mực chứ không đỏ: đỏ chỉ dành cho hành động chính và lỗi (bộ quy tắc mục 1) */
.jk-foot__social a:hover { background: var(--jk-ink); color: #fff; border-color: var(--jk-ink); }
/* Columns */
/* margin-top = 0: 6px cũ đẩy nhãn cột xuống thấp hơn đỉnh logo đúng 6px — đo ra thì
   thấy, nhìn thì chỉ thấy "sao nó lấn cấn". Hàng flex đã align-items:flex-start rồi.
   ⚠️ CỠ CHỮ của nhãn cột KHÔNG khai ở đây — nó là 18px ở mục JK-CASE cuối file, kèm
   lý do (15px từng bé hơn mục con ngay dưới nó). Đừng thêm lại font-size vào đây. */
.jk-foot__h {
	font-weight: 700; color: var(--jk-ink);
	margin: 0 0 16px; letter-spacing: 0;   /* JK-CASE 2026-08-09: bỏ IN HOA, xem cuối file */
}
.jk-foot__col ul { list-style: none; margin: 0; padding: 0; }
.jk-foot__col li { margin: 0 0 11px; }
/* Gạch chân trong suốt sẵn → khi rê chuột chỉ đổi màu gạch, chữ không nhảy. 2026-08-08 */
.jk-foot__col a {
	color: #6A6A6A;
	font-size: 16px;
	text-decoration: underline;
	text-decoration-color: transparent;
	text-decoration-thickness: 1px;
	text-underline-offset: 4px;
	transition: color .15s ease, text-decoration-color .15s ease;
}
.jk-foot__col a:hover { color: #111; text-decoration-color: #111; }
/* Newsletter */
.jk-foot__newstxt { margin: 0 0 14px; color: #6A6A6A; font-size: 16px; } /* 16px = đúng cỡ link cột Studio kế bên (Hùng 2026-08-12) */
/* Ô nhập + nút gộp thành MỘT khối bo tròn: viền nằm ở vỏ ngoài, hai con bên trong
   không có viền riêng. Trước đây là hai hình chữ nhật vuông dán cạnh nhau, viền
   chồng viền. Vòng focus đặt ở vỏ (giống ô nhập trang thanh toán) chứ không ở <input>. */
.jk-news {
	display: flex; gap: 0; width: 100%; /* bề ngang do .jk-foot__ctaform quyết */
	background: #fff; border: 1px solid var(--jk-line);
	border-radius: var(--jk-r-ctl); overflow: hidden;
	transition: border-color .15s ease, box-shadow .15s ease;
}
.jk-news:focus-within { border-color: var(--jk-ink); box-shadow: 0 0 0 3px var(--jk-red-ring); }
.jk-news input[type="email"] {
	flex: 1 1 auto; min-width: 0;
	height: 52px; padding: 0 16px;
	border: 0; border-radius: 0;
	font: inherit; font-size: 16px; color: #111; background: transparent;
}
.jk-news input::placeholder { color: #A8A8A8; }
/* Vòng focus đã ở vỏ ngoài; để nguyên thì thành hai vòng lồng nhau.
   !important vì luật focus-visible chung ở JK-POLISH có !important. */
.jk-news input:focus,
.jk-news input:focus-visible { outline: 0 !important; }
.jk-news button {
	flex: 0 0 auto; height: 52px; padding: 0 20px;
	background: #111; color: #fff; border: 0; border-radius: 0;
	font: inherit; font-weight: 600; font-size: 15px; cursor: pointer;
	transition: background .15s ease;
}
.jk-news button:hover { background: #2E2E2E; }
.jk-news button:disabled { opacity: .6; cursor: default; }
.jk-news__msg { margin: 10px 0 0; font-size: 15px; color: #6A6A6A; }
/* Dòng trạng thái RỖNG không được chiếm chỗ: min-height 1em cũ cộng margin thành ~25px
   không khí dưới đáy hộp — chính nó góp phần cảm giác "padding trên dưới không bằng nhau". */
.jk-news__msg:empty { display: none; }
/* Bottom bar */
.jk-foot__bottom {
	display: flex; align-items: center; justify-content: space-between;
	flex-wrap: wrap; gap: 12px 24px;
	padding-top: 22px; border-top: 1px solid var(--jk-line);
}
.jk-foot__copy { margin: 0; } /* màu + cỡ ở luật 5.4:1 phía dưới (nạp sau, nó quyết) */
.jk-foot__legal { display: flex; gap: 22px; }
/* Bong bóng chat Crisp (fixed, góc phải dưới, ~64px + 20px lề) đè lên link cuối
   của hàng legal khi mép phải nội dung cách mép màn <84px — tức mọi màn ≤~1368px
   (đã thấy trên prod 2026-08-12: chữ "Shipping" nằm dưới bong bóng). Chừa sẵn chỗ.
   <768px: hàng legal wrap + canh trái, bong bóng không chạm nên không cần. */
@media (min-width: 768px) and (max-width: 1368px) {
	.jk-foot__legal { padding-right: 88px; }
}
.jk-foot__legal a {
	color: #6A6A6A;
	font-size: 14px; /* cùng cỡ với dòng bản quyền — đây là hàng chân, không phải nội dung */
	text-decoration: underline;
	text-decoration-color: transparent;
	text-decoration-thickness: 1px;
	text-underline-offset: 4px;
	transition: color .15s ease, text-decoration-color .15s ease;
}
.jk-foot__legal a:hover { color: #111; text-decoration-color: #111; }
/* Mobile ≤768px */
@media (max-width: 768px) {
	.jk-foot { margin-top: 40px; }
	.jk-foot__inner { padding: 34px 20px 22px; }
	/* Ở màn hẹp: thương hiệu và thẻ đăng ký chiếm trọn bề ngang, hai cột link chia đôi
	   — mép trái của chúng thẳng hàng thay vì để nội dung tự quyết bề ngang. */
	.jk-foot__top { display: grid; grid-template-columns: 1fr 1fr; gap: 28px 20px; padding-bottom: 28px; }
	.jk-foot__brand { grid-column: 1 / -1; max-width: none; }
	.jk-foot__news { grid-column: 1 / -1; flex-basis: auto; margin-top: 0; }
	.jk-foot__tag { font-size: 15px; max-width: none; }
	.jk-foot__col a { font-size: 15px; }
	.jk-foot__newstxt { max-width: none; }
	.jk-foot__bottom { flex-direction: column; align-items: flex-start; gap: 10px; }
	.jk-foot__legal { gap: 18px; flex-wrap: wrap; }
}
/* JK-FOOTER END */

/* JK-HEADER START — custom header (bám mockup), thay Astra builder. */
.site-header, #masthead, #ast-fixed-header, #ast-mobile-header{ display:none !important; }
.main-header-bar-wrap, .ast-main-header-wrap, .main-header-bar{ margin:0 !important; padding:0 !important; border:0 !important; background:transparent !important; min-height:0 !important; box-shadow:none !important; }

.jk-head{ position:sticky; top:0; z-index:99; background:#fff; font-family:var(--jk-font-sans); }
/* Khi cuộn: nền trắng mờ + làm nhoè cái chạy phía sau, thay vì một tấm trắng đặc.
   Ảnh sản phẩm lướt qua dưới thanh menu vẫn thấy thấp thoáng → thanh menu trông
   như đang nổi trên trang chứ không phải một khối chắn ngang. */
.jk-head.jk-stuck{
  /* .86 chứ không .82: hero trang chủ là ảnh rất rực, ở .82 mấy cái đầu linh vật
     hiện rõ sau chữ menu — vẫn đọc được nhưng rối. Đã render đè lên hero để chọn. */
  background:rgba(255,255,255,.86);
  -webkit-backdrop-filter:saturate(1.5) blur(16px);
  backdrop-filter:saturate(1.5) blur(16px);
  border-bottom:1px solid var(--jk-line);
  box-shadow:0 8px 26px -20px rgba(17,17,17,.55);
}
/* Trình duyệt không có backdrop-filter thì phải trắng đặc, không thì chữ chồng ảnh */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .jk-head.jk-stuck{ background:#fff; }
}
.jk-head__bar{ display:grid; grid-template-columns:1fr auto 1fr; align-items:center; gap:20px; max-width:1240px; margin:0 auto; padding:6px 20px; min-height:68px; }
.jk-head__logo{ display:inline-flex; align-items:center; justify-self:start; }
/* 2026-08-10: header đeo CHỮ KÝ (dấu tròn + chữ "jellykey"), không còn dấu tròn trần.
   Khoá bằng `height` + `width:auto` chứ không đặt cả hai số cứng: file 300x115, ép cả
   hai chiều là bóp méo chữ ký.
   2026-08-11: Hùng thấy nhỏ quá, phóng 20% (44→53, mobile 38→46). Thanh desktop cao 75px vì
   thanh nav (63px) chứ không phải logo, nên 53px vẫn còn 11px thở trên dưới. `max-width` phải
   nới theo cùng tỉ lệ: file 300x115, cao 53px là rộng 138px — để nguyên 130px thì nó kẹp
   chiều rộng trong khi chiều cao đã khoá, tức là bóp méo chữ ký một cách lặng lẽ. */
.jk-head__logo img{ height:53px; width:auto; max-width:156px; display:block; border-radius:0; }
@media (max-width:768px){
  /* Thanh mobile chỉ 62px và còn ba nút bên phải — hạ một nấc cho khỏi chật. */
  .jk-head__logo img{ height:46px; }
}

/* nav giữa */
.jk-head__nav{ justify-self:center; }
.jk-menu{ list-style:none; margin:0; padding:0; display:flex; align-items:center; gap:30px; }
.jk-menu > li{ position:relative; }
.jk-menu a{ font-size:17px; font-weight:500; color:#111; text-decoration:none; line-height:1; }
.jk-menu > li > a{ display:inline-flex; align-items:center; gap:6px; padding:23px 0; }
.jk-menu > li:hover > a, .jk-menu > li.current-menu-item > a, .jk-menu > li.current-menu-ancestor > a{ color:#000; }
/* 2026-08-12: bỏ mask, vẽ thẳng SVG làm background. Máy nào không dựng được mask
   (WebView cũ, extension can thiệp) thì mask + background-màu ra Ô VUÔNG XÁM ĐẶC
   thay cho mũi tên — background-image không có đường hỏng đó, nhìn thì y hệt. */
.jk-menu .menu-item-has-children > a::after{ content:""; width:12px; height:12px; display:inline-block; background:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%239A9A9A'%20stroke-width='2.4'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpolyline%20points='6%209%2012%2015%2018%209'/%3E%3C/svg%3E") center/contain no-repeat; }

/* dropdown — thẻ bo tròn, mỗi dòng là một ô bấm bo góc riêng.
   Bản cũ: hộp vuông, viền cứng, VÀ một vạch kẻ dưới từng dòng → đọc ra cái bảng
   biểu chứ không phải menu. Bỏ hết vạch, để khoảng cách và ô nền hover làm việc đó. */
/* left:-22px = 8px đệm của thẻ + 14px đệm của dòng → chữ trong menu con thẳng hàng
   với chữ của mục cha bên trên, không bị thụt vào. */
/* 2026-08-12 (đợt tile): panel NỔI = trắng + viền --jk-tile-line + bóng token --jk-shadow
   (bóng cũ 18px/40px alpha .3 là thứ Hùng gọi "đổ bóng rộng quá"; nổi trên nội dung nên
   không bỏ hẳn bóng như tile trong trang, chỉ thu về mức thì thầm của token). */
.jk-menu .sub-menu{ list-style:none; margin:0; padding:8px; position:absolute; top:100%; left:-22px; min-width:248px; width:max-content; background:#fff; border:1px solid var(--jk-tile-line); border-radius:var(--jk-r-panel); box-shadow:var(--jk-shadow); opacity:0; visibility:hidden; transform:translateY(6px); transition:opacity .15s, transform .15s; z-index:50; }
.jk-menu > li:hover > .sub-menu,
/* .jk-open: dành cho màn CHẠM rộng ≥922px (máy gập mở ra) — ở đó không có hover,
   nên JS trong header gắn class này khi khách chạm lần đầu. Xem functions.php. */
.jk-menu > li.jk-open > .sub-menu{ opacity:1; visibility:visible; transform:none; }
.jk-menu .sub-menu li:not(:last-child){ border-bottom:0; }
.jk-menu .sub-menu a{ display:block; padding:11px 14px; border-radius:var(--jk-r-ctl); font-size:16px; font-weight:400; color:#111; white-space:nowrap; transition:background .12s ease; } /* 2026-08-12: 10px là số lạc thang duy nhất toàn file — về thang --jk-r-ctl */
.jk-menu .sub-menu a:hover{ color:#000; background:var(--jk-soft); }

/* actions — icon to, hover nền xám nhạt BO TRÒN (cả 3 đồng nhất) */
.jk-head__actions{ justify-self:end; display:flex; align-items:center; gap:4px; }
.jk-head__icon{ display:inline-flex; align-items:center; justify-content:center; width:46px; height:46px; padding:0; margin:0; cursor:pointer; color:#111; position:relative; border-radius:var(--jk-r-ctl); -webkit-appearance:none; appearance:none; transition:background .12s; }
.jk-head__icon, .jk-head__icon:focus, .jk-head__icon:focus-visible{ background:transparent !important; border:0 !important; box-shadow:none !important; outline:none !important; -webkit-tap-highlight-color:transparent; }
.jk-head__icon:hover, .jk-head__icon:active{ background:var(--jk-soft) !important; color:#000 !important; }
.jk-ico{ width:26px; height:26px; display:block; }
.jk-head__cart{ text-decoration:none; }
/* Số trong giỏ: 16px nhồi trong vòng 20px là chật, và dính sát quai túi nên đọc thành
   một phần của biểu tượng. Nhỏ lại, đậm lên, thêm viền trắng để tách khỏi cái túi. */
.jk-head__cart-n{ position:absolute; top:5px; right:3px; background:var(--jk-red); color:#fff; font-size:11px; font-weight:700; min-width:19px; height:19px; line-height:19px; border-radius:var(--jk-r-pill); padding:0 5px; text-align:center; box-sizing:border-box; box-shadow:0 0 0 2px #fff; }
.jk-head__cart-n.is-empty{ display:none; }
.jk-head__burger{ display:none; }

/* SEARCH popover nhỏ — neo NGAY DƯỚI icon search */
.jk-head__search-wrap{ position:relative; display:inline-flex; align-items:center; }
.jk-head__search{ position:absolute; top:calc(100% + 10px); right:-2px; width:320px; max-width:calc(100vw - 44px); background:#fff; border:1px solid var(--jk-tile-line); border-radius:var(--jk-r-panel); box-shadow:var(--jk-shadow); padding:10px; z-index:70; } /* 2026-08-12: bóng rộng .32 → token, viền theo khung tile */
.jk-head__search[hidden]{ display:none; }
.jk-head__search::before{ content:""; position:absolute; top:-7px; right:15px; width:12px; height:12px; background:#fff; border-left:1px solid var(--jk-tile-line); border-top:1px solid var(--jk-tile-line); border-radius:3px 0 0 0; transform:rotate(45deg); } /* mũi tên cùng màu viền panel */
/* Viền + vòng focus nằm ở vỏ form, <input> để trần — trước đây hộp có viền, form có
   viền, rồi luật focus-visible chung vẽ thêm vòng đỏ nữa: ba khung lồng nhau. */
.jk-head__search form{ display:flex; align-items:center; border:1px solid var(--jk-line); border-radius:var(--jk-r-ctl); overflow:hidden; transition:border-color .15s ease, box-shadow .15s ease; }
.jk-head__search form:focus-within{ border-color:var(--jk-ink); box-shadow:0 0 0 3px var(--jk-red-ring); }
.jk-head__search input[type=search]{ flex:1; border:0; padding:12px 14px; font-size:16px; background:transparent; min-width:0; }
.jk-head__search input[type=search]:focus,
.jk-head__search input[type=search]:focus-visible{ outline:0 !important; }
.jk-head__search .jk-head__search-go{ width:auto; height:44px; padding:0 14px; background:none !important; border:0 !important; border-radius:0 var(--jk-r-ctl) var(--jk-r-ctl) 0; color:#111; }
.jk-head__search .jk-head__search-go:hover{ background:var(--jk-soft) !important; }

/* overlay + drawer (mobile) */
/* Ngăn kéo trượt vào thay vì hiện đứng phắt. Chuyển động này chạy được mà KHÔNG phải
   sửa JS (JS chỉ bật/tắt thuộc tính `hidden`): `transition-behavior:allow-discrete`
   cho phép hoãn `display:none` tới cuối, `@starting-style` cấp trạng thái lúc mở.
   Trình duyệt cũ bỏ qua cả hai → về đúng hành vi hiện-phắt như trước, không vỡ. */
.jk-head__overlay[hidden], .jk-head__drawer[hidden]{ display:none; }
.jk-head__overlay{ position:fixed; inset:0; background:rgba(17,17,17,.42); z-index:999; opacity:1; transition:opacity .25s ease, display .25s allow-discrete; }
.jk-head__overlay[hidden]{ opacity:0; }
@starting-style{ .jk-head__overlay{ opacity:0; } }

.jk-head__drawer{ position:fixed; top:0; right:0; width:88%; max-width:370px; height:100%; background:#fff; z-index:1000; padding:14px 18px 40px; overflow-y:auto; border-radius:var(--jk-r-card) 0 0 var(--jk-r-card); box-shadow:-16px 0 36px -28px rgba(17,17,17,.35); transform:translateX(0); transition:transform .3s cubic-bezier(.2,.7,.2,1), display .3s allow-discrete; } /* 2026-08-12: bóng .55 → .35 thu hẹp — tấm màn .42 phía sau đã lo việc tách lớp */
.jk-head__drawer[hidden]{ transform:translateX(100%); }
@starting-style{ .jk-head__drawer{ transform:translateX(100%); } }
@media (prefers-reduced-motion: reduce){
  .jk-head__drawer, .jk-head__overlay{ transition:none; }
}

/* `inline-flex` + `margin-left:auto` KHÔNG đẩy được sang phải (margin auto chỉ ăn trên
   hộp mức khối). Nút đóng vì thế nằm ở mép TRÁI của ngăn kéo, trong khi ngăn kéo trượt
   ra từ bên phải — ngón cái với không tới. `display:flex` thì auto mới chạy. */
.jk-head__drawer-close{ display:flex; align-items:center; justify-content:center; width:44px; height:44px; margin:0 -2px 6px auto; background:none !important; border:0 !important; box-shadow:none !important; border-radius:var(--jk-r-ctl); color:#111; cursor:pointer; }
.jk-drawer-menu{ list-style:none; margin:0; padding:0; }
.jk-drawer-menu li{ border-bottom:1px solid var(--jk-line); } /* 2026-08-12: #F1F1F1 viết chết → token, "check hết lại luôn" */
.jk-drawer-menu > li:last-child{ border-bottom:0; }
.jk-drawer-menu a{ display:block; padding:15px 4px; font-size:17px; color:#111; text-decoration:none; }
.jk-drawer-menu .sub-menu{ list-style:none; margin:0; padding:0 0 8px 14px; display:none; }
.jk-drawer-menu li.jk-open > .sub-menu{ display:block; }
.jk-drawer-menu .sub-menu li{ border:0; }
.jk-drawer-menu .sub-menu a{ font-size:16px; padding:11px 4px; color:#5A5A5A; }
body.jk-noscroll{ overflow:hidden; }

@media (max-width:768px){
  .jk-head__bar{ grid-template-columns:auto 1fr; padding:6px 20px; min-height:62px; }
  .jk-head__nav{ display:none; }
  .jk-head__burger{ display:inline-flex; }
  .jk-head__search{ right:-2px; width:270px; }
}

/* iPad DỌC: thanh menu vốn cần 533px mà chỗ trống chỉ có 455–520px, nên "Artisan keycaps"
   và "Raffle sales" gãy xuống dòng, header cao 92px thay vì 75px. Đo trên prod 2026-08-28,
   dải hỏng đúng 769px → 849px: iPad 10.9 / iPad Air dọc (820) và iPad Pro 11" dọc (834)
   nằm trọn trong đó; iPad Pro 12.9 dọc (1024), iPad xoay ngang và máy gập mở ra (924+)
   không dính. Bóp giãn cách và cỡ chữ trong đúng dải này thay vì đổi sang nút burger —
   màn 820px vẫn còn thừa chỗ cho một thanh menu thật, chủ chốt 28/08.
   🛑 Chỗ chật nhất (769px) menu cần 436px trên 455px có sẵn, tức chỉ dư 19px. THÊM MỘT MỤC
   MENU NỮA LÀ VỠ LẠI. Thêm mục thì đo lại bằng tools/jk-do-header-css.mjs trước khi đẩy. */
@media (min-width: 769px) and (max-width: 859px){
  .jk-menu{ gap:18px; }
  .jk-menu a{ font-size:15px; }
  .jk-menu > li > a{ gap:4px; }
}

/* Khối đầu trang chủ (`.jk-hero` — chỉ dùng ở trang 19): hai cột 75/25, đẹp ở khổ rộng
   nhưng cột chữ co theo cửa sổ. Đo 2026-08-28: 286px ở khổ 1440 → 261px ở 1100 →
   222px ở 984 → 207px ở 924, tức khoảng 4 chữ một dòng và 14 dòng liền. Dưới 1100px cho
   xếp dọc: ảnh sản phẩm được cả bề ngang, chữ cũng vậy. Chủ chọn kiểu này 28/08 sau khi
   xem ba bản dựng thử (giữ nguyên · xếp dọc · cân lại 58/42).
   `!important` là bắt buộc: bề rộng cột do trình soạn khối ghi INLINE (flex-basis:25%),
   luật trong file không có cửa thắng nếu không có nó. Đã thử không !important — luật ăn
   một nửa, cột đổi tỉ lệ mà không xuống dòng. */
@media (max-width: 1100px){
  /* row-gap để trình soạn khối lo — biến --wp--style--block-gap của nó thắng, đo ra 30px
     ở mọi khổ, nên đặt số ở đây chỉ là dòng chết. */
  .jk-hero{ flex-wrap: wrap !important; }
  .jk-hero > .wp-block-column{ flex-basis: 100% !important; }
}

/* --- Bổ sung 2026-08-08 ---------------------------------------------------
   Ba lỗ hổng của header cũ: (1) rê chuột lên menu không có gì đổi (chỉ #111→#000,
   mắt không thấy); (2) không mục nào cho biết khách đang ở phần nào; (3) đi bằng
   bàn phím thì không mở được menu con và không thấy con trỏ ở đâu. */

/* Gạch chân: mọc ra khi rê chuột, đứng yên ở mục đang mở.
   ::before chứ không ::after — ::after đang là mũi tên xổ xuống.
   Màu: ĐEN (Hùng chốt 2026-08-09, trước đó là đỏ #E80000). Cùng hướng với quy ước
   JK-HOVER — đỏ để dành cho hành động và cảnh báo, còn "bấm được / đang ở đây" thì
   nói bằng nét gạch, không cần đổi màu. */
.jk-menu > li > a{ position:relative; }
/* Độ dày: 2px → 1.5px (Hùng 2026-08-11: "dày quá, không cân đối với logo"). Logo chữ ký
   cao 44px với nét viết tay mảnh, cạnh nó một vạch 2px đặc đọc ra nặng hơn cả chữ ký.
   1.5px trên màn Retina ra đúng 3 điểm ảnh vật lý nên vẫn sắc; máy thường làm tròn
   xuống 1px — mảnh hơn nữa, vẫn thấy rõ vì nền trắng và màu mực đặc. */
.jk-menu > li > a::before{
  content:""; position:absolute; left:0; right:0; bottom:13px; height:1.5px; border-radius:999px;
  background:var(--jk-ink); transform:scaleX(0); transform-origin:left center;
  transition:transform .22s cubic-bezier(.2,.6,.2,1);
}
.jk-menu > li:hover > a::before,
.jk-menu > li:focus-within > a::before,
.jk-menu > li.current-menu-item > a::before,
.jk-menu > li.current-menu-ancestor > a::before,
.jk-menu > li.jk-current > a::before{ transform:scaleX(1); }
/* Mục đang mở đậm hơn — để nhận ra cả khi không nhìn màu */
.jk-menu > li.current-menu-item > a,
.jk-menu > li.current-menu-ancestor > a,
.jk-menu > li.jk-current > a{ font-weight:600; }
@media (prefers-reduced-motion: reduce){
  .jk-menu > li > a::before{ transition:none; }
}

/* Bàn phím mở được menu con (trước chỉ mở khi rê chuột → tab tới là hết đường) */
.jk-menu > li:focus-within > .sub-menu{ opacity:1; visibility:visible; transform:none; }
.jk-menu .sub-menu a:focus-visible{ background:var(--jk-soft); } /* 2026-08-12: #F5F5F5 viết chết → token, cùng màu hover */

/* Trả lại vòng focus cho 3 nút trên header. Dòng ở trên tắt outline cho MỌI trạng thái
   (để giết viền xấu mặc định), nhưng tắt luôn cả lúc đi bằng bàn phím.
   Vòng đặt RA NGOÀI (offset dương) chứ không lấn vào trong: nút đã bo góc, vòng nằm
   trong thì cắt qua góc bo, nhìn ra hình méo. */
.jk-head__icon:focus-visible{ outline:2px solid var(--jk-red) !important; outline-offset:2px; }
.jk-head__drawer-close:focus-visible{ outline:2px solid var(--jk-red) !important; outline-offset:2px; }

/* Ngăn kéo (mobile) — nút đóng đang là chữ X TRẮNG trên nền TRẮNG: `color:#111` ở trên
   không có !important nên bị nút mặc định của Astra đè thành #fff; icon còn bị flex bóp
   từ 27px xuống 4px. Không ai thấy nút đóng — vẫn đóng được bằng nền mờ hoặc Esc,
   nhưng đó là may chứ không phải thiết kế. */
.jk-head__drawer-close{ color:#111 !important; }
.jk-head__drawer-close .jk-ico{ width:26px; height:26px; flex:0 0 26px; }

/* Ngăn kéo: mục đang mở — vạch đỏ bên trái, chữ đậm */
.jk-drawer-menu > li.current-menu-item > a,
.jk-drawer-menu > li.current-menu-ancestor > a,
.jk-drawer-menu > li.jk-current > a{
  font-weight:600; box-shadow:inset 3px 0 0 var(--jk-red); padding-left:14px;
}
/* Mục có menu con: mũi tên cho biết bấm là mở ra, xoay khi đã mở */
.jk-drawer-menu > li.menu-item-has-children > a{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
}
.jk-drawer-menu > li.menu-item-has-children > a::after{
  content:""; width:16px; height:16px; flex:0 0 16px;
  /* background-image thay cho mask — cùng lý do với mũi tên menu desktop ở trên */
  background:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%239A9A9A'%20stroke-width='2.4'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpolyline%20points='6%209%2012%2015%2018%209'/%3E%3C/svg%3E") center/contain no-repeat;
  transition:transform .18s ease;
}
.jk-drawer-menu > li.menu-item-has-children.jk-open > a::after{ transform:rotate(180deg); }

/* Nhảy thẳng vào nội dung, bỏ qua menu — chỉ hiện khi bấm Tab */
.jk-skip{
  position:absolute; left:16px; top:-64px; z-index:1001;
  background:#111; color:#fff; padding:12px 18px;
  font-size:16px; text-decoration:none; transition:top .15s ease;
}
.jk-skip:focus{ top:12px; color:#fff; }
.jk-skip{ border-radius:var(--jk-r-ctl); }

/* Nút "lên đầu trang" của Astra — mảnh cuối cùng còn vuông trong bộ khung của site */
#ast-scroll-top{
  border-radius:var(--jk-r-ctl) !important;
  box-shadow:0 1px 2px rgba(17,17,17,.06), 0 12px 28px -16px rgba(17,17,17,.4);
}
/* JK-HEADER END */


/* JK-404 START — trang 404 tuỳ biến (404.php). Font chữ đọc của site, mực #111, đỏ #D42027.
   2026-08-12 bản 2 (Hùng gạt bản 1 ba-phím-keycap cùng ngày: "đơn giản thôi nhưng có
   dấu ấn, text, hiệu ứng gõ chữ"): MỘT CÂU TỰ GÕ với dấu nháy đỏ nhấp nháy — hiệu ứng
   là bàn phím, không cần vẽ bàn phím. Câu ("Ten years of making keycaps, and we've
   never seen this key.") là câu văn nên đi font chữ đọc theo đúng luật hai font;
   phần mono chỉ có nhãn "error 404". JS gõ chữ nằm trong 404.php, no-JS/reduced-motion
   thì câu hiện tĩnh nguyên vẹn. min-height giữ chỗ 2 dòng để trang không nhảy khi gõ. */
.jk-404 { max-width: 640px; margin: 0 auto; padding: 84px 20px 96px; text-align: center; }
.jk-404__code {
	font-family: var(--jk-font-mono);
	font-size: 14px; font-weight: 600; letter-spacing: -.02em;
	color: var(--jk-red);
	margin: 0 0 18px;
}
.jk-404__title {
	font-size: clamp(26px, 4.4vw, 38px); font-weight: 650; line-height: 1.25;
	letter-spacing: -0.02em; color: #111;
	margin: 0 0 14px;
	min-height: calc(2 * 1.25em); /* giữ chỗ đúng 2 dòng lúc đang gõ */
	text-wrap: balance;
}
/* Dấu nháy: khối đỏ mảnh, nhịp nháy bậc thang (steps) như con trỏ terminal thật,
   KHÔNG fade — fade là con trỏ "thở", steps mới là con trỏ "chờ gõ". */
.jk-404__caret {
	display: inline-block;
	width: 3px; height: .95em;
	margin-left: 5px;
	vertical-align: text-bottom;
	background: var(--jk-red);
	animation: jk404-blink 1.06s steps(2, jump-none) infinite;
}
@keyframes jk404-blink { 0% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
	.jk-404__caret { animation: none; opacity: 1; }
}
.jk-404__text { font-size: var(--jk-fs-body); line-height: 1.65; color: #6A6A6A; margin: 0 auto var(--jk-sp-6); max-width: 460px; }
/* Nút */
.jk-404__actions { display: flex; flex-wrap: wrap; gap: var(--jk-sp-3); justify-content: center; }
.jk-404__btn {
	display: inline-flex; align-items: center; justify-content: center;
	height: 54px; padding: 0 26px;   /* 52 → 54: cùng cỡ chạm nút chính toàn site (2026-08-13) */
	border: 1px solid #111; border-radius: var(--jk-r-ctl);
	font-size: var(--jk-fs-btn); font-weight: 600; text-decoration: none;
	color: #111; background: #fff; transition: background .15s ease, color .15s ease;
}
.jk-404__btn:hover { background: #111; color: #fff; }
.jk-404__btn--primary { background: #111; color: #fff; }
.jk-404__btn--primary:hover { background: var(--jk-red); border-color: var(--jk-red); color: #fff; }
@media (max-width: 480px) {
	.jk-404 { padding: 48px 18px 64px; }
	.jk-404__actions { flex-direction: column; }
	.jk-404__btn { width: 100%; }
}
/* JK-404 END */

/* JK-POLISH START — tinh chỉnh thẩm mỹ (chỉ CSS, không đụng markup/PHP/giá).
   Tokens sẵn có: đỏ #D42027, mực #111, chữ phụ #6A6A6A, viền #E8E8E8, vuông góc.
   Nền khung ảnh dùng token --jk-soft (từng là #F6F6F6 rời — hai mã xám lệch 1 nấc
   cho cùng một khái niệm, gộp về một token 2026-08-12). */

/* --- Thẻ sản phẩm (lưới shop, related, up-sell, "You may also like" ở giỏ) ---
   Ảnh chụp là tài sản mạnh nhất của brand nhưng đang nằm phẳng lì, không có phản hồi
   khi rê chuột. Cho ảnh phóng nhẹ trong khung cắt → cảm giác "chạm được". */
.woocommerce ul.products li.product .astra-shop-thumbnail-wrap {
	overflow: hidden;   /* cắt phần ảnh tràn ra khi phóng */
	background: var(--jk-soft); /* ảnh nền trắng không bị "trôi" trên nền trang trắng */
}
.woocommerce ul.products li.product .astra-shop-thumbnail-wrap img {
	display: block;     /* bỏ khe baseline ~5px dưới ảnh (img là inline mặc định) */
	width: 100%;
	height: auto;
	transition: transform .55s cubic-bezier(.2, .6, .2, 1), opacity .45s ease;
}
.woocommerce ul.products li.product:hover .astra-shop-thumbnail-wrap img { transform: scale(1.045); }

.woocommerce ul.products li.product .astra-shop-summary-wrap { padding-top: 14px; }
.woocommerce ul.products li.product .woocommerce-loop-product__title { transition: color .18s ease; }
/* Rê tới thẻ: tên hàng GẠCH CHÂN, không đổi sang đỏ (JK-HOVER). Đỏ trên một lưới 12 thẻ
   đọc thành "món này khác các món kia", trong khi nó chỉ đang nói "bấm được". */
.woocommerce ul.products li.product:hover .woocommerce-loop-product__title {
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
	text-decoration-color: currentColor;
}

/* Không phóng ảnh nếu máy khách bật "giảm chuyển động" */
@media (prefers-reduced-motion: reduce) {
	.woocommerce ul.products li.product .astra-shop-thumbnail-wrap img { transition: none; }
	.woocommerce ul.products li.product:hover .astra-shop-thumbnail-wrap img { transform: none; }
}

/* --- Cột bên trang shop --- */
#secondary .widget { margin-bottom: 40px; }
#secondary .widget-title {
	padding-bottom: 12px;
	margin-bottom: 16px;
	border-bottom: 1px solid var(--jk-line);   /* 2026-08-12: #E8E8E8 viết chết → token */
}
/* Danh mục: chữ đằm hơn, số đếm lùi về sau để không tranh chỗ với tên */
#secondary .widget_product_categories a,
#secondary .product-categories a { color: #111; text-decoration: none; transition: color .15s ease; }
#secondary .widget_product_categories a:hover,
#secondary .product-categories a:hover {  /* gạch chân, không nhuộm đỏ — JK-HOVER */
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
#secondary .widget_product_categories .count,
#secondary .product-categories .count { color: var(--jk-muted, #6A6A6A); font-size: 15px; }

/* Đám mây thẻ: 45 viên có viền đang đọc như một bức tường. Bỏ viền, nền xám nhạt,
   chữ nhỏ lại → lùi về đúng vai trò thông tin phụ. (WordPress gắn font-size inline
   theo độ phổ biến của thẻ nên phải ép cùng cỡ.) */
#secondary .tagcloud a,
#secondary .wp-block-tag-cloud a,
.tagcloud a {
	font-size: 15px !important;
	padding: 5px 12px;
	margin: 0 6px 8px 0;
	background: var(--jk-soft);
	border: 0;
	border-radius: 8px; /* trước là 0 — cả site đã bo tròn, mỗi đám thẻ còn vuông */
	color: #4A4A4A;
	text-decoration: none;
	transition: background .15s ease, color .15s ease;
}
#secondary .tagcloud a:hover,
#secondary .wp-block-tag-cloud a:hover,
.tagcloud a:hover { background: #111; color: #fff; }

/* --- Phân trang (17 trang nên nó được nhìn nhiều) --- */
.woocommerce nav.woocommerce-pagination ul,
.woocommerce nav.woocommerce-pagination ul li { border: 0 !important; }
.woocommerce nav.woocommerce-pagination ul { display: flex; flex-wrap: wrap; gap: 4px; justify-content: center; }
/* 36px: ở giữa dải trang (1 2 3 … 8 [9] 10 … 16 17 →) có 16 ô — to hơn nữa là
   tràn xuống dòng hai. Trên điện thoại nới lại 44px cho vừa đầu ngón tay. */
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span {
	min-width: 36px;
	height: 36px;
	line-height: 36px;
	padding: 0 6px;
	border-radius: 0;
	transition: background .15s ease, color .15s ease;
}
@media (max-width: 768px) {
	.woocommerce nav.woocommerce-pagination ul li a,
	.woocommerce nav.woocommerce-pagination ul li span { min-width: 44px; height: 44px; line-height: 44px; }
}
/* Astra có sẵn ".ast-woocommerce-pagination-default…{background:transparent}" mạnh hơn,
   nên phải bám đúng class đó thì nền mới ăn (file này nạp sau Astra). */
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a:hover,
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a:focus {
	background: #F2F2F2;
	color: #111;
}
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li span.current {
	background: #111;
	color: #fff;
}

/* --- Nút "Add to cart" lúc chưa chọn đủ biến thể ---
   Woo để nút đỏ mờ đi, ra màu hồng nhạt trông như nút hỏng. Đổi sang nút xám đặc:
   vẫn ra dáng nút chính, nhìn là biết "chưa tới lượt", chọn xong thì bật đỏ đậm.
   (Nút viền rỗng đã thử rồi — bị đọc nhầm thành nút phụ.) */
.woocommerce div.product form.cart .single_add_to_cart_button.disabled,
.woocommerce div.product form.cart .single_add_to_cart_button.wc-variation-selection-needed {
	background: #EDEDED !important;
	color: #8A8A8A !important;
	border: 1px solid #EDEDED !important;
	opacity: 1 !important;
	cursor: not-allowed;
}

/* --- Chân trang: dòng bản quyền #8A8A8A chỉ đạt 3.45:1, dưới ngưỡng đọc được --- */
.jk-foot__copy { color: #6A6A6A; font-size: 14px; } /* 5.4:1 — luật này nằm SAU JK-FOOTER nên nó quyết cỡ chữ */

/* --- Đi bằng bàn phím thì phải thấy mình đang ở đâu (Astra tắt outline nhiều chỗ) ---
   Trừ tabindex="-1": Woo đưa con trỏ vào ô thông báo "đã thêm vào giỏ" để trình đọc
   màn hình đọc lên, viền đỏ ở đó lại đọc thành báo lỗi. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
	outline: 2px solid var(--jk-red) !important;
	outline-offset: 3px;
}

::selection { background: var(--jk-red); color: #fff; }
/* JK-POLISH END */

/* ============================================================================
   JK-CC START — THIẾT KẾ LẠI GIỎ HÀNG + THANH TOÁN. 2026-08-08
   ============================================================================
   Vì sao làm lại chứ không vá: hai trang này đang là bảng biểu WooCommerce mặc
   định — vuông, viền xám, nút thấp, mọi thứ cùng một sức nặng. Không phải tối
   giản, chỉ là chưa được thiết kế.

   Hướng mới: nội dung nằm trong các THẺ bo tròn, có bóng rất nhẹ; ô nhập và nút
   cao lên, bo tròn, bấm trúng dễ hơn; bảng tổng tiền dính theo màn khi cuộn;
   một sắc đỏ duy nhất dành cho hành động chính.

   MỌI bán kính bo lấy từ biến bên dưới — muốn tròn hơn/bớt tròn chỉ sửa ở đây,
   và sau này nới ra các trang khác thì dùng chung bộ biến này.
   ---------------------------------------------------------------------------- */
:root {
	/* Bo góc — thang đồng tâm: khối ngoài tròn hơn khối trong, nếu bằng nhau thì
	   nhìn ra "hộp dán chồng hộp" chứ không phải hộp lồng nhau. */
	--jk-r-card:  20px;  /* thẻ ngoài cùng: giỏ hàng, tổng tiền, form */
	--jk-r-panel: 14px;  /* khối con nằm TRONG thẻ: khu thanh toán */
	--jk-r-ctl:   12px;  /* ô nhập, nút bấm */
	--jk-r-thumb: 12px;  /* ảnh sản phẩm trong giỏ */
	--jk-r-media: 16px;  /* ảnh lớn: thẻ sản phẩm ở lưới shop (~300px, 12px đọc ra gần vuông) */
	--jk-r-sm:     6px;  /* ô tick, chip nhỏ — 8px trên ô 22px đọc ra hình tròn */
	--jk-r-pill:  999px; /* ô số lượng */

	/* Màu — ĐÚNG 3 tông: trắng, xám (mực + xám nhạt), đỏ. Không thêm màu thứ tư.
	   Đỏ chỉ dùng cho hành động chính và cảnh báo; thông báo thường đi tông xám. */
	--jk-ink:   #111;
	--jk-muted: #6A6A6A;
	/* #E8E8E8 → #E2E2E5 (Hùng 2026-08-12, đợt tile: "mấy đường line đậm hơn xíu vì có màu
	   xám nền rồi, check hết lại luôn") — token này cấp màu cho MỌI đường kẻ ngăn + viền
	   khối con của site (47 chỗ), chỉnh một chỗ là đều cả lượt. Trùng luôn #E1E1E1 của
	   Astra nên hết cảnh hai tông kẻ gần giống nhau đứng cạnh nhau. */
	--jk-line:  #E2E2E5;
	--jk-soft:  #F7F7F7;
	/* Đỏ: Hùng 2026-08-11 — "#D42027 hơi digital". Hạ bão hoà 100%→74% và tối đi một
	   bậc: vẫn là đỏ ấm, sống, nhưng thôi chói như đèn màn hình. Ba sắc đỏ đang cùng
	   tồn tại (logo header #ED1D24, logo tròn #FE0000, UI này) — nếu sau này đồng bộ
	   được hai file logo thì lấy đúng mã dưới đây. */
	--jk-red:   #D42027;
	--jk-red-dark: #B31B21;
	--jk-red-tint: #FDF5F5;
	--jk-red-ring: rgba(212, 32, 39, .14); /* quầng focus — trước là var(--jk-red-ring) rải rác 8 chỗ */

	/* Thẻ kiểu tile (2026-08-12 — Hùng: "viền rồi đổ bóng rộng quá", chỉ mẫu
	   apple.com/apple-watch-series-11). Đo trang đó: tile #F5F5F7, KHÔNG viền, KHÔNG
	   bóng, khe 20px, khối tách nhau thuần bằng tương phản nền; khối con quan trọng
	   thì TRẮNG nổi trên xám. Bộ token dưới đây là bản dịch của công thức đó. */
	/* Ba vòng chỉnh cùng ngày theo mắt Hùng nhìn prod: #F5F5F7 → #FAFAFB → #FCFCFD
	   ("nền thẻ nhạt hơn đi") và viền tile tách khỏi --jk-line, đậm hơn một nấc
	   ("viền đậm hơn chút cũng được"). Tile = nền gần trắng + viền rõ, KHÔNG bóng.
	   ⚠️ --jk-tile-line CHỈ cho viền NGOÀI của tile; đường kẻ ngăn bên trong và viền
	   khối con vẫn --jk-line (nhạt hơn) — khung ngoài phải rõ hơn ruột. */
	--jk-tile:      #FCFCFD;  /* nền thẻ */
	--jk-tile-line: #D8D8DC;  /* viền ngoài của thẻ — đậm hơn --jk-line một nấc cho ra khung */
	--jk-tile-hov:  #EFEFF1;  /* hover của ô bấm nằm TRONG thẻ (soft trùng màu tile nên vô hình) */

	/* --jk-shadow KHÔNG còn ai dùng từ 2026-08-12 (4 chỗ thẻ đã bỏ bóng theo mẫu Apple).
	   Giữ định nghĩa cho phần tử NỔI tương lai (menu thả, popover) — đừng gắn lại vào thẻ. */
	--jk-shadow: 0 1px 2px rgba(17,17,17,.04), 0 10px 28px -14px rgba(17,17,17,.16);
	--jk-card-pad: 32px;  /* 26 → 32 (2026-08-12): tile không viền cần đệm trong hào phóng hơn */

	/* Thang chữ — 5 bậc, mỗi bậc một việc. Trước đây từ 15 đến 20px có tới 6 cỡ
	   gần giống nhau nên không bậc nào ra dáng bậc nào. */
	--jk-fs-title: 22px;  /* tên thẻ: Cart totals, Your order, Billing details */
	/* 650 chứ không 600 (2026-08-12, Hùng: "Billing details sao có vẻ không đẹp"):
	   Source Sans 600 nhìn mềm hơn Inter 600 ở cùng con số — semibold của nó vốn nhẹ.
	   Font variable nên 650 là weight THẬT, không phải giả lập. Chỉnh đậm tên thẻ thì
	   sửa Ở ĐÂY, ba luật bên dưới đều đọc biến này. */
	--jk-fw-title: 650;
	--jk-fs-body:  17px;  /* dòng nội dung, nhãn hàng, tiền lẻ */
	--jk-fs-sm:    15px;  /* chú thích, chữ phụ */
	--jk-fs-label: 14px;  /* nhãn cột bảng — xem JK-CASE: bỏ in hoa nên phải to lên 1px */
	--jk-fs-total: 25px;  /* con số TỔNG, to nhất trong thẻ */
	/* Chữ nút — HAI cỡ, không hơn (2026-08-13, Hùng: "khoảng cách... không theo nguyên
	   tắc gì cả" — quét ra nút đang rải 15/16/17/18px): nút chính 16, nút phụ 15. */
	--jk-fs-btn:    16px;
	--jk-fs-btn-sm: 15px;

	/* Thang KHOẢNG CÁCH — 2026-08-13, Hùng: "canh lại khoảng cách ở tất cả thành phần,
	   không theo nguyên tắc gì cả, quá trống, không đều". Kiểm kê ra 30 giá trị lẻ
	   (5/9/10/11px cạnh nhau; 84/88/90px cho cùng một vai). Sáu nấc, cách dùng:
	   sp-2 khe chip/inline · sp-3 trong khối con · sp-4 giữa phần tử trong thẻ ·
	   sp-5 giữa khối con trong thẻ · sp-6 tiêu đề trang→nội dung, thẻ→thẻ ·
	   sp-7 giữa các vùng lớn (lưới→phân trang, tabs→bán chéo).
	   Số vi chỉnh 1–2px trong chip/nút nhỏ KHÔNG ép vào thang. */
	--jk-sp-2:  8px;
	--jk-sp-3: 12px;
	--jk-sp-4: 16px;
	--jk-sp-5: 24px;
	--jk-sp-6: 32px;
	--jk-sp-7: 48px;
}

/* ---- Thẻ dùng chung cho cả hai trang ---- */
.woocommerce-cart .jk-card,
.woocommerce-checkout .jk-card,
.woocommerce-cart .woocommerce-cart-form table.cart,
.woocommerce-cart .cart_totals,
.woocommerce-checkout #customer_details .col-1,
.woocommerce-checkout #ast-order-review-wrapper {
	/* Tile (2026-08-12, chỉnh vòng 2): nền nhạt + VIỀN MẢNH, không bóng — xem chú thích
	   ở khối token --jk-tile. Vòng 1 bỏ hẳn viền theo mẫu Apple, Hùng xem trên prod và
	   chốt lại: "nhạt hơn chút rồi có 1 viền ở ngoài".
	   !important cho background + border: Astra có luật riêng cho .cart_totals
	   (nền #FAFAFA + viền, specificity cao hơn nhóm này) — chính nó từng lộ ra trên prod
	   thành cái ô "khác bầy" mà Hùng lấy làm mẫu; nay ép mọi thẻ về một công thức. */
	background: var(--jk-tile) !important;
	border: 1px solid var(--jk-tile-line) !important;
	/* !important: Astra đặt border-radius riêng cho .cart_totals và các bảng shop_table
	   với specificity cao hơn → không có nó thì góc vẫn vuông. Đã kiểm bằng ảnh render. */
	border-radius: var(--jk-r-card) !important;
}
/* Lớp phủ loading của Woo (jQuery blockUI) BO THEO THẺ nó che. Mặc định nó là một tấm
   trắng VUÔNG đè kín khối bị khoá trong lúc chờ AJAX, nên mỗi lần cộng/trừ số lượng ở
   giỏ là "khung vuông hiện ra trước rồi mới khung tròn" (Hùng bắt 2026-08-12). blockUI
   set inline background/opacity nhưng KHÔNG set radius → luật này ăn không cần !important. */
:is(.woocommerce-cart, .woocommerce-checkout, .woocommerce-account) .blockUI.blockOverlay {
	border-radius: var(--jk-r-card);
}

/* Ô nhập bên trong tile xám phải TRẮNG rõ ràng (Astra có nơi để trong suốt/xám nhạt —
   trên nền trắng không ai thấy khác, trên tile xám thì ô chìm mất). Chỉ nhắm ô gõ chữ
   và select, không đụng checkbox/radio. */
.woocommerce-cart :is(input.input-text, select, textarea),
.woocommerce-checkout :is(input.input-text, select, textarea),
.woocommerce-account :is(input[type="text"], input[type="email"], input[type="tel"], input[type="password"], select, textarea),
.woocommerce-form-track-order :is(input[type="text"], input[type="email"], input[type="tel"]),
:is(.woocommerce-cart, .woocommerce-checkout, .woocommerce-account) .select2-container .select2-selection {
	background-color: #fff;
}

/* ============================ CHỮ ============================
   Trước đây hai trang này có 6 cỡ chữ nằm sát nhau (15/16/17/18/20) và weight rải
   400–700 không theo luật nào, nên nhìn vào không biết đâu là chính đâu là phụ —
   rõ nhất là dòng TỔNG TIỀN to bằng đúng dòng Subtotal. Rút về 5 bậc dưới đây. */

/* Tên thẻ */
.woocommerce-cart .cart_totals > h2,
.woocommerce-cart .jk-upsell > :is(h2, h3),
.woocommerce-checkout #order_review_heading,
.woocommerce-checkout #customer_details .col-1 h3,
.woocommerce-checkout .ast-checkout-form-heading h3 {
	font-size: var(--jk-fs-title) !important;
	font-weight: var(--jk-fw-title, 650) !important;
	line-height: 1.25 !important;
	letter-spacing: -.015em;
	color: var(--jk-ink) !important;
}

/* Ô nhập + nhãn form: bậc --jk-fs-body (17px), KHÔNG thừa kế body 18px.
   2026-08-12 (Hùng: "trong form chữ có vẻ bự hơn chữ chuẩn của site"): trước giờ không
   ai khai cỡ cho input vì nó trùng-may-mắn với body 17px thời JK-TYPO3; gỡ khối đó
   (quay lại Source Sans) thì body về 18px và form phình theo. 18px là cỡ chữ ĐỌC —
   form là GIAO DIỆN, chuẩn của nó là thang UI (menu header cũng 17). Khai tường minh
   một lần, hết phụ thuộc body. ≥16px nên iOS không tự zoom khi chạm vào ô. */
.woocommerce-cart :is(input.input-text, select, textarea, .form-row label),
.woocommerce-checkout :is(input.input-text, select, textarea, .form-row label),
.woocommerce-checkout .select2-container .select2-selection__rendered {
	font-size: var(--jk-fs-body);
}

/* Nhãn cột bảng: Product · Price · Quantity · Subtotal (JK-CASE: thôi in hoa) */
.woocommerce-cart .woocommerce-cart-form table.cart thead th,
.woocommerce-checkout #order_review table.shop_table thead th {
	font-size: var(--jk-fs-label) !important;
	font-weight: 600 !important;
	letter-spacing: 0;
	color: var(--jk-muted) !important;
}

/* Nhãn hàng (Subtotal / Shipping / Total) và số tiền đi kèm */
.woocommerce-cart .cart_totals table th,
.woocommerce-checkout #order_review table tfoot th {
	font-size: var(--jk-fs-body) !important;
	font-weight: 500 !important;
	color: var(--jk-ink) !important;
}
.woocommerce-cart .cart_totals table td,
.woocommerce-checkout #order_review table tfoot td {
	font-size: var(--jk-fs-body);
	font-weight: 600;
	color: var(--jk-ink);
}
/* TỔNG: to nhất, đậm nhất — đây là con số khách quyết định dựa vào */
.woocommerce-cart .cart_totals tr.order-total th,
.woocommerce-checkout #order_review tr.order-total th {
	font-size: var(--jk-fs-body) !important;
	font-weight: 600 !important;
}
.woocommerce-cart .cart_totals tr.order-total td,
.woocommerce-checkout #order_review tr.order-total td,
.woocommerce-cart .cart_totals tr.order-total .amount,
.woocommerce-checkout #order_review tr.order-total .amount {
	font-size: var(--jk-fs-total) !important;
	font-weight: 700 !important;
	color: var(--jk-ink) !important;
	line-height: 1.2;
}
/* Chữ phụ: thông tin vận chuyển, mô tả biến thể */
.woocommerce-cart .cart_totals tr.shipping td,
.woocommerce-cart .cart_totals .woocommerce-shipping-destination,
.woocommerce-checkout #order_review .product-name .variation,
.woocommerce-cart .woocommerce-cart-form .product-name .variation {
	font-size: var(--jk-fs-sm) !important;
	font-weight: 400 !important;
	color: var(--jk-muted) !important;
}
/* Tên sản phẩm + đơn giá trong bảng.
   17/600 chứ không 18/500 (2026-08-13): luật đầu file (mục ACCOUNT/CART/CHECKOUT) khai
   "tên SP = neo chính, đậm 600" mà khối này nạp sau đè xuống 500 — hai đầu chọi nhau
   đúng kiểu-4. Doc chốt tên hàng đi bậc --jk-fs-body, đậm hơn giá thường một nấc.
   🛑 `td.product-name > a` là SELECTOR CHẾT ở giỏ (kiểu-5): Astra Modern Cart bọc tên
   trong td > div.ast-product-image > div.ast-product-name > a — số 18/500 thật ra đến
   từ `.woocommerce-cart table.shop_table td.product-name{font-weight:500}` của Astra
   woocommerce.min.css + 18px thừa kế từ body (đo bằng duyệt styleSheets 2026-08-13).
   Nhắm thẳng td và div bọc tên; giữ `> a` làm dự phòng cho markup không Modern-Cart. */
.woocommerce-cart .woocommerce-cart-form td.product-name,
.woocommerce-cart .woocommerce-cart-form td.product-name .ast-product-name,
.woocommerce-cart .woocommerce-cart-form td.product-name > a,
.woocommerce-checkout #order_review td.product-name,
.woocommerce-checkout #order_review .ast-product-name {
	font-size: var(--jk-fs-body) !important;
	font-weight: 600 !important;
	line-height: 1.45 !important;
	color: var(--jk-ink) !important;
}
.woocommerce-cart .woocommerce-cart-form td.product-price,
.woocommerce-cart .woocommerce-cart-form td.product-subtotal,
.woocommerce-checkout #order_review tbody td {
	font-size: var(--jk-fs-body) !important;
	font-weight: 600 !important;
	color: var(--jk-ink) !important;
}

/* ============================ Ô TICK ============================ */
/* Ô tick mặc định của trình duyệt: vuông, 16px, xám nhạt — chạm hụt và xấu.
   Vẽ lại: 22px, bo nhẹ, tick trắng trên nền đỏ khi chọn. */
.woocommerce-cart input[type="checkbox"],
.woocommerce-checkout input[type="checkbox"] {
	-webkit-appearance: none !important;
	appearance: none !important;
	width: 22px !important;
	height: 22px !important;
	min-width: 22px;
	margin: 0 !important;
	flex: 0 0 22px;
	border: 1.5px solid #C9C9C9 !important;
	border-radius: var(--jk-r-sm) !important;
	background: #fff !important;
	cursor: pointer;
	position: relative;
	transition: background .12s ease, border-color .12s ease;
}
.woocommerce-cart input[type="checkbox"]:hover,
.woocommerce-checkout input[type="checkbox"]:hover { border-color: var(--jk-ink) !important; }
.woocommerce-cart input[type="checkbox"]:checked,
.woocommerce-checkout input[type="checkbox"]:checked {
	background: var(--jk-red) !important;
	border-color: var(--jk-red) !important;
}
/* Dấu tick vẽ bằng 2 cạnh viền xoay 45° — không cần ảnh, nét luôn sắc */
.woocommerce-cart input[type="checkbox"]:checked::after,
.woocommerce-checkout input[type="checkbox"]:checked::after {
	content: "";
	position: absolute;
	left: 7px; top: 3px;
	width: 5px; height: 10px;
	border: solid #fff;
	border-width: 0 2px 2px 0;
	transform: rotate(45deg);
}

/* "Ship to a different address?" — KHÔNG đóng khung.
   Đã thử bọc viền cho cả hàng thành một "ô bấm được", nhưng đặt giữa một chồng ô nhập
   thì nó đọc nhầm thành thêm một ô nhập nữa, trong khi đây là công tắc. Để trôi trong
   dòng, chỉ nới khoảng thở; phần "nhìn cho tử tế" đã do ô tick 22px ở trên gánh. */
.woocommerce-checkout .woocommerce-shipping-fields h3#ship-to-different-address {
	margin: 4px 0 2px !important;
	padding: 0 !important;
}
.woocommerce-checkout h3#ship-to-different-address label {
	padding: 8px 0 !important;
	border: 0;
	background: none;
	font-size: var(--jk-fs-body) !important;
	font-weight: 500 !important;
}

/* ============================ Ô NHẬP & NÚT ============================ */
/* Chỉ trong giỏ + thanh toán, để không đụng form ở trang khác. */
.woocommerce-cart :is(input[type=text], input[type=email], input[type=tel], input[type=number], input[type=password], textarea, select),
.woocommerce-checkout :is(input[type=text], input[type=email], input[type=tel], input[type=number], input[type=password], textarea, select),
.woocommerce-checkout .select2-container .select2-selection {
	border-radius: var(--jk-r-ctl) !important;
	border: 1px solid #DCDCDC !important;
	background: #fff !important;
	transition: border-color .15s ease, box-shadow .15s ease;
}
/* Viền focus: quầng đỏ rất nhạt + viền mực — rõ mình đang gõ ở ô nào mà không chói. */
.woocommerce-cart :is(input, textarea, select):focus,
.woocommerce-checkout :is(input, textarea, select):focus,
.woocommerce-checkout .select2-container--open .select2-selection {
	border-color: var(--jk-ink) !important;
	box-shadow: 0 0 0 3px var(--jk-red-ring) !important;
	outline: none !important;
}

/* Nút chính: cao 54, bo tròn, chữ chắc. #place_order đang chỉ cao 36px — quá mỏng
   cho hành động cuối cùng của một đơn hàng vài trăm đô.

   🛑 `display: flex` ở đây KHÔNG được `!important` — đã từng làm hỏng đường thanh toán.
   Cổng PayPal ẩn nút đặt hàng của Woo đi (nó thay bằng nút vàng của chính PayPal) bằng
   `#place_order.ppcp-hidden{display:none!important}`. Chuỗi đó cũng (1,1,0) + important,
   tức NGANG với chuỗi ở đây → thắng thua quyết bởi thứ tự nạp, mà file này nạp SAU.
   Kết quả: khách chọn PayPal thì thấy HAI nút trả tiền, đỏ và vàng, chồng nhau.
   Bỏ `!important` là đủ: `#place_order` có một #id nên vẫn thắng `inline-block` của Woo
   (`.woocommerce-js button.button`, 0-2-1) mà không chặn ai muốn ẩn nút đi.
   Cùng lý do, đừng thêm `!important` lại: `jQuery.hide()` đặt display:none dạng inline
   thường, và `!important` trong stylesheet đè cả cái đó — tức chặn luôn mọi cổng khác. */
.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,
.woocommerce-checkout #place_order {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 54px !important;
	padding: 14px 24px !important;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: var(--jk-fs-btn) !important;  /* 18 → 16 (2026-08-13): nút đang rải 15/16/17/18 — về hai cỡ, chính 16 phụ 15 */
	font-weight: 600 !important;
	letter-spacing: 0;
	line-height: 1.2 !important;
	transition: background .15s ease, transform .08s ease;
}
.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:hover,
.woocommerce-checkout #place_order:hover { background: var(--jk-red-dark) !important; }
.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:active,
.woocommerce-checkout #place_order:active { transform: translateY(1px); }

/* --- "Return to shop" — giỏ hàng và thanh toán lúc giỏ TRỐNG. 2026-08-09 ---
   Chỗ này lọt qua chín đợt vì phải làm rỗng giỏ mới nhìn thấy: nút vuông góc, cao 37px,
   và đỏ #CE1A1A (mặc định Astra) giữa một site đã thống nhất #D42027. Nó lại là nút DUY
   NHẤT trên trang, tức là toàn bộ trang chỉ có một thứ để nhìn và thứ đó lạc chuẩn.
   Cao 48 chứ không 54: đây là lối quay lại, không phải hành động cuối của một đơn hàng —
   cùng họ nút nhưng thấp hơn một bậc. */
.woocommerce a.button.wc-backward {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	padding: 12px 26px !important;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: var(--jk-fs-btn) !important;  /* 17 → 16: về cỡ nút chính của thang (2026-08-13) */
	font-weight: 600 !important;
	line-height: 1.2 !important;
	transition: background .15s ease, transform .08s ease;
}
.woocommerce a.button.wc-backward:hover { background: var(--jk-red-dark) !important; }
.woocommerce a.button.wc-backward:active { transform: translateY(1px); }

/* ============================ TRANG GIỎ HÀNG ============================ */
.woocommerce-cart .woocommerce-cart-form table.cart {
	border-collapse: separate;  /* separate + overflow:hidden = bo được góc bảng */
	border-spacing: 0;
	overflow: hidden;
}
@media (min-width: 769px) {
	.woocommerce-cart .woocommerce-cart-form table.cart thead th {
		background: var(--jk-soft);
		border: 0;
		padding: 16px 18px;
		font-size: 15px;
		letter-spacing: 0;   /* JK-CASE */
		color: var(--jk-muted);
	}
	.woocommerce-cart .woocommerce-cart-form table.cart tbody td {
		border: 0;
		border-top: 1px solid var(--jk-line);
		padding: 22px 18px;
		vertical-align: middle;
	}
	.woocommerce-cart .woocommerce-cart-form table.cart tbody tr:first-child td { border-top: 0; }
}

/* ---- Ảnh món hàng trong giỏ: PHẢI vuông ----
   Ảnh đang ra 70×88 chứ không phải 88×88 — bẹp thành hình chữ nhật đứng, nhìn như
   bị kéo méo. Thủ phạm là một dòng của chính WooCommerce:
       .woocommerce table.shop_table .product-thumbnail img { max-width:70px; width:auto }
   (woocommerce.min.css). `width:88px !important` của mình vô hiệu, vì **max-width
   luôn cắt width**, dù width có !important hay không — !important chỉ quyết ai
   thắng trong cùng một thuộc tính, không cứu được thuộc tính bị thuộc tính khác cắt.
   Chiều cao 88px thì không bị cắt → ra 70×88.

   Cách chắc chắn: dựng cái KHUNG vuông ở thẻ <a> bọc ngoài (nó không dính luật của
   Woo), rồi bảo ảnh lấp đầy khung và cắt theo `object-fit:cover`; kèm `max-width:none`
   để gỡ hẳn cái trần 70px. Lúc này ảnh không còn quyết định kích thước ô nữa. */
.woocommerce-cart .woocommerce-cart-form table.cart td.product-thumbnail > a,
.woocommerce-cart .woocommerce-cart-form table.cart td.product-thumbnail > img {
	display: block;
	width: 88px;
	height: 88px;
	overflow: hidden;
	border-radius: var(--jk-r-thumb);
	background: var(--jk-soft);
}
.woocommerce-cart .woocommerce-cart-form table.cart td.product-thumbnail img {
	display: block;
	width: 100% !important;
	height: 100% !important;
	max-width: none !important;
	object-fit: cover;
	border-radius: inherit;
}
@media (max-width: 768px) {
	/* Trên điện thoại thẻ món neo ảnh tuyệt đối ở góc trái với ô rộng 84px (xem mục
	   CART MOBILE ở đầu file — dòng padding-left:118px tính đúng theo con số 84 này).
	   Khung vuông phải bằng đúng 84 thì mới không hở một dải trống bên phải ảnh. */
	.woocommerce-cart .woocommerce-cart-form table.cart td.product-thumbnail > a,
	.woocommerce-cart .woocommerce-cart-form table.cart td.product-thumbnail > img {
		width: 84px;
		height: 84px;
	}
}
/* Tên món + biến thể */
.woocommerce-cart .woocommerce-cart-form td.product-name > a { font-size: 18px; line-height: 1.45; }

/* Ô số lượng → viên thuốc, nút bấm to hơn (31px là hụt tầm ngón tay) */
.woocommerce-cart .woocommerce-cart-form .quantity {
	display: inline-flex !important;
	align-items: center;
	border: 1px solid #DCDCDC;
	border-radius: var(--jk-r-pill);
	overflow: hidden;
	background: #fff;
}
.woocommerce-cart .woocommerce-cart-form .quantity :is(.minus, .plus) {
	width: 40px !important;
	height: 42px !important;
	line-height: 42px !important;
	border: 0 !important;
	background: transparent !important;
	color: var(--jk-ink) !important;
	font-size: 20px;
	text-decoration: none;
	transition: background .12s ease;
}
.woocommerce-cart .woocommerce-cart-form .quantity :is(.minus, .plus):hover { background: var(--jk-soft) !important; }
.woocommerce-cart .woocommerce-cart-form .quantity input.qty {
	width: 46px !important;
	height: 42px !important;
	min-height: 0 !important;
	line-height: 42px !important;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	text-align: center;
	font-size: 17px;
	font-weight: 600;
	box-shadow: none !important;
}

/* Nút xoá: chìm khi bình thường, đỏ khi rê tới — bấm nhầm thì mất hàng, nên
   phải thấy rõ mình đang chạm vào nó. */
.woocommerce-cart .woocommerce-cart-form td.product-remove a {
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	width: 34px !important;
	height: 34px !important;
	border-radius: var(--jk-r-pill);
	color: #9A9A9A !important;
	transition: background .12s ease, color .12s ease;
}
.woocommerce-cart .woocommerce-cart-form td.product-remove a:hover {
	background: var(--jk-red-ring);
	color: var(--jk-red) !important;
}

/* ---- Khối tổng tiền ---- */
/* !important: Astra đặt padding 0 20px cho .cart_totals và cho h2 một dải xám tràn
   ra ngoài bằng margin âm (0 -20px) — dải đó đâm ra khỏi góc bo của thẻ. */
.woocommerce-cart .cart_totals { padding: var(--jk-card-pad) !important; }
.woocommerce-cart .cart_totals > h2 {
	margin: 0 0 18px !important;
	padding: 0 0 16px !important;
	border-bottom: 1px solid var(--jk-line);
	/* cỡ chữ: KHÔNG khai ở đây — thang --jk-fs-title !important ở mục CHỮ quản rồi */
	background: none !important;
}
/* "Calculate shipping" đang là chữ đen thường, không ai biết bấm được */
.woocommerce-cart .shipping-calculator-button {
	color: var(--jk-ink) !important;
	text-decoration: underline !important;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}

/* Khối "You may also like" — KHÔNG có luật nào ở đây, và đó là chủ ý.
   Nó do plugin jk-toolkit (modules/woo/cart-upsell.php) in ra kèm <style> riêng
   giữa body, tức nạp SAU file này → mọi thứ viết ở đây đều phải !important mới ăn.
   Trước đây có 4 dòng !important vá bo góc; nay phần nhìn đã sửa thẳng trong plugin,
   dùng chung bộ biến --jk-*. Sửa khối đó thì sang plugin, đừng vá ngược lại ở đây.
   ⚠ Nhớ: plugin là MỘT PHẦN DEPLOY RIÊNG. */
/* Astra vẽ khung bảng bằng box-shadow spread 1px chứ không phải border — bỏ border
   không đủ, phải tắt cả bóng thì bảng mới phẳng vào trong thẻ. */
.woocommerce-cart .cart_totals table.shop_table,
.woocommerce-checkout #order_review table.shop_table {
	border: 0 !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	background: none !important;
	margin: 0;
}
.woocommerce-cart .cart_totals table.shop_table :is(th, td) {
	border: 0 !important;
	border-bottom: 1px solid var(--jk-line) !important;
	padding: 14px 0 !important;
}
.woocommerce-cart .cart_totals table.shop_table tr.order-total :is(th, td) {
	border-bottom: 0 !important;
	padding-top: 18px !important;
	font-size: 20px;
}
/* Dòng vận chuyển đang là 3 mẩu chữ dồn về phải, đọc rối. Cho về canh trái, xuống dòng gọn.
   CHỈ desktop: trên điện thoại cột nhãn bị ẩn và nhãn "Shipping:" là ::before thả trôi
   bên trái — ép canh trái nữa thì giá trị đè lên chính cái nhãn đó. */
@media (min-width: 769px) {
	.woocommerce-cart .cart_totals tr.shipping td {
		text-align: left !important;
		font-size: 16px;
		color: var(--jk-muted);
	}
	.woocommerce-cart .cart_totals tr.shipping td :is(p, .woocommerce-shipping-destination) { margin: 6px 0 0; font-size: 15px; }

	/* Chữ "Shipping" và dòng "Free shipping (VN)" bên phải KHÔNG cùng một hàng ngang.
	   Đo ra lệch 5,3px trong khi dòng Subtotal ngay trên nó khớp tuyệt đối (cùng 281px).
	   Vì sao: hai ô đều `vertical-align:top` nên MÉP TRÊN Ô bằng nhau, nhưng chữ bên
	   trái là 17px còn bên phải 15px — cỡ chữ khác nhau thì đường chân chữ nằm ở hai
	   độ cao khác nhau bên trong cùng một mép trên. Ép chiều cao dòng bằng nhau KHÔNG
	   cứu được, vì lệch đến từ cỡ chữ chứ không phải chiều cao dòng.

	   Sửa đúng gốc: cho tên phương thức vận chuyển ĐÚNG cỡ chữ của nhãn bên trái.
	   Vốn dĩ nó cũng nên vậy — nó là GIÁ TRỊ của dòng Shipping, ngang vai với "$1,028"
	   của dòng Subtotal; còn "Shipping options will be updated…" và "Calculate shipping"
	   mới là chữ phụ, giữ 15px xám. */
	.woocommerce-cart .cart_totals tr.shipping td ul#shipping_method,
	.woocommerce-cart .cart_totals tr.shipping td ul#shipping_method li {
		margin: 0;
		/* !important, và đây là lý do — không phải lười.
		   WooCommerce in ra:
		       ul#shipping_method li:not(.elementor-widget-woocommerce-cart #shipping_method li)
		   `:not()` mang theo độ ưu tiên của thứ NẶNG NHẤT bên trong nó, mà bên trong có
		   một #id nữa → chuỗi đó tính ra HAI id. Chuỗi của mình dài gấp đôi (1 id + 3 class
		   + 5 thẻ) nhưng chỉ có một id nên vẫn thua. Viết dài thêm cũng vô ích, phải
		   !important mới qua được.
		   Hệ quả nhìn thấy được: `padding:.25em 0` đẩy tên phương thức xuống 3,75px, nên
		   "Free shipping" luôn thấp hơn chữ "Shipping" bên trái đúng ngần ấy. */
		padding: 0 !important;
		/* Luật đó của Woo là một cặp TREO LỀ: `padding-left:22px` + `text-indent:-22px`,
		   để nút radio thò ra ngoài lề chữ. Gỡ padding mà quên text-indent thì cái âm
		   22px còn lại một mình và kéo tên phương thức ra NGOÀI lề — 2026-08-09 đo được
		   label ở x=17 trong khi mọi dòng khác ở x=39. Phải gỡ cả cặp, và cũng phải
		   `!important` vì cùng chuỗi hai-id đó. */
		text-indent: 0 !important;
		list-style: none;
	}
	.woocommerce-cart .cart_totals tr.shipping td ul#shipping_method label {
		font-size: var(--jk-fs-body);
		font-weight: 500;
		line-height: 1.5;
		color: var(--jk-ink);
	}
}

/* Trên điện thoại dòng vận chuyển là chỗ xấu nhất của bảng tổng: nhãn "Shipping:" thả
   TRÔI bên trái (Woo cho `::before` một `float:left`), còn ba mẩu nội dung dồn về phải
   và tự ngắt dòng — thành một khối chữ răng cưa mép trái, không thẳng với gì cả.
   Trước đây không dám ép canh trái vì giá trị sẽ ĐÈ lên chính cái nhãn thả trôi đó.
   Gỡ đúng chỗ: bỏ `float` của nhãn và cho nó một dòng riêng — hết trôi thì hết đè,
   và cả cụm canh trái gọn thành 4 dòng đọc từ trên xuống.
   CHỈ dòng shipping. Subtotal/Total vẫn nhãn-trái / số-phải, đó là cách đọc đúng cho
   một con số tiền. */
@media (max-width: 768px) {
	.woocommerce-cart .cart_totals table.shop_table tr.shipping td { text-align: left !important; }
	.woocommerce-cart .cart_totals table.shop_table tr.shipping td::before {
		float: none;
		display: block;
		margin: 0 0 6px;
	}
	.woocommerce-cart .cart_totals table.shop_table tr.shipping td ul#shipping_method,
	.woocommerce-cart .cart_totals table.shop_table tr.shipping td ul#shipping_method li {
		margin: 0;
		padding: 0 !important;   /* xem giải thích ở bản desktop phía trên */
		text-indent: 0 !important;  /* cặp treo lề của Woo — gỡ padding thì phải gỡ cả cái này */
		list-style: none;
	}
	.woocommerce-cart .cart_totals table.shop_table tr.shipping td ul#shipping_method label {
		font-size: var(--jk-fs-body);
		font-weight: 500;
		color: var(--jk-ink);
	}
	.woocommerce-cart .cart_totals tr.shipping td .woocommerce-shipping-destination,
	.woocommerce-cart .cart_totals tr.shipping td p { margin: 6px 0 0; }
}

/* Bảng tổng dính theo màn khi cuộn (chỉ desktop, và chỉ khi đủ chỗ).
   Ngưỡng 993 → 1200 ngày 2026-08-09: dưới 1200px hai cột đã xếp dọc (xem
   JK-CART-WIDTH ở cuối file), thẻ tổng nằm DƯỚI bảng nên dính theo màn vừa vô
   nghĩa vừa dễ đè lên khối "You may also like" ngay bên dưới nó. */
@media (min-width: 1200px) {
	.woocommerce-cart .cart-collaterals .cart_totals { position: sticky; top: 96px; }
}

/* ---- Khối hành động dưới bảng tổng ----
   Trước: dưới con số TỔNG là một mảng trắng 54px rồi mới tới một cái NÚT VIỀN nhỏ
   "Have a coupon?" nằm lệch trái, dưới nữa mới tới nút đỏ. Ba thứ rời rạc, ở giữa
   thì trống. Hai chuyện phải sửa cùng lúc:

   1. "Have a coupon?" là một LỐI RẼ, không phải hành động chính. Cho nó là CHỮ có
      gạch chân (chữ = "bấm được nhưng không quan trọng"), thay vì cái nút viền —
      nút viền cạnh nút đỏ đọc thành "hai lựa chọn ngang nhau".
   2. Chỗ trống không lấp bằng cách nhồi thêm thứ gì vào, mà bằng một VẠCH NGĂN:
      cùng một khoảng cách, có vạch thì đọc ra "hết phần tính tiền, sang phần bấm",
      không vạch thì đọc ra "quên chưa điền gì đó".
   Astra dùng #ast-coupon-trigger cho CẢ giỏ lẫn thanh toán (form coupon gốc của Woo
   bị nó ẩn đi), nên phải nhắm cả hai trang. */
.woocommerce-cart #ast-coupon-trigger,
.woocommerce-checkout #ast-coupon-trigger,
.woocommerce-checkout .woocommerce-form-coupon-toggle .showcoupon {
	display: inline-block;
	margin: 0 !important;
	padding: 0 !important;
	border: 0 !important;
	background: none !important;
	font-size: 15px;
	line-height: 1.4;
	color: var(--jk-muted) !important;
	text-decoration: underline !important;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
	text-decoration-color: #C9C9C9;
	cursor: pointer;
	transition: color .15s ease;
}
.woocommerce-cart #ast-coupon-trigger:hover,
.woocommerce-checkout #ast-coupon-trigger:hover,
.woocommerce-checkout .woocommerce-form-coupon-toggle .showcoupon:hover {
	color: var(--jk-ink) !important;
	text-decoration-color: currentColor;
}
/* Ở giỏ hàng, Astra nhét khối coupon vào TRONG .wc-proceed-to-checkout, ngay trên
   nút đỏ — nên vạch ngăn phải đặt ở khối bọc chứ không phải ở nút. */
.woocommerce-cart .wc-proceed-to-checkout {
	padding: 18px 0 0;
	margin-top: 18px;
	border-top: 1px solid var(--jk-line);
}
.woocommerce-cart #ast-checkout-coupon { margin: 0 0 16px; }

/* "Tiếp tục xem hàng" — đang không có đường nào quay lại ngoài menu trên cùng.
   Canh TRÁI, không canh giữa: nó với "Have a coupon?" là hai link phụ của cùng một
   khối, mà một cái canh trái một cái canh giữa thì đọc ra hai mép lề trong cùng
   một ô — chính là thứ làm khối này trông chắp vá. */
.woocommerce-cart .jk-keep-shopping {
	display: block;
	margin: 14px 0 0;
	text-align: left;
	font-size: 15px;
	color: var(--jk-muted);
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
	text-decoration-color: #C9C9C9;
}
.woocommerce-cart .jk-keep-shopping:hover { color: var(--jk-ink); text-decoration-color: currentColor; }

/* ============================ TRANG THANH TOÁN ============================ */

/* Astra "modern checkout" xếp địa chỉ thành hàng 2 ô (`ast-column-50`) và 3 ô
   (`ast-column-33`) ở MỌI bề ngang — không có media query nào. Ở máy bàn rộng thì đẹp,
   nhưng từ 769px trang thanh toán đã chia hai cột (form trái, "Your order" phải) nên cột
   form co lại còn 401–583px, và mỗi ô chỉ còn 112–175px.
   Đo 2026-08-28 trên giỏ 3 món: **4 ô bị cắt mất chữ gợi ý** ở khổ 769–820 (House number
   and street name · Apartment, suite, etc. · Postcode / ZIP · Town / City), 2–3 ô ở khổ
   900–1100, hết hẳn từ 1180px. Dính: iPad dọc (820), iPad Pro 11" dọc (834), máy gập mở
   ra (924/984), iPad Pro 12.9 dọc (1024), iPad mini ngang (1133) và cả laptop nhỏ.
   Khách không đọc được ô đang hỏi gì, ngay trên trang trả tiền.
   Trả các ô đó về nguyên hàng trong đúng dải hẹp; từ 1180px giữ y như cũ. `body` ở đầu để
   thắng độ ưu tiên của Astra (0,5,1 → 0,5,2) mà không cần !important. */
@media (min-width: 769px) and (max-width: 1179px){
	body.ast-modern-checkout .woocommerce form.woocommerce-checkout .form-row.ast-column-50,
	body.ast-modern-checkout .woocommerce form.woocommerce-checkout .form-row.ast-column-33 { width: 100%; }
}

.woocommerce-checkout #customer_details .col-1 { padding: var(--jk-card-pad); }
.woocommerce-checkout #ast-order-review-wrapper { padding: var(--jk-card-pad); }

/* Vạch mảnh ngăn từng phần trong thẻ form, thay cho việc mọi thứ dính liền nhau */
.woocommerce-checkout #customer_details .col-1 > .woocommerce-billing-fields {
	margin-top: 22px;
	padding-top: 22px;
	border-top: 1px solid var(--jk-line);
}
.woocommerce-checkout #order_review_heading {
	margin: 0 0 18px !important;
	padding: 0 0 16px;
	border-bottom: 1px solid var(--jk-line);
}
/* Astra cho #order_review nền + viền riêng → thành "thẻ trong thẻ". Làm phẳng nó đi,
   thẻ ngoài (#ast-order-review-wrapper) mới là khung. */
.woocommerce-checkout #order_review {
	background: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	padding: 0 !important;
	box-shadow: none !important;
}
/* Tiêu đề từng phần: bỏ gạch chân riêng của nó. Gạch đó chỉ dài bằng chữ (Astra để
   h3 co theo nội dung) nên trông như vẽ dở; vả lại mỗi phần đã có vạch ngăn ở trên rồi. */
.woocommerce-checkout #customer_details .col-1 h3,
.woocommerce-checkout .ast-checkout-form-heading h3 { border-bottom: 0 !important; }

.woocommerce-checkout #order_review table.shop_table :is(th, td) {
	border: 0 !important;
	border-bottom: 1px solid var(--jk-line) !important;
	padding: 14px 0 !important;
	background: none !important;
}
.woocommerce-checkout #order_review table.shop_table tfoot tr.order-total :is(th, td) {
	border-bottom: 0 !important;
	font-size: 20px;
	padding-top: 18px !important;
}
/* Khối tóm tắt đơn dính theo màn — form dài hơn 1100px, cuộn xuống là mất hút số tiền. */
@media (min-width: 993px) {
	.woocommerce-checkout #ast-order-review-wrapper { position: sticky; top: 96px; }
}

/* Khối thanh toán: nền chìm, bo tròn, tách khỏi phần điền thông tin */
.woocommerce-checkout #payment {
	margin-top: 24px;
	padding: 20px;
	border: 1px solid var(--jk-line) !important;
	border-radius: var(--jk-r-panel) !important;  /* 14px: nhỏ hơn thẻ ngoài 20px */
	background: var(--jk-soft) !important;
}
.woocommerce-checkout #payment ul.payment_methods {
	border: 0 !important;
	padding: 0 !important;
	margin: 0 0 16px !important;
	background: none !important;
}
/* Chỉ bọc thẻ cho cổng thanh toán THẬT (li.wc_payment_method). Khi không có cổng nào,
   Woo nhét một hộp thông báo vào <li> trần — bọc nữa thành hộp lồng hộp.
   Hàng cao 81px cho MỘT dòng chữ là quá dày — chỉ có tên cổng, không có gì để đọc thêm. */
/* ⚠️ Nút tròn KHÔNG nằm trong <label> — Woo in ra ba anh em ngang hàng trong <li>:
       <input type=radio> <label> <div class="payment_box">
   Nên `align-items:center` đặt trên label chẳng canh được gì cho cái nút tròn, và
   `vertical-align:middle` chỉ canh theo giữa chữ x + nửa — đo ra vẫn LỆCH 1px, đủ để
   nhìn ra "dấu chọn với chữ không thẳng hàng".
   Cho cả HÀNG thành flex thì hai thứ mới thật sự cùng một trục; khung mô tả chiếm trọn
   một dòng riêng bên dưới nhờ `flex-basis:100%`. (Mặc định Woo/Astra để `inline-table`.) */
.woocommerce-checkout #payment ul.payment_methods li.wc_payment_method {
	display: flex !important;
	flex-wrap: wrap;
	align-items: center;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff;
	border: 1px solid var(--jk-line);
	padding: 11px 16px !important;
	margin: 0 0 8px !important;
	transition: border-color .15s ease;
}
.woocommerce-checkout #payment ul.payment_methods li.wc_payment_method:last-child { margin-bottom: 0 !important; }
/* Astra cho <label> của cổng padding riêng → hàng phình thêm ~10px mà không thấy gì. */
.woocommerce-checkout #payment ul.payment_methods label {
	flex: 1 1 auto;
	padding: 0 !important;
	margin: 0 !important;
	font-size: var(--jk-fs-body) !important;
	line-height: 1.35 !important;
	min-height: 0 !important;
}
/* Logo cổng (PayPal, thẻ…) Woo thả vào <li> — không khoá chiều cao thì mỗi cổng một cỡ. */
.woocommerce-checkout #payment ul.payment_methods li.wc_payment_method > img,
.woocommerce-checkout #payment ul.payment_methods label img {
	max-height: 22px;
	width: auto;
	margin: 0 0 0 8px;
	flex: 0 0 auto;
}
.woocommerce-checkout #payment ul.payment_methods li.wc_payment_method:hover { border-color: #C9C9C9; }
.woocommerce-checkout #payment ul.payment_methods li:not(.wc_payment_method) {
	padding: 0 !important;
	margin: 0 !important;
	background: none !important;
	border: 0 !important;
}
/* Khung mô tả của cổng đang chọn ("Pay via PayPal.").
   ⚠️ `width` PHẢI đặt lại. Astra viết `width: calc(100% + 30px)` kèm `margin-left:-15px`
   để khung này TRÀN hết bề ngang trong thiết kế danh sách phẳng của nó. Thiết kế của mình
   bọc mỗi cổng trong một thẻ trắng, nên cái tràn đó thò ra ngoài thẻ **13px bên phải**.
   Lần trước chỉ đè `margin` (bỏ cú kéo trái -15px) mà quên `width`, nên nó vẫn thừa 30px —
   sửa nửa vời còn khó thấy hơn là để nguyên, vì mất luôn dấu hiệu đối xứng. */
.woocommerce-checkout #payment div.payment_box {
	width: 100% !important;
	box-sizing: border-box;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-soft) !important;
	margin: 10px 0 2px !important;
	padding: 14px 16px !important;
	font-size: var(--jk-fs-sm) !important;
	line-height: 1.55;
	color: var(--jk-muted) !important;
}
.woocommerce-checkout #payment div.payment_box p:last-child { margin-bottom: 0; }
.woocommerce-checkout #payment div.payment_box::before { display: none !important; } /* mũi tên nhọn của Woo */
.woocommerce-checkout #payment .place-order { padding: 0 !important; margin: 0; }

/* ---- Nút tròn chọn cổng thanh toán ----
   Đây là chỗ DUY NHẤT trên trang còn màu xanh dương: nút tròn mặc định của trình duyệt,
   13×13, `accent-color: auto`. Ô tick đã vẽ lại từ lâu nhưng nút tròn thì bỏ sót, vì bản
   test không bật cổng nào nên chưa bao giờ có cái nút tròn nào để mà nhìn thấy. */
.woocommerce-checkout #payment input[type="radio"] {
	-webkit-appearance: none !important;
	appearance: none !important;
	width: 20px !important;
	height: 20px !important;
	min-width: 20px;
	margin: 0 12px 0 0 !important;
	padding: 0 !important;
	flex: 0 0 20px;
	/* 2px chứ không phải 1,5px: nét nửa pixel trên một vòng tròn 20px bị khử răng cưa
	   không đều, nhìn ra vòng tròn "méo" chứ không phải mảnh. */
	border: 2px solid #C9C9C9 !important;
	border-radius: 50% !important;
	background: #fff !important;
	box-shadow: none !important;
	cursor: pointer;
	position: relative;
	transition: border-color .12s ease;
}
.woocommerce-checkout #payment input[type="radio"]:hover { border-color: var(--jk-ink) !important; }
.woocommerce-checkout #payment input[type="radio"]:checked {
	border-color: var(--jk-red) !important;
	border-width: 6px !important;   /* viền dày = cái chấm giữa, không cần thêm phần tử */
}
.woocommerce-checkout #payment ul.payment_methods label {
	display: inline-flex;
	align-items: center;
	margin: 0;
	font-size: var(--jk-fs-body);
	font-weight: 500;
	color: var(--jk-ink);
	cursor: pointer;
}

/* ---- Nút vàng của PayPal ----
   PayPal bơm nút của nó vào `.ppc-button-wrapper` nằm NGOÀI `#payment`, ngay dưới khung xám.

   Đợt 2026-08-08 (vòng 2) cho nó `padding: 0 21px` để thẳng hàng với nút "Place order"
   nằm BÊN TRONG khung xám (khung có `padding:20px` + viền 1px). Nhìn lại thì căn nhầm mốc:
   khi khách chọn PayPal — và PayPal là cổng mặc định — thì chính nút "Place order" bị
   PayPal ẩn đi, nên nút vàng thụt vào 21px so với MỌI thứ còn nhìn thấy được (khung xám
   604px, các ô nhập bên trên cũng vậy) mà không thẳng hàng với gì cả. Đo trên prod:
   khung xám `x 148..751`, nút vàng `x 168..731` — hụt đúng 20px mỗi bên.

   Nay bỏ thụt: nút vàng nằm NGOÀI khung nên lấy mép khung làm mốc, giống mọi khối khác
   trong cột. Nút "Place order" vẫn thụt — đúng, vì nó nằm TRONG một cái khung có lề.
   (Trang giỏ hàng không dính luật này: ở đó nút vàng đã trùng khít nút đỏ, 306px cả hai.) */
.woocommerce-checkout .ppc-button-wrapper {
	margin-top: 14px;
	padding: 0;
}

/* ==================== Ô CHỌN QUỐC GIA (select2) ====================
   Ô "Country / Region" dùng select2, và select2 vẽ danh sách bằng markup RIÊNG của
   nó chứ không phải <select> của trình duyệt — nên nó mang nguyên kiểu mặc định của
   thư viện vào giữa trang: rê tới nước nào là nước đó XANH DƯƠNG #007CBE, khung
   danh sách vuông, dán dính vào đáy ô nhập. Xanh dương là màu thứ tư, ngoài bảng
   ba tông của site.

   ⚠ BẪY: select2 gắn khung danh sách vào CUỐI <body> chứ không nằm trong form, nên
   `.woocommerce-checkout #customer_details .select2-…` KHÔNG bao giờ khớp. Phải nhắm
   qua class trên chính <body> (`body.woocommerce-checkout`) — lúc đó khung danh sách
   là con của body nên mới với tới được. Đo bằng `.closest('.select2-container').parentElement`
   → ra đúng BODY.

   Nhắm cả 3 trang có ô quốc gia: thanh toán, tính phí ship ở giỏ, sổ địa chỉ. */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-dropdown {
	padding: 6px !important;
	border: 1px solid var(--jk-line) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	box-shadow: 0 14px 34px -14px rgba(17, 17, 17, .28), 0 2px 6px rgba(17, 17, 17, .05) !important;
}
/* Tách khỏi ô nhập một nhịp — dính liền thì đọc thành "ô nhập bị kéo dài ra". */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-dropdown--below { margin-top: 6px; }
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-dropdown--above { margin-bottom: 6px; }

:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__option {
	padding: 9px 12px !important;
	border-radius: var(--jk-r-sm) !important;
	font-size: 16px !important;
	line-height: 1.4;
	color: var(--jk-ink) !important;
	background: transparent !important;
}
/* Đang rê tới / đang chọn bằng phím: XÁM, không xanh. */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__option--highlighted,
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__option--highlighted[aria-selected] {
	background: var(--jk-soft) !important;
	color: var(--jk-ink) !important;
}
/* Nước đang được chọn: đánh dấu bằng nét chữ, không bằng màu nền — nếu tô nền thì
   nó lẫn với mục đang rê tới, hai trạng thái khác nhau mà nhìn như một. */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__option[aria-selected="true"],
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__option[data-selected="true"] {
	font-weight: 600 !important;
}
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__options { max-height: 264px !important; }

/* Ô tìm trong danh sách */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-search--dropdown { padding: 0 0 6px !important; }
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-search__field {
	padding: 10px 12px !important;
	border: 1px solid #DCDCDC !important;
	border-radius: var(--jk-r-ctl) !important;
	font-size: 16px !important;
	box-shadow: none !important;
}
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-search__field:focus {
	border-color: var(--jk-ink) !important;
	outline: none !important;
}
/* Đang mở thì ô nhập giữ nguyên góc bo — select2 mặc định vuông hai góc dưới để
   "dán" vào danh sách, nhưng danh sách giờ đã tách rời nên vuông góc là thừa. */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-container--open .select2-selection {
	border-radius: var(--jk-r-ctl) !important;
}
/* Không có kết quả */
:is(.woocommerce-checkout, .woocommerce-cart, .woocommerce-account) .select2-results__message {
	padding: 10px 12px !important;
	font-size: 15px !important;
	color: var(--jk-muted) !important;
}

/* ============================ THÔNG BÁO ============================ */
/* Hộp "đã thêm vào giỏ" đang có gạch đen dày trên đầu + viền focus xanh của trình
   duyệt (Woo tự đưa con trỏ vào để trình đọc màn hình đọc lên). Nhìn ra hộp BÁO LỖI
   chứ không phải báo thành công. */
/* Woo neo biểu tượng bằng position:absolute (left:1.5em) tính theo padding-left 3.5em
   của nó. Mình rút padding xuống → biểu tượng đè lên chữ. Chuyển cả hộp sang flex và
   cho biểu tượng thành một ô đứng cạnh, không còn phụ thuộc padding nữa. */
/* .woocommerce-notices-wrapper: hộp "đã thêm vào giỏ" hiện nhiều nhất ở TRANG SHOP
   chứ không phải trong giỏ — gộp luôn để cả site cùng một kiểu thông báo. */
.woocommerce-notices-wrapper :is(.woocommerce-message, .woocommerce-info, .woocommerce-error),
.woocommerce-cart :is(.woocommerce-message, .woocommerce-info, .woocommerce-error),
.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info, .woocommerce-error) {
	display: flex !important;
	align-items: center;
	gap: 12px;
	border: 1px solid var(--jk-line) !important;
	border-top: 1px solid var(--jk-line) !important;
	border-left: 3px solid var(--jk-ink) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-soft) !important;
	padding: 16px 18px !important;
	color: var(--jk-ink);
	font-size: var(--jk-fs-body);
	line-height: 1.5;
}
.woocommerce-notices-wrapper :is(.woocommerce-message, .woocommerce-info, .woocommerce-error)::before,
.woocommerce-cart :is(.woocommerce-message, .woocommerce-info, .woocommerce-error)::before,
.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info, .woocommerce-error)::before {
	position: static !important;
	top: auto !important;
	left: auto !important;
	margin: 0 !important;
	flex: 0 0 auto;
}
/* Nút "View cart" nằm TRƯỚC chữ trong DOM — đẩy nó về cuối hàng. */
.woocommerce-notices-wrapper :is(.woocommerce-message, .woocommerce-info) a.button,
.woocommerce-cart :is(.woocommerce-message, .woocommerce-info) a.button,
.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info) a.button {
	order: 9;
	margin-left: auto !important;
	flex: 0 0 auto;
}
/* Thông báo thường (thành công / thông tin) đi tông XÁM. Đỏ để dành cho lỗi và cho
   nút hành động — thấy đỏ là phải có chuyện, không phải để trang trí. */
/* Ô "Have a coupon?" của Woo cũng mang class .woocommerce-info nhưng nó không phải
   thông báo — nó là một nút. Kéo nó ra khỏi kiểu hộp xanh ở trên. */
.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info {
	display: inline-flex !important;
	align-items: center;
	gap: 8px;
	width: auto;
	margin: 0 0 4px !important;
	padding: 10px 16px !important;
	border: 1px solid #DCDCDC !important;
	border-left: 1px solid #DCDCDC !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	font-size: 16px;
	transition: border-color .15s ease, background .15s ease;
}
.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info::before { display: none !important; }
.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info:hover {
	border-color: var(--jk-ink) !important;
	background: var(--jk-soft) !important;
}
.woocommerce-checkout .woocommerce-form-coupon-toggle .showcoupon {
	color: var(--jk-ink) !important;
	text-decoration: underline !important;
	text-underline-offset: 3px;
}
.woocommerce-notices-wrapper .woocommerce-error,
.woocommerce-cart .woocommerce-error,
.woocommerce-checkout .woocommerce-error {
	border: 1px solid var(--jk-line) !important;
	border-left: 3px solid var(--jk-red) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red-tint) !important;
	padding: 16px 18px !important;
}
.woocommerce-notices-wrapper .woocommerce-error::before,
.woocommerce-cart .woocommerce-error::before,
.woocommerce-checkout .woocommerce-error::before { color: var(--jk-red) !important; }
/* Astra để sẵn một thẻ báo lỗi RỖNG trên trang thanh toán (.ast-customer-info__notice,
   chỉ đổ chữ vào khi đăng nhập lỗi). Kiểu hộp ở trên làm cái rỗng đó hiện ra thành một
   ô đỏ không chữ ngay đầu form. Hộp rỗng thì không hiện. */
.woocommerce-notices-wrapper :is(.woocommerce-message, .woocommerce-info, .woocommerce-error):empty,
.woocommerce-cart :is(.woocommerce-message, .woocommerce-info, .woocommerce-error):empty,
.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info, .woocommerce-error):empty {
	display: none !important;
}

/* Bỏ viền focus trên chính hộp thông báo — Woo focus nó bằng tabindex="-1" chỉ để
   trình đọc màn hình đọc, người nhìn thấy thì tưởng lỗi. */
.woocommerce-message:focus,
.woocommerce-info:focus,
.woocommerce-error:focus { outline: none !important; }
/* Nút trong hộp thông báo (View cart) — bo tròn, chìm lại, không tranh với nút chính */
.woocommerce-cart .woocommerce-message a.button,
.woocommerce-checkout .woocommerce-message a.button {
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	color: var(--jk-ink) !important;
	border: 1px solid #DCDCDC !important;
	padding: 9px 18px !important;
	font-weight: 500 !important;
}
.woocommerce-cart .woocommerce-message a.button:hover,
.woocommerce-checkout .woocommerce-message a.button:hover { border-color: var(--jk-ink) !important; }

/* Mục lớn trong nội dung — giữ nguyên CỠ CHỮ của h1 sau khi hạ thẻ xuống h2. 2026-08-28
   Khuôn nội dung sản phẩm/bài dùng `wp:heading {"level":1}` cho tiêu đề mục lớn ("Gallery",
   "Group-buy information"), nên 78 trang công khai đang có HAI h1: một của tiêu đề bài, một
   của mục. Rà SEO 28/08 bắt đúng chỗ này. Hạ xuống h2 là việc của thẻ, KHÔNG phải việc của
   thiết kế — nên class này trả lại đúng cỡ chữ h1 ở cả ba nấc của Astra, đo trên bản test:
   ≥769px 40px · 545–768px 34px · ≤544px 29px (line-height 1.4em ở mọi nấc).
   Đặt class bằng ô "Additional CSS class" của khối, không nhét style vào nội dung. */
.entry-content h2.jk-muc-lon { font-size: 40px; line-height: 1.4em; }
@media (max-width: 768px) { .entry-content h2.jk-muc-lon { font-size: 34px; } }
@media (max-width: 544px) { .entry-content h2.jk-muc-lon { font-size: 29px; } }

/* ============================ ĐIỆN THOẠI ============================ */
@media (max-width: 768px) {
	:root { --jk-card-pad: 18px; }

	/* Trên điện thoại Astra gấp phần "Your order" vào thanh "Show Order Summary" ở đầu
	   trang, #ast-order-review-wrapper chỉ còn là mẩu rỗng 134×38 nằm dưới đáy. Kiểu thẻ
	   ở trên vẽ nó thành một cục trắng bo tròn lơ lửng. Trả nó về trong suốt. */
	.woocommerce-checkout #ast-order-review-wrapper {
		background: none !important;
		border: 0 !important;
		border-radius: 0 !important;
		box-shadow: none !important;
		padding: 0 !important;
	}

	/* Thẻ món trong giỏ (layout mobile do JK-CART-MOBILE dựng) — bo tròn theo bộ mới */
	.woocommerce-cart .woocommerce-cart-form table.cart tr.cart_item {
		border-radius: var(--jk-r-card);
	}
	.woocommerce-cart .woocommerce-cart-form td.product-thumbnail img {
		border-radius: var(--jk-r-thumb);
	}
	/* Nút chính chạm được thoải mái */
	.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,
	.woocommerce-checkout #place_order { min-height: 56px !important; font-size: 18px !important; }
}
/* Ở 375px, hàng địa chỉ bị chia 2–3 cột nên chữ gợi ý cụt hết: "Postcode / Z…",
   "House number ar…", "Town / Cit…". Astra chia bằng .ast-column-50 / .ast-column-33
   (không phải form-row-first/last của Woo) — phải nhắm đúng hai class đó. */
@media (max-width: 600px) {
	.woocommerce-checkout .woocommerce-billing-fields .form-row.ast-column-50,
	.woocommerce-checkout .woocommerce-billing-fields .form-row.ast-column-33,
	.woocommerce-checkout .woocommerce-shipping-fields .form-row.ast-column-50,
	.woocommerce-checkout .woocommerce-shipping-fields .form-row.ast-column-33 {
		width: 100% !important;
		flex: 0 0 100% !important;
		max-width: 100% !important;
	}
}

/* Giỏ hàng trên điện thoại: bảng rộng 377px trong khung 335px → nút xoá (×) bị cắt
   mất một nửa ở mép phải. Do <tr> chuyển display:block mà padding không tính vào
   chiều rộng. */
@media (max-width: 768px) {
	/* width:100% một mình KHÔNG đủ: bảng luôn nở ra bằng nội dung tối thiểu, mà mỗi
	   hàng đang có 138px padding ngang (chừa chỗ cho ảnh neo tuyệt đối). Chuyển bảng
	   và tbody sang display:block thì chúng mới chịu nghe width như một khối thường.
	   Hàng vốn đã là display:block sẵn nên không đổi cách xếp. */
	.woocommerce-cart .woocommerce-cart-form table.cart,
	.woocommerce-cart .woocommerce-cart-form table.cart tbody {
		display: block !important;
		width: 100% !important;
		max-width: 100% !important;
	}
	.woocommerce-cart .woocommerce-cart-form table.cart :is(tr.cart_item, td) {
		box-sizing: border-box !important;
		max-width: 100%;
	}
	.woocommerce-cart .woocommerce-cart-form table.cart tr.cart_item { width: 100% !important; }

	/* Hộp thông báo hẹp: cho nút xuống hàng riêng thay vì ép chung một hàng */
	.woocommerce-cart :is(.woocommerce-message, .woocommerce-info),
	.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info) { flex-wrap: wrap; }
	.woocommerce-cart :is(.woocommerce-message, .woocommerce-info) a.button,
	.woocommerce-checkout :is(.woocommerce-message, .woocommerce-info) a.button { margin-left: auto !important; }
}
/* JK-CC END */


/* ============================================================================
   JK-SHOP START — LƯỚI DANH MỤC SẢN PHẨM (/shop/, /product-category/*). 2026-08-08
   ============================================================================
   Đã đo trước khi sửa, và ba con số nói hết vấn đề:

     · khung 1240px → cột sản phẩm 840px, cột bên 360px (29%);
     · nhưng `ul.products` chỉ rộng 779px — Astra xếp bằng flex với margin-phải
       CỐ ĐỊNH 20px, nên 61px cuối cột bỏ không, không cách nào lấp;
     · ảnh vì thế còn 246px trên màn 1440, trong khi file gốc là 500×500.

   Nói cách khác: 34% chiều ngang trang dành cho điều hướng, còn hàng hoá — thứ
   Jelly Key bán bằng hình ảnh — bị bóp xuống 246px. Ở đây đổi ba thứ: chia lại bề
   ngang, thay flex bằng lưới thật, và bo ảnh theo bộ biến chung.
   ---------------------------------------------------------------------------- */

/* --- 1. Chia lại bề ngang -------------------------------------------------
   Astra khai `#primary{width:70%}` / `#secondary{width:30%}` bằng CSS inline của
   Customizer (in SAU file này), nên phải thắng bằng ĐỘ ƯU TIÊN chứ không phải thứ
   tự: thêm class của <body> là (1,1,0) so với (1,0,0). Không cần !important.
   Chỉ áp cho trang lưới shop — `ast-woo-shop-archive` không có ở trang khác. */
@media (min-width: 769px) {
	body.ast-woo-shop-archive #primary   { width: 78%; padding-right: 46px; }
	body.ast-woo-shop-archive #secondary { width: 22%; }
}
/* Máy tính bảng (769–1199px): 22% chỉ còn ~167px — tên danh mục và số đếm tách làm hai
   dòng. Trả cột bên về 28% và hạ lưới xuống 2 cột: ở bề ngang này 3 cột ra ảnh 151px,
   nhỏ hơn cả bản gốc trước khi sửa. 2 cột cho ảnh ~240–390px. */
@media (min-width: 769px) and (max-width: 1199px) {
	body.ast-woo-shop-archive #primary   { width: 72%; padding-right: 34px; }
	body.ast-woo-shop-archive #secondary { width: 28%; }
	/* KHÔNG có `.woocommerce` ở giữa: class đó nằm trên chính <body> (xem bẫy ở mục 9) */
	body.ast-woo-shop-archive ul.products,
	body.ast-woo-shop-archive ul.products[class*="columns-"] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
/* KHÔNG nới `.ast-container` rộng hơn 1240px: thanh header (`.jk-head__bar`) khoá ở
   1240, nới riêng phần thân thì hàng hoá tràn ra ngoài mép logo và mép menu — nhìn
   ra lỗi chứ không ra rộng rãi. Bề ngang lấy thêm được là lấy từ cột bên (30%→22%)
   và từ rãnh giữa hai cột (60px→46px), không phải từ khung. */

/* --- 2. Lưới thật thay cho flex + margin cố định --------------------------
   Số cột đọc từ chính class `columns-N` mà Woo đã in sẵn, nên luật này dùng chung
   được cho cả sản phẩm liên quan và "You may also like" ở giỏ (đang là 4 cột) mà
   không phải viết riêng. */
.woocommerce ul.products {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 36px 22px;
	margin: 0;
}
/* BẪY: WooCommerce có clearfix `ul.products::before/::after{content:" ";display:table}`
   để dọn float. Khi container thành grid thì hai cái giả này BIẾN THÀNH Ô LƯỚI THẬT —
   ::before chiếm ô đầu, ::after chiếm ô cuối, cả lưới lệch đi một ô. Nhìn ảnh render
   thì thấy ngay: hàng đầu trống ô số 1, hàng cuối thừa ra một mình. */
.woocommerce ul.products::before,
.woocommerce ul.products::after { content: none; }
.woocommerce ul.products.columns-1 { grid-template-columns: minmax(0, 1fr); }
.woocommerce ul.products.columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.woocommerce ul.products.columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.woocommerce ul.products.columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
/* Astra vẫn khai width/margin cho từng ô — để nguyên thì ô lưới lại bị bóp về 246px */
.woocommerce ul.products li.product {
	width: auto !important;
	margin: 0 !important;
	float: none !important;
	clear: none !important;
}

/* --- 3. Ảnh sản phẩm ------------------------------------------------------ */
.woocommerce ul.products li.product .astra-shop-thumbnail-wrap {
	position: relative;
	border-radius: var(--jk-r-media);
	overflow: hidden;
	background: var(--jk-soft);
}

/* --- 4. Nhãn tình trạng trên ảnh -----------------------------------------
   Xem chú thích ở functions.php cho lý do nghiệp vụ. Màu vẫn đúng ba tông: mặc
   định là chip trắng mờ chữ xám; riêng "In stock" nền mực để nó bật hẳn lên —
   đó là thứ khách đang tìm. Không dùng đỏ: đỏ để dành cho hành động và lỗi. */
.jk-tag {
	position: absolute; top: 10px; left: 10px; z-index: 3;
	display: inline-flex; align-items: center;
	height: 26px; padding: 0 10px;
	border-radius: var(--jk-r-pill);
	font-size: 13px; font-weight: 700; letter-spacing: 0;   /* JK-CASE: thôi in hoa, bù 1px */
	background: rgba(255, 255, 255, .92); color: var(--jk-muted);
	border: 1px solid rgba(17, 17, 17, .08);
	-webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
	pointer-events: none; /* nhãn không được chắn cú bấm vào ảnh */
}
.jk-tag--in { background: var(--jk-ink); color: #fff; border-color: var(--jk-ink); }

/* --- 5. Chữ trên thẻ ------------------------------------------------------
   Tên nằm SÁT ảnh (9px) chứ không thả rơi 14px: xa quá thì nó đọc ra một dòng chữ
   riêng lẻ chứ không phải nhãn của tấm ảnh ngay trên. */
.woocommerce ul.products li.product .astra-shop-summary-wrap { padding-top: 9px; }
.woocommerce ul.products li.product .woocommerce-loop-product__title {
	font-size: 17px; font-weight: 500; line-height: 1.45; margin: 0;
}

/* --- 6. Đầu trang: đường dẫn lên TRƯỚC tiêu đề ----------------------------
   Thứ tự trong HTML đang là tiêu đề → mô tả → đường dẫn, tức là chỉ cho biết
   "anh đang ở đâu" SAU khi đã đọc xong. Đổi bằng `order` chứ không đụng PHP.
   Canh trái cho khớp lưới bên dưới — trước đây canh giữa trong khi lưới canh trái. */
body.ast-woo-shop-archive .ast-archive-description {
	display: flex; flex-direction: column;
	text-align: left; max-width: none; padding-bottom: 26px;
}
/* Astra khai `.ast-breadcrumbs-wrapper{text-align:center}` bằng CSS inline (0,1,0);
   ba class ở đây là (0,3,0) nên thắng mà không cần !important. */
body.ast-woo-shop-archive .ast-archive-description .ast-breadcrumbs-wrapper {
	order: -1; text-align: left;
	/* Astra để sẵn `padding-bottom:20px` trên cái khung này. Đặt margin-bottom rồi tưởng
	   khe hở là 10px, thật ra là 30px — đo mới ra. Bỏ đệm đi thì margin mới nói thật. */
	padding-bottom: 0; margin: 0 0 6px;
	/* 18px là cỡ chữ nội dung — đường dẫn không phải nội dung, nó là cái biển chỉ đường.
	   Xuống 14px thì tiêu đề 34px mới ra tiêu đề. */
	font-size: 14px; line-height: 1.4;
}
body.ast-woo-shop-archive .ast-archive-description .ast-breadcrumbs-wrapper a,
body.ast-woo-shop-archive .ast-archive-description .ast-breadcrumbs-wrapper span { font-size: 14px; }
body.ast-woo-shop-archive .ast-archive-description .ast-breadcrumbs-wrapper a { color: var(--jk-muted); }
body.ast-woo-shop-archive .ast-archive-description .ast-breadcrumbs-wrapper a:hover { color: var(--jk-ink); }
body.ast-woo-shop-archive .ast-archive-description > p { max-width: 720px; margin: 10px 0 0; }

/* --- 7. Cột bên: cây danh mục --------------------------------------------
   Khối này là block Gutenberg `wc-block-product-categories`, KHÔNG phải widget
   `widget_product_categories` — mấy luật cũ ở JK-POLISH nhắm sai chỗ nên không
   ăn, đó là lý do cấp con vẫn còn dấu chấm đầu dòng. */
#secondary .wc-block-product-categories-list { list-style: none; margin: 0; padding: 0; }
#secondary .wc-block-product-categories-list-item { margin: 0 0 3px; line-height: 1.65; }
#secondary .wc-block-product-categories-list-item > a {
	font-size: 17px; color: var(--jk-ink); text-decoration: none;
	transition: color .15s ease;
}
#secondary .wc-block-product-categories-list-item > a:hover {  /* JK-HOVER */
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
#secondary .wc-block-product-categories-list-item-count { color: var(--jk-muted, #6A6A6A); font-size: 14px; }
/* Cấp con: thay dấu chấm bằng một nét dọc — nét gom cả nhóm lại, chấm thì rời rạc.
   Chấm KHÔNG phải list-style (đã là none) mà là `::before{content:"•"}` của block —
   đặt list-style:none không giết được nó, phải bắn thẳng vào pseudo. */
#secondary .wc-block-product-categories-list-item::before { content: none; }
#secondary .wc-block-product-categories-list--depth-1 {
	list-style: none; margin: 6px 0 12px; padding-left: 14px;
	border-left: 1px solid var(--jk-line);
}
#secondary .wc-block-product-categories-list--depth-1 > li > a { font-size: 16px; color: var(--jk-muted); }
#secondary .wc-block-product-categories-list-item-count { font-size: 15px; }
/* Danh mục đang xem (class do JS gắn) — trước đây không có gì cho biết đang ở đâu.
   2026-08-09: bỏ màu ĐỎ. Đỏ chỉ dành cho hành động chính và lỗi (mục 1 tài liệu thiết kế);
   một mục danh mục đang xem không phải hành động, cũng không phải lỗi. Đậm + màu mực đã đủ
   nổi giữa một cột chữ xám — cùng lý lẽ đã bỏ đỏ ở hover. */
#secondary a.jk-cat-current { color: var(--jk-ink); font-weight: 600; }

/* --- 8. Đám mây thẻ: gấp lại ---------------------------------------------
   45 viên, cao 717px, chiếm gần nửa cột bên trên MỌI trang shop. Không xoá (còn
   giá trị liên kết nội bộ cho SEO) — gấp lại còn ba hàng, ai cần thì bấm mở. */
#secondary .tagcloud.jk-tags--clip {
	max-height: 124px; overflow: hidden;
	-webkit-mask-image: linear-gradient(#000 62%, transparent);
	mask-image: linear-gradient(#000 62%, transparent);
}
/* Nút mở là MỘT VIÊN THẺ NỮA, chỉ khác màu — cùng cỡ, cùng đệm, cùng bo góc với đám
   thẻ nó đang gấp lại, nên nó đứng vào hàng chứ không chen ngang. Nền mực đặc để
   phân biệt: đây là cái bấm được, mấy viên kia là đường dẫn.
   Hai bản trước đều trượt: nút viền 14px/600 thì to hơn mọi viên thẻ, link gạch chân
   thì lại rơi hẳn ra ngoài hàng. */
.jk-tags__more {
	display: inline-block; margin: 8px 6px 8px 0; /* 8px trên: đám thẻ bị cắt ngang, không tự có khe */
	padding: 5px 12px;
	background: var(--jk-ink); border: 0; border-radius: 8px;
	font: inherit; font-size: 15px; font-weight: 500; color: #fff;
	line-height: inherit; text-decoration: none;
	cursor: pointer; transition: background .15s ease;
}
.jk-tags__more:hover { background: #3A3A3A; }

/* --- 9. Phân trang --------------------------------------------------------
   Ba lỗi: ô vuông (cả site đã bo tròn), mũi tên là ký tự "→" gõ thẳng trong HTML của
   WooCommerce nên nét mảnh hơn hẳn mọi thứ quanh nó, và nó dính sát hàng sản phẩm
   cuối. Luật ở JK-POLISH đặt bán kính 0 nên phải đè lại ở đây (file cùng một chỗ,
   luật này nằm sau). */
/* ⚠️ KHÔNG viết `body.ast-woo-shop-archive .woocommerce nav…`: class `woocommerce` nằm
   ngay trên chính <body>, nên nó không thể vừa là tổ tiên vừa là con cháu — luật đó
   không khớp gì cả và im lặng, không báo lỗi. Đã mất một vòng vì đúng chỗ này. */
body.ast-woo-shop-archive nav.woocommerce-pagination { margin-top: var(--jk-sp-7); }  /* 88 → 48 (2026-08-13, "quá trống"): khe lớn nhất của thang, vẫn tách rõ khỏi lưới */
.woocommerce nav.woocommerce-pagination ul { gap: 6px; }
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span {
	min-width: 40px; height: 40px; line-height: 40px;
	border-radius: var(--jk-r-ctl);
	font-size: 15px; font-weight: 500;
}
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li span.current {
	border-radius: var(--jk-r-ctl);
}
/* Mũi tên: giấu ký tự "→" (font-size:0) rồi vẽ lại bằng SVG background, cùng nét với
   chevron trên thanh menu. Viền mảnh để nó đọc ra "nút", tách khỏi dãy số.
   KHÔNG dùng mask + currentColor: máy không dựng được mask sẽ ra ô vuông đặc — vì thế
   màu viết thẳng vào SVG (đen lúc thường, trắng lúc hover, khớp số đo trên prod). */
.woocommerce nav.woocommerce-pagination ul li a.next,
.woocommerce nav.woocommerce-pagination ul li a.prev {
	position: relative; font-size: 0;
	border: 1px solid var(--jk-line);
}
.woocommerce nav.woocommerce-pagination ul li a.next::before,
.woocommerce nav.woocommerce-pagination ul li a.prev::before {
	content: ""; position: absolute; inset: 0; margin: auto;
	width: 17px; height: 17px;
	background: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23000'%20stroke-width='2.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpolyline%20points='9%206%2015%2012%209%2018'/%3E%3C/svg%3E") center/contain no-repeat;
}
/* Cùng điều kiện với luật đổi nền đen bên dưới — kẻo trắng trên nền trắng */
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a.next:hover::before,
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a.prev:hover::before {
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23fff'%20stroke-width='2.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpolyline%20points='9%206%2015%2012%209%2018'/%3E%3C/svg%3E");
}
.woocommerce nav.woocommerce-pagination ul li a.prev::before { transform: rotate(180deg); }
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a.next:hover,
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a.prev:hover {
	background: var(--jk-ink); color: #fff; border-color: var(--jk-ink);
}

/* --- 10. Điện thoại ------------------------------------------------------- */
@media (max-width: 768px) {
	.woocommerce ul.products,
	.woocommerce ul.products[class*="columns-"] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 26px 14px;
	}
	.woocommerce ul.products li.product .woocommerce-loop-product__title { font-size: 16px; }
	.woocommerce ul.products li.product .astra-shop-summary-wrap { padding-top: 8px; }
	.jk-tag { top: 7px; left: 7px; height: 23px; padding: 0 8px; font-size: 11px; }
	body.ast-woo-shop-archive .ast-archive-description { padding-bottom: 20px; }
	body.ast-woo-shop-archive nav.woocommerce-pagination { margin-top: 40px; }  /* 56 → 40 theo thang mới, giữ tỉ lệ với 48 desktop */
	.woocommerce nav.woocommerce-pagination ul li a,
	.woocommerce nav.woocommerce-pagination ul li span { min-width: 44px; height: 44px; line-height: 44px; }
}
/* JK-SHOP END */


/* ============================================================================
   JK-MONO START — JetBrains Mono cho NHÃN, THÔNG SỐ, ĐIỀU HƯỚNG. 2026-08-08
   ============================================================================
   🛑 RANH GIỚI — ĐỌC TRƯỚC KHI NỚI THÊM

   KHÔNG bao giờ đặt font này ở tầng `body`, `h1–h6`, `p`, `.entry-content`, hay bất
   kỳ luật trần nào. Hùng chốt: **Elementor không dùng JetBrains Mono.** Trang chủ,
   các trang landing và **mô tả của 186 sản phẩm** đều là Elementor — một luật trần
   sẽ viết đè lên tất cả mà không ai thấy ngay (xem mục 0 tài liệu thiết kế).

   Font mono rộng hơn font tỉ lệ ~15–20% ở cùng cỡ chữ và đọc chậm hơn, nên nó CHỈ
   dùng cho chữ để LIẾC (nhãn, thông số, số đếm), không dùng cho chữ để ĐỌC (câu văn,
   mô tả, tên sản phẩm dài, cột link chân trang).

   `letter-spacing` âm ở khắp mục này là cố ý: JetBrains Mono vốn thoáng, để nguyên
   thì mấy nhãn nhỏ nhìn rời rạc.
   ---------------------------------------------------------------------------- */
:root {
	--jk-font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}

/* --- 1. Cột bên trang shop ------------------------------------------------ */
/* 13px chứ không 15px: "JELLY KEY PRODUCT TAGS" là 22 ký tự, mono in hoa ở 15px thì
   xuống hai dòng và cái nhãn lại to hơn nội dung nó đang đặt tên. */
/* Chuỗi chọn dài là CỐ Ý, đã dò từng bậc mới ra. Astra in trong CSS inline của
   Customizer (nằm SAU file này) hai luật cùng khai font-family cho đúng phần tử này:
   `#secondary .widget-title` (1,1,0) và `.woocommerce-page #secondary .widget
   .widget-title` (1,3,0). Cái sau mới là kẻ thắng. Thêm `body` để lên (1,3,1).
   Triệu chứng lúc chưa sửa rất dễ đọc nhầm: chữ ĐÃ in hoa (Astra không khai
   text-transform nên luật mình ăn) nhưng font vẫn cũ → tưởng font mono chưa nạp. */
body #secondary .widget .widget-title,
body.woocommerce-page #secondary .widget .widget-title {
	font-family: var(--jk-font-mono);
	/* JK-CASE: 13 → 18px. Cùng lý do với tiêu đề chân trang — đây là TIÊU ĐỀ đứng trên
	   một danh sách (danh mục, thẻ), mà các mục trong danh sách đã 15px. */
	font-size: 18px; font-weight: 700; letter-spacing: -.01em;
}
#secondary .wc-block-product-categories-list-item > a,
#secondary .wc-block-product-categories-list-item-count {
	font-family: var(--jk-font-mono);
	letter-spacing: -.035em;
}
#secondary .wc-block-product-categories-list-item > a { font-size: 15px; }
#secondary .wc-block-product-categories-list--depth-1 > li > a { font-size: 14px; }
#secondary .wc-block-product-categories-list-item-count { font-size: 13px; }
/* Thẻ thông số (1.5u, 2.25u, R1, SA profile) — đây ĐÚNG NGHĨA là thông số kỹ thuật
   bàn phím, mono là font đúng cho chúng chứ không phải một lựa chọn thẩm mỹ. */
#secondary .tagcloud a,
.jk-tags__more {
	font-family: var(--jk-font-mono);
	font-size: 13px !important; /* !important vì JK-POLISH ép 15px cho .tagcloud a */
	letter-spacing: -.03em;
}

/* --- 2. Nhãn tình trạng trên thẻ sản phẩm --------------------------------- */
.jk-tag {
	font-family: var(--jk-font-mono);
	/* ⚠️ Cỡ THẬT của nhãn nằm ở ĐÂY, không phải ở JK-SHOP: mục này nạp sau và cùng
	   specificity nên nó thắng. Đổi cỡ nhãn thì đổi ở dòng này. JK-CASE: 11 → 12px vì
	   thôi in hoa, và giãn chữ về 0. */
	font-size: 12px; font-weight: 700; letter-spacing: 0;
}

/* --- 3. Trang sản phẩm: thang chữ khu chọn mua ----------------------------
   Trước khi sửa, MỌI thứ ở khu này đều 18px — nhãn, giá trị, ô chọn thông số, nút mua.
   Và 18px là cỡ chữ NỘI DUNG của site, không phải cỡ chữ giao diện. Thủ phạm không
   phải Astra mà là chính mình: `swatch.css` ép `font-size:18px !important` cho nhãn,
   `style.css` khai 18px cho nhãn + giá trị + nút. Đã gỡ ở cả hai chỗ; cỡ chữ giờ
   chỉ đặt tại đây, theo thang: nhãn 13 · giá trị 15 · thông số 14 · nút 15.
   ------------------------------------------------------------------------- */
.woocommerce div.product form.cart .variations select,
.woocommerce div.product .woo-selected-variation-item-name,
/* Tình trạng ("Out of stock", "5 in stock"): nhãn trạng thái → mono, đúng vai. */
.woocommerce div.product .woocommerce-variation-availability {
	font-family: var(--jk-font-mono);
	letter-spacing: -.03em;
}
/* Mô tả biến thể ("The default option is a naked profile…"): đây là CÂU VĂN giải thích,
   không phải nhãn — mono 18px làm nó vừa to vừa như code, Hùng bắt 2026-08-12 ("to quá,
   đây hình như là product description"). Về bậc chú thích: font chữ đọc, 15px, màu phụ.
   Khai cả <p> con vì Woo bọc nội dung trong <p> có luật cỡ riêng. */
.woocommerce div.product .woocommerce-variation-description,
.woocommerce div.product .woocommerce-variation-description p {
	font-size: var(--jk-fs-sm);
	line-height: 1.6;
	color: var(--jk-muted);
}
.woocommerce div.product .woocommerce-variation-description p { margin: 0 0 6px; }
.woocommerce div.product .woocommerce-variation-description p:last-child { margin-bottom: 0; }
/* Nhãn: bậc nhỏ nhất, màu phụ — nó chỉ đặt tên cho giá trị bên cạnh (JK-CASE) */
.woocommerce div.product .variations .label label {
	font-family: var(--jk-font-mono);
	font-size: 14px; font-weight: 700; letter-spacing: 0;
}
/* Giá trị đang chọn: to hơn nhãn một bậc, màu mực — đây mới là thứ khách cần đọc */
.woocommerce div.product .variations .woo-selected-variation-item-name { font-size: 15px; }
/* Ô chọn thông số (1u, 2.25u…) — cỡ đặt ở swatch.css của plugin, đây chỉ đổi font */
.jk-swatch--text .jk-swatch__inner,
.jk-swatch__item.is-text .jk-swatch__inner,
.jk-swatch__item[data-jk-tooltip]:hover::before {
	font-family: var(--jk-font-mono);
	letter-spacing: -.03em;
}
/* Nút mua + ô số lượng */
.woocommerce div.product form.cart .button.single_add_to_cart_button {
	font-family: var(--jk-font-mono);
	font-size: 15px; letter-spacing: -.02em;
	border-radius: var(--jk-r-ctl); /* nút mua là thứ cuối cùng còn vuông ở khu này */
}
.woocommerce div.product .quantity .qty {
	font-family: var(--jk-font-mono);
	font-size: 16px;
}
/* Giá: giữ nguyên cỡ, nhưng nét 400 làm con số quan trọng nhất trang trông yếu */
.single-product div.product .summary > .price,
.single-product div.product .summary .woocommerce-variation-price .price { font-weight: 700; }

/* Nhãn tình trạng — ĐẶT LÊN ẢNH, đúng góc như ở lưới shop, nên khách nhận ra ngay và
   không tốn thêm dòng nào trong cột mua. Bản đầu để nó đứng riêng ở đầu cột mua:
   ăn nguyên một dòng cho một chữ, Hùng gạt.
   Neo theo `div.product` — khối ảnh nằm ngay góc trên-trái của khối này ở cả hai khổ. */
.single-product div.product { position: relative; }
.single-product .jk-pdp-state {
	position: absolute; top: 14px; left: 14px; z-index: 3;
	display: inline-flex; align-items: center;
	height: 28px; padding: 0 12px; margin: 0;
	border-radius: var(--jk-r-pill);
	font-family: var(--jk-font-mono);
	font-size: 12px; font-weight: 700; letter-spacing: 0;   /* JK-CASE: thôi in hoa, bù 1px */
	background: rgba(255, 255, 255, .92); color: var(--jk-muted);
	border: 1px solid rgba(17, 17, 17, .08);
	-webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
	pointer-events: none; /* không chắn cú bấm mở ảnh phóng to */
}
.single-product .jk-pdp-state.jk-tag--in { background: var(--jk-ink); color: #fff; border-color: var(--jk-ink); }
@media (max-width: 768px) {
	.single-product .jk-pdp-state { top: 10px; left: 10px; }
}
/* Dòng biến thể trong giỏ / thanh toán / đơn hàng ("Combo SA (6), Topre") */
.woocommerce .product-name .variation,
.woocommerce .product-name dl.variation,
.woocommerce td.product-name dl.variation dt,
.woocommerce td.product-name dl.variation dd,
.wc-item-meta, .wc-item-meta li {
	font-family: var(--jk-font-mono);
	font-size: 14px; letter-spacing: -.035em;
}

/* --- 4. Điều hướng -------------------------------------------------------- */
/* 🛑 MENU GIỮ SOURCE SANS — đã thử mono cho cả hàng menu chính, menu con và ngăn kéo,
   Hùng gạt 2026-08-08: "header menu nên font thường". Đừng làm lại.

   Kèm theo một số đo đáng giữ: mono làm hàng menu nở đúng **18,1%** (535px → 632px),
   và ở màn **800px** thì cột `1fr` bên trái co lại làm **logo bị bóp còn 0px**. Dòng
   `min-width` dưới đây ở lại kể cả khi đã bỏ mono — đó là lỗi CÓ SẴN, chỉ cần thêm
   một mục menu hoặc một nhãn dài hơn là dính, không liên quan gì tới font. */
/* 2026-08-10: logo header từ dấu tròn 50px thành chữ ký ~115px, nên chốt chặn phải
   nới theo — nếu không thì đúng lỗi cũ (cột `1fr` bên trái co lại, logo bị bóp còn 0)
   chỉ dịch sang một bề rộng khác. Đã đo lại nấc 1061–1240px sau khi đổi. */
/* 2026-08-11: logo phóng 20% thì chốt chặn phải đi theo, nếu không nó chặn ở bề rộng cũ và
   lỗi "cột 1fr co lại, logo bị bóp" quay lại đúng chỗ cũ. 53px cao = 138px rộng, 46px = 120px. */
.jk-head__logo { min-width: 138px; }
@media (max-width: 768px) { .jk-head__logo { min-width: 120px; } }

/* Đường dẫn (breadcrumb): mono. Đây là biển chỉ đường — thứ để LIẾC, đúng vai của mono.
   Không khoá trong trang shop: breadcrumb là khung của theme, có mặt ở cả trang sản phẩm. */
.ast-breadcrumbs-wrapper,
.ast-breadcrumbs-wrapper a,
.ast-breadcrumbs-wrapper span {
	font-family: var(--jk-font-mono);
	font-size: 14px; /* Astra để 18px = cỡ chữ nội dung; mono ở 18px thì cả dòng nặng như một câu văn */
	letter-spacing: -.04em;
}
/* Số trang + số trong giỏ: chữ số mono thẳng hàng, không nhảy khi đổi số */
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span,
.jk-head__cart-n {
	font-family: var(--jk-font-mono);
	letter-spacing: -.04em;
}

/* --- 5. Nhãn cột chân trang ----------------------------------------------- */
/* Chỉ NHÃN cột (Shop / Studio / Newsletter). Các link bên dưới giữ font chữ đọc —
   đó là chữ để đọc, và cột chân trang đã hẹp sẵn. */
.jk-foot__h {
	font-family: var(--jk-font-mono);
	/* ⚠️ Cỡ THẬT của tiêu đề cột nằm ở ĐÂY (mục này nạp sau JK-FOOTER).
	   JK-CASE: 12 → 18px. Hùng chỉ ra ngay: bỏ in hoa xong "Shop" đọc ra NHỎ HƠN
	   "Artisan keycaps" ngay dưới nó (14 so với 16px) — tiêu đề mà bé hơn mục con thì
	   không còn là tiêu đề. Chữ IN HOA che được lỗi này vì nó cao bằng cả thân chữ; bỏ
	   in hoa là lộ ra. Đây là TIÊU ĐỀ, không phải nhãn: phải LỚN HƠN thứ nó đứng trên. */
	font-size: 18px; letter-spacing: -.01em;
}
/* Nút "Sign up" — nhãn hành động ngắn, mono cho nó chất nút bấm kỹ thuật */
.jk-news button {
	font-family: var(--jk-font-mono);
	font-size: 14px; letter-spacing: -.03em;
}
/* --- 6. Trang sản phẩm: ảnh và đầu trang --------------------------------- */
/* Ảnh sản phẩm là tài sản mạnh nhất của brand, và sau mấy đợt vừa rồi nó là thứ DUY
   NHẤT còn vuông góc — thẻ ở lưới shop, nút mua, ô chọn thông số, ô số lượng đều bo cả. */
.single-product .woocommerce-product-gallery__image img,
.single-product .woocommerce-product-gallery__wrapper img { border-radius: var(--jk-r-media); }
/* 🛑 Bo ở ẢNH thôi thì HOVER VÀO LÀ VUÔNG LẠI (Hùng chỉ ra 2026-08-09). Khi rê chuột,
   jQuery zoom của Woo chèn thêm `img.zoomImg` phủ lên — ảnh 2048px đặt `position:absolute`
   và trượt theo con trỏ. Nó cũng nhận bán kính từ luật trên, nhưng bốn góc bo của nó nằm
   tít bên ngoài khung nhìn, nên cái khách thấy là bốn góc VUÔNG của khung.
   Cách chắc: bo + cắt ở chính KHUNG, để mọi thứ chạy bên trong đều bị cắt theo.
   Cùng bài học với gallery Elementor ở JK-ELEMENTOR: ảnh nào có `transform` hay chạy
   ra ngoài khổ thì bán kính phải đặt ở khung, không đặt ở ảnh. */
.single-product .woocommerce-product-gallery__image,
.single-product .woocommerce-product-gallery .flex-viewport {
	border-radius: var(--jk-r-media);
	overflow: hidden;
}
.single-product .flex-control-thumbs img,
.single-product .flex-control-nav img { border-radius: var(--jk-r-thumb); }
.single-product .woocommerce-product-gallery__trigger { border-radius: var(--jk-r-pill); }

/* --- 6b. Chống nhảy bố cục (CLS) của gallery — đo 2026-08-12 ----------------
   Lighthouse mobile ra CLS 0,563 (hai lượt y hệt), nguồn là chính gallery này:
   flexslider của Woo chạy SAU khi trang đã vẽ (FlyingPress hoãn JS), và trước khi
   nó chạy thì (1) mọi slide xếp CHỒNG dọc → init xong sụp về 1 slide, (2) dải
   thumbnail do JS dựng bằng <img onload="this.width=this.naturalWidth…"> KHÔNG có
   width/height (jquery.flexslider.js:256) → tự phình sau khi tải. Cả khối dưới
   (bảng swatch, giá, nút mua) bị đẩy theo hai nhịp. Nguyên tắc sửa: trạng thái
   TRƯỚC-init phải chiếm đúng chỗ của trạng thái SAU-init. */
/* (1) Trước init: chỉ hiện slide đầu. Flexslider init xong tự đặt display:block
   INLINE cho từng slide (setup() → newSlides.css) nên luật này hết hiệu lực đúng
   lúc — KHÔNG !important, thua inline là chủ đích. JS không chạy = còn ảnh đầu. */
.single-product .woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:nth-child(n+2) {
	display: none;
}
/* (2) Thumbnail của flexslider: khoá ô vuông bằng CSS để attribute do onload gắn
   không còn quyết định kích thước — ô chiếm đúng chỗ NGAY khi <li> vào DOM,
   ảnh tải xong không phình thêm lần nữa. */
.single-product .flex-control-thumbs li img {
	width: 100%;
	height: auto;
	aspect-ratio: 1 / 1;
	object-fit: cover;
}
/* (3) Giữ chỗ cho CẢ DẢI thumbnail trước khi JS dựng nó: spacer cao ≈ 1/4 bề
   ngang gallery (Astra xếp 4 cột ô vuông, xem woocommerce-grid nth-child(4n)).
   Chỉ áp khi sản phẩm có ≥2 ảnh (sản phẩm 1 ảnh không có dải nào để giữ chỗ),
   và tự ẩn khi dải thật xuất hiện. iOS <15.4 không có :has() → không spacer,
   tức là tệ đúng bằng hiện trạng, không tệ hơn. */
.single-product .woocommerce-product-gallery:has(.woocommerce-product-gallery__image:nth-child(2)):not(:has(.flex-control-thumbs))::after {
	content: "";
	display: block;
	aspect-ratio: 4 / 1;
}
/* (4) Khoá tỉ lệ khung ảnh CHÍNH bằng CSS thuần — không chờ ảnh tải mới biết chiều
   cao. Ảnh single của Woo trên site đều crop ~850×567 (3:2, vài tấm 850×570 lệch
   0,5% — object-fit:cover nuốt phần lệch). Đo 2026-08-12: Lighthouse ghi shift
   0,209 của bảng swatch với cause = chính ảnh này "lacking an explicit size". */
.single-product .woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:first-child img.wp-post-image {
	width: 100%;
	height: auto;
	aspect-ratio: 3 / 2;
	object-fit: cover;
}
/* (5) Giữ chỗ cho khối GIÁ của biến thể: sản phẩm có default attributes thì giá
   chỉ hiện SAU khi wc-add-to-cart-variation chạy (bị FlyingPress hoãn) → cả khối
   nút mua + phần dưới bị đẩy xuống một nhịp (shift 0,26 đo cùng ngày). Với sản
   phẩm chưa chọn đủ biến thể (giá ẩn CÓ CHỦ ĐÍCH — đừng "sửa"), min-height này
   chỉ là một khoảng thở cố định giữa swatch và nút, không lộ gì. */
.single-product form.variations_form .woocommerce-variation.single_variation { min-height: 52px; }
/* (6) Bịt CỬA SỔ 100ms GIỮA-init của flexslider — thủ phạm cuối cùng của CLS 0,47
   (trace Lighthouse: bảng swatch văng từ y=632 xuống y=2608 rồi quay về, đúng 2 shift
   0,209 + 0,26; tái hiện được bằng iframe có script: t=134ms bảng ở y=2608).
   Cơ chế: setup() của flexslider set wrapper `width:800%` inline NGAY, nhưng width
   inline của từng slide thì nằm trong setTimeout(…,100) — suốt 100ms đó slide 1
   (block, chưa có width) nở theo wrapper 800%, ảnh aspect-ratio 3/2 phình cao ~1790px
   đẩy mọi thứ bên dưới văng khỏi màn hình. Chặn bề ngang slide 1 ĐÚNG TRONG cửa sổ đó:
   scope dưới .flex-viewport nên trước-init (chưa có viewport) không đụng, sau-init
   width inline 335px < mức chặn nên cũng không đụng — luật chỉ sống đúng 100ms.
   Mobile: 100vw-48 ≈ đúng bề ngang gallery. Desktop: 50vw ≥ cột gallery thật (~660)
   nên không bao giờ bóp layout thật, chỉ bóp cú phình 2680px.
   🛑 CÂU TRÊN SAI và đã trả giá (Hùng khoanh đỏ 2026-08-13): cột gallery là 660px CỐ ĐỊNH
   theo content 1240, còn 50vw co theo cửa sổ — cửa sổ hẹp hơn ~1320px thì 50vw < 660,
   max-width "chỉ sống 100ms" hoá ra sống VĨNH VIỄN: nó cắt cả width:660 inline mà
   flexslider set sau init (max-width thắng width, xem bài học ảnh giỏ 70×88), slide 1
   còn 656,5px và mép trái ẢNH THỨ HAI thò vào thành một vệt dọc. Fix: đo theo chính
   gallery bằng container query — 100cqw = đúng bề ngang gallery ở MỌI cỡ cửa sổ, chặn
   được cú phình 5280px mà không bao giờ nhỏ hơn ô slide thật. Hai luật vw giữ làm
   fallback cho trình duyệt chưa có cqw (~2022 trở về trước). */
.woocommerce-product-gallery .flex-viewport .woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:first-child {
	max-width: calc(100vw - 48px);
}
@media (min-width: 922px) {
	.woocommerce-product-gallery .flex-viewport .woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:first-child {
		max-width: 50vw;
	}
}
@supports (width: 100cqw) {
	.single-product .woocommerce-product-gallery { container-type: inline-size; }
	.woocommerce-product-gallery .flex-viewport .woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:first-child {
		max-width: 100cqw;   /* nạp sau nên thắng hai luật vw cùng độ mạnh ở trên */
	}
}
/* (7) Khoá CHIỀU CAO của khung trượt — nốt còn lại của cửa sổ 100ms. 2026-08-16
   Luật (6) chặn slide 1 phình ngang, nhưng SLIDE 2–4 thì vẫn hiện chồng dọc suốt cửa sổ
   đó: setup() gắn `display:block` INLINE cho mọi slide ngay (nên luật (1) hết hiệu lực,
   đúng chủ đích), mà bề ngang từng slide lại nằm trong setTimeout(…,100) — chưa có width
   thì mỗi slide là một khối 100% xếp dọc.
   Đo trên prod 16/08 (điện thoại 390, mạng 4G chậm, sau FCP): `.flex-viewport` 712px →
   233px lúc ~3,5s, kéo cả trang bật lên 478px. Đó là TOÀN BỘ CLS 0,217 của trang sản
   phẩm — bảng swatch chỉ là nạn nhân bị đẩy, không phải nguồn (tôi đã đuổi nhầm nó một
   vòng trước khi quét hình học toàn trang mới ra).
   Khung trượt luôn cao đúng bằng MỘT slide, mà slide 1 đã bị luật (4) khoá 3/2 — nên
   khai thẳng 3/2 cho khung là con số đã biết, không phải phỏng đoán. Flexslider chỉ đặt
   `height` inline cho khung sau khi trượt (inline thắng aspect-ratio) nên luật này tự
   nhường chỗ đúng lúc, y như luật (1).
   🛑 KHÔNG giảm được byte, đừng tưởng. Bản đầu của chú thích này đoán rằng slide 2–4 bị
   cắt khỏi khung thì trình duyệt sẽ bỏ tải ảnh của chúng. ĐO LẠI THÌ SAI: trước và sau
   bản vá, trang sản phẩm đều tải đúng 24 ảnh / 1.779 KB, không lệch một byte. Flexslider
   đặt style inline cho slide sau khi init nên chúng vẫn có ô hiển thị thật, chỉ bị
   `overflow:hidden` che đi — mà ảnh bị che vẫn được tải. Muốn bỏ ~600 KB ba slide sau thì
   phải gỡ `src`/`srcset` của chúng ra `data-*` rồi trả lại bằng JS, tức đụng vào gallery
   của trang bán hàng — việc riêng, chưa làm. Luật này CHỈ để hết nhảy bố cục. */
/* 🛑 `width: 100%` KHÔNG thừa — thiếu nó thì ĐIỆN THOẠI GẬP hỏng (đo 2026-08-28).
   `aspect-ratio` chỉ suy ra chiều CÒN LẠI, và chiều nào là "còn lại" thì tuỳ chiều kia
   có xác định hay không. Sau khi trượt, flexslider đặt `height` INLINE cho khung; lúc đó
   height là xác định nên aspect-ratio quay ngược lại suy ra WIDTH = height × 3/2 — bề
   ngang của khung không còn theo cột gallery nữa mà theo một con số đã đóng băng.
   Trên máy thường không ai thấy, vì cửa sổ hiếm khi đổi bề ngang giữa chừng. Máy gập thì
   ĐỔI mỗi lần mở ra: tải trang lúc gập (màn ngoài 360) → height inline 213px → mở máy ra
   (màn trong 924) → khung khoá ở 213 × 1,5 = 320px trong khi cột gallery đã rộng 486px.
   Ảnh sản phẩm co lại còn 2/3 ô, chừa một mảng trắng bên phải. Và flexslider KHÔNG tự
   chữa được: nó đọc bề ngang khung (320) để tính lại slide rồi đặt height theo đó, tức
   là tự khoá lại chính mình mỗi lần chạy.
   `width: 100%` làm bề ngang xác định trước, nên aspect-ratio chỉ còn suy ra chiều cao —
   đúng việc luật (7) cần. Lúc tải thẳng thì con số y hệt trước, không đổi gì. */
.single-product .woocommerce-product-gallery .flex-viewport {
	width: 100%;
	aspect-ratio: 3 / 2;
	overflow: hidden;
}

/* Tiêu đề + đường dẫn: canh TRÁI và đường dẫn lên trước, giống hệt trang danh mục.
   Trước đây hai thứ này canh giữa trong khi cột ảnh và cột mua ngay bên dưới canh trái
   — hai kiểu canh lề trên cùng một trang. Astra canh giữa bằng CSS inline (0,1,0);
   ba class + `body` ở đây là (0,3,1) nên thắng, không cần !important. */
/* KHÔNG bám .ast-header-without-markup: class đó Astra chỉ gắn khi bài là Elementor
   (_elementor_edit_mode=builder, inc/compatibility/class-astra-elementor.php) — sản phẩm
   /bài đã convert sang block sẽ rớt luật, tiêu đề nhảy lên trên breadcrumb (đo 13/08
   trên pilot One Ball One World). Với bài Elementor kết quả y hệt. */
body.single-product .entry-header {
	display: flex; flex-direction: column; text-align: left; padding-bottom: 22px;
}
body.single-product .entry-header .ast-breadcrumbs-wrapper {
	order: -1; text-align: left; padding-bottom: 0; margin: 0 0 8px;
}
body.single-product .entry-header .entry-title { text-align: left; margin: 0; }
/* JK-MONO END */


/* ============================================================================
   JK-ACCOUNT START — TRANG ĐĂNG NHẬP / ĐĂNG KÝ / QUÊN MẬT KHẨU. 2026-08-08
   ============================================================================
   Ba trang này là thứ cuối cùng còn sót lại từ thời "vuông góc": ô nhập vuông,
   nút vuông, và HAI cái khung lồng nhau — Astra Pro (`ast-modern-woo-account-page`)
   tự vẽ một thẻ quanh `.woocommerce`, mình lại vẽ thêm một viền nữa quanh chính
   cái form bên trong. Đo ra: thẻ ngoài 540px, khung trong 458px, cách nhau đúng
   40px padding → đọc thành "hộp dán trong hộp".

   Hướng sửa: CHỈ MỘT thẻ (cái của Astra), bo và đổ bóng theo đúng bộ biến --jk-*
   dùng cho giỏ hàng/thanh toán, để ba trang này nhìn cùng một họ với phần còn lại.

   ⚠ HAI CÁI BẪY SCOPE, đã dính cả hai:

   1. `.woocommerce-account` CÒN dùng cho bảng điều khiển KHI ĐÃ đăng nhập (đơn
      hàng, địa chỉ, chi tiết tài khoản) — không được bọc thẻ cho trang đó. Nên mọi
      luật đều đi qua `:has(.woocommerce-form-login)` / `:has(.woocommerce-ResetPassword)`,
      chỉ khớp khi form đăng nhập/đặt lại mật khẩu thực sự có mặt.

   2. `:has()` nằm trên <body> → nó đúng cho CẢ TRANG. Bản đầu viết
      `…:has(.woocommerce-form-login) form button` và ăn luôn nút "Sign up" của khối
      đăng ký nhận tin dưới CHÂN TRANG: nút đổi thành đỏ, ô email co lại còn một mẩu.
      Vì vậy mọi luật bên dưới đều phải đi qua `.woocommerce` — thẻ bọc của Woo,
      chân trang nằm ngoài nó.
   ---------------------------------------------------------------------------- */

/* Thẻ duy nhất */
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce {
	max-width: 480px !important;
	margin: 4px auto 0 !important;
	padding: 32px !important;
	/* Tile 2026-08-12 (vòng 2: nền nhạt + viền mảnh) — xem khối token --jk-tile */
	background: var(--jk-tile);
	border: 1px solid var(--jk-tile-line) !important;
	border-radius: var(--jk-r-card) !important;
}

/* Khung THỨ HAI (viền quanh chính cái form) — gỡ hẳn. */
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(form.woocommerce-form-login, form.woocommerce-form-register, .woocommerce-ResetPassword) {
	max-width: none;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
}

/* Astra Pro đổi qua lại giữa cột Login (.col-1) và cột Register (.col-2) bằng
   inline style display — nên chỉ MỘT cột hiện tại một thời điểm. Margin-bottom 26px
   của cột đang hiện cộng với padding của thẻ tạo ra một mảng trống ~66px ở đáy
   (đo trên ảnh render: form hết ở 745, thẻ hết ở 812). Bỏ margin đó đi. */
.woocommerce-account:has(.woocommerce-form-login) .woocommerce .u-columns.col2-set {
	display: block;
	max-width: none;
	margin: 0;
}
.woocommerce-account:has(.woocommerce-form-login) .woocommerce .col2-set > div {
	width: 100%;
	max-width: 100%;
	float: none;
	margin: 0;
	padding: 0;
}

/* Tiêu đề "Login" / "Register" / "Lost password".
   Đang là 30px/700 — to bằng tiêu đề trang ngay phía trên nó ("My Jelly Key account"),
   thành hai dòng tiêu đề cãi nhau. Rút về bậc tiêu đề thẻ như "Cart totals". */
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce h2 {
	margin: 0 0 20px !important;
	padding: 0 0 16px;
	border-bottom: 1px solid var(--jk-line);
	font-size: var(--jk-fs-title) !important;
	font-weight: var(--jk-fw-title, 650) !important;
	line-height: 1.25 !important;
	letter-spacing: -.015em;
	color: var(--jk-ink) !important;
	text-align: center;
}

/* ---- Ô nhập ---- */
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(input[type=text], input[type=email], input[type=password]) {
	width: 100%;
	box-sizing: border-box;
	min-height: 54px;
	padding: 14px 16px !important;
	border: 1px solid #DCDCDC !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	font-size: 16px !important;
	transition: border-color .15s ease, box-shadow .15s ease;
}
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(input[type=text], input[type=email], input[type=password]):focus {
	border-color: var(--jk-ink) !important;
	box-shadow: 0 0 0 3px var(--jk-red-ring) !important;
	outline: none !important;
}
/* Woo bọc ô mật khẩu trong <span class="password-input"> (inline) → ô co lại theo
   nội dung thay vì trải hết bề ngang. */
.woocommerce-account .woocommerce .password-input,
.woocommerce-lost-password .woocommerce .password-input { display: block; width: 100%; }

/* ---- Nút ---- */
/* Đang cao 38px, vuông, màu #CE1A1A — trong khi nút ở giỏ hàng/thanh toán cao 54px,
   bo 12px, đỏ #D42027. Cùng một site không thể có hai cái nút chính khác nhau. */
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(button[type=submit], button.button, input[type=submit]) {
	display: flex !important;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 54px !important;
	margin: 4px 0 0;
	padding: 14px 24px !important;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: var(--jk-fs-btn) !important;  /* 17 → 16: về cỡ nút chính của thang (2026-08-13) */
	font-weight: 600 !important;
	line-height: 1.2 !important;
	transition: background .15s ease, transform .08s ease;
}
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(button[type=submit], button.button, input[type=submit]):hover {
	background: var(--jk-red-dark) !important;
}
:is(.woocommerce-account:has(.woocommerce-form-login),
    .woocommerce-account:has(.woocommerce-ResetPassword),
    .woocommerce-lost-password) .woocommerce :is(button[type=submit], button.button, input[type=submit]):active {
	transform: translateY(1px);
}

/* ---- Ô tick "Remember me" ---- */
/* Dùng lại đúng ô tick 22px bo nhẹ của giỏ hàng/thanh toán, thay ô vuông 16px xám. */
.woocommerce-account:has(.woocommerce-form-login) .woocommerce input[type="checkbox"] {
	-webkit-appearance: none !important;
	appearance: none !important;
	width: 22px !important;
	height: 22px !important;
	min-width: 22px;
	margin: 0 !important;
	padding: 0 !important;
	flex: 0 0 22px;
	border: 1.5px solid #C9C9C9 !important;
	border-radius: var(--jk-r-sm) !important;
	background: #fff !important;
	box-shadow: none !important;
	cursor: pointer;
	position: relative;
	vertical-align: middle;
	transition: background .12s ease, border-color .12s ease;
}
.woocommerce-account:has(.woocommerce-form-login) .woocommerce input[type="checkbox"]:hover { border-color: var(--jk-ink) !important; }
.woocommerce-account:has(.woocommerce-form-login) .woocommerce input[type="checkbox"]:checked {
	background: var(--jk-red) !important;
	border-color: var(--jk-red) !important;
}
.woocommerce-account:has(.woocommerce-form-login) .woocommerce input[type="checkbox"]:checked::before {
	content: "";
	position: absolute;
	left: 7px; top: 3px;
	width: 5px; height: 10px;
	margin: 0;
	border: solid #fff;
	border-width: 0 2px 2px 0;
	background: none !important;
	transform: rotate(45deg);
}
.woocommerce-account .woocommerce .woocommerce-form-login__rememberme {
	display: flex !important;
	align-items: center;
	gap: 10px;
	margin: 0 0 18px;
	font-size: 16px;
	color: var(--jk-ink);
	cursor: pointer;
}

/* ---- Link phụ ---- */
/* "Lost your password?" và "Register" đang là chữ đen 18px KHÔNG gạch chân — nhìn
   y hệt chữ thường, không ai biết bấm được. */
.woocommerce-account .woocommerce :is(.lost_password, .ast-woo-form-actions),
.woocommerce-lost-password .woocommerce .lost_password {
	margin: 18px 0 0 !important;
	text-align: center;
	font-size: 15px !important;
	color: var(--jk-muted);
}
.woocommerce-account .woocommerce .lost_password a,
.woocommerce-lost-password .woocommerce .lost_password a {
	color: var(--jk-muted) !important;
	font-size: 15px !important;
	text-decoration: underline !important;
	text-underline-offset: 3px;
	text-decoration-color: #C9C9C9;
}
.woocommerce-account .woocommerce .lost_password a:hover { color: var(--jk-ink) !important; text-decoration-color: currentColor; }
.woocommerce-account .woocommerce .ast-woo-form-actions .ast-woo-account-form-link {
	color: var(--jk-ink) !important;
	font-size: 15px !important;
	font-weight: 600;
	text-decoration: underline !important;
	text-underline-offset: 3px;
}

/* Vạch ngăn trước hàng "Not a member? Register" — nó là lối rẽ sang một việc khác
   hẳn, không phải phần đuôi của form đăng nhập. */
.woocommerce-account .woocommerce .ast-woo-form-actions {
	padding-top: 18px;
	border-top: 1px solid var(--jk-line);
}

/* Đoạn hướng dẫn ở trang quên mật khẩu + đoạn chính sách ở form đăng ký */
.woocommerce-lost-password .woocommerce .woocommerce-ResetPassword > p:first-of-type,
.woocommerce-account .woocommerce .woocommerce-privacy-policy-text p {
	margin: 0 0 18px;
	font-size: 15px;
	line-height: 1.55;
	color: var(--jk-muted);
}

@media (max-width: 768px) {
	:is(.woocommerce-account:has(.woocommerce-form-login),
	    .woocommerce-account:has(.woocommerce-ResetPassword),
	    .woocommerce-lost-password) .woocommerce { padding: 24px 20px !important; }
}
/* JK-ACCOUNT END */


/* ============================================================================
   JK-PDP2 START — TRANG SẢN PHẨM VÒNG 2: bán chéo + thanh mua dính. 2026-08-08
   ============================================================================
   Hai thứ, cùng một lý do: trang sản phẩm là ngõ cụt. Cuộn xuống đọc mô tả thì
   mất nút mua, và đọc hết mô tả thì hết đường đi tiếp.

   Khối bán chéo cố tình KHÔNG mang kiểu riêng: nó là `ul.products` chuẩn, ăn
   nguyên bộ lưới ở mục JK-SHOP (vốn viết để dùng chung). Ở đây chỉ có phần vỏ
   của khối — vạch ngăn, tiêu đề, khoảng thở — và thanh mua dính.
   ---------------------------------------------------------------------------- */

/* --- 1. Khối bán chéo ----------------------------------------------------- */
/* Khe tabs → bán chéo (2026-08-13, "quá trống"): số 72 KHÔNG nằm ở .jk-xsell — Astra cho
   .woocommerce-tabs margin-bottom 72px, hai margin GẬP vào nhau nên margin-top bên dưới
   thua max(). Hạ về sp-5; khe thật = max(24, 48) = sp-7. Sản phẩm không có bán chéo thì
   24px tới khối kế cũng vừa. */
.single-product .woocommerce-tabs { margin-bottom: var(--jk-sp-5) !important; }
.jk-xsell {
	margin: var(--jk-sp-7) 0 0;
	padding: var(--jk-sp-5) 0 0;
	border-top: 1px solid var(--jk-line);
}
.jk-xsell__title {
	margin: 0 0 var(--jk-sp-5);
	font-size: var(--jk-fs-title);
	/* var(--jk-fw-title): chú thích cũ ghi "cùng dòng ở giỏ hàng đang 600" nhưng giỏ đã
	   lên 650 theo biến từ 2026-08-12 — quét 2026-08-13 bắt được hai đầu lệch nhau 600/650.
	   Đọc chung một biến thì hết lệch kiểu này. */
	font-weight: var(--jk-fw-title, 650);
	line-height: 1.25;
	color: var(--jk-ink);
}
/* Lưới 4 ô ở đây hẹp hơn lưới shop (không có cột bên) nên ảnh đã đủ lớn; chỉ hạ
   xuống 2 ô khi bề ngang không còn đủ cho 4. Không khai `grid-template-columns`
   cho desktop — `ul.products.columns-4` ở JK-SHOP lo rồi. */
@media (max-width: 921px) {
	.jk-xsell ul.products.columns-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 768px) {
	.jk-xsell { margin-top: var(--jk-sp-6); padding-top: var(--jk-sp-4); }
	.jk-xsell__title { font-size: 19px; margin-bottom: var(--jk-sp-4); }
}

/* --- 2. (Thanh mua dính jk-buybar đã GỠ 2026-08-12 — Hùng: "người ta có thể scroll
   to top mua". Đi cùng nó: các luật body.jk-buybar-on từng dời bong bóng Crisp và
   GIẤU #ast-scroll-top trên mobile — gỡ xong thì scroll-top hiện lại bình thường
   ở trang sản phẩm điện thoại, đúng thứ Hùng hỏi cùng ngày. Đừng thêm lại thanh
   mà không hỏi chủ: nó đã được chốt THÊM 08/08 rồi chốt GỠ 12/08.) --- */

/* JK-PDP2 END */


/* ============================================================================
   JK-PAY START — HÌNH DÁNG KHU NÚT THANH TOÁN NHANH. 2026-08-08
   ============================================================================
   Nút "Pay with PayPal" ở giỏ hàng và thanh toán là **Smart Button**: plugin dựng
   một `<iframe>` của PayPal trong `#ppc-button-ppcp-gateway`, và cái nút vàng được
   vẽ BÊN TRONG iframe đó. CSS của mình không với vào trong iframe được, nên màu và
   chữ chỉ đổi được qua tuỳ chọn của plugin (gold/blue/silver/white/black · rect/pill).

   Nhưng HÌNH DÁNG ngoài thì với được: bo góc chính cái `<iframe>`. Nội dung iframe bị
   cắt theo bán kính đó, nên nút vàng ra đúng độ tròn của site mà không phải đụng gì
   vào PayPal. Đo trên prod: iframe cao **55px** (nút chính của site 54px — lệch 1px,
   không đáng sửa), còn góc PayPal vẽ ~4px trong khi cả site là 12px — đó mới là chỗ
   nhìn ra "lạc bộ".

   🛑 Bo góc đặt trên IFRAME, KHÔNG phải `overflow:hidden` trên khối bọc. PayPal có
   `.smart-menu` (bảng chọn nguồn tiền) nằm cùng cấp với iframe và tràn ra ngoài khung
   nút; cắt ở khối bọc là cắt luôn cái bảng đó — hỏng chức năng để đổi một chi tiết
   thẩm mỹ.
   ---------------------------------------------------------------------------- */

.ppc-button-wrapper .paypal-buttons > iframe {
	border-radius: var(--jk-r-ctl);
}

/* 🛑 ĐÃ THỬ RỒI BỎ — đừng dựng lại: `.paypal-buttons { height: 54px !important }`.
   Đo trên prod ở giỏ hàng: nút đỏ **54px**, nút PayPal **45px**. Luật đó CÓ ăn — khối
   iframe cao lên thật — nhưng cái nút vàng nằm TRONG iframe vẫn do PayPal vẽ ở 45px,
   nên chỉ thêm 9px trống bên dưới; đo lại thấy "Continue shopping" tụt xuống đúng 9px
   còn vệt vàng vẫn 45px. Xấu hơn lúc chưa sửa.
   Chiều cao nút chỉ đổi được ở **tuỳ chọn của plugin** (PayPal SDK nhận 25–55px), cùng
   màn hình với màu và hình dáng. Đó là việc trong wp-admin, không phải việc của CSS. */

/* Hai luật dưới đây nhắm Apple/Google Pay CỦA PLUGIN PAYPAL. 2026-08-09 nhìn thấy
   khu nút chạy thật lần đầu (trình duyệt có Apple Pay + Google Pay) và biết thêm:
   ở site này plugin PayPal chỉ vẽ **nút vàng**, còn hai nút đen là của **Stripe** —
   xem khối kế bên. Giữ lại để phòng khi bật Apple/Google Pay bên PayPal, nhưng
   ⚠️ **chúng chưa từng ăn vào cái gì đang hiển thị**; đừng ghi là "đã kiểm".
   Apple Pay là custom element, chỉ nhận bán kính qua biến riêng của nó. */
#ppc-button-ppcp-applepay apple-pay-button {
	--apple-pay-button-border-radius: var(--jk-r-ctl);
}
#ppc-button-ppcp-googlepay button,
#ppc-button-ppcp-googlepay .gpay-card-info-container {
	border-radius: var(--jk-r-ctl) !important;  /* Google in style thẳng vào phần tử */
}

/* ---- Apple Pay + Google Pay: chúng là STRIPE Express Checkout ----
   Hùng chỉ ra 2026-08-09: hai nút đen vẫn vuông góc giữa một thẻ đã bo hết. Đo ra
   thì chúng KHÔNG thuộc plugin PayPal mà là Stripe Express Checkout:
       #wc-stripe-express-checkout-element-applePay   (.StripeElement, 306×48)
       #wc-stripe-express-checkout-element-googlePay  (.StripeElement, 306×48)
   Mỗi cái bọc một <iframe> 314×56 lệch -4,-4 — nút thật do Stripe vẽ BÊN TRONG,
   viền 4px quanh nó là chỗ trống dành cho vòng focus.

   Vì vậy bo ở iframe (mẹo dùng cho PayPal) không tới được nút: bán kính sẽ nằm ở
   mép iframe, cách nút 4px. Phải cắt ở chính `.StripeElement` — nó ôm đúng khổ nút
   306×48, nên `overflow:hidden` + bán kính cắt trúng bốn góc nút. `overflow:hidden`
   ở đây an toàn, khác với PayPal: Stripe không thả bảng chọn nào ra ngoài khung
   (Apple/Google Pay mở sheet của HỆ ĐIỀU HÀNH, không phải DOM).
   Đo sau khi áp, trên chính www.jellykey.com: bốn nút cùng x=987, cùng rộng 306px,
   cùng bo 12px. Chiều cao vẫn lệch (đỏ 54 · Apple/Google 48 · PayPal 45) và vẫn
   **không sửa được bằng CSS** — nằm trong tuỳ chọn của từng plugin. */
[id^="wc-stripe-express-checkout-element-"] {
	border-radius: var(--jk-r-ctl) !important;
	overflow: hidden !important;
}
/* JK-PAY END */

/* ============================================================================
   JK-CART-WIDTH START — BỀ NGANG HAI CỘT GIỎ HÀNG. 2026-08-09
   ============================================================================
   🛑 ĐỌC TRƯỚC KHI ĐỔI BỀ NGANG HAI CỘT — đợt trước mất năm vòng ở đây.

   Bề ngang hai cột KHÔNG do file này quyết định, và cũng không nằm trong `<head>`
   như một luật thường. astra-addon in ra `<style id="astra-addon-css-inline-css">`
   chứa:

       @media screen and ( min-width: 769px ) {
         .ast-no-sidebar #ast-cart-wrapper .ast-cart-non-sticky { width: 68%; }
         .ast-no-sidebar #ast-cart-wrapper .cart-collaterals    { width: 30%; }
       }

   Chuỗi đó mang **một #id**, nên mọi luật nhắm `.cart-collaterals` bằng class đơn
   đều thua — kể cả đặt cuối file, kể cả thêm `!important` vào một luật KHÁC media
   query. Đó là lời giải cho nghịch lý đã ghi trong worklog đợt 3: nhuộm nền thì
   THẤY ăn (không ai tranh chấp `background`) mà đổi `width` thì không nhúc nhích.
   ⇒ Muốn đổi bề ngang thì chuỗi chọn PHẢI đi qua `#ast-cart-wrapper`.

   Số đo (bản test, 2026-08-09): bảng giỏ có min-content **633px** — remove 70 +
   thumbnail 124 + product 97 + price 72 + quantity 170 + subtotal 99. Dưới ngần
   ấy nó không co thêm được nữa, mà tràn ra ngoài cột.
   68% × container ≥ 633 ⇒ **viewport phải ≥ ~971px** thì hai cột mới KHÔNG VỠ.

   Nhưng "không vỡ" chưa phải "đọc được": ở 1025px cột trái ra 647px, tức chỉ hơn
   min-content 14px, nên cột PRODUCT bị ép còn ~110px và tên hàng rơi **sáu dòng**
   ("One Ball, / One World / artisan / keycaps - / Combo SA / (6), Topre"). Chụp ra
   nhìn mới thấy. Ngưỡng chọn theo cái nhìn được, không theo cái vừa khít:
   **hai cột chỉ từ 1200px**, nơi cột trái 762–788px và tên gói gọn 2–3 dòng.
   ---------------------------------------------------------------------------- */

/* ---- 769–1199px: XẾP DỌC, vì hai cột không thể vừa ----
   Ở 900px cột trái chỉ còn 585px trong khi bảng cần 633px: bảng tràn ra và chui
   xuống dưới thẻ "Cart totals" — SUBTOTAL bị cắt giữa chữ, tên sản phẩm rơi mỗi
   dòng một từ, số tiền biến mất sau thẻ bên cạnh. iPad dọc (834px) nằm gọn trong
   dải này, và đây là trang giỏ hàng của một shop đang bán.

   Vì sao `display: contents` chứ không chỉ `width: 100%`: khối "You may also like"
   (jk-upsell) do jk-toolkit in vào `woocommerce_after_cart_table`, tức nằm TRONG
   <form> ở cột trái. Chỉ cho hai cột rộng 100% thì thứ tự đọc thành
   bảng → 4 sản phẩm gợi ý → mới tới tổng tiền, đẩy nút "Proceed to checkout"
   xuống ~830px. `display: contents` gỡ hộp bố cục của div cột và của form để bảng,
   tổng tiền và khối gợi ý cùng thành flex item của #ast-cart-wrapper, rồi `order`
   xếp lại đúng thứ tự mua hàng. Form vẫn là form — đã kiểm nút +/− số lượng: AJAX
   cập nhật giỏ chạy, giá đổi, bố cục giữ nguyên sau khi Astra thay HTML.

   Bề ngang thẻ tổng 420px ≈ 48% của cột — đúng tỉ lệ WooCommerce vốn dùng cho
   `.cart_totals` khi xếp dọc, và giữ nút thanh toán ở khổ bấm được thay vì kéo dài
   860px. */
@media (min-width: 769px) and (max-width: 1199px) {
	.woocommerce-cart #ast-cart-wrapper .ast-cart-non-sticky,
	.woocommerce-cart #ast-cart-wrapper .woocommerce-cart-form { display: contents; }

	.woocommerce-cart #ast-cart-wrapper table.cart { order: 1; width: 100%; }
	.woocommerce-cart #ast-cart-wrapper .cart-collaterals {
		order: 2;
		width: 100%;
		max-width: 420px;
		margin: 30px 0 0 auto;   /* neo về phải, thẳng mép phải của bảng */
	}
	.woocommerce-cart #ast-cart-wrapper .jk-upsell { order: 3; width: 100%; margin-top: 34px; }
}

/* ---- ≥1200px: nới khe giữa hai cột ----
   Khe = 100% − 68% − 30% = 2%, ra **24px** ở container 1200 — chưa bằng một nửa
   khe của trang thanh toán (52px), và Hùng nhận ra bằng mắt. Nới bằng cách thu cột
   trái, KHÔNG thu cột phải: thẻ tổng giữ nguyên 360px, còn cột trái 788px vẫn dư
   155px so với min-content 633px của bảng.
   Chỉ từ 1200px trở lên: dưới ngưỡng đó mỗi pixel của cột trái đều đang cần đến.

   🛑 `margin-left: auto` KHÔNG thừa, và đây là chỗ bản test nói dối. Astra để
   `#ast-cart-wrapper { justify-content: space-between }`, mà trên PROD hàng flex đó
   có **ba** con chứ không phải hai: plugin Stripe thêm
   `<wc-order-attribution-inputs>` bề ngang 0 vào cuối. `space-between` chia chỗ
   trống cho HAI khe thay vì một → khe chỉ ra 25,8px và thẻ tổng thụt vào 25,8px
   khỏi mép phải. Bản test **tắt Stripe** nên chỉ có hai con và đo ra đúng 51,6px;
   sai lệch chỉ lộ ra khi đo trên chính www.jellykey.com. `margin-left: auto` nuốt
   hết chỗ trống vào MỘT khe, nên đúng ở cả hai nơi và không phụ thuộc plugin nào
   đang bật. */
@media (min-width: 1200px) {
	.woocommerce-cart #ast-cart-wrapper .ast-cart-non-sticky { width: 65.7%; }
	.woocommerce-cart #ast-cart-wrapper .cart-collaterals { margin-left: auto; }
}
/* JK-CART-WIDTH END */

/* ============================================================================
   JK-HOVER START — RÊ CHUỘT THÌ GẠCH CHÂN, ĐỪNG NHUỘM ĐỎ. 2026-08-09
   ============================================================================
   Hùng chốt: "mấy cái hover chữ đỏ lên, cho gạch dưới đi, thuận mắt hơn."

   Quy ước: **chữ đổi màu đỏ khi rê chuột → thay bằng gạch chân**, chữ giữ nguyên
   màu. Đỏ ở site này đang mang nghĩa "hành động chính / cảnh báo / đang ở đây";
   dùng nó cho cả việc "con trỏ đang nằm trên chữ" làm nghĩa đó loãng ra, và trên
   một lưới 12 sản phẩm thì một tên hàng đỏ lên đọc thành "món này khác các món kia".

   Bộ số dùng chung cho mọi chỗ: `underline` · `text-underline-offset: 3px` ·
   `text-decoration-thickness: 1px` · màu gạch = màu chữ.

   Đã đổi (sửa tại chỗ, không gom về đây): đường dẫn (breadcrumb) · tên hàng ở lưới
   shop · cây danh mục ở cột bên, cả bản widget lẫn bản block.

   **Menu chính** cũng theo: vạch dưới mục đang rê / đang xem đổi từ đỏ sang ĐEN
   (Hùng chốt 2026-08-09, sau khi nhìn bản render).

   KHÔNG đổi, và có lý do:
   - **Nút xoá món trong giỏ** — icon chuyển đỏ khi rê là cảnh báo "bấm là mất hàng",
     đúng nghĩa của đỏ.
   - **Các nút** (Add to cart, Place order, 404) — nền đỏ chữ trắng, không phải chữ đổi màu.
   - **Vạch đỏ bên trái trong ngăn kéo mobile** — đó là "bạn đang ở mục này", không phải
     phản hồi rê chuột. Để nguyên cho tới khi Hùng nói khác.
   ---------------------------------------------------------------------------- */
/* (Các luật nằm cạnh phần chúng sửa; mục này là nơi ghi quy ước.) */
/* JK-HOVER END */

/* ============================================================================
   JK-CASE START — BỎ CHỮ IN HOA TOÀN CHỮ. 2026-08-09
   ============================================================================
   Hùng: "bỏ mấy cái chữ in hoa toàn chữ, cân lại cho đẹp."

   Trước đó bậc "nhãn" của thang chữ được dựng bằng ba thứ cùng lúc: cỡ nhỏ +
   IN HOA + giãn chữ. Bỏ in hoa thì phải bù lại hai chỗ, nếu không nhãn tụt xuống
   thành chữ nhỏ mờ không ra bậc nào:

   1. **To lên 1–2px.** Chữ hoa cao bằng cả thân chữ, chữ thường chỉ cao bằng phần
      x-height (~70%), nên cùng một con số px thì chữ thường trông nhỏ hơn hẳn.
   2. **Bỏ giãn chữ** (`letter-spacing` về 0). Giãn chữ sinh ra để cứu chữ hoa vốn
      dính nhau; áp lên chữ thường thì chữ rời rạc, đọc chậm.

   Bậc nhãn giờ nhận ra nhờ **độ đậm (600–700) + màu phụ + font mono**, không nhờ
   viết hoa nữa. Tám chỗ đã đổi:
   | chỗ | trước | sau |
   |---|---|---|
   | tiêu đề cột chân trang `.jk-foot__h` | mono 12px · HOA | mono **18px** |
   | tiêu đề widget cột bên | mono 13px · HOA | mono **18px** |
   | nhãn cột bảng giỏ + thanh toán `--jk-fs-label` | 13px · .07em · HOA | 14px · 0 |
   | nhãn cột bảng giỏ (desktop) | 15px · .04em · HOA | 15px · 0 |
   | nhãn tình trạng trên ảnh lưới `.jk-tag` | mono 11px · HOA | mono 12px |
   | nhãn thông số ở trang sản phẩm | mono 13px · HOA | mono 14px |
   | nhãn tình trạng trên ảnh sản phẩm `.jk-pdp-state` | mono 11px · HOA | mono 12px |

   🛑 **Hai hàng đầu bảng nhảy hẳn lên 18px, và đó là điểm phải nhớ: NHÃN với TIÊU ĐỀ
   không cùng luật.** Nhãn (Design, Subtotal, In stock) đặt tên cho một giá trị nằm
   ngay cạnh, nên nhỏ hơn giá trị là đúng. Tiêu đề (Shop, Studio, Jelly Key product
   tags) đứng TRÊN một danh sách, nên phải lớn hơn các mục trong danh sách. Bản đầu
   tôi hạ cả hai xuống cùng một bậc, Hùng nhìn ra ngay: "Shop" 14px ngồi trên
   "Artisan keycaps" 16px. Chữ IN HOA che được lỗi này (chữ hoa cao bằng cả thân chữ),
   bỏ in hoa là lộ.

   ⚠️ Kiểm chữ GỐC trước khi bỏ in hoa. Chỗ nào HTML viết thường hết thì bỏ
   `text-transform` xong sẽ ra chữ thường trông như lỗi. Đã đọc `textContent` của cả
   tám chỗ: "Design", "Switch: MX", "In stock", "Product/Price/Quantity/Subtotal" —
   đều Title Case sẵn.
   ---------------------------------------------------------------------------- */
/* (Các luật nằm cạnh phần chúng sửa; mục này là nơi ghi quy ước.) */
/* JK-CASE END */

/* ============================================================================
   JK-ELEMENTOR START — BO GÓC ẢNH TRONG NỘI DUNG ELEMENTOR. 2026-08-09
   ============================================================================
   Đây là lần đầu theme chạm vào phần Elementor, nên đọc kỹ ranh giới ở mục 0 của
   `docs/he-thong-thiet-ke.md` trước khi thêm bất cứ thứ gì vào mục này.

   🛑 **KHÔNG `!important`, và không nhắm `.elementor img` chung.** Mọi luật dưới đây
   cố ý để specificity thấp, để **bất kỳ bán kính nào Hùng đặt trong Elementor cũng
   thắng**. Đã kiểm bằng số: hai ảnh trang chủ đang mang bán kính riêng
   `0 0 200px 200px` và `200px 200px 0 0`; sau khi áp luật 16px ở đây, đọc lại
   `getComputedStyle` vẫn ra đúng 200px — luật của Hùng thắng, ảnh chưa ai đặt gì
   thì nhận 16px. Thêm `!important` là phá thiết kế của 186 mô tả sản phẩm cùng lúc.

   Ảnh trong mô tả sản phẩm và ảnh bài viết: bo ở chính ảnh là đủ, chúng không
   phóng to hay chạy ra ngoài khổ. */
.elementor-widget-image img,
.elementor-widget-theme-post-featured-image img,
.elementor-post__thumbnail img { border-radius: var(--jk-r-media); }

/* ⚠️ Nhưng LƯỚI của widget Posts/Products (trang chủ: khối "In-Stock sales") thì bo ở
   ẢNH KHÔNG ĂN — và đây là bẫy thứ ba cùng kiểu trong hai ngày, xem gallery bên dưới và
   ảnh hover ở mục 6. Đo trên prod: khung `.elementor-post__thumbnail` 285×285 `overflow:
   hidden`, còn ảnh bên trong 432×288 `position:absolute` + `transform: matrix(1.01…)` để
   lấp đầy khung. Bốn góc bo của ảnh nằm NGOÀI khung nên khách chỉ thấy góc vuông.
   → Quy tắc chung: **ảnh nào bị khung cắt thì bo ở KHUNG.**

   🛑 ĐÂY LÀ CHỖ DUY NHẤT THEME ĐÈ LÊN ELEMENTOR — đọc trước khi sửa.
   Bo ở khung vẫn chưa đủ: Elementor tự sinh file `uploads/elementor/css/post-19.css`
   và ghi thẳng vào đó
       `.elementor-19 .elementor-element.elementor-element-1bce6ae .elementor-post__thumbnail
        { border-radius: 0px 0px 0px 0px }`
   với specificity (0,4,0) — luật (0,1,0) của theme thua và **không báo gì cả**. Số 0 đó
   là giá trị MẶC ĐỊNH widget tự ghi ra, không phải Hùng chọn; Hùng còn hỏi tại sao lưới
   chưa bo. Nên ở riêng lưới Posts/Products, theme thắng: chuỗi dưới đây (0,4,1) hơn đúng
   một bậc type.
   ⚠️ Hệ quả phải nhớ: từ nay đặt bán kính cho ảnh lưới TRONG Elementor sẽ KHÔNG ăn —
   đổi thì đổi ở dòng này. Ảnh widget Image và gallery thì vẫn nhường Elementor như cũ
   (đã đo: hai ảnh trang chủ giữ nguyên `200px`). */
body .elementor .elementor-element .elementor-posts-container .elementor-post__thumbnail,
body .elementor .elementor-element .elementor-posts-container .elementor-post__thumbnail__link {
	border-radius: var(--jk-r-media);
	overflow: hidden;
}

/* Gallery (widget `uael-image-gallery`, 1.166 cái trong mô tả sản phẩm): bo ở KHUNG,
   không ở ảnh. Ảnh bên trong mang `transform: scale(…)` do control `image_scale` của
   widget — bo ở ảnh thì bốn góc bo bị phóng ra ngoài khung và khách thấy góc vuông,
   đúng cái bẫy của ảnh sản phẩm hover-zoom (xem mục 6). Khung vốn đã `overflow:hidden`
   nên chỉ cần thêm bán kính. */
.uael-grid-img-thumbnail,
.uael-image-gallery .uael-grid-item-content { border-radius: var(--jk-r-media); }
/* JK-ELEMENTOR END */

/* ============================================================================
   JK-MYACCOUNT START — TRANG TÀI KHOẢN ĐÃ ĐĂNG NHẬP. 2026-08-09
   ============================================================================
   Bốn tab sau khi đăng nhập (Dashboard · Orders · Addresses · Account details) là
   phần cuối cùng còn nguyên kiểu WooCommerce/Astra mặc định: menu bên là một danh
   sách có vạch kẻ từng dòng, nội dung trôi trên nền trắng không thẻ, bảng đơn hàng
   kẻ ô lưới, thẻ địa chỉ vuông góc. Đứng cạnh giỏ hàng và trang đăng nhập — vốn đã
   là thẻ bo tròn có bóng — nó đọc ra như một trang của site khác.

   ⚠️ Không nhầm với `JK-ACCOUNT` (trang đăng nhập/đăng ký/quên mật khẩu, khách CHƯA
   đăng nhập). Mục này chỉ nhắm `.woocommerce-account.logged-in`.

   ⚠️ Lịch sử: `JK-ACCOUNT-DASH` từng bị GỠ 2026-06-30 vì tưởng child theme phá kiểu
   nav của Astra Modern Account. Thủ phạm thật là Astra "File Generation" phục vụ CSS
   cache cũ, và đã tắt. Nên viết lại ở đây là an toàn — nhưng nếu một ngày nav trở
   chứng, kiểm Astra File Generation TRƯỚC khi đổ cho mục này.
   ---------------------------------------------------------------------------- */

/* ---- Menu bên: thẻ bo tròn, mỗi mục một ô bấm ----
   Bỏ vạch kẻ dưới từng dòng — cùng lý do đã bỏ ở menu thả xuống của header (v1.9.0):
   vạch kẻ từng dòng đọc ra bảng biểu, không ra menu. Khoảng cách và ô nền lo việc đó. */
/* 🛑 Hai vạch dọc của Astra vẫn còn sau khi dựng thẻ, và Hùng nhìn ra ngay (2026-08-09):
   1. `nav` mang `border-right: 1px solid #E1E1E1` — một đường kẻ chạy suốt chiều cao, nằm
      NGOÀI thẻ nên đọc ra "thẻ bị gạch một nét dọc bên hông".
   2. mục đang xem có `li.is-active::after` — vạch đen 3px, `position:absolute; right:-1px`,
      tức cách đánh dấu CŨ của Astra. Nay ô nền mực đã làm việc đó rồi; để lại thì thành
      một cái gai đen thò ra khỏi góc bo của thẻ.
   Cả hai đều vô hình trong style.css nên chỉ lộ ra khi đọc `getComputedStyle`. */
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation { border: 0 !important; }
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li.is-active::after,
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li.is-active > a::after { display: none !important; }

.woocommerce-account.logged-in .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0;
	padding: 8px;
	/* Tile 2026-08-12 (vòng 2: nền nhạt + viền mảnh) — xem khối token --jk-tile */
	background: var(--jk-tile);
	border: 1px solid var(--jk-tile-line);
	border-radius: var(--jk-r-card);
}
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li {
	margin: 0;
	border: 0 !important;   /* Woo kẻ border-bottom cho từng <li> */
}
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a {
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 12px 12px;
	border-radius: var(--jk-r-ctl);
	/* Source Sans, KHÔNG mono (sửa 2026-08-12 — Hùng: my-account "nhiều thứ xấu, không đúng
	   chuẩn"). Bản 08-09 cho nav này đi mono với lý do "cùng vai với menu chính" — nhưng menu
	   chính GIỮ Source Sans theo chính quyết định của Hùng 08-08 (mục 4 của JK-CC), nên mono
	   ở đây là tự mâu thuẫn. Điều hướng là chữ để ĐỌC. 15px: mọi ô bấm của site (menu chính
	   16px, nút 15-16px) — và ở 15px sans, nhãn dài nhất "Orders, groupbuy joined" ~161px,
	   thừa chỗ trong ~196px, không còn cần cỡ 13px co kéo như thời mono. */
	font-size: 15px;
	/* nowrap: text node trong một hàng flex là item co được, nên dù đủ chỗ nó vẫn tự ngắt
	   làm đôi và ô nền cao gấp rưỡi các mục bên cạnh.
	   ⚠️ Chỉ giữ nowrap khi cột đủ rộng: ở 769–1100px cột nav hẹp lại mà chữ không được
	   ngắt thì "Orders, groupbuy joined" TRÀN RA NGOÀI THẺ đè lên khung nội dung (bắt được
	   trên ảnh chụp 800px, 2026-08-12). Khổ ≤768 đã có luật riêng ở media query dưới. */
	white-space: nowrap;
	font-weight: 500;
	color: var(--jk-ink);
	text-decoration: none;
	transition: background .12s ease, color .12s ease;
}
@media (min-width: 769px) and (max-width: 1100px) {
	.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a { white-space: normal; }
}
/* hover dùng --jk-tile-hov chứ KHÔNG --jk-soft: soft (#F7F7F7) trùng màu nền tile nên vô hình */
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a:hover { background: var(--jk-tile-hov); }
/* Mục đang xem: nền mực, chữ trắng — cùng ngôn ngữ với ô thông số đang chọn ở trang
   sản phẩm. Trước đó Astra đánh dấu bằng một vạch dọc dày bên phải, đọc ra "đường kẻ
   của bảng" chứ không ra "mục đang mở". */
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li.is-active > a {
	background: var(--jk-ink);
	color: #fff;
}
/* Icon của Astra là SVG tô cứng màu; ép theo màu chữ để nó trắng trên nền mực. */
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a svg { fill: currentColor; }
.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a .ahfb-svg-iconset { color: inherit; }

/* ---- Khung nội dung: một thẻ, như mọi thẻ khác của site ---- */
.woocommerce-account.logged-in .woocommerce-MyAccount-content {
	/* Tile 2026-08-12 (vòng 2: nền nhạt + viền mảnh) — xem khối token --jk-tile */
	background: var(--jk-tile);
	border: 1px solid var(--jk-tile-line);
	border-radius: var(--jk-r-card);
	padding: var(--jk-card-pad);
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content > p:first-of-type { margin-top: 0; }
.woocommerce-account.logged-in .woocommerce-MyAccount-content > :last-child { margin-bottom: 0; }

/* ---- Bảng đơn hàng: KHÔNG khung riêng ----
   Bản đầu cho bảng một khung viền + nền xám ở đầu bảng, giống bảng giỏ hàng. Nhưng bảng giỏ
   đứng MỘT MÌNH trên nền trang, còn bảng này nằm TRONG thẻ nội dung — thành khung lồng khung,
   hai đường viền cách nhau 26px, mắt phải đi qua hai lần ranh giới để tới con số. Hùng gạt:
   "có viền bảng rồi viền ngoài nữa nhìn chán quá".
   Nay bảng không có khung nào: đầu bảng chỉ là một hàng nhãn với đường kẻ dưới, mỗi đơn cách
   nhau bằng một đường kẻ mảnh, và chữ thẳng mép trái/phải của thẻ — thẻ đã là cái khung rồi. */
.woocommerce-account.logged-in .woocommerce-orders-table {
	border-collapse: collapse;
	border: 0 !important;
	border-radius: 0 !important;
	margin: 0;
}
/* 🛑 BỎ HẲN HÀNG NHÃN ĐẦU BẢNG. Thử hai kiểu và Hùng gạt cả hai: nền xám thì thành khung
   lồng khung, để trần thì "header quá ghê" — một hàng chữ nhỏ mờ rải ngang, nặng bằng cả
   hàng dữ liệu bên dưới mà không mang thông tin nào.
   Bỏ được vì năm giá trị này TỰ NÓI RA nó là gì: `#JK…` là mã đơn, `06/08/2026` là ngày,
   `On hold` là chip trạng thái, `$2,867` là tiền, và cái còn lại là một cái nút. Nhãn cột
   chỉ cần khi hai cột trông giống nhau — ở đây không cột nào giống cột nào. */
.woocommerce-account.logged-in .woocommerce-orders-table thead { display: none; }
.woocommerce-account.logged-in .woocommerce-orders-table tbody td {
	border: 0 !important;
	border-top: 1px solid var(--jk-line) !important;
	padding: 20px 14px !important;
	vertical-align: middle;
	font-size: 16px;
}
.woocommerce-account.logged-in .woocommerce-orders-table tbody tr:first-child td {
	border-top: 0 !important;
	padding-top: 4px !important;   /* 0 thì mã đơn dính mép trên của thẻ */
}
/* Ngày: chữ phụ, nó chỉ đứng cạnh mã đơn cho đủ ngữ cảnh */
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-date { color: var(--jk-muted); }
/* Tổng tiền: thứ khách quét mắt tìm, cho nó nặng hơn phần chữ "for 4 items" đi kèm */
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-total { font-weight: 600; }
/* Cột đầu và cột cuối thẳng mép thẻ — nếu thụt vào thì lại đọc ra "một cái bảng nữa" */
.woocommerce-account.logged-in .woocommerce-orders-table :is(th, td):first-child { padding-left: 0 !important; }
.woocommerce-account.logged-in .woocommerce-orders-table :is(th, td):last-child { padding-right: 0 !important; text-align: right; }
/* Mã đơn là thứ khách đối chiếu với email — cho nó mono, đúng vai "thông số" (mục 2b) */
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-number {
	font-family: var(--jk-font-mono);
	font-size: 15px;
	font-weight: 700;
	/* 🛑 Ô NÀY có `border-right` VÀ `border-top` riêng, không đi theo luật `border:0` viết cho
	   `td` bên trên — Woo kẻ một nét dọc sau cột mã đơn và một nét ngang trên nó. Nét dọc chạy
	   suốt chiều cao bảng; nét ngang thì chỉ hiện ở HÀNG ĐẦU (các hàng sau bị đường kẻ ngăn của
	   mình đè lên) nên ra một đoạn gạch ngắn lửng lơ phía trên mã đơn đầu tiên — Hùng chỉ đúng
	   chỗ đó. Phải nhắm đích danh mới gỡ được. */
	border-right: 0 !important;
}
.woocommerce-account.logged-in .woocommerce-orders-table tbody tr:first-child .woocommerce-orders-table__cell-order-number {
	border-top: 0 !important;
}
/* Trạng thái đơn: CHIP THẬT, cùng bộ với nhãn tình trạng trên ảnh sản phẩm (.jk-pdp-state).
   ⚠️ Chú thích cũ (08-09) ghi "thành chip" nhưng chưa bao giờ là chip — chỉ là chữ mono xám
   trần, vì ô <td> của Woo không có thẻ con để dựng viên thuốc. Nay jk-toolkit 1.6.17 bọc
   trạng thái trong <span class="jk-ochip jk-ochip--{status}"> (hook
   woocommerce_my_account_my_orders_column_order-status) nên chip dựng được thật.
   Luật trên <td> giữ lại làm LƯỚI AN TOÀN: nếu ai tắt jk-toolkit, chữ trần vẫn đọc được. */
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-status {
	font-family: var(--jk-font-mono);
	font-size: 13px;
	font-weight: 700;
	color: var(--jk-muted);
	white-space: nowrap;
}
.jk-ochip {
	display: inline-flex;
	align-items: center;
	height: 26px;
	padding: 0 11px;
	border-radius: var(--jk-r-pill);
	border: 1px solid var(--jk-line);
	background: #fff;
	font-family: var(--jk-font-mono);
	font-size: 12px;
	font-weight: 700;
	letter-spacing: 0;
	color: var(--jk-muted);
}
/* Đơn đang chạy: mực — khách cần thấy nó "sống". Hoàn tất: xám là đủ, việc đã xong. */
.jk-ochip--processing { color: var(--jk-ink); border-color: var(--jk-ink); }
/* Chờ thanh toán (bank transfer chưa báo có, đơn chưa trả) = việc KHÁCH còn phải làm → đỏ,
   đúng vai cảnh báo của mục 1 JK-CC. Thất bại cùng vai. */
.jk-ochip--on-hold, .jk-ochip--pending, .jk-ochip--failed { color: var(--jk-red); border-color: rgba(212, 32, 39, .35); }
/* Nút "View": KHÔNG đỏ. Đỏ dành cho hành động chính (mục 1), mà ở bảng này mỗi hàng
   một nút đỏ thì cả cột đỏ rực trong khi việc nó làm chỉ là mở đơn ra xem. */
.woocommerce-account.logged-in .woocommerce-orders-table .button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 40px;
	padding: 0 18px;
	border: 1px solid var(--jk-ink) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	color: var(--jk-ink) !important;
	font-size: 15px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .woocommerce-orders-table .button:hover { background: var(--jk-tile-hov) !important; }
/* Mã đơn là neo của hàng — link bên trong phải ăn đúng 700 của ô, đừng để luật link
   600 đầu file (mục ACCOUNT/CART/CHECKOUT) kéo xuống. Đo 2026-08-13: ô 700, link 600. */
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-number a { font-weight: 700; }

/* ---- Phân trang bảng đơn (Previous / Next) — 2026-08-13 ----
   Hùng: "nút next chưa đúng kìa" — nó đang là nút Astra mặc định: đỏ #CE1A1A lệch tông,
   vuông góc, 18px/700, giữa một khu đã toàn nút bo tròn. Đây là ĐIỀU HƯỚNG chứ không
   phải hành động chính → bộ nút phụ trắng viền mực, cùng cỡ nút "View" trong bảng.
   Previous neo trái, Next đẩy về phải (margin-left:auto — không phụ thuộc số nút,
   cùng bài học auto-margin của JK-CART-WIDTH). */
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-pagination {
	display: flex;
	align-items: center;
	margin-top: var(--jk-sp-5);
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-pagination .button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 44px;
	padding: 0 22px;
	border: 1px solid var(--jk-ink) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	color: var(--jk-ink) !important;
	font-size: var(--jk-fs-btn-sm);
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-pagination .button:hover { background: var(--jk-tile-hov) !important; }
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-pagination .woocommerce-button--next { margin-left: auto; }

/* ---- Địa chỉ: hai thẻ, bỏ dải xám sau tiêu đề ----
   2026-08-12 (đợt tile Apple): khối con trong tile xám đi TRẮNG không viền — đúng công
   thức "white card on gray" của mẫu; viền cũ trên nền xám vừa mờ vừa là khung lồng khung. */
.woocommerce-account.logged-in .woocommerce-Address address {
	background: #fff;
	border: 1px solid var(--jk-line);   /* vòng 2: tile nhạt (#FAFAFB) nên trắng trần chìm mất */
	border-radius: var(--jk-r-panel);
	padding: 20px;
	font-style: normal;
	font-size: var(--jk-fs-body);   /* 2026-08-13: thiếu dòng này nên ăn 18 của Astra, trong khi thẻ địa chỉ trang xem đơn 16 — cùng một thẻ hai cỡ */
	line-height: 1.6;
	color: var(--jk-ink);
}
.woocommerce-account.logged-in .woocommerce-Address-title {
	background: none !important;
	border: 0 !important;
	padding: 0 0 12px !important;
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 16px;
}
.woocommerce-account.logged-in .woocommerce-Address-title h2,
.woocommerce-account.logged-in .woocommerce-Address-title h3 {
	margin: 0;
	font-size: 18px !important;
	font-weight: 600 !important;
	color: var(--jk-ink) !important;
}
/* "Add billing address" là lối rẽ, không phải hành động chính → chữ có gạch chân,
   cùng cách đã dùng cho "Have a coupon?" ở giỏ hàng. */
.woocommerce-account.logged-in .woocommerce-Address-title a {
	/* `margin-left:auto` chứ không trông chờ `space-between` của khối bọc: header này có
	   thêm text node giữa hai phần tử nên hàng flex hoá ra ba item và chỗ trống bị chia
	   đôi — link dừng ở giữa thay vì về sát mép phải. Cùng bài học với thẻ tổng ở giỏ
	   hàng (JK-CART-WIDTH): auto-margin không phụ thuộc số phần tử. */
	margin-left: auto;
	font-size: 15px;
	color: var(--jk-ink);
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}

/* ---- Trang XEM ĐƠN (view-order) + tiêu đề khu nội dung — 2026-08-12 ----
   Endpoint này bị mục 08-09 BỎ QUÊN hoàn toàn (chỉ style 4 tab, quên trang con của Orders)
   và Hùng khoanh đỏ đúng nó: "chỉnh mấy font mỏng này lại đi, xấu quá". Hiện trạng đo được:
   "Order details"/"Billing address" ăn h2 Astra 30px/nét 200 xám — chữ mờ phóng to; bảng
   chi tiết đơn 18px/400 xám ĐỒNG LOẠT (tên hàng, nhãn, tổng tiền cùng một bậc — không có
   phân cấp nào); "Billing address" còn nằm trên một dải nền xám của Astra = khung lồng khung
   y như vụ bảng đơn hàng.

   1) Tiêu đề về bậc tiêu đề thẻ của site: 22px / var(--jk-fw-title) mực — cùng số đã chốt
   cho "Billing details" ở thanh toán (2026-08-12). KHÔNG !important: (0,3,1) đã thắng
   h2 Astra (0,1,1), và nhờ vậy KHÔNG đè luật 18px !important của tiêu đề thẻ địa chỉ
   (.woocommerce-Address-title h2) ở trên — hai bậc này cố ý khác nhau: một cái là tiêu đề
   TRANG CON, một cái là tiêu đề THẺ trong lưới. `> h2` bắt tiêu đề không class của form
   sửa địa chỉ (con trực tiếp của khung nội dung) mà không chạm h2 trong thẻ địa chỉ. */
.woocommerce-account.logged-in .woocommerce-MyAccount-content > h2,
.woocommerce-account.logged-in .woocommerce-MyAccount-content > form > h2,   /* form sửa địa chỉ đặt h2 TRONG <form> */
.woocommerce-account.logged-in .woocommerce-order-details__title,
.woocommerce-account.logged-in .woocommerce-column__title {
	font-size: 22px;
	font-weight: var(--jk-fw-title, 650);
	color: var(--jk-ink);
	line-height: 1.3;
	background: none;   /* gỡ dải xám Astra sau "Billing address" */
	border: 0;          /* …và cái VIỀN chữ nhật Astra addon bao quanh chính tiêu đề đó */
	padding: 0;
	margin: 0 0 14px;
}
.woocommerce-account.logged-in .woocommerce-customer-details { margin-top: 30px; }

/* 2) Dòng mở đầu "Order #… was placed on … and is currently …" — ba giá trị nằm trong
   <mark>: mã đơn + ngày đi mono đúng vai thông số (mục 2b JK-CC), trạng thái đậm là đủ. */
.woocommerce-account.logged-in .woocommerce-MyAccount-content mark {
	background: none;
	color: var(--jk-ink);
	font-weight: 600;
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content :is(mark.order-number, mark.order-date) {
	font-family: var(--jk-font-mono);
	font-variant-numeric: tabular-nums;
	letter-spacing: -.02em;
}

/* 3) Bảng chi tiết đơn: cùng ngôn ngữ với bảng đơn hàng ở trên — thẻ nội dung đã là cái
   khung, bảng chỉ còn đường kẻ ngăn hàng; hàng nhãn đầu bảng đi mono bậc nhãn. */
.woocommerce-account.logged-in table.order_details {
	border: 0 !important;
	border-radius: 0 !important;
	border-collapse: collapse;
	margin: 0;
}
.woocommerce-account.logged-in table.order_details :is(th, td) {
	border: 0 !important;
	border-top: 1px solid var(--jk-line) !important;
	background: none !important;   /* gỡ nền xám tfoot của Woo */
	padding: 16px 14px !important;
	/* !important (2026-08-13): thiếu nó thì hai ô cuối tfoot (Payment method / Bank
	   transfer) ăn 18px của một luật Astra mạnh hơn — cả bảng 17 riêng hàng chót 18.
	   Không khoá cỡ chữ con: bdi/mono là PHẦN TỬ CON, tự mang luật riêng. */
	font-size: var(--jk-fs-body) !important;
}
.woocommerce-account.logged-in table.order_details :is(th, td):first-child { padding-left: 0 !important; }
.woocommerce-account.logged-in table.order_details :is(th, td):last-child { padding-right: 0 !important; text-align: right; }
/* ⚠️ KHÔNG style thead ở đây: Astra addon đã `display:none` nó từ trong CSS inline tự sinh
   (.woocommerce-order-details .shop_table thead) — hàng nhãn "Product/Total" chưa bao giờ
   hiện, và thế là ĐÚNG Ý chủ: cùng lý do Hùng gạt hàng nhãn ở bảng đơn hàng ("header quá
   ghê"). Đã mất một vòng đo vì viết luật cho một thứ vô hình. */
/* Tên hàng là thứ khách nhận ra đơn — bậc tên (600 mực), như tên sản phẩm ở giỏ */
.woocommerce-account.logged-in table.order_details td.product-name { font-weight: 600; color: var(--jk-ink); }
.woocommerce-account.logged-in table.order_details td.product-name a { color: inherit; }
/* Dòng thông số (Designs/Sizes/Profiles) đã mono 14 theo luật .wc-item-meta (mục 3 JK-CC);
   ở đây chỉ trả nó về nét thường + màu phụ cho khỏi tranh bậc với tên hàng. */
.woocommerce-account.logged-in table.order_details td.product-name :is(.wc-item-meta, dl.variation) {
	font-weight: 400;
	color: var(--jk-muted);
}
/* Chân bảng: nhãn (Subtotal/Payment method) màu phụ; riêng hàng TỔNG là con số khách tìm */
.woocommerce-account.logged-in table.order_details tfoot th {
	font-weight: 500;
	color: var(--jk-muted);
	text-align: left;
}
/* Hàng TỔNG: KHÔNG dùng :last-child — Woo ở đây xếp Payment method SAU Total (đo DOM
   2026-08-12: Subtotal → Total → Payment method), và đơn chờ trả tiền còn mọc thêm hàng
   Actions ở cuối. Hàng Tổng = hàng CÓ con số tiền mà sau nó không còn hàng tiền nào nữa —
   :has() tả đúng điều đó, không phụ thuộc thứ tự. Trình duyệt không có :has thì mọi nhãn
   cùng màu phụ, không sai chỉ nhạt. */
.woocommerce-account.logged-in table.order_details tfoot tr:has(.woocommerce-Price-amount):not(:has(~ tr .woocommerce-Price-amount)) th { color: var(--jk-ink); font-weight: 600; }
.woocommerce-account.logged-in table.order_details tfoot tr:has(.woocommerce-Price-amount):not(:has(~ tr .woocommerce-Price-amount)) td { font-weight: 600; }

/* 3b) Nút "Order again" (chỉ mọc ở đơn Completed — <p class="order-again"> NGAY SAU bảng,
   margin 0 nên dính vào đường kẻ hàng cuối; nút là kiểu Astra thô: vuông góc, đỏ #CE1A1A
   lệch tông brand, 38px. Hùng chỉ đích danh 2026-08-12: "nút order again đang xấu, sát
   line ở trên nữa nè". Mua lại là hành động chính → đúng bộ nút đỏ của site. */
.woocommerce-account.logged-in .woocommerce-order-details .order-again {
	margin: 22px 0 0;
}
.woocommerce-account.logged-in .woocommerce-order-details .order-again .button {
	display: inline-flex;
	align-items: center;
	min-height: 54px;
	padding: 0 26px;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: 16px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .woocommerce-order-details .order-again .button:hover { background: var(--jk-red-dark) !important; }

/* 4) Khối địa chỉ trong trang xem đơn: cùng thẻ địa chỉ với tab Addresses
   (trắng-trên-xám theo đợt tile Apple 2026-08-12) */
.woocommerce-account.logged-in .woocommerce-customer-details address {
	background: #fff;
	border: 1px solid var(--jk-line);   /* vòng 2: như thẻ địa chỉ tab Addresses */
	border-radius: var(--jk-r-panel);
	padding: 20px;
	font-style: normal;
	line-height: 1.6;
	font-size: var(--jk-fs-body);   /* 16 → 17: cùng cỡ thẻ địa chỉ tab Addresses (2026-08-13) */
	color: var(--jk-ink);
}

/* ---- Ô nhập: về đúng bộ ô nhập của site ----
   Woo/Astra để ô bo **4px**, viền #E1E1E1, chữ 18px, và hàng "wide" kéo dài hết 846px của
   thẻ. Ba cái sai một lúc: bo 4px cạnh thẻ bo 20px đọc ra "ô của trang khác dán vào"; chữ
   18px là cỡ NỘI DUNG chứ không phải cỡ giao diện (cùng lỗi đã sửa ở khu chọn mua, mục 2b);
   và một dòng nhập 846px cho "First name" thì con mắt phải chạy hết chiều ngang màn hình
   cho một chữ.

   Không đụng chiều cao và padding: nhãn nổi của Astra (`.ast-animate-input`) định vị theo
   chính hai con số đó — sửa vào là nhãn rơi ra khỏi ô. Chỉ đổi bo góc, viền, cỡ chữ. */
.woocommerce-account.logged-in .woocommerce-EditAccountForm,
.woocommerce-account.logged-in .woocommerce-address-fields { max-width: 640px; }

.woocommerce-account.logged-in :is(.woocommerce-EditAccountForm, .woocommerce-address-fields) :is(input[type="text"], input[type="email"], input[type="tel"], input[type="password"], select, textarea) {
	border: 1px solid var(--jk-line) !important;
	border-radius: var(--jk-r-ctl) !important;
	/* 17px theo --jk-fs-body — 16px là số của thời Inter; form thanh toán đã chốt 17px
	   (2026-08-12, "chữ form to hơn chuẩn") thì form tài khoản phải cùng cỡ. */
	font-size: var(--jk-fs-body) !important;
	color: var(--jk-ink);
	transition: border-color .12s ease, box-shadow .12s ease;
}
/* Focus: viền mực + quầng đỏ rất nhạt — cùng bộ với ô nhập ở thanh toán (mục 5) */
.woocommerce-account.logged-in :is(.woocommerce-EditAccountForm, .woocommerce-address-fields) :is(input, select, textarea):focus {
	border-color: var(--jk-ink) !important;
	box-shadow: 0 0 0 3px var(--jk-red-ring) !important;
	outline: 0 !important;
}
/* Ô quốc gia là select2 — chữ hiển thị nằm trong span riêng, không ăn luật input ở trên */
.woocommerce-account.logged-in .select2-container .select2-selection__rendered { font-size: var(--jk-fs-body); }
/* Dòng giải thích dưới ô ("This will be how your name will be displayed…") đang 18px, tức
   nặng ngang chính nội dung nó giải thích. Về bậc chú thích. */
.woocommerce-account.logged-in :is(.woocommerce-EditAccountForm, .woocommerce-address-fields) span.description,
.woocommerce-account.logged-in :is(.woocommerce-EditAccountForm, .woocommerce-address-fields) em {
	display: block;
	margin-top: 8px;
	font-size: var(--jk-fs-sm);
	font-style: normal;
	color: var(--jk-muted);
}
/* Dấu sao bắt buộc: đỏ là đúng vai (cảnh báo), nhưng nhỏ lại cho khỏi tranh chỗ với nhãn */
.woocommerce-account.logged-in .woocommerce-form-row .required { color: var(--jk-red); text-decoration: none; }

/* ---- Chi tiết tài khoản: nút lưu theo đúng bộ nút chính ---- */
.woocommerce-account.logged-in .woocommerce-EditAccountForm button[type="submit"],
.woocommerce-account.logged-in .woocommerce-address-fields button[type="submit"],
.woocommerce-account.logged-in .woocommerce-EditAccountForm .button {
	min-height: 54px;
	padding: 0 26px;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: 16px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .woocommerce-EditAccountForm button[type="submit"]:hover,
.woocommerce-account.logged-in .woocommerce-address-fields button[type="submit"]:hover,
.woocommerce-account.logged-in .woocommerce-EditAccountForm .button:hover { background: var(--jk-red-dark) !important; }
/* "Password change" là tiêu đề của một nhóm ô nhập, không phải chú thích */
.woocommerce-account.logged-in .woocommerce-EditAccountForm legend {
	font-size: 18px;
	font-weight: 600;
	color: var(--jk-ink);
	padding: 0;
	margin: 26px 0 14px;
}
.woocommerce-account.logged-in .woocommerce-EditAccountForm fieldset { border: 0; padding: 0; margin: 0; }

/* ---- Điện thoại: menu nằm trên nội dung, ô bấm cao hơn ---- */
@media (max-width: 768px) {
	.woocommerce-account.logged-in .woocommerce-MyAccount-navigation { margin-bottom: 22px; }
	.woocommerce-account.logged-in .woocommerce-MyAccount-navigation li a {
		padding: 14px;
		font-size: 16px;   /* mono, xem bản desktop */
	}
	.woocommerce-account.logged-in .woocommerce-MyAccount-content { padding: 18px; }
	/* Menu ở khổ hẹp: Astra dựng thành LƯỚI HAI CỘT, nên mục "Orders, groupbuy joined"
	   rơi ba dòng và ô nền đen của nó cao gấp đôi các mục bên cạnh — hàng lệch nhau như
	   bảng xếp hình. Một cột, mỗi mục một hàng, đọc thẳng từ trên xuống. */
	.woocommerce-account.logged-in .woocommerce-MyAccount-navigation ul {
		display: block;
	}

	/* Bảng đơn ở khổ hẹp do woocommerce-smallscreen dựng lại thành từng dòng một nhãn.
	   Cho MỖI ĐƠN thành một thẻ riêng — nếu không, ba đơn nối nhau thành một cột chữ dài
	   không biết đơn nào hết ở đâu. */
	.woocommerce-account.logged-in .woocommerce-orders-table {
		border: 0;
		border-radius: 0;
	}
	.woocommerce-account.logged-in .woocommerce-orders-table tbody tr {
		display: block;
		background: #fff;   /* thẻ con trắng-trên-xám (đợt tile 2026-08-12) */
		border: 1px solid var(--jk-line);   /* vòng 2: tile nhạt nên cần viền mảnh định hình */
		border-radius: var(--jk-r-panel);
		overflow: hidden;
		margin-bottom: 14px;
	}
	.woocommerce-account.logged-in .woocommerce-orders-table tbody td {
		padding: 12px 14px !important;
		font-size: 15px;
	}
	/* Nhãn trái của thẻ ("Date:", "Status:") là ::before do woocommerce-smallscreen sinh từ
	   data-title. Nó đứng cạnh giá trị mono nên thừa kế mono — giữ, đúng vai nhãn (mục 2b
	   JK-CC), nhưng hạ xuống bậc nhãn cho giá trị bên phải nổi lên. */
	.woocommerce-account.logged-in .woocommerce-orders-table tbody td::before {
		font-family: var(--jk-font-mono);
		font-size: 12.5px;
		font-weight: 500;
		color: var(--jk-muted);
	}
	/* "Actions:" đứng tên cho MỘT CÁI NÚT — nút tự nói nó làm gì, nhãn chỉ là tiếng ồn. */
	.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-actions::before { content: none !important; }
	/* 🛑 Mã đơn bị Woo ẩn ở khổ hẹp (`display:none` cho ô đầu) — nhưng đó chính là thứ
	   khách đối chiếu với email xác nhận. Hiện lại và cho nó làm dòng đầu của thẻ. */
	.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-number {
		display: block !important;
		border-top: 0 !important;
		background: var(--jk-soft);
	}
	.woocommerce-account.logged-in .woocommerce-orders-table tbody tr td:not(.woocommerce-orders-table__cell-order-number) {
		border-top: 1px solid var(--jk-line) !important;
	}
}
/* ---- Form "Order tracking" (shortcode `[woocommerce_order_tracking]`) ----
   Cùng bộ ô nhập và nút với trang tài khoản: khách chưa đăng nhập vào đây tra đơn, và hai
   trang này nói cùng một việc. Trước đó ô bo 4px chữ 18px, nút "Track" cao 38px vuông góc.
   ⚠️ Form nằm TRONG một khối Elementor (mục 0) nhưng luật chỉ nhắm chính cái form của
   WooCommerce, không đụng gì tới nội dung Hùng dựng quanh nó. */
.woocommerce-form-track-order :is(input[type="text"], input[type="email"], input[type="tel"]) {
	border: 1px solid var(--jk-line) !important;
	border-radius: var(--jk-r-ctl) !important;
	font-size: var(--jk-fs-body) !important;   /* cùng cỡ form tài khoản + thanh toán */
	color: var(--jk-ink);
	transition: border-color .12s ease, box-shadow .12s ease;
}
.woocommerce-form-track-order :is(input[type="text"], input[type="email"], input[type="tel"]):focus {
	border-color: var(--jk-ink) !important;
	box-shadow: 0 0 0 3px var(--jk-red-ring) !important;
	outline: 0 !important;
}
/* "Track" là hành động chính của trang → đúng bộ nút chính (mục 5) */
.woocommerce-form-track-order button[type="submit"],
.woocommerce-form-track-order .button {
	min-height: 54px;
	padding: 0 30px;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: 16px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-form-track-order button[type="submit"]:hover,
.woocommerce-form-track-order .button:hover { background: var(--jk-red-dark) !important; }
/* Đoạn hướng dẫn phía trên hai ô: bậc nội dung, không phải bậc tiêu đề */
.woocommerce-form-track-order > p:first-child { font-size: var(--jk-fs-body); color: var(--jk-ink); }

/* ---- Payment methods (tab + trang thêm thẻ) — 2026-08-13 ----
   Hùng: "trong my-account, payment vẫn chưa làm kìa". Tab này bị các đợt 08-09/08-12 bỏ
   quên vì tài khoản test không có thẻ lưu: trạng thái rỗng là một notice Astra thô (vạch
   đen dày trên đầu + nền xám) và nút Astra vuông, đứng giữa một khu đã toàn thẻ bo tròn.
   ⚠️ Bản test TẮT Stripe/PayPal nên trang thêm thẻ (add-payment-method) không dựng được
   ở local — khối #add_payment_method bên dưới chỉ đổi màu/viền/nút, không đụng layout. */

/* Notice trong khu tài khoản ("No saved methods found." / "Address changed successfully"):
   cùng hộp thông báo đã chốt cho shop/giỏ/thanh toán (mục notice ~dòng 2330), nhưng nền
   TRẮNG chứ không --jk-soft: nội dung tài khoản nằm trên tile xám nhạt, xám-trên-xám thì
   hộp chìm mất — đúng công thức "white card on gray" của cả khu này. */
.woocommerce-account.logged-in .woocommerce-MyAccount-content :is(.woocommerce-message, .woocommerce-info, .woocommerce-error) {
	display: flex !important;
	align-items: center;
	gap: 12px;
	border: 1px solid var(--jk-line) !important;
	border-top: 1px solid var(--jk-line) !important;   /* Astra kẻ vạch đen dày trên đầu */
	border-left: 3px solid var(--jk-ink) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	padding: 16px 18px !important;
	color: var(--jk-ink);
	font-size: var(--jk-fs-body);
	line-height: 1.5;
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content :is(.woocommerce-message, .woocommerce-info, .woocommerce-error)::before {
	position: static !important;
	top: auto !important;
	left: auto !important;
	margin: 0 !important;
	flex: 0 0 auto;
}
/* Nút trong notice (vd "Browse products" ở Orders rỗng): về cuối hàng, kiểu nút phụ */
.woocommerce-account.logged-in .woocommerce-MyAccount-content :is(.woocommerce-message, .woocommerce-info) a.button {
	order: 9;
	margin-left: auto !important;
	flex: 0 0 auto;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	color: var(--jk-ink) !important;
	border: 1px solid #DCDCDC !important;
	padding: 9px 18px !important;
	font-weight: 500 !important;
}
/* Lỗi: viền trái + biểu tượng đỏ — cùng bộ với hộp lỗi giỏ/thanh toán */
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-error {
	border-left-color: var(--jk-red) !important;
	background: var(--jk-red-tint) !important;
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content .woocommerce-error::before { color: var(--jk-red) !important; }
.woocommerce-account.logged-in .woocommerce-MyAccount-content :is(.woocommerce-message, .woocommerce-info, .woocommerce-error):empty { display: none !important; }

/* "Add payment method" là hành động chính của tab → bộ nút đỏ của site.
   `> a.button` = link con trực tiếp của khung nội dung; nút trong bảng/notice không dính. */
.woocommerce-account.logged-in .woocommerce-MyAccount-content > a.button {
	display: inline-flex;
	align-items: center;
	min-height: 54px;
	padding: 0 26px;
	margin-top: 18px;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: 16px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .woocommerce-MyAccount-content > a.button:hover { background: var(--jk-red-dark) !important; }

/* Bảng thẻ đã lưu (khi có): cùng ngôn ngữ bảng đơn hàng — thẻ nội dung đã là khung,
   bảng chỉ còn đường kẻ ngăn hàng; nhãn cột giấu đi vì từng hàng tự nói nó là gì
   ("Visa ending in 1234" · "12/28" · nút). */
.woocommerce-account.logged-in .account-payment-methods-table {
	border: 0 !important;
	border-radius: 0 !important;
	border-collapse: collapse;
	margin: 0;
}
.woocommerce-account.logged-in .account-payment-methods-table thead { display: none; }
.woocommerce-account.logged-in .account-payment-methods-table :is(th, td) {
	border: 0 !important;
	border-top: 1px solid var(--jk-line) !important;
	background: none !important;
	padding: 18px 14px !important;
	vertical-align: middle;
	font-size: 16px;
}
.woocommerce-account.logged-in .account-payment-methods-table tr:first-child :is(th, td) {
	border-top: 0 !important;
	padding-top: 4px !important;
}
.woocommerce-account.logged-in .account-payment-methods-table :is(th, td):first-child { padding-left: 0 !important; }
.woocommerce-account.logged-in .account-payment-methods-table :is(th, td):last-child { padding-right: 0 !important; text-align: right; }
/* Tên thẻ là neo của hàng; hạn thẻ là thông số → mono (mục 2b JK-CC) */
.woocommerce-account.logged-in .account-payment-methods-table td.payment-method-method { font-weight: 600; color: var(--jk-ink); }
.woocommerce-account.logged-in .account-payment-methods-table td.payment-method-expires {
	font-family: var(--jk-font-mono);
	font-size: 15px;
	color: var(--jk-muted);
}
/* Delete / Make default: hành động phụ → bộ nút "View" của bảng đơn; riêng Delete là
   hành động phá nên chữ + viền ngả đỏ, nhưng KHÔNG nền đỏ (nền đỏ = hành động chính) */
.woocommerce-account.logged-in .account-payment-methods-table .button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 40px;
	padding: 0 16px;
	margin-left: 8px;
	border: 1px solid var(--jk-ink) !important;
	border-radius: var(--jk-r-ctl) !important;
	background: #fff !important;
	color: var(--jk-ink) !important;
	font-size: 15px;
	font-weight: 600;
	transition: background .12s ease;
}
.woocommerce-account.logged-in .account-payment-methods-table .button:hover { background: var(--jk-tile-hov) !important; }
.woocommerce-account.logged-in .account-payment-methods-table .button.delete {
	color: var(--jk-red) !important;
	border-color: rgba(212, 32, 39, .4) !important;
}

/* Trang THÊM thẻ (my-account/add-payment-method — chỉ hiện khi cổng hỗ trợ lưu thẻ,
   trên prod là Stripe): gỡ hộp xám #ebe9eb của Woo, mỗi cổng một thẻ trắng, nút xác
   nhận về bộ nút chính. ID đứng đầu nên (1,0,0), không luật Woo/Astra nào đè lại. */
#add_payment_method #payment { background: none !important; border-radius: 0 !important; }
#add_payment_method #payment ul.payment_methods {
	list-style: none;
	margin: 0 0 18px;
	padding: 0 !important;
	border-bottom: 0 !important;
}
#add_payment_method #payment ul.payment_methods li {
	background: #fff;
	border: 1px solid var(--jk-line);
	border-radius: var(--jk-r-panel);
	padding: 16px 18px;
	margin: 0 0 12px;
	line-height: 1.5;
}
#add_payment_method #payment ul.payment_methods label {
	font-size: var(--jk-fs-body);
	font-weight: 600;
	color: var(--jk-ink);
	padding-left: 6px;
}
#add_payment_method #payment div.payment_box {
	background: var(--jk-soft) !important;
	border-radius: var(--jk-r-ctl);
	margin-top: 12px;
	padding: 14px 16px;
	font-size: var(--jk-fs-sm);
	color: var(--jk-ink);
}
#add_payment_method #payment div.payment_box::before { display: none !important; }   /* mũi tên nhọn của Woo */
#add_payment_method button#place_order {
	min-height: 54px;
	padding: 0 26px;
	border: 0 !important;
	border-radius: var(--jk-r-ctl) !important;
	background: var(--jk-red) !important;
	color: #fff !important;
	font-size: 16px;
	font-weight: 600;
	transition: background .12s ease;
}
#add_payment_method button#place_order:hover { background: var(--jk-red-dark) !important; }
/* JK-MYACCOUNT END */

/* ============================================================================
   JK-TYPO2 START — CÂN LẠI CHỮ TOÀN SITE. 2026-08-09
   ============================================================================
   Không đoán: quét `getComputedStyle` của MỌI phần tử có chữ trực tiếp trên 11 trang
   (trang chủ · shop · sản phẩm · giỏ · thanh toán · 4 tab tài khoản · tra đơn · 404)
   bằng `site/_typo.html` của bản test, gom theo (font, cỡ, weight) rồi đếm. 408 phần tử,
   30 bộ. Ba việc dưới đây là những gì bảng đếm đó chỉ ra.

   ✅ Việc quét cũng xác nhận hai điều đang ĐÚNG, đừng đổi:
   - **0 phần tử Elementor nào dính JetBrains Mono.** Ranh giới ở mục 2b còn nguyên.
   - Thang chữ thân không loạn như trông có vẻ: 18px là nội dung Elementor (sân Hùng),
     17px là nội dung theme, 16px là link điều hướng, 14–15px là chú thích chân trang.
   ---------------------------------------------------------------------------- */

/* ---- 1. Tiêu đề trang: BỐN cỡ khác nhau cho cùng một vai ----
   Đo được: giỏ/thanh toán/tài khoản **30px**, trang sản phẩm **32px**, lưới shop **34px**,
   trang 404 **34px**. Không ai chọn bốn con số này; chúng là bốn mặc định của Astra/Woo
   cho bốn loại trang. Đứng riêng thì không thấy, đi từ giỏ sang shop thì tiêu đề nhảy cỡ.
   Chốt **32px/700** cho mọi tiêu đề trang. Elementor giữ h2 30px của nó — đó là tiêu đề
   KHỐI trong nội dung, không phải tiêu đề trang. */
.woocommerce-cart h1.entry-title,
.woocommerce-checkout h1.entry-title,
.woocommerce-account h1.entry-title,
.single-product h1.entry-title,
body.ast-woo-shop-archive h1.page-title,
/* Trang thường (tra đơn, chính sách…) cũng vào bậc này. `:not(.home)` vì trang chủ là
   Elementor toàn phần — tiêu đề của nó do Hùng dựng, không phải h1 của theme. */
body.page:not(.home) h1.entry-title,
/* 2026-08-09 (rà soát cuối): bài viết blog bị SÓT ở đợt gom trên — Astra khai riêng
   `header.entry-header .entry-title` = 34px, mạnh hơn mọi luật `h1` trần. Đo trên prod
   mới thấy, vì đợt trước quét 8 trang mà không có trang bài viết. */
body.single-post h1.entry-title,
body.archive h1.page-title,
body.search h1.page-title,
.error404 .jk-404__title,
.jk-404__title {
	font-size: 32px !important;
	font-weight: 700 !important;
	letter-spacing: -.02em;
}

/* ---- 2. TIỀN, SỐ, NGÀY sang JetBrains Mono ----
   Hùng: "có thể sử dụng thêm font mono ở chỗ khác." Đây là chỗ nó không chỉ hợp gu mà còn
   làm việc: mono có bề rộng ký tự bằng nhau, nên một cột tiền xếp thẳng hàng đơn vị —
   `$257` và `$1,028` không còn so le. Woo đã bật sẵn `tabular-nums` cho `.amount`; mono là
   bước còn thiếu.
   Nhắm đúng những phần tử WooCommerce in ra, KHÔNG nhắm `.elementor …` và không nhắm luật
   trần cho số — giá viết trong mô tả sản phẩm ("$9 per set") là câu văn, phải giữ font chữ đọc. */
.woocommerce-Price-amount,
.woocommerce-cart :is(td.product-price, td.product-subtotal),
.woocommerce-cart .cart_totals :is(td, th) .amount,
.woocommerce-checkout #order_review :is(td, th) .amount,
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-date,
.woocommerce-account.logged-in .woocommerce-orders-table__cell-order-total,
.woocommerce div.product .summary .price,
.woocommerce ul.products li.product .price,
.woocommerce .quantity input.qty {
	font-family: var(--jk-font-mono);
	font-variant-numeric: tabular-nums;
	letter-spacing: -.02em;   /* mono rộng hơn Source Sans 18,1%, kéo lại một chút */
}
/* Con số TỔNG vẫn là chữ to nhất trong thẻ; mono ở cỡ đó đọc nặng hơn nên hạ weight một nấc
   để nó không đè cả thẻ. */
.woocommerce-cart .cart_totals tr.order-total :is(td, th) .amount,
.woocommerce-checkout #order_review tr.order-total :is(td, th) .amount { font-weight: 600; }

/* Ô ngày trên thẻ bài viết blog (Astra layout 3): số ngày + tháng + năm. Là NGÀY, nên theo
   cùng quy ước với ngày ở bảng đơn — mono, và bỏ cỡ lẻ 15,4px của Astra. */
.ast-date-meta :is(.date-month, .date-year, .date-monthyear),
.ast-blog-single-element.ast-blog-meta-container time,
.ast-date-meta .date {
	font-family: var(--jk-font-mono);
	font-variant-numeric: tabular-nums;
	letter-spacing: -.02em;
}
.ast-date-meta :is(.date-month, .date-year) { font-size: 15px; }

/* ---- 3. Hai cỡ lẻ còn sót ---- */
/* Đoạn giới thiệu ở Dashboard tài khoản ăn 18px của Elementor, trong khi nó là nội dung
   THEME — bậc của nó là 17px như mọi đoạn khác của giỏ/thanh toán. */
.woocommerce-account.logged-in .woocommerce-MyAccount-content > p { font-size: var(--jk-fs-body); }
/* Nhãn nổi của Astra ra 12,6px (0,7em của 18px) — một cỡ không nằm trong thang nào.
   13px là bậc nhỏ nhất mình có. */
.woocommerce-account.logged-in .ast-animate-input label,
.woocommerce-checkout .ast-animate-input label,
.woocommerce-checkout .form-row :is(label, span.optional),
.woocommerce-form-track-order label { font-size: 13px !important; }
/* JK-TYPO2 END */

/* ============================================================================
   JK-BLOG START — TRANG BLOG VÀ BÀI VIẾT. 2026-08-09
   ============================================================================
   Đây là góc CUỐI CÙNG của site còn nguyên Astra mặc định. Không ai báo hỏng vì nó
   không hỏng — nó chỉ **không cùng một site** với phần còn lại. Đo trên prod mới thấy:

   | | blog đang là | phần còn lại của site |
   |---|---|---|
   | ảnh thẻ bài | vuông góc | bo 16px (lưới shop, Elementor) |
   | ô ngày trên ảnh | khối đen 103×103, ba dòng, vuông | nhãn `.jk-tag` bo tròn, mono, cao 26px |
   | số ngày | Inter **900** 45px | thang chữ site dừng ở 700 |
   | tên bài | xám `#5E5E5E`, 30px | tên sản phẩm mực `#111`, 17px |
   | tiêu đề bài | 34px, CANH GIỮA, đường dẫn nằm DƯỚI | 32px, canh trái, đường dẫn nằm TRÊN |

   Không đổi bố cục Astra, chỉ kéo năm thứ trên về đúng bộ.
   ---------------------------------------------------------------------------- */

/* --- 1. Ảnh thẻ bài: bo ở KHUNG ------------------------------------------
   Bo ở chính `img` cũng ăn ở đây (ảnh không tràn khung), nhưng bo ở khung thì đúng
   trong cả hai trường hợp và không phải nhớ trường hợp nào là trường hợp nào. */
.ast-blog-featured-section .post-thumb-img-content {
	border-radius: var(--jk-r-media);
	overflow: hidden;
}

/* --- 2. Ô ngày: từ khối đen ba dòng thành MỘT CHIP ------------------------
   Cùng vị trí, cùng bo, cùng font với nhãn tình trạng `.jk-tag` ở lưới shop — hai chỗ
   này làm đúng một việc (một mẩu dữ liệu dán lên góc ảnh) nên phải nói cùng giọng.
   `order: -1` đảo `<span class="date-day">` lên đầu để đọc ra "17 Jun 2025" — thứ tự
   trong HTML của Astra là tháng · ngày · năm, không sửa được từ CSS nào khác. */
.ast-blog-featured-section .ast-date-meta .posted-on {
	top: 10px; left: 10px;
	display: inline-flex; align-items: center;
	height: 26px; padding: 0 10px;
	border-radius: var(--jk-r-pill);
	background: var(--jk-ink);
}
.ast-blog-featured-section .ast-date-meta time {
	display: inline-flex; align-items: center; gap: 5px;
}
/* (0,4,0) — Astra khai `.ast-blog-featured-section .posted-on .date-day` (0,3,0) với
   `font-size:2.5em; font-weight:900`. Luật yếu hơn thì im lặng không ăn, đúng cái bẫy
   đã dính ở cỡ chữ ngày đợt trước (15,4px vẫn còn nguyên trên prod dù đã "sửa"). */
.ast-blog-featured-section .ast-date-meta .posted-on :is(.date-month, .date-day, .date-year) {
	font-family: var(--jk-font-mono);
	font-variant-numeric: tabular-nums;
	font-size: 12px; font-weight: 700; line-height: 1;
	letter-spacing: 0; color: #fff;
}
.ast-blog-featured-section .ast-date-meta .posted-on .date-day { order: -1; }

/* --- 3. Tên bài trên danh sách -------------------------------------------
   Màu: Astra cho `.entry-title a` màu chữ chung `#5E5E5E` — nhưng đây là **tên**, cùng
   vai với tên sản phẩm ở lưới shop (đang là mực `#111`). Cỡ: 30px đứng cạnh tiêu đề
   trang 32px thì không ra bậc nào; 24px mới đọc ra "một mục trong danh sách". */
:is(.blog, .archive, .search) .entry-title {
	font-size: 24px !important;
	line-height: 1.3;
}
:is(.blog, .archive, .search) .entry-title a { color: var(--jk-ink); }

/* --- 4. Đầu trang bài viết: đường dẫn LÊN TRÊN, cả cụm canh GIỮA -----------
   Astra xếp tiêu đề → meta → đường dẫn. Ở đây đảo thành đường dẫn → tiêu đề → meta bằng
   flex `order`, không đụng PHP (`header.entry-header` vốn là khối thường).

   Canh giữa (chốt 01/09/2026, đổi từ canh trái): bài viết là trang ĐỌC, cụm đầu trang
   đứng trên một cột chữ hẹp hơn khung — canh giữa cho nó cùng trục với cột chữ. Trang bán
   hàng (sản phẩm, giỏ, tài khoản) vẫn canh trái, luật của chúng nằm riêng ở trên. */
body.single-post header.entry-header {
	display: flex; flex-direction: column;
	align-items: center;
	text-align: center;
}
body.single-post header.entry-header .ast-breadcrumbs-wrapper { order: -1; }
body.single-post header.entry-header .entry-meta { color: var(--jk-muted); }
/* Ngày trong dòng meta đi mono như mọi ngày khác của site (bảng đơn, thẻ bài). */
body.single-post .entry-meta .posted-on .published {
	font-family: var(--jk-font-mono);
	font-variant-numeric: tabular-nums;
	font-size: 15px; letter-spacing: -.02em;
}
/* Link danh mục đứng cạnh ngày trong cùng dòng meta: 16 → 15 cho khỏi so le (đo 2026-08-13) */
body.single-post header.entry-header .entry-meta a { font-size: 15px; }

/* Phân trang blog + tìm kiếm: SỐ TRANG là thông số → mono 15/500, cùng giọng với phân
   trang lưới shop (đang mono qua luật JK-SHOP). Đo 2026-08-13: đây là chỗ duy nhất
   của site số trang còn sans 17. Chuỗi nhắm nav của Astra, không chạm phân trang Woo. */
#content .ast-pagination .page-numbers,
#content nav.navigation.pagination .page-numbers {
	font-family: var(--jk-font-mono);
	font-size: 15px;
	font-weight: 500;
	letter-spacing: -.01em;
}

/* --- 4b. Tiêu đề form bình luận ------------------------------------------
   24,12px/500 — cỡ lẻ CUỐI CÙNG của site (Astra tính 1,34em rồi làm tròn lẻ), và weight 500
   không có bậc nào. Về bậc "tên thẻ" 22px/600. */
h3.comment-reply-title { font-size: 22px !important; font-weight: 600 !important; }

/* --- 4c. Đường dẫn ở bài viết canh GIỮA ------------------------------------
   Nhắc lại text-align ngay trên khối đường dẫn: luật chung `.ast-breadcrumbs-wrapper` ở
   phần trên có luật riêng cho trang cửa hàng, và danh sách `ul.trail-items` là khối
   thường nên phải canh bằng text-align chứ không phải justify-content. */
body.single-post .ast-breadcrumbs-wrapper,
body.single-post .ast-breadcrumbs-inner,
body.single-post .ast-breadcrumbs-wrapper .trail-items { text-align: center; }

/* --- 4d. Cột bên trang blog: danh mục dùng CHUNG bộ với danh mục sản phẩm ---
   Hai cột bên làm đúng một việc — điều hướng theo nhóm — nên phải cùng giọng: mono, cùng
   cỡ, cùng màu, cùng kiểu rê chuột. Trước đó là Inter 18px đen, tức cỡ NỘI DUNG nằm trong
   một cột ĐIỀU HƯỚNG.

   ⚠️ Số đếm `(11)` là **text node trần** trong `<li>`, không có thẻ bọc — không nhắm riêng
   được. Nên đặt bậc "số đếm" lên chính `<li>` rồi cho `<a>` đè lại bậc "mục". */
#secondary .widget_categories ul { list-style: none; margin: 0; padding: 0; }
#secondary .widget_categories li.cat-item {
	margin: 0 0 3px; line-height: 1.65;
	font-family: var(--jk-font-mono);
	/* #9A9A9A = 2,81:1 trên nền trắng, dưới xa chuẩn AA — đo 17 chỗ trên trang danh mục
	   16/08. Về token xám của site (5,41:1). */
	font-size: 13px; color: var(--jk-muted, #6A6A6A);   /* bậc số đếm, giống cây danh mục sản phẩm */
	letter-spacing: -.035em;
}
#secondary .widget_categories li.cat-item > a {
	font-family: var(--jk-font-mono);
	font-size: 15px; color: var(--jk-ink); text-decoration: none;
	letter-spacing: -.035em;
	transition: color .15s ease;
}
#secondary .widget_categories li.cat-item > a:hover {   /* JK-HOVER: gạch chân, không đỏ */
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
#secondary .widget_categories li.cat-item .children { margin: 6px 0 8px; padding-left: 14px; border-left: 1px solid var(--jk-line); }
#secondary .widget_categories li.cat-item .children > li > a { font-size: 14px; color: var(--jk-muted); }

/* --- 5. Tiêu đề lưu trữ thôi bị viết hoa chữ đầu --------------------------
   Astra để `text-transform: capitalize` cho tiêu đề trang lưu trữ, nên "Jelly Key
   boutique" hiện ra thành "Jelly Key Boutique" — CSS sửa lại chữ Hùng đã viết. Cả site
   viết kiểu câu ("Artisan keycaps", "Raffle sales"), tiêu đề trang cũng vậy.

   ⚠️ Phải khớp ĐÚNG chuỗi Astra in ra inline — `body.archive .ast-archive-description
   .ast-archive-title` (0,3,1). `h1.page-title` (0,1,1) thua và im lặng, đo mới thấy. */
body.archive .ast-archive-description .ast-archive-title,
body.archive .ast-archive-description .ast-archive-title *,
.ast-archive-title,
h1.page-title { text-transform: none; }
/* JK-BLOG END */

/* ============================================================================
   JK-TYPO3 — ĐÃ GỠ 2026-08-12 (từng là "bù cỡ chữ sau khi đổi sang Inter", 2026-08-09).
   ============================================================================
   Khối này hạ thang chữ thân 18/17/16 → 17/16/16 và mô tả sản phẩm 1rem → 0.944rem
   để bù việc Inter cao hơn Source Sans 12,3% ở cùng cỡ px (số đo canvas còn trong
   git, commit đợt 9). Đổi về Source Sans Pro thì phép bù ĐẢO CHIỀU thành phép phạt —
   giữ nó lại là chữ nhỏ hơn bản Source Sans gốc một bậc. Gỡ cả khối: thang chữ về
   đúng mặc định Astra (18/17/16, mô tả sản phẩm 1rem) — chính là thang đã chạy ổn
   suốt 2026-07 với đúng font này.
   Bài học giữ lại từ khối cũ (vẫn đúng, đừng dẫm lại):
   - Astra khai BA bậc theo khổ màn; muốn đè phải chép đủ ba bậc, đè một là giết hai.
   - Mô tả sản phẩm KHÔNG lấy cỡ từ `body` — Astra Addon khai riêng
     `.single-product div.product .entry-content { font-size: 1rem }` (0,3,1).
   - Mô tả ngắn đang bị ẩn ở mục HIDE ELEMENTS — đừng bao giờ đưa nó vào một luật
     font-size nạp sau, sẽ đè mất luật ẩn (đã trả giá một lần). */


/* ============================================================================
   JK-TRIM START — 2026-08-10. Năm chỗ nhỏ, đo trên prod rồi mới sửa.
   ---------------------------------------------------------------------------- */

/* --- 1. Dòng trấn an dưới nút trả tiền ------------------------------------
   Ba dòng, mono, màu phụ. KHÔNG icon và KHÔNG màu: khu này đã có đỏ (nút chọn cổng)
   và vàng (PayPal), thêm màu nữa là loạn. Nét kẻ mảnh ở trên để nó tách khỏi nút chứ
   không dính vào nút như một phần của nút. */
/* 🛑 `clear: both` KHÔNG được bỏ (Hùng khoanh ảnh 2026-08-11).
   `#place_order` của Woo là `float: right` và rộng đúng bằng cột (564px). Khối này là
   `display: grid` nằm ngay sau nó, mà grid KHÔNG tự clear float — nên nó co về **rộng
   0px**, ba dòng chữ dồn thành một cột 93px cao 369px, đọc ra như trang vỡ.
   Chỉ lộ khi cổng đang chọn là **Stripe**: PayPal ẩn nút bằng `.ppcp-hidden` nên không
   còn float, và đó là lý do chín lần chụp trang thanh toán trước đó không ai thấy. */
.jk-assure {
	list-style: none;
	clear: both;
	margin: 18px 0 0; padding: 16px 0 0;
	border-top: 1px solid var(--jk-line);
	display: grid; gap: 7px;
}
.jk-assure li {
	margin: 0;
	font-family: var(--jk-font-mono);
	font-size: 12.5px; line-height: 1.5; letter-spacing: -.03em;
	color: var(--jk-muted);
}
@media (max-width: 768px) {
	.jk-assure { margin-top: 16px; }
	.jk-assure li { font-size: 12px; }
}

/* --- 2. Nút "lên đầu trang" -----------------------------------------------
   🛑 KHÔNG đụng `right`/`bottom`/`width`: mấy số đó canh tâm với bong bóng Crisp, đã
   chỉnh riêng ở mục JK-HEADER. Ở đây chỉ hai việc.

   (a) Nó đang `background: transparent` mà VẪN có đổ bóng — trên nền trắng đọc ra một
       ô trắng lơ lửng không có ruột. Cho nó cái nền và một nét viền như mọi thẻ khác.  */
#ast-scroll-top {
	background: #fff !important;
	border: 1px solid var(--jk-line) !important;
	color: var(--jk-ink) !important;
	display: flex !important; align-items: center; justify-content: center;
}
#ast-scroll-top:hover { background: var(--jk-ink) !important; color: #fff !important; border-color: var(--jk-ink) !important; }

/* (b) 🛑 Ở GIỎ VÀ THANH TOÁN thì ẩn hẳn. Đo 2026-08-10 trên iPhone: nút PayPal nằm
       x 39–351 / y 520–565, nút này x 322–378 / y 521–580 và `elementFromPoint` trả về
       CHÍNH NÓ — tức 29px bên phải nút trả tiền bấm vào là cuộn lên đầu trang chứ không
       phải trả tiền. Hai trang này cũng đã cố tình bỏ chân trang để bớt lối thoát; một
       nút "về đầu trang" ở đây vừa thừa vừa nguy hiểm. */
body.woocommerce-cart #ast-scroll-top,
body.woocommerce-checkout #ast-scroll-top { display: none !important; }

/* --- 3. Trang kết quả tìm kiếm --------------------------------------------
   Đo được: `section.ast-archive-description` mang `padding: 0 51px` của Astra, nên
   tiêu đề đứng ở x=171 trong khi lưới sản phẩm ngay dưới bắt đầu ở x=120 — hai trục
   lề trên cùng một trang. Khoá trong `body.search` vì cùng class này còn dùng ở nơi
   khác của Astra.

   ⚠️ Specificity: Astra in `.search .ast-container section.ast-archive-description
   { padding: 3em }` trong CSS INLINE của Customizer — **(0,3,1)**, và nằm SAU file này.
   Bản đầu tôi viết `body.search .ast-archive-description` = (0,2,1) → thua, mà thua
   IM LẶNG: không lỗi, chỉ là tiêu đề vẫn đứng ở x=171. Chuỗi dưới đây là (0,3,2).
   Chỉ gỡ padding NGANG — 3em trên/dưới là khoảng thở của đầu trang, giữ lại. */
body.search .ast-container section.ast-archive-description {
	padding-left: 0; padding-right: 0;
}
/* "Here are the search results for your search." — câu này không nói thêm điều gì mà
   khách chưa đọc được ở chính tiêu đề ngay trên nó. */
body.search .ast-archive-description > p { display: none; }

/* --- 4. Trang blog: đường dẫn + tiêu đề (markup ở functions.php) ----------
   Dựng cho giống hệt đầu trang danh mục sản phẩm: đường dẫn mono 14px ở TRÊN, tiêu đề
   32px/700 canh trái ở dưới, rồi một nét kẻ. Không phải kiểu mới — là cùng một kiểu. */
.jk-arch { margin: 0 0 var(--jk-sp-6); }  /* 26 → sp-6: cùng mốc tiêu đề→nội dung mọi trang (JK-SPACING) */
/* `ast-breadcrumbs-wrapper` được mượn CHỈ để lấy font mono + cỡ 14px của mục JK-MONO —
   nhưng nó kéo theo `text-align:center` của Astra, và render ra mới thấy: đường dẫn nằm
   canh giữa ngay trên một tiêu đề canh trái. Ghi đè tại đây. */
.jk-arch__crumb { display: block; padding: 0; margin: 0 0 6px; text-align: left; }
.jk-arch__crumb span[aria-hidden] { margin: 0 6px; color: var(--jk-muted); }
.jk-arch__crumb span:not([aria-hidden]) { color: var(--jk-muted); }
.jk-arch__h {
	margin: 0 0 18px;
	font-size: 32px; font-weight: 700; line-height: 1.15; letter-spacing: -.02em;
	color: var(--jk-ink); text-align: left;
}
.jk-arch::after {
	content: ""; display: block; height: 1px; background: var(--jk-line);
}
@media (max-width: 768px) {
	.jk-arch__h { font-size: 28px; }
}

/* --- 5. Hiện dần khi cuộn -------------------------------------------------
   🛑 MẶC ĐỊNH LÀ HIỆN. Không có luật nào ở đây ẩn nội dung đi cả — `.jk-reveal` chỉ
   do JS gắn vào, nên không JS thì không có gì ẩn. Đây là chỗ dễ tự bắn vào chân nhất:
   viết `opacity:0` trần rồi trông chờ JS gỡ ra, JS hỏng một cái là trang trắng.

   Dịch 10px chứ không 30px, và 420ms chứ không 800ms: đây là chuyển động để trang có
   nhịp, không phải để khách ngắm. Trễ theo cột (0/60/120ms) cho hàng lưới chạy so le. */
.jk-reveal {
	opacity: 0;
	transform: translateY(10px);
	transition: opacity .42s ease, transform .42s cubic-bezier(.22, .61, .36, 1);
	transition-delay: var(--jk-rev-d, 0ms);
	will-change: opacity, transform;
}
.jk-reveal--in { opacity: 1; transform: none; }
.jk-reveal--in { will-change: auto; }

@media (prefers-reduced-motion: reduce) {
	/* Chốt chặn thứ hai. JS đã tự tắt khi thấy cờ này, nhưng nếu class lỡ được gắn
	   (ví dụ cờ đổi giữa chừng) thì luật này giữ mọi thứ đứng yên và HIỆN. */
	.jk-reveal, .jk-reveal--in { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* JK-TRIM END */


/* ============================================================================
   JK-BLOCKS START — BÀI ĐÃ CHUYỂN TỪ ELEMENTOR SANG BLOCK EDITOR. 2026-08-13
   ============================================================================
   201 bài blog convert đợt 13/08 (sổ: docs/so-doi-chieu-convert-blog.csv) + mọi bài
   block Hùng soạn sau này. Đi cùng jk-toolkit ≥1.10.1 (block jk/gallery, jk/countdown,
   bộ class jk-cc-… và jk-tc-…; luật responsive nằm trong blocks.css của plugin).
   🛑 CẤM để cặp ký-tự sao-rồi-gạch-chéo lọt vào LỜI chú thích (kể cả trong nháy,
   ví dụ viết tên hai nhóm class bằng dấu sao rồi gạch chéo ngăn cách) — 13/08 chuỗi
   đó đóng comment sớm, rác còn lại NUỐT NGUYÊN luật bo ảnh đứng sau; blog prod vuông
   nửa ngày không ai hay. Bẫy "chú thích vỡ" lần 2 — và lần 3 là chính câu cảnh báo
   đầu tiên của bẫy này cũng dính. */

/* Ảnh/embed về cùng ngôn ngữ bo góc của site + khoảng thở giữa các khối
   (Elementor vốn có gap container ~20px, block editor thì không).
   🛑 Phải có CẢ `.page`: bản đầu (13/08) chỉ khoanh single-post/single-product vì lúc đó
   mới chuyển blog và sản phẩm. Sang trang landing đầu tiên (/artisan-keycaps/, 14/08) cả
   hai luật rớt sạch — ảnh banner vuông góc và tiêu đề dính đáy ảnh (khe 0 thay vì 20).
   Hùng khoanh đỏ đúng hai chỗ đó; máy đo lưới báo ĐẠT vì không ai đo phần ngoài lưới. */
:is(.single-post, .single-product, .page) .entry-content .wp-block-image img,
:is(.single-post, .single-product, .page) .entry-content .wp-block-gallery .wp-block-image img,
:is(.single-post, .single-product, .page) .entry-content .wp-block-embed iframe,
:is(.single-post, .single-product, .page) .entry-content .jk-gallery-block .uael-grid-img img,
:is(.single-post, .single-product, .page) .entry-content p > img {
	border-radius: var(--jk-r-media);
}
:is(.single-post, .single-product, .page) .entry-content :is(.wp-block-image, .wp-block-gallery, .wp-block-embed, .wp-block-separator) {
	margin-top: 0;
	margin-bottom: 20px;
}

/* Gạch ngang trong bài — CHUẨN CHUNG Hùng chốt 13/08 ("gạch ngang đậm, dài quá; qui
   định chung cho toàn site là 40%, mờ xuống"): 1px mờ .22, rộng 40% trần 480px, nằm
   giữa. CỐ TÌNH không giữ số gốc Elementor từng bài (có bài 65%, đậm .68) — convert
   là dịp đưa mọi bài về một nét. Cũng ghi ở docs/he-thong-thiet-ke.md §4. */
.entry-content hr.wp-block-separator {
	border: 0;
	border-top: 1px solid rgba(0, 0, 0, .22);
	background: none;
	opacity: 1;
	width: 40%;
	max-width: 480px;
	margin: 0 auto 20px;
}
/* 🛑 KHÔNG đổi hai số trên thành đối xứng (thử 15/08, ĐO RỒI TRẢ LẠI). Nghe thì hợp lý —
   đường kẻ là vật ngăn đôi, lẽ ra thở đều hai bên — nhưng khoảng thở thật quanh nó chủ yếu
   do ĐỆM CỦA HAI SECTION hai bên tạo ra (số Elementor gốc, mỗi section một khác), theme chỉ
   cộng thêm một hằng số. Nhịp 0-trên/20-dưới đang VÔ TÌNH bù cho các nhóm lệch về phía trên;
   đổi sang 20/20 làm mọi chỗ tệ đi (artisan kẻ 1: lệch −12px thành −32px). Một luật `:has()`
   nhắm "nhóm chỉ chứa một đường kẻ" cũng không phủ nổi: 4/10 chỗ không đổi gì vì đường kẻ
   không nằm trong nhóm riêng, /about-us/ y nguyên. Muốn đường kẻ nằm giữa thì phải chỉnh
   Ô KHOẢNG CÁCH của từng nhóm bọc — xem docs/chuyen-block-so-tay.md §30. */

/* Lề hai bên cho bài block (Hùng 13/08: "mobile sao bị sát mép"): Elementor kit cho
   container 20px padding hai bên Ở MỌI KHỔ (1240−1200 của khung site). Bài Hùng TỰ SOẠN
   sau này cần lề đó; bài CONVERT thì bộ chuyển đã dịch padding container (kit lẫn số
   riêng từng bài) nên khối bọc ngoài mang class jk-conv để né — cộng chồng là ảnh hụt
   40px (đo 13/08 trên pilot sản phẩm). */
:is(.single-post, .single-product, .page) .entry-content > .wp-block-group:not(.jk-conv) {
	padding-left: 20px;
	padding-right: 20px;
}

/* JK-BLOCKS END */

/* ============================================================================
 * § ASTRA PRO — bê phần CSS mà plugin astra-addon đang gánh
 *
 * Nguồn: chép đúng đầu ra của astra-addon (GPL) đo trên bản test 01/09/2026,
 * chỉ giữ những luật THỰC SỰ khớp DOM của site này. Cách đo: liệt kê mọi luật
 * trong sheet của addon rồi lọc bằng querySelector trên từng loại trang; 53–59
 * luật khớp mỗi trang, phần lớn là luật rỗng hoặc của overlay tìm kiếm toàn màn
 * hình mà site không dùng — số còn lại nằm dưới đây.
 *
 * Giữ nguyên tên class `ast-*`: 140 chỗ trong tệp này bám họ class đó.
 * Chi tiết đường đi và những gì mất khi tắt plugin: xem khối cùng tên trong
 * functions.php.
 * ========================================================================== */

/* --- Trang sản phẩm: bề ngang hai cột + viền nút số lượng ----------------- */
@media (min-width: 769px) {
	.woocommerce #content .ast-woocommerce-container div.product div.images,
	.woocommerce .ast-woocommerce-container div.product div.images,
	.woocommerce-page #content .ast-woocommerce-container div.product div.images,
	.woocommerce-page .ast-woocommerce-container div.product div.images {
		width: 55%;
	}
	.woocommerce #content .ast-woocommerce-container div.product div.summary,
	.woocommerce .ast-woocommerce-container div.product div.summary,
	.woocommerce-page #content .ast-woocommerce-container div.product div.summary,
	.woocommerce-page .ast-woocommerce-container div.product div.summary {
		width: 41%;
	}
}
.woocommerce .quantity .plus,
.woocommerce .quantity .minus,
.woocommerce .quantity .qty {
	border: 1px solid var(--ast-border-color);
}
.woocommerce .quantity .plus { border-left: none; }
.woocommerce .quantity .minus { border-right: none; }
.woocommerce-js .quantity .minus,
.woocommerce .quantity .plus { font-size: 18px; }

/* --- Lưới sản phẩm (cửa hàng, danh mục, thẻ) ------------------------------ */
.woocommerce ul.products li.product,
.woocommerce-page ul.products li.product {
	padding-bottom: 1.2em;
	transition: 300ms ease-in-out;
}
.woocommerce ul.products li.product > :last-child,
.woocommerce ul.products li.product > .button:last-child,
.woocommerce ul.products li.product .ast-woo-shop-product-description p:last-child,
.woocommerce-page ul.products li.product > :last-child,
.woocommerce-page ul.products li.product > .button:last-child,
.woocommerce-page ul.products li.product .ast-woo-shop-product-description p:last-child {
	margin-bottom: 0;
}
.woocommerce ul.products li.product .astra-shop-summary-wrap,
.woocommerce-page ul.products li.product .astra-shop-summary-wrap {
	padding: 0 1.2em;
}
.woocommerce ul.products li.product .astra-shop-thumbnail-wrap,
.woocommerce-page ul.products li.product .astra-shop-thumbnail-wrap {
	margin-bottom: 0.8em;
}
.astra-shop-thumbnail-wrap { position: relative; }
.woocommerce ul.products li.product .woocommerce-loop-product__link,
.woocommerce-page ul.products li.product .woocommerce-loop-product__link {
	overflow: hidden;
}
.woocommerce ul.products li.product .woocommerce-loop-product__link img,
.woocommerce-page ul.products li.product .woocommerce-loop-product__link img {
	margin-bottom: 0;
	backface-visibility: hidden;
	transition: filter 0.6s, opacity 0.6s, transform 0.6s;
}
.woocommerce ul.products li.product .woocommerce-loop-product__title,
.woocommerce-page ul.products li.product .woocommerce-loop-product__title {
	font-weight: 400;
	font-size: 1rem;
}
@media (max-width: 768px) {
	.woocommerce ul.products li.product .woocommerce-loop-product__title,
	.woocommerce-page ul.products li.product .woocommerce-loop-product__title { font-size: 0.944444rem; }
}
@media (max-width: 544px) {
	.woocommerce ul.products li.product .woocommerce-loop-product__title,
	.woocommerce-page ul.products li.product .woocommerce-loop-product__title { font-size: 0.888889rem; }
}

/* --- Phân trang ----------------------------------------------------------- */
.ast-woocommerce-pagination-default .woocommerce-pagination .page-numbers,
.ast-woocommerce-pagination-default .woocommerce-pagination .page-numbers li {
	border: 0;
}
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a:focus,
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li a:hover,
.ast-woocommerce-pagination-default.woocommerce nav.woocommerce-pagination ul li span.current {
	background: transparent;
	color: inherit;
}
.woocommerce nav.woocommerce-pagination ul li > span.current,
.woocommerce nav.woocommerce-pagination ul li > .page-numbers {
	border-color: #000;
}
/* Phân trang của blog/tìm kiếm. Astra Pro gắn class `ast-pagination-square` lên
   body rồi mới cho viền; class đó đi cùng plugin nên nhắc thẳng vào .ast-pagination. */
.ast-pagination .page-numbers {
	color: #5e5e5e;
	border: 1px solid #000;
	line-height: 2.33333em;
	font-size: 0.944444rem;
}
.ast-pagination .page-navigation { font-size: 0.944444rem; }
.ast-pagination .page-numbers.current,
.ast-pagination .page-numbers:focus,
.ast-pagination .page-numbers:hover {
	color: #fff;
	background-color: #000;
	border-color: #000;
}

/* --- Chữ: cỡ nút, tiêu đề, tiêu đề cột bên ------------------------------- */
button,
.ast-button,
input#submit,
input[type="button"],
input[type="submit"],
input[type="reset"] {
	font-size: 1rem;
	font-weight: 400;
}
@media (max-width: 544px) {
	button,
	.ast-button,
	input#submit,
	input[type="button"],
	input[type="submit"],
	input[type="reset"] { font-size: 0.944444rem; }
}
.ast-single-post .entry-title,
.page-title { font-weight: 700; line-height: 1.3em; }
.ast-archive-description .ast-archive-title { font-weight: normal; }
.blog .entry-title, .blog .entry-title a,
.archive .entry-title, .archive .entry-title a,
.search .entry-title, .search .entry-title a {
	font-family: "Source Sans Pro", sans-serif;
	font-weight: 700;
	line-height: 1.3em;
}
.single-product div.product .woocommerce-product-details__short-description,
.single-product div.product .product_meta,
.single-product div.product .entry-content { font-size: 1rem; }
@media (max-width: 768px) {
	.single-product div.product .woocommerce-product-details__short-description,
	.single-product div.product .product_meta,
	.single-product div.product .entry-content { font-size: 0.944444rem; }
}
@media (max-width: 544px) {
	.single-product div.product .woocommerce-product-details__short-description,
	.single-product div.product .product_meta,
	.single-product div.product .entry-content { font-size: 0.888889rem; }
}
.widget-area.secondary .sidebar-main .wp-block-heading,
#secondary .widget-title,
.woocommerce-page #secondary .widget .widget-title {
	font-size: 1.11111rem;
	font-weight: 600;
	font-family: "Source Sans Pro", sans-serif;
	line-height: 1.77em;
}
.secondary .widget > :not(.widget-title) {
	font-weight: normal;
	font-size: 1rem;
	line-height: 2.05em;
}
@media (max-width: 768px) {
	.widget-area.secondary .sidebar-main .wp-block-heading,
	#secondary .widget-title,
	.woocommerce-page #secondary .widget .widget-title { font-size: 1.05556rem; }
}
@media (max-width: 544px) {
	.widget-area.secondary .sidebar-main .wp-block-heading,
	#secondary .widget-title,
	.woocommerce-page #secondary .widget .widget-title { font-size: 1rem; }
}

/* --- Danh sách bài: hai cột ảnh trái / chữ phải --------------------------- */
/* Astra Pro đổi hẳn template sang `blog-layout-3` (ảnh và chữ là hai cột
   `ast-col-md-6` anh em). Bản của theme cha là `blog-layout-1`: ảnh nằm LỒNG
   trong `.post-content`, nên không bắt chước được bằng float — dựng lại bằng
   lưới, ảnh chiếm cột 1 suốt chiều cao, mọi thứ còn lại dồn sang cột 2.
   Số đo bám bản cũ: hai cột 389,5px, chữ lùi 36px, đáy bài 36px + kẻ 1px. */
/* Kẻ dưới + đáy 2em đã có sẵn ở luật `.blog-layout-1` của theme cha. Việc phải
   làm ở đây là bỏ đệm ngang: CSS động của theme cha cho `.ast-article-inner`
   padding 1.5em, còn Astra Pro thì không — để nguyên là hai cột hụt mỗi bên
   27px (ảnh 345px thay vì 390px). */
:is(.blog, .archive, .search) .ast-article-post .ast-article-inner {
	padding-top: 0;
	padding-left: 0;
	padding-right: 0;
}
@media (min-width: 769px) {
	:is(.blog, .archive, .search) .ast-article-post .blog-layout-1 > .post-content {
		display: grid;
		/* Cột ảnh đúng 50% như bản cũ; khoảng thở 2em ăn vào cột chữ, nên chữ bắt
		   đầu ở 546px và rộng 353px — khớp từng pixel với bản Astra Pro. */
		grid-template-columns: 50% 1fr;
		column-gap: 2em;
		align-items: start;
	}
	:is(.blog, .archive, .search) .ast-article-post .blog-layout-1 > .post-content > .ast-blog-featured-section {
		grid-column: 1;
		grid-row: 1 / span 99;
	}
	:is(.blog, .archive, .search) .ast-article-post .blog-layout-1 > .post-content > *:not(.ast-blog-featured-section) {
		grid-column: 2;
	}
}
/* Khổ hẹp: ảnh và chữ xếp chồng. Hai số phải chỉnh lại cho khớp bản cũ — đáy
   khối bài (theme cha tính 2em theo cỡ chữ 12px = 24px, bản cũ là 32px) và
   khoảng dưới ảnh (theme cha thêm 24px, bản cũ không có). */
@media (max-width: 768px) {
	:is(.blog, .archive, .search) .ast-article-post .ast-article-inner {
		padding-bottom: 32px;
	}
	:is(.blog, .archive, .search) .ast-article-post .ast-blog-featured-section {
		margin-bottom: 0;
	}
}

/* Site tắt hết meta bài (tác giả, chuyên mục) nên `header.entry-header` ra rỗng.
   Luật chung của theme chừa 32px dưới nó; khoảng đo được trên bản Astra Pro là
   15px, nên khoá đúng số đó cho cái rỗng (dùng !important vì luật chung cũng
   !important). */
/* 🛑 Phải nhắc `#content` trong selector: luật chung ở trên là
   `#content .entry-header{margin-bottom:var(--jk-sp-6)!important}` — cùng
   !important thì id thắng class, viết thiếu là luật này im lặng không ăn. */
:is(.blog, .archive, .search) #content .ast-article-post .entry-header:not(:has(*)) {
	margin-bottom: 15px !important;
}

/* Huy hiệu ngày: kiểu dáng đã có sẵn ở trên (nền, bo tròn, 10px/10px); phần
   plugin lo là mỗi việc neo nó vào ảnh. Huy hiệu do theme này in ra nằm trong
   `.post-thumb-img-content`, nên mốc neo đặt ở đó. */
.ast-blog-featured-section .post-thumb-img-content { position: relative; }
.ast-blog-featured-section .ast-date-meta .posted-on { position: absolute; }
.ast-blog-featured-section .ast-date-meta .entry-date span {
	display: block;
	text-align: center;
}

/* --- Trang tài khoản: nav cột trái + icon --------------------------------- */
.ast-modern-woo-account-page .entry-content { margin: 2em auto; }
.woocommerce-account .woocommerce-MyAccount-navigation {
	width: 22%;
	border-right: 1px solid var(--ast-border-color);
}
.woocommerce-account .woocommerce-MyAccount-content { width: 75%; }
.woocommerce-MyAccount-navigation ul {
	list-style: none;
	padding: 0;
	margin: 0;
	background: var(--ast-global-color-primary, var(--ast-global-color-5));
}
.woocommerce-MyAccount-navigation .woocommerce-MyAccount-navigation-link + .woocommerce-MyAccount-navigation-link {
	border-top: 1px solid var(--ast-border-color);
}
li.woocommerce-MyAccount-navigation-link { position: relative; }
.woocommerce-MyAccount-navigation ul li a {
	display: inline-flex;
	align-items: center;
	padding: 1em;
	width: 100%;
	font-weight: 500;
	color: var(--ast-global-color-3);
	transition: 0.1s;
}
.woocommerce-MyAccount-navigation ul li a:focus { outline: none; }
.woocommerce-MyAccount-navigation-link .ahfb-svg-iconset {
	margin-right: 20px;
	vertical-align: middle;
	color: var(--ast-global-color-0);
	display: inline-flex;
}
.woocommerce-MyAccount-navigation-link .ahfb-svg-iconset svg { width: 20px; height: 20px; }
.woocommerce-MyAccount-navigation ul li a:hover .ahfb-svg-iconset,
.woocommerce-MyAccount-navigation ul li span.ahfb-svg-iconset { color: inherit; }
.woocommerce-MyAccount-navigation-link.is-active a,
.woocommerce-MyAccount-navigation-link:hover a { color: var(--ast-global-color-0); }
@media (min-width: 768px) {
	.woocommerce-MyAccount-navigation-link::after {
		content: "";
		position: absolute;
		top: 1px;
		right: -1px;
		z-index: 9;
		width: 3px;
		height: 100%;
		background-color: var(--ast-global-color-0);
		opacity: 0;
		transition: 0.3s;
	}
	li.woocommerce-MyAccount-navigation-link.is-active::after,
	li.woocommerce-MyAccount-navigation-link:hover::after { opacity: 1; }
}
@media (max-width: 768px) {
	.woocommerce-account .woocommerce-MyAccount-navigation,
	.woocommerce-account .woocommerce-MyAccount-content,
	.woocommerce-MyAccount-navigation .woocommerce-MyAccount-navigation-link + .woocommerce-MyAccount-navigation-link,
	.woocommerce-MyAccount-navigation ul li a {
		width: 100%;
		border: none;
	}
	.woocommerce-MyAccount-navigation ul li a { padding-left: 0; }
	.woocommerce-MyAccount-navigation ul {
		display: grid;
		grid-template-columns: repeat(2, 1fr);
		column-gap: 20px;
		margin-bottom: 2em;
	}
}

/* --- Trang giỏ: hai cột + ô mã giảm giá thu gọn --------------------------- */
/* Số đo bám bản Astra Pro: bảng hàng 68%, khối tổng tiền 30%, cùng nằm trong
   `#ast-cart-wrapper` do functions.php bọc lại bằng hook của WooCommerce. */
@media screen and (min-width: 769px) {
	.ast-no-sidebar #ast-cart-wrapper {
		display: flex;
		flex-wrap: wrap;
		align-items: flex-start;
		justify-content: space-between;
	}
	.ast-no-sidebar #ast-cart-wrapper .ast-cart-non-sticky { width: 68%; }
	.ast-no-sidebar #ast-cart-wrapper .cart-collaterals { width: 30%; }
	#ast-cart-wrapper .cart-collaterals .cart_totals { width: 100%; }
	.woocommerce-cart-form__contents .product-thumbnail { width: 100px; }
	.woocommerce-cart-form .woocommerce-cart-form__contents .product-subtotal { padding-right: 3em; }
	.woocommerce-cart-form__contents .woocommerce-cart-form__cart-item { position: relative; }
}
/* Hàng cuối của bảng giỏ là ô mã giảm giá + nút "Update cart". Ô mã đã được
   dời xuống dưới nút thanh toán; nút Update cart giữ lại trong DOM cho khách
   tắt JavaScript, chỉ giấu đi. */
.woocommerce-cart .woocommerce-cart-form table tbody tr:nth-last-child(1) { display: none; }
.woocommerce-cart table.shop_table { border: 1px solid var(--ast-border-color); }
.woocommerce-cart table.shop_table thead { background-color: var(--ast-global-color-secondary, var(--ast-global-color-4)); }
.woocommerce-cart table.shop_table td { border-top: 1px solid var(--ast-border-color); }
.woocommerce-cart table.shop_table td.product-remove a { border-color: var(--ast-border-color); }
.woocommerce-cart .cart-collaterals .cart_totals { border-color: var(--ast-border-color); }
.woocommerce-cart .cart-collaterals .cart_totals > h2 {
	background-color: var(--ast-global-color-secondary, var(--ast-global-color-4));
	border-bottom: 1px solid var(--ast-border-color);
}
.woocommerce-cart .cart-collaterals .cart_totals tr th,
.woocommerce-cart .cart-collaterals .cart_totals tr td { border-top: 1px solid var(--ast-border-color); }
.woocommerce .woocommerce-cart-form__cart-item .product-name .ast-product-name > a { display: inline-block; }

/* Chỉnh theo góp ý 01/09: "Have a coupon?" phải CÙNG GIỌNG với "Continue
   shopping" ngay trên nó (cùng cỡ 15px, cùng màu nhạt, cùng kiểu gạch chân
   mảnh), và nút Apply thôi làm cục đỏ hai dòng — nút đen gọn một dòng, cùng
   hàng với ô nhập. */
#ast-checkout-coupon { margin: 0; }
/* Kiểu chữ của trigger đến từ class jk-keep-shopping dùng chung với
   "Continue shopping" — ở đây chỉ thêm phần chữ chung không có: con trỏ. */
#ast-coupon-trigger { cursor: pointer; }
#ast-checkout-coupon .coupon { display: none; }
#ast-checkout-coupon.is-open .coupon {
	display: flex;
	align-items: stretch;
	gap: 8px;
	margin-top: 10px;
}
#ast-checkout-coupon .coupon input[name="coupon_code"] {
	flex: 1;
	min-width: 0;
	height: 44px;
	padding: 0 12px;
	border: 1px solid var(--ast-border-color, #e1e1e1);
	border-radius: var(--jk-r-md, 8px);
}
#ast-checkout-coupon .coupon button {
	width: auto;
	flex: 0 0 auto;
	height: 44px;
	padding: 0 18px;
	white-space: nowrap;
	background: var(--jk-ink, #111) !important;
	color: #fff !important;
	border-radius: var(--jk-r-md, 8px);
	font-size: 15px;
	font-weight: 600;
	line-height: 1;
}
#ast-checkout-coupon .coupon button:hover { opacity: 0.85; }
/* Trong lúc gửi lại giỏ: làm mờ để thấy có việc đang chạy, và chặn bấm tiếp. */
#ast-cart-wrapper.is-updating { opacity: 0.55; pointer-events: none; }

/* --- Nhãn nổi cho biểu mẫu WooCommerce ------------------------------------ */
/* Bê từ astra-addon; bỏ mấy tầng `body:not(.cartflows-*)` vì site không dùng
   CartFlows. Nhãn nằm chồng lên ô, chỉ hiện khi ô đã có chữ (class
   `ast-animate-input` do jk-float-labels gắn). */
.woocommerce form .form-row input[type="text"],
.woocommerce form .form-row input[type="number"],
.woocommerce form .form-row input[type="email"],
.woocommerce form .form-row input[type="url"],
.woocommerce form .form-row input[type="password"],
.woocommerce form .form-row input[type="search"],
.woocommerce form .form-row input[type="tel"],
.woocommerce form .form-row select,
.woocommerce form .form-row textarea,
.woocommerce form .form-row .select2-container--default .select2-selection--single {
	border: 1px solid var(--ast-border-color);
	border-radius: 4px;
	padding: 0.9em 0.8em;
}
.woocommerce form .form-row label:not(.checkbox):not(.radio):not(.woocommerce-form__label-for-checkbox) {
	user-select: none;
	pointer-events: none;
	position: absolute;
	color: var(--ast-global-color-3);
	font-size: 0.7em;
	font-weight: inherit;
	margin-top: 0.35em;
	padding: 0 1.1em;
	line-height: 1.625;
	opacity: 0;
	height: auto;
	width: auto;
	clip-path: none;
	clip: unset;
	white-space: nowrap;
	overflow: hidden;
	max-width: 95%;
	text-overflow: ellipsis;
	z-index: 1;
	transition: 0.2s ease-out;
}
.woocommerce form .form-row.ast-animate-input label:not(.checkbox):not(.woocommerce-form__label-for-checkbox) {
	opacity: 1;
}
.woocommerce form .form-row.ast-animate-input input[type="text"],
.woocommerce form .form-row.ast-animate-input input[type="number"],
.woocommerce form .form-row.ast-animate-input input[type="email"],
.woocommerce form .form-row.ast-animate-input input[type="url"],
.woocommerce form .form-row.ast-animate-input input[type="password"],
.woocommerce form .form-row.ast-animate-input input[type="search"],
.woocommerce form .form-row.ast-animate-input input[type="tel"],
.woocommerce form .form-row.ast-animate-input select,
.woocommerce form .form-row.ast-animate-input textarea,
.woocommerce form .form-row.ast-animate-input .select2-container--default .select2-selection--single {
	padding: 1.45em 0.8em 0.35em;
}

/* --- Thanh toán: khối "Customer information" ------------------------------ */
/* Hai thanh mặc định của WooCommerce ở đầu trang chỉ bị giấu khi JavaScript đã
   dời được nội dung của chúng đi (class `jk-checkout-arranged` do
   jk-checkout-layout gắn). Không có JS thì trang trở về đúng dáng WooCommerce,
   vẫn đăng nhập và nhập mã được. */
.jk-checkout-arranged .woocommerce-form-coupon-toggle,
.jk-checkout-arranged .woocommerce-form-login-toggle { display: none; }

#customer_info { margin-bottom: 2em; }
#customer_info .ast-checkout-form-heading {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 8px;
	margin-bottom: 1em;
}
#customer_info .ast-checkout-form-heading h3 { margin: 0; }
#customer_info .woocommerce-billing-fields__customer-login-label a { text-decoration: underline; }
#ast-customer-login-section { display: none; margin-top: 1em; }
#ast-customer-login-section.is-open { display: block; }
#ast-customer-login-section .woocommerce-form-login {
	display: block;
	margin: 0;
	border: 1px solid var(--ast-border-color);
	border-radius: var(--jk-r-md, 8px);
	padding: 1.25em;
}
#ast-payment_options_heading { margin: 1.5em 0 0.75em; }
/* Ô mã giảm giá trên trang thanh toán dùng chung dáng với trang giỏ. */
#ast-checkout-coupon form.checkout_coupon {
	display: none;
	margin: 0.75em 0 0;
	border: 0;
	padding: 0;
}
#ast-checkout-coupon.is-open form.checkout_coupon { display: block; }

/* --- Trang cảm ơn (đơn đã nhận) ------------------------------------------- */
/* WooCommerce để tóm tắt đơn thành một dòng chữ hoa nhỏ; bản Astra Pro đóng nó
   thành thẻ nền xám, chữ thường, cỡ bằng thân bài, và bo bảng chi tiết đơn. */
.woocommerce-checkout.woocommerce-order-received .woocommerce-order {
	max-width: 800px;
	margin: 0 auto;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-thankyou-order-received {
	text-align: center;
	margin: 1.5em auto 2em;
	padding: 1em 0;
	font-weight: 600;
	font-size: large;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview {
	color: inherit;
	padding: 1.5em 1.5em 1em;
	background: var(--ast-global-color-secondary, var(--ast-global-color-4));
	margin: 2.5em auto 3em;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview li {
	display: inline-block;
	line-height: inherit;
	margin: 0 1.5em;
	padding: 0;
	border-bottom: 0;
	border-right: 0;
	overflow: visible;
	font-size: 1em;
	text-transform: none;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview li strong {
	font-size: inherit;
	font-weight: 400;
	color: var(--ast-global-color-1);
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order-received-title-common,
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-customer-details .woocommerce-column__title,
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details .woocommerce-order-details__title {
	background: transparent;
	border: 0;
	font-size: 1.5em;
	padding: 0;
	font-weight: 600;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table {
	border-style: hidden;
	border-radius: 4px;
	box-shadow: 0 0 0 1px var(--ast-border-color);
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tr th,
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tr td {
	padding: 1.5em 1.2em;
	line-height: 1.4em;
	font-weight: 400;
	border-right: 0;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table thead tr th {
	padding: 1em 1.2em;
	font-weight: 500;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tr td:last-child,
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tr th:last-child {
	text-align: right;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tfoot tr:last-child th,
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tfoot tr:last-child td {
	font-size: large;
	padding: 1em 1em 1em 1.2em;
	border-bottom: 0;
}
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tfoot tr:last-child th { font-weight: 600; }
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-order-details table.shop_table tfoot tr:last-child .amount { font-weight: 700; }
.woocommerce-checkout.woocommerce-order-received .woocommerce-order .woocommerce-customer-details address {
	border: 0;
	padding: 0;
}
/* Khổ hẹp: hai cột chen nhau khó đọc — bản cũ cho mỗi mục một dòng, kẻ mảnh
   ngăn giữa (đo trên ảnh chụp bản Astra Pro ở 390px). */
@media (max-width: 768px) {
	.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview li {
		/* 🛑 `float: none` là bắt buộc: CSS Woo (bản Astra tráo) cho các mục
		   `float:left`, nên đặt display:block thôi thì chúng vẫn nằm ngang. */
		display: block;
		float: none;
		margin: 0;
		padding: 0.75em 0;
		border-right: 0;
		border-bottom: 1px solid var(--ast-border-color);
	}
	.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview li:last-child {
		border-bottom: 0;
	}
	.woocommerce-checkout.woocommerce-order-received .woocommerce-order ul.woocommerce-order-overview li strong {
		display: block;
	}
}
/* Trang tài khoản: khoảng cách giữa các ô. Bản Astra Pro để 20px, WooCommerce
   trần chỉ 6px nên form bị dồn cục. Giới hạn trong .woocommerce-account để
   không đụng bố cục trang thanh toán. */
.woocommerce-account .woocommerce form .form-row { margin-bottom: 20px; }

/* --- Xem đơn trong trang tài khoản ---------------------------------------- */
/* Bảng chi tiết đơn ở đây không có hàng tiêu đề (tên món đã nói rõ rồi), ô thưa
   hơn và kẻ mảnh dưới mỗi dòng. Giới hạn trong .woocommerce-account để trang
   cảm ơn sau khi đặt hàng vẫn giữ hàng tiêu đề như cũ. */
.woocommerce-account .woocommerce-order-details .shop_table thead { display: none; }
.woocommerce-account .woocommerce-order-details .shop_table {
	width: 100%;
	border-spacing: 0;
	border-collapse: separate;
	margin: 0 0 30px;
	border-radius: 3px;
	border: 1px solid var(--ast-border-color);
}
.woocommerce-account .woocommerce-order-details .shop_table tbody tr td {
	padding: 12px 15px;
	border: 0;
	border-bottom: 1px solid var(--ast-border-color);
}
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr th,
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr td {
	padding-top: 0;
	padding-bottom: 10px;
	border: 0;
	background: rgba(0, 0, 0, 0.03);
	font-weight: normal;
}
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr:first-child th,
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr:first-child td { padding-top: 15px; }
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr:last-child th,
.woocommerce-account .woocommerce-order-details .shop_table tfoot tr:last-child td {
	border-top: 1px solid var(--ast-border-color);
	font-size: 1em;
	padding-top: 10px;
}

/* --- /my-account/ khi chưa đăng nhập: một form một lúc -------------------- */
/* Chỉ ăn khi JavaScript đã gắn `jk-account-switch` — không có JS thì hai form
   hiện cạnh nhau như WooCommerce gốc, chứ không giấu mất đường đăng ký. */
.jk-account-switch #customer_login > .u-column2 { display: none; }
.jk-account-switch #customer_login.jk-show-register > .u-column1 { display: none; }
.jk-account-switch #customer_login.jk-show-register > .u-column2 { display: block; }
.ast-woo-form-actions { margin-top: 1em; text-align: center; }
.ast-woo-account-form-link { text-decoration: underline; font-weight: 600; }

/* --- Thanh toán: dọn theo góp ý 01/09 (soi ảnh bản Astra Pro làm chuẩn) ---- */
/* 1. "Your order" phải là MỘT THẺ liền — viền mảnh, bo góc, nền trắng — như
   bản cũ; bộ luật đóng băng cho khung 2px ba cạnh rồi bỏ lửng phần dưới, nhìn
   như cái hộp gãy. Thẻ bọc heading + bảng; coupon và Payment đứng ngoài thẻ. */
.woocommerce-checkout form.checkout #order_review_heading {
	border: 1px solid var(--ast-border-color) !important;
	border-bottom: 0 !important;
	border-radius: var(--jk-r-lg, 14px) var(--jk-r-lg, 14px) 0 0;
	background: #fff;
	margin: 0 !important;
	padding: 26px 32px 6px !important;
	font-weight: 700 !important;
}
.woocommerce-checkout form.checkout #order_review {
	border: 0 !important;
	padding: 0 !important;
}
/* 🛑 Selector phải CÓ #order_review: luật cũ `.woocommerce-checkout
   #order_review table.shop_table{border:0!important}` mang ID — luật mới không
   ID thì thua bất kể !important và thứ tự (đã đo bằng liệt kê luật áp). */
.woocommerce-checkout #order_review table.woocommerce-checkout-review-order-table {
	border: 1px solid var(--ast-border-color) !important;
	border-top: 0 !important;
	border-radius: 0 0 var(--jk-r-lg, 14px) var(--jk-r-lg, 14px);
	background: #fff;
	padding: 4px 32px 14px;
	margin-bottom: 0;
}
/* 2. Ô mã giảm giá đừng dính Total ở trên và Payment ở dưới. */
.woocommerce-checkout #ast-checkout-coupon { margin: 18px 0 26px; }
/* 3. Nút đặt hàng thở một nhịp sau ô đồng ý điều khoản. */
.woocommerce-checkout #place_order { margin-top: 16px !important; }
/* 4. Ba dòng cam kết dưới nút: gạch đầu dòng như các dòng mô tả sản phẩm. */
.jk-assure li::before { content: "– "; }

/* --- Thanh toán: đợt chỉnh 2 theo góp ý 01/09 ------------------------------ */
/* 1. Hai tiêu đề hai cột phải NGANG HÀNG: chữ "Customer information" đang
   thấp hơn "Your order" 27px (h3 trái ăn padding-top 20 của luật đóng băng,
   heading phải chỉ 26). Trái về 0, phải lên 33 → cả hai cùng mốc. */
.woocommerce-checkout #customer_details .ast-checkout-form-heading h3 { padding-top: 0 !important; }
.woocommerce-checkout form.checkout #order_review_heading { padding-top: 33px !important; }

/* 2. "Ship to a different address?" + ô ghi chú đang nằm TRẦN ngoài hộp
   trắng (hộp chỉ bọc .col-1) — cho .col-2 cùng bộ thẻ để hai khối ăn khớp,
   ô ghi chú nằm cân trong khung ở mọi khổ. */
.woocommerce-checkout #customer_details .col-2 {
	background: rgb(252, 252, 253);
	border: 1px solid var(--ast-border-color);
	border-radius: 20px;
	padding: 24px 32px 28px;
	margin-top: 16px;
}

/* 3. Khoảng trống trên ô "I agree" đang quá rộng (thông báo cổng thanh toán
   mang margin-bottom 34). */
.woocommerce-checkout #payment .woocommerce-info,
.woocommerce-checkout #payment .woocommerce-notice { margin-bottom: 16px !important; }

/* 4. Dấu * đứng SÁT chữ điều khoản. Con abbr bị một luật nào đó đẩy thành
   block trôi ra xa — thay vì đấu specificity, giấu nó và vẽ * bằng ::after
   ngay đuôi chữ: sát tuyệt đối, không phụ thuộc luật lạ. */
.woocommerce-terms-and-conditions-wrapper .required { display: none !important; }
.woocommerce-terms-and-conditions-checkbox-text::after {
	content: " *";
	color: var(--jk-red, #d63638);
}

/* 5. Ba dòng cam kết dưới nút: khít lại cho ra một khối chữ chú thích. */
.jk-assure { gap: 3px; }
.jk-assure li { line-height: 1.4; }
