/* ==========================================================================
   TrendyShop — component

   Một file. Không bundle riêng cho trang chủ: docblock của
   Mona_Enqueue::context() ghi lại cái giá của lần chia trước — năm rule nằm
   trong bundle chỉ-trang-chủ và render không style ở mọi trang khác.

   Thứ tự: chrome → hero → dải 1..9 → mảnh dùng lại → footer → dock.
   ========================================================================== */

/* ══ Thanh trên cùng ══════════════════════════════════════════════════════
   Quy ước của trang bán hàng Việt: hotline và cam kết giao/đổi nằm TRÊN
   header, thấy ngay dòng đầu tiên. Người mua ở đây quyết định bằng "có COD
   không, đổi trả thế nào" trước khi xem tới sản phẩm.                       */

.mona-topbar {
	background: var(--ink); color: var(--on-dark-soft);
	font-size: var(--t-micro);
}
/* nowrap, KHÔNG phải wrap. Bản đầu để flex-wrap:wrap nên ở khoảng 760–900px
   thanh này tụt xuống hai dòng: ba cam kết một dòng, dòng miễn phí vận chuyển
   một dòng nữa. Một thanh phụ chiếm hai dòng trên điện thoại là hai dòng lấy
   mất của nội dung. Thay vì cho xuống dòng thì bỏ bớt mục theo khổ. */
.mona-topbar__in {
	display: flex; align-items: center; justify-content: space-between;
	gap: 16px; min-height: 38px; flex-wrap: nowrap; overflow: hidden;
}
.mona-topbar__in > p { white-space: nowrap; flex: none; }
.mona-topbar ul { display: flex; gap: 20px; flex-wrap: wrap; }
.mona-topbar li { display: inline-flex; align-items: center; gap: 6px; }
.mona-topbar svg { width: 14px; height: 14px; color: var(--sun); flex: none; }
.mona-topbar b { color: var(--on-dark); font-weight: 600; }
.mona-topbar a { color: var(--on-dark); }
@media (max-width: 980px) { .mona-topbar li:nth-child(n+3) { display: none; } }
@media (max-width: 700px) { .mona-topbar li:nth-child(n+2) { display: none; } }
/* Dưới 520px giữ dòng miễn phí vận chuyển — nó là lời hứa mạnh nhất — và bỏ
   danh sách cam kết, vốn đã lặp lại trong hero. */
@media (max-width: 520px) {
	.mona-topbar ul { display: none; }
	.mona-topbar__in { justify-content: center; }
}

/* ══ Header ═══════════════════════════════════════════════════════════════
   Dính. Trang bán hàng cuộn dài qua nhiều lưới sản phẩm; giỏ hàng và ô tìm
   kiếm phải theo người dùng xuống, nếu không họ phải cuộn ngược lên đầu để
   tìm một mẫu khác.                                                         */

.mona-header {
	position: sticky; top: 0; z-index: 60;
	background: var(--card);
	border-bottom: 1px solid var(--line);
}
.mona-header__bar {
	display: grid;
	grid-template-columns: auto minmax(180px, 1fr) auto;
	align-items: center; gap: clamp(14px, 2vw, 32px);
	min-height: 72px;
}

.mona-logo { display: inline-flex; align-items: center; gap: 10px; }
.mona-logo__word {
	display: flex; flex-direction: column;
	font-family: var(--f-display); font-weight: 800;
	font-size: 1.18rem; letter-spacing: -.03em;
	/* 1.05 đủ cho "TrendyShop" vì nó không có dấu — nhưng trong theme dòng này
	   là bloginfo('name'), biên tập viên đổi được. 1.27 là sàn đo được của
	   Plus Jakarta Sans 800 với dấu chồng. Chênh lệch ~4px, không đáng tiếc. */
	line-height: 1.27;
}
.mona-logo__word span {
	/* Không thừa hưởng 1.05 của .mona-logo__word. Dòng này là text-transform:
	   uppercase, nên sàn không phải 1.17 của chữ thường mà là 1.356 — chữ hoa
	   có dấu chồng (Ô, Ắ, Á) là thứ cao nhất trong font. */
	line-height: 1.45;
	font-family: var(--f-body); font-size: 10px; font-weight: 500;
	letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
	margin-top: 3px;
}

/* Ô tìm kiếm là phần tử rộng nhất của header. Trên một shop, tìm kiếm là
   đường đi chính chứ không phải một icon nép ở góc. */
.mona-search { position: relative; display: flex; }
.mona-search input {
	width: 100%; min-height: var(--tap);
	padding: 10px 46px 10px 42px;
	border: 1.5px solid var(--line-2); border-radius: var(--r-full);
	background: var(--card); font: inherit; font-size: var(--t-small);
	color: var(--ink);
}
.mona-search input::placeholder { color: var(--ink-2); }
.mona-search input:focus { border-color: var(--ink); outline: none; }
.mona-search__ico {
	position: absolute; left: 15px; top: 50%; transform: translateY(-50%);
	width: 17px; height: 17px; color: var(--ink-2); pointer-events: none;
}
.mona-search button {
	position: absolute; right: 5px; top: 50%; transform: translateY(-50%);
	width: 34px; height: 34px; border-radius: 50%;
	background: var(--ink); color: var(--on-dark);
	display: grid; place-items: center;
}
.mona-search button:hover { background: var(--brand); }

.mona-header__act { display: flex; align-items: center; gap: clamp(8px, 1vw, 16px); }

.mona-hot {
	display: inline-flex; align-items: center; gap: 10px;
	padding: 7px 16px 7px 8px; border-radius: var(--r-full);
	background: var(--brand-wash);
}
.mona-hot i {
	width: 32px; height: 32px; border-radius: 50%; flex: none;
	background: var(--brand); color: var(--on-dark); display: grid; place-items: center;
}
.mona-hot i svg { width: 15px; height: 15px; }
.mona-hot span { display: block; font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-2); }
.mona-hot b { display: block; font-family: var(--f-num); font-weight: 800; font-size: .95rem; color: var(--brand-ink); letter-spacing: -.01em; }

.mona-cart {
	position: relative; width: var(--tap); height: var(--tap);
	border-radius: 50%; display: grid; place-items: center;
	border: 1.5px solid var(--line-2);
}
.mona-cart:hover { border-color: var(--ink); }
.mona-cart__n {
	position: absolute; top: 2px; right: 0;
	min-width: 19px; height: 19px; padding: 0 5px;
	border-radius: var(--r-full); background: var(--brand); color: var(--on-dark);
	font-family: var(--f-num); font-size: 11px; font-weight: 800;
	display: grid; place-items: center; border: 2px solid var(--ground);
}
.mona-burger { width: var(--tap); height: var(--tap); display: none; place-items: center; }

/* ══ Nav + mega menu ══════════════════════════════════════════════════════
   Mở bằng :hover VÀ :focus-within, nên đi bằng phím Tab cũng mở được panel mà
   không cần một dòng JS. `visibility` chứ không phải `display:none` — display
   không transition được, và một panel bật tắt cụp đọc ra lỗi chứ không đọc ra
   hiệu ứng. `visibility: hidden` cũng kéo panel ra khỏi thứ tự Tab khi đóng,
   là điều `opacity: 0` một mình không làm được.                             */
/* Prototype có border-top ở đây và border-bottom ở .mona-crumb, và ở đó chúng
   đúng: nền header là --ground, nền trang cũng --ground, nên ba nét kẻ là thứ duy
   nhất tách được các dải cùng màu. Site này đã đổi sang nền trắng --card theo yêu
   cầu, và lúc đó ba nét ấy thành ba lát cắt ngang một mặt trắng liền, cách nhau
   chừng 40px. Giữ đúng một nét: border-bottom của .mona-header, cái tách thanh
   dính đầu trang khỏi nội dung. */
.mona-nav { position: relative; }
.mona-nav > .mona-container { position: static; }   /* panel bám mép .mona-nav, không bám container */
.mona-nav__list { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; }
.mona-nav__list > li { position: static; }
.mona-nav a {
	display: inline-flex; align-items: center; gap: 6px;
	min-height: 46px; padding: 6px 14px;
	font-family: var(--f-display); font-weight: 600; font-size: var(--t-small);
	border-bottom: 2px solid transparent;
}
.mona-nav a:hover { color: var(--brand-ink); }
.mona-nav a[aria-current="page"] { color: var(--brand-ink); border-bottom-color: var(--brand); }
.mona-nav .is-hot { color: var(--brand-ink); }
.mona-nav__caret { width: 11px; height: 11px; transition: transform var(--dur) var(--ease); }
.mona-nav__list > li:hover .mona-nav__caret,
.mona-nav__list > li:focus-within .mona-nav__caret { transform: rotate(180deg); }

.mona-panel {
	position: absolute; left: 0; right: 0; top: 100%; z-index: 70;
	background: var(--card);
	border-top: 1px solid var(--line);
	box-shadow: 0 24px 44px -22px rgba(23,18,14,.42);
	opacity: 0; visibility: hidden; transform: translateY(-6px);
	transition: opacity var(--dur) var(--ease-2), transform var(--dur) var(--ease), visibility var(--dur);
}
.mona-nav__list > li:hover > .mona-panel,
.mona-nav__list > li:focus-within > .mona-panel {
	opacity: 1; visibility: visible; transform: none;
}

/* Mega: bốn cột nhân vật + một thẻ khuyến mãi */
.mona-mega {
	display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) 250px;
	gap: clamp(18px, 2vw, 34px);
	padding-block: clamp(22px, 2.4vw, 32px);
}
/* Bốn cột có 7 / 5 / 7 / 6 mục, nên nếu để chảy tự nhiên thì bốn link
   "Xem cả bộ" nằm ở bốn độ cao khác nhau — nhìn ra ngay là lệch. Mỗi cột là
   một flex column, link đẩy xuống đáy bằng margin-top:auto, và grid stretch
   làm mọi cột cao bằng cột cao nhất. */
.mona-mega > div { display: flex; flex-direction: column; min-width: 0; }

/* Tên và số lượng CỐ Ý xuống hai dòng ở mọi cột. Để chung một dòng thì
   "THANH GƯƠM DIỆT QUỶ · 13 MẪU" tự xuống dòng còn ba cột kia không, và bốn
   danh sách bắt đầu ở bốn độ cao khác nhau. */
.mona-mega h3 {
	font-size: var(--t-micro); letter-spacing: .11em; text-transform: uppercase;
	color: var(--brand-ink); margin-bottom: 11px; font-family: var(--f-display); font-weight: 700;
	line-height: 1.45;
}
.mona-mega h3 b { display: block; font-weight: 700; }
.mona-mega h3 span {
	display: block; color: var(--ink-2); font-weight: 500;
	letter-spacing: .06em; margin-top: 2px;
}
.mona-mega ul { display: flex; flex-direction: column; gap: 1px; }
.mona-mega ul a {
	min-height: 32px; padding: 4px 0; font-weight: 500; font-size: var(--t-small);
	border-bottom: 0; color: var(--ink-2);
}
.mona-mega ul a:hover { color: var(--brand-ink); }
.mona-mega__all { margin-top: auto; padding-top: 14px; font-size: var(--t-micro); color: var(--brand-ink); font-weight: 700; }

.mona-mega__promo {
	position: relative; border-radius: var(--r-m); overflow: hidden;
	background: var(--ground-2); min-height: 190px; display: block;
}
.mona-mega__promo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.mona-mega__promo::after { content: ""; position: absolute; inset: 0;
	background: linear-gradient(to top, rgba(12,9,7,.86), rgba(12,9,7,.14) 62%, transparent); }
.mona-mega__promo > span { position: absolute; inset: auto 0 0 0; z-index: 2; padding: 14px 16px; color: var(--on-dark); }
.mona-mega__promo b { display: block; font-family: var(--f-display); font-size: var(--t-card); font-weight: 800; }
.mona-mega__promo em { font-style: normal; display: block; font-size: var(--t-micro); color: rgba(255,255,255,.82); margin-top: 3px; }

/* Dropdown thường: một cột, hẹp */
.mona-drop { width: 312px; left: auto; right: auto; border-radius: 0 0 var(--r-m) var(--r-m); }
.mona-drop ul { padding: 8px 0; }
/* flex-direction: column — thiếu nó thì <small> thành flex item thứ hai và
   mô tả nằm CẠNH tiêu đề, hai bên cùng bó lại thành hai cột hẹp. */
.mona-drop a {
	display: flex; flex-direction: column; justify-content: center; gap: 2px;
	/* align-items: center của .mona-nav a vẫn dội xuống đây; ở flex column nó
	   canh giữa theo TRỤC NGANG, nên cả tiêu đề lẫn mô tả bị đẩy vào giữa. */
	align-items: flex-start;
	min-height: 48px; padding: 9px 20px; border-bottom: 0; font-weight: 600;
	line-height: 1.35; text-align: left;
}
.mona-drop a:hover { background: var(--ground); color: var(--brand-ink); }
.mona-drop a small { font-size: var(--t-micro); color: var(--ink-2); font-weight: 400; line-height: 1.45; }

@media (max-width: 1120px) { .mona-mega { grid-template-columns: repeat(4, minmax(0, 1fr)); } .mona-mega__promo { display: none; } }

/* Dòng phụ của logo xuống hai dòng ở khổ hẹp. Thu nhỏ và cấm xuống dòng
   trước; chỉ khi vẫn không đủ chỗ thì mới bỏ hẳn — một dòng chữ nhỏ vẫn nói
   được shop bán gì, còn không có gì thì không. */
@media (max-width: 480px) {
	.mona-logo__word { font-size: 1.04rem; }
	.mona-logo__word span { font-size: 8.5px; letter-spacing: .04em; white-space: nowrap; }
}
@media (max-width: 350px) {
	.mona-logo__word span { display: none; }
}

@media (max-width: 900px) {
	/* HAI cột, không phải ba. Ô tìm kiếm bị display:none nên nó rời khỏi lưới,
	   và cụm nút tụt vào cột 2 (1fr) — canh trái, để trống hẳn cột 3. Đó là
	   khoảng trống bên phải trong ảnh. Logo giữ 1fr, cụm nút auto ở mép phải. */
	.mona-header__bar { grid-template-columns: minmax(0, 1fr) auto; }
	.mona-header__act { justify-self: end; }
	.mona-search { display: none; }
	.mona-burger { display: grid; }
	.mona-nav { display: none; }
	/* Chỉ thu gọn hotline TRONG HEADER. Không giới hạn phạm vi thì drawer —
	   vốn dùng lại đúng component này — cũng mất luôn nhãn và số.
	   Ở đây bỏ hẳn chữ và biến nó thành nút tròn: một pill có padding mà bên
	   trong không còn chữ nào đọc ra "hỏng", không đọc ra "thu gọn". */
	.mona-header .mona-hot { padding: 0; background: transparent; }
	.mona-header .mona-hot .mona-hot__txt { display: none; }
	.mona-header .mona-hot i { width: var(--tap); height: var(--tap); }
	.mona-header .mona-hot i svg { width: 18px; height: 18px; }
	/* Trong drawer thì ngược lại: đây là nút được bấm nhiều nhất, cho nó to. */
	.mona-drawer .mona-hot { width: 100%; padding: 10px 20px 10px 10px; }
	.mona-drawer .mona-hot b { font-size: 1.12rem; }
}

/* ══ Hero ═════════════════════════════════════════════════════════════════
   Ảnh đời thường bên phải (bàn gỗ, tay đang lắp), lời chào và giá "từ" bên
   trái. Một thẻ sản phẩm nổi đè lên mép ảnh — mô-típ MONA dùng ở cả hai dự
   án trước: thẻ ảnh xếp chồng lệch để dải mở đầu có chiều sâu.              */

.mona-hero { padding-block: clamp(28px, 3.4vw, 56px) clamp(40px, 5vw, 78px); }
.mona-hero__in {
	display: grid; grid-template-columns: minmax(0, 1.04fr) minmax(0, .96fr);
	gap: clamp(28px, 4vw, 64px); align-items: center;
}
.mona-hero__title {
	font-size: var(--t-hero); line-height: var(--lh-tight); letter-spacing: -.035em;
	/* Cân dòng khi trình duyệt hỗ trợ; <br> ở markup lo phần còn lại. */
	text-wrap: balance;
}
.mona-hero__title em { font-style: normal; color: var(--brand-ink); }
.mona-hero__lede { color: var(--ink-2); margin-top: 16px; max-inline-size: 44ch; }

.mona-hero__cta { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 26px; }

.mona-hero__chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
.mona-chip {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 7px 14px; border-radius: var(--r-full);
	background: var(--card); border: 1px solid var(--line);
	font-size: var(--t-micro); font-weight: 500;
}
.mona-chip svg { width: 14px; height: 14px; color: var(--green); flex: none; }

.mona-hero__media { position: relative; }
.mona-hero__media > img {
	width: 100%; aspect-ratio: 1600 / 900; object-fit: cover;
	border-radius: var(--r-l);
}
/* Thẻ giá nổi — đặt bằng % để nó bám mép ảnh ở mọi khổ, không phải px cứng */
.mona-hero__float {
	position: absolute; left: -4%; bottom: -26px;
	width: min(268px, 62%);
	background: var(--card); border-radius: var(--r-m);
	box-shadow: var(--sh-lift); padding: 12px;
	display: flex; gap: 12px; align-items: center;
}
.mona-hero__float img { width: 68px; height: 68px; border-radius: var(--r-s); flex: none; background: var(--ground-2); }
.mona-hero__float b { display: block; font-family: var(--f-display); font-size: .92rem; font-weight: 700; line-height: 1.3; }
.mona-hero__float .mona-price { margin-top: 4px; }
@media (max-width: 900px) {
	.mona-hero__in { grid-template-columns: minmax(0, 1fr); }
	.mona-hero__float { left: auto; right: 12px; bottom: -20px; }
}

/* ══ Thẻ sản phẩm ═════════════════════════════════════════════════════════
   Trái tim của một trang bán hàng. Ảnh vuông vì shop chụp studio 1200×1200 —
   ép 4:3 sẽ cắt mất chân đế của mô hình.

   Thẻ trắng trên nền ấm: sản phẩm chụp nền trắng, nên thẻ phải trắng để ảnh
   liền mạch với thẻ, và nền trang phải ấm để thẻ tách khỏi nền.             */

.mona-pcard {
	display: flex; flex-direction: column;
	/* Khai màu chữ, đừng thừa kế. Thẻ là một MẶT TRẮNG và nó xuất hiện trong cả
	   dải sáng lẫn dải tối; trong .mona-flash (color: --on-dark) nó thừa kế màu
	   trắng và toàn bộ tên sản phẩm biến mất trên nền trắng. Sửa ở thẻ chứ không
	   ở từng dải: dải tối nào thêm sau cũng an toàn. */
	color: var(--ink);
	background: var(--card); border: 1px solid var(--line);
	border-radius: var(--r-m); overflow: hidden;
	transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
	            border-color var(--dur) var(--ease-2);
}
.mona-pcard:hover { transform: translateY(-3px); box-shadow: var(--sh-lift); border-color: transparent; }

/* Thẻ phải cao bằng ô lưới chứa nó.
   Prototype không cần dòng này vì sáu thẻ trong dải flash của nó cao y hệt nhau:
   thẻ nào cũng có thanh "đã bán". Với dữ liệu thật thì thanh đó chỉ hiện khi shop
   đếm tồn kho, nên trong cùng một dải có thẻ có thanh và thẻ không, và vì <article>
   là khối cao tự động nằm trong <li> đã bị grid kéo giãn, các thẻ so le nhau ở đáy.
   .mona-pcard__body đã có flex:1 và .mona-pcard__foot đã có margin-top:auto, hai
   thứ đó chỉ có tác dụng khi bản thân thẻ được kéo cao hết ô.
   dynamic-content.md § "prototype chỉ cho thấy một trạng thái". */
.mona-pcard { height: 100%; }

/* Nền ô ảnh phải là --card, đúng nền studio 1200×1200 mà shop chụp sản phẩm.
   Lệch một sắc là thấy ngay đường viền quanh mô hình. */
.mona-pcard__media { position: relative; aspect-ratio: 1 / 1; background: var(--card); }
/* 3%, không phải 6%. Ảnh studio của shop đã tự chừa lề quanh mô hình rồi, nên
   6% ở đây là lề chồng lên lề: mô hình ngồi nhỏ giữa một ô trắng rộng và thẻ
   trông rỗng. Giảm một nửa thì sản phẩm to lên rõ mà không chạm mép ô. */
.mona-pcard__media img { width: 100%; height: 100%; object-fit: contain; padding: 3%; }

/* Lùi vào 14px cho khớp lề 17-18px của thân thẻ, và bỏ weight 800 xuống 700.
   Đây là vệt màu đặc duy nhất trong một lưới toàn nền trắng, nên mỗi cân nặng
   thừa của nó đều được nhân với số thẻ trên màn hình. Giữ nền --brand đặc: đây
   vẫn là thông tin người mua tìm, chỉ là nó không cần hét. */
.mona-badge {
	position: absolute; top: 14px; left: 14px; z-index: 2;
	padding: 3px 8px; border-radius: var(--r-s);
	font-family: var(--f-num); font-size: 11px; font-weight: 700; letter-spacing: -.01em;
}
.mona-badge--off { background: var(--brand); color: var(--on-dark); }
.mona-badge--new { background: var(--sun); color: var(--ink); }
/* Prototype để --hot là var(--ink), tức một viên đen. Chủ site yêu cầu đổi, nên
   đổi: cam --sun-2, chữ --ink (8.2:1). Cam tách bạch với --off đỏ và --new vàng,
   mà vẫn nằm trong bảng màu sẵn có — --sun-2 trước nay chỉ dùng làm điểm cuối của
   gradient, đây là chỗ đầu tiên nó thành nền đặc. */
.mona-badge--hot { background: var(--sun-2); color: var(--ink); }

/* Nút yêu thích — góc phải, hiện rõ hơn khi hover thẻ nhưng KHÔNG ẩn hoàn
   toàn: một nút chỉ tồn tại khi rê chuột thì trên điện thoại là không tồn tại. */
.mona-fav {
	position: absolute; top: 8px; right: 8px; z-index: 2;
	width: 34px; height: 34px; border-radius: 50%;
	background: rgba(255,255,255,.9); border: 1px solid var(--line);
	display: grid; place-items: center; color: var(--ink-2);
	opacity: .6; transition: opacity var(--dur) var(--ease-2), color var(--dur) var(--ease-2);
}
.mona-pcard:hover .mona-fav, .mona-fav:focus-visible { opacity: 1; }
.mona-fav:hover { color: var(--brand); }

.mona-pcard__body { padding: 17px 18px 19px; display: flex; flex-direction: column; gap: 9px; flex: 1; }
.mona-pcard__k { font-size: var(--t-micro); color: var(--ink-2); letter-spacing: .03em; }
.mona-pcard__title {
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-card);
	line-height: 1.34;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	/* Tên 1 dòng và 2 dòng phải xếp bằng nhau trong cùng một hàng lưới */
	min-height: calc(1.34em * 2);
}
.mona-pcard:hover .mona-pcard__title { color: var(--brand-ink); }

/* Giá: giá bán to và đỏ, giá gốc gạch ngang nhỏ và xám. Thứ tự này là quy
   ước — đảo lại là người mua đọc nhầm con số. */
.mona-price { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.mona-price b {
	font-family: var(--f-num); font-weight: 800; font-size: 1.06rem;
	color: var(--brand-ink); letter-spacing: -.02em;
}
.mona-price del { font-size: var(--t-micro); color: var(--ink-2); text-decoration-thickness: 1px; }

.mona-pcard__foot { margin-top: auto; padding-top: 15px; display: flex; align-items: center; gap: 8px; }
.mona-add {
	flex: 1; min-height: 38px; border-radius: var(--r-full);
	background: var(--ink); color: var(--on-dark);
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-micro);
	display: inline-flex; align-items: center; justify-content: center; gap: 6px;
	transition: background var(--dur) var(--ease-2);
}
.mona-add:hover { background: var(--brand); }
.mona-add svg { width: 14px; height: 14px; }

/* margin-left:auto đẩy nó về mép phải của hàng giá, nên hàng giá đọc thành
   "giá — giá cũ ............ còn hàng" thay vì ba thứ dính chùm bên trái. */
.mona-stock { display: inline-flex; align-items: center; gap: 5px; margin-left: auto; font-size: var(--t-micro); color: var(--green); }
.mona-stock::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }


/* ══ Đường ray sản phẩm ═══════════════════════════════════════════════════
   Lưới bốn cột đổi thành đường ray cuộn ngang. Vì sao đáng đổi: một lưới chỉ
   khoe được đúng số thẻ nó có chỗ, còn đường ray khoe cùng số thẻ đó rồi nói
   thêm "còn nữa" — và trên điện thoại, THẤY MỘT PHẦN thẻ kế tiếp là tín hiệu
   cuộn được mạnh hơn mọi mũi tên.

   Cuộn được bằng chạm, trackpad, và bàn phím (tabindex + role) TRƯỚC khi JS
   chạy. Mũi tên chỉ thêm vào — .mona-railnav ẩn cho tới khi .js xuất hiện,
   nên tắt JS không để lại nút chết.                                        */
.mona-prail {
	--gap: clamp(12px, 1.3vw, 20px);
	--per: 4;
	display: grid; grid-auto-flow: column;
	grid-auto-columns: calc((100% - (var(--per) - 1) * var(--gap)) / var(--per));
	gap: var(--gap);
	overflow-x: auto; overscroll-behavior-x: contain;
	scroll-snap-type: x mandatory;
	/* Chừa chỗ cho bóng đổ khi thẻ nhấc lên lúc hover, nếu không nó bị cắt */
	padding: 4px 4px 14px;
	margin: -4px -4px -14px;
	scrollbar-width: none;
}
.mona-prail::-webkit-scrollbar { display: none; }
/* Kéo được thì phải nhìn ra là kéo được. Link và nút bên trong tự mang
   cursor: pointer của riêng chúng nên không bị nắm tay này đè lên. */
.mona-prail { cursor: grab; }
.mona-prail.is-grabbing { cursor: grabbing; user-select: none; }
.mona-prail > * { scroll-snap-align: start; }

/* Màn rộng: thêm thẻ mỗi khung, không kéo thẻ to ra. Ảnh sản phẩm là 1200px
   vuông; một thẻ rộng hơn ~460px bắt đầu phóng ảnh lên và làm mờ. */
@media (min-width: 1900px) { .mona-prail { --per: 5; } }
@media (min-width: 2600px) { .mona-prail { --per: 6; } }
@media (min-width: 3200px) { .mona-prail { --per: 7; } }

/* Ở khổ hẹp để lẻ 0.15 thẻ: mép thẻ kế tiếp thò ra là lời mời cuộn. */
@media (max-width: 1000px) { .mona-prail { --per: 3; } }
@media (max-width: 760px)  { .mona-prail { --per: 2.15; } }
@media (max-width: 460px)  { .mona-prail { --per: 1.6; } }

/* Đầu dải khi có mũi tên: tiêu đề trái, link + mũi tên phải */
.mona-head__act { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }

/* ══ Ô bộ sưu tập ═════════════════════════════════════════════════════════
   Ảnh nhóm 16:9 phủ gradient, chữ đặt lên. Ô đầu rộng gấp đôi để dải không
   đọc ra "năm ô giống nhau" — và vì One Piece là nhóm nhiều mẫu nhất.       */

/* Lưới 6 cột, hai hàng: hàng trên hai ô lớn (span 3), hàng dưới ba ô (span 2).
   Bản đầu xếp cả năm ô trên một hàng — mỗi ô cao khoảng 60px, đọc ra "hàng nút"
   chứ không đọc ra "chọn bộ nào", và gradient nuốt hết ảnh vì ô quá thấp. */
.mona-colls { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: clamp(12px, 1.3vw, 18px); }

/* ⚠️ grid-column phải đặt trên <li>, KHÔNG phải trên <a> bên trong nó. Phần tử
   lưới là con trực tiếp của .mona-colls; một `span` khai trên <a> không áp
   dụng gì cả và không báo lỗi ở đâu — năm ô dồn thành một hàng, mỗi ô cao
   khoảng 60px, và trông y như một lựa chọn thiết kế tồi. */
.mona-colls > li { grid-column: span 2; min-width: 0; }
.mona-colls > li.is-wide { grid-column: span 3; }

.mona-coll {
	position: relative; height: 100%;
	border-radius: var(--r-m); overflow: hidden;
	aspect-ratio: 16 / 11; display: block;
	transition: transform var(--dur) var(--ease);
}
.mona-coll--wide { aspect-ratio: 16 / 8; }
.mona-coll:hover { transform: translateY(-3px); }
.mona-coll img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
	transition: transform .6s var(--ease); }
.mona-coll:hover img { transform: scale(1.045); }
.mona-coll::after {
	content: ""; position: absolute; inset: 0;
	background: linear-gradient(to top, rgba(12,9,7,.82) 0%, rgba(12,9,7,.30) 52%, rgba(12,9,7,0) 82%);
}
.mona-coll__t { position: absolute; inset: auto 0 0 0; z-index: 2; padding: 16px 18px; color: var(--on-dark); }
.mona-coll__t strong { display: block; font-family: var(--f-display); font-weight: 800; font-size: var(--t-h3); }
.mona-coll--wide .mona-coll__t { padding: 20px 22px; }
.mona-coll--wide .mona-coll__t strong { font-size: clamp(1.25rem, 1rem + .8vw, 1.65rem); }
.mona-coll__t span { display: inline-flex; align-items: center; gap: 6px; font-size: var(--t-micro); color: rgba(255,255,255,.82); margin-top: 4px; }
@media (max-width: 900px) {
	.mona-colls { grid-template-columns: repeat(4, minmax(0, 1fr)); }
	.mona-colls > li, .mona-colls > li.is-wide { grid-column: span 2; }
	.mona-coll, .mona-coll--wide { aspect-ratio: 16 / 10; }
}
@media (max-width: 560px) {
	.mona-colls { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mona-colls > li, .mona-colls > li.is-wide { grid-column: span 1; }
}

/* ══ Dải cam kết ══════════════════════════════════════════════════════════*/
.mona-trust { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(14px, 1.6vw, 26px); }
.mona-trust > li { display: flex; gap: 14px; align-items: flex-start; }
.mona-trust i {
	width: 44px; height: 44px; border-radius: var(--r-m); flex: none;
	background: var(--brand-wash); color: var(--brand-ink);
	display: grid; place-items: center;
}
.mona-trust i svg { width: 21px; height: 21px; }
.mona-trust b { display: block; font-family: var(--f-display); font-weight: 700; font-size: var(--t-card); }
.mona-trust p { color: var(--ink-2); font-size: var(--t-small); margin-top: 3px; }
@media (max-width: 760px) { .mona-trust { grid-template-columns: minmax(0, 1fr); } }

/* Dạng thẻ, dùng cho dải cam kết trên trang chủ và trang giới thiệu. Không đặt
   lên .mona-trust trần: page.php dùng lại class đó cho danh sách gọn trong cột
   phụ, đóng khung ở đó là hộp lồng trong hộp. */
.mona-trust--cards > li {
	padding: clamp(18px, 1.8vw, 24px);
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	box-shadow: var(--sh-card);
}
.mona-trust--cards > li > div { min-width: 0; }

/* ══ Combo ════════════════════════════════════════════════════════════════
   Dải tối, đặt giữa hai lưới sản phẩm để mắt được nghỉ và để ưu đãi không
   lẫn vào một hàng thẻ nữa.                                                  */
/* ── Dải combo ──────────────────────────────────────────────────────────────
   Site vệ tinh: thiết kế tự do. Trái là thông điệp, phải là hình — ba ảnh sản
   phẩm thật xếp fan thành "combo", huy hiệu tiết kiệm nổ lên trên. Một vệt sáng
   ấm phía sau để nền tối không bị chết. */
.mona-combo-band { position: relative; overflow: hidden; }
.mona-combo-band::before {
	content: ""; position: absolute; inset: 0; pointer-events: none;
	background:
		radial-gradient(42rem 32rem at 82% 42%, rgba(255, 200, 51, .16), transparent 60%),
		radial-gradient(30rem 30rem at 96% 88%, rgba(217, 43, 56, .22), transparent 60%);
}
.mona-combo { position: relative; z-index: 1; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 30rem); gap: clamp(28px, 4vw, 72px); align-items: center; }
@media (max-width: 900px) { .mona-combo { grid-template-columns: minmax(0, 1fr); } }

.mona-combo__msg { max-width: 44rem; }
.mona-combo__title { font-size: clamp(1.8rem, 1.2rem + 1.9vw, 2.7rem); line-height: var(--lh-head); max-inline-size: 16ch; }
.mona-combo__deals { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 22px; }
.mona-deal {
	border: 1px solid var(--line-dark); background: rgba(255, 255, 255, .05);
	border-radius: var(--r-m); padding: 15px 22px; min-width: 148px;
}
.mona-deal b { display: block; font-family: var(--f-num); font-weight: 800; font-size: 1.7rem; color: var(--sun); letter-spacing: -.02em; }
.mona-deal span { display: block; font-size: var(--t-micro); color: var(--on-dark-soft); margin-top: 3px; }
.mona-combo__note { color: var(--on-dark-soft); font-size: var(--t-small); margin-top: 16px; max-inline-size: 46ch; }
/* Nút to hơn một chút và phát sáng đỏ để mời bấm. */
.mona-combo__cta {
	margin-top: 26px; gap: 9px; padding: 14px 30px; font-size: var(--t-body);
	box-shadow: 0 10px 30px -8px rgba(217, 43, 56, .6);
}
.mona-combo__cta:hover { box-shadow: 0 14px 34px -6px rgba(217, 43, 56, .75); }
@media (max-width: 900px) { .mona-combo__cta { width: 100%; justify-content: center; } }

/* ── Hình combo bên phải ─────────────────────────────────────────────────── */
.mona-combo__visual { position: relative; min-height: 300px; display: grid; place-items: center; }
.mona-combo__stack { position: relative; width: min(100%, 26rem); aspect-ratio: 3 / 2; }
.mona-combo__pic {
	position: absolute; top: 50%; width: 44%; aspect-ratio: 1;
	border-radius: var(--r-m); overflow: hidden;
	background: var(--card); border: 3px solid #fff;
	box-shadow: 0 18px 40px -14px rgba(0, 0, 0, .7);
	transform: translateY(-50%) rotate(var(--rot));
}
/* Ba ảnh chồng nhẹ, nghiêng xen kẽ như đang cầm trên tay. */
.mona-combo__pic:nth-child(1) { left: 0;   --rot: -7deg; z-index: 1; }
.mona-combo__pic:nth-child(2) { left: 28%; --rot: 3deg;  z-index: 3; top: 46%; width: 46%; }
.mona-combo__pic:nth-child(3) { left: 56%; --rot: 8deg;  z-index: 2; }
.mona-combo__pic img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Dấu + giữa các ảnh — làm rõ "gộp lại". */
.mona-combo__plus {
	position: absolute; top: 50%; z-index: 4; transform: translateY(-50%);
	font-family: var(--f-num); font-weight: 800; font-size: 1.6rem;
	color: #fff; text-shadow: 0 2px 8px rgba(0, 0, 0, .6);
}
.mona-combo__plus--a { left: 25%; }
.mona-combo__plus--b { left: 53%; }

/* Huy hiệu tiết kiệm — nổ lên góc trên phải của chồng ảnh. */
.mona-combo__burst {
	position: absolute; z-index: 5; top: 2%; right: 2%;
	width: 8.4rem; height: 8.4rem; border-radius: 50%;
	display: grid; place-content: center; text-align: center;
	background: radial-gradient(circle at 38% 32%, var(--sun-lit), var(--sun) 62%, var(--sun-2));
	color: var(--ink); transform: rotate(-10deg);
	box-shadow: 0 12px 30px -8px rgba(255, 138, 61, .7), 0 0 0 6px rgba(255, 200, 51, .18);
}
.mona-combo__burst small { display: block; font-size: var(--t-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }
.mona-combo__burst b { display: block; font-family: var(--f-num); font-weight: 800; font-size: 1.5rem; line-height: 1.05; letter-spacing: -.02em; }
@media (max-width: 900px) {
	.mona-combo__visual { min-height: 260px; margin-top: 8px; }
	.mona-combo__burst { width: 7rem; height: 7rem; }
	.mona-combo__burst b { font-size: 1.25rem; }
}

/* ══ Chọn theo độ tuổi ════════════════════════════════════════════════════*/
.mona-age { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(12px, 1.4vw, 20px); }
.mona-age__c {
	position: relative; display: flex; flex-direction: column; gap: 6px;
	padding: 22px 22px 20px; border-radius: var(--r-m);
	background: var(--card); border: 1px solid var(--line); overflow: hidden;
	transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.mona-age__c:hover { transform: translateY(-3px); box-shadow: var(--sh-lift); }
.mona-age__n {
	font-family: var(--f-num); font-weight: 800; font-size: 1.6rem;
	letter-spacing: -.03em; color: var(--ink);
}
.mona-age__c p { color: var(--ink-2); font-size: var(--t-small); max-inline-size: 34ch; }
.mona-age__c .mona-more { margin-top: 8px; }
/* Vệt màu mỏng ở mép trên, mỗi thẻ một màu — đủ để ba thẻ không đọc ra một khối */
.mona-age__c::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 4px; background: var(--sun); }
.mona-age__c:nth-child(2)::before { background: var(--sky); }
.mona-age__c:nth-child(3)::before { background: var(--brand); }
@media (max-width: 860px) { .mona-age { grid-template-columns: minmax(0, 1fr); } }

/* ══ Bài viết ═════════════════════════════════════════════════════════════*/
.mona-post { display: flex; flex-direction: column; background: var(--card);
	border: 1px solid var(--line); border-radius: var(--r-m); overflow: hidden;
	transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }
.mona-post:hover { transform: translateY(-3px); box-shadow: var(--sh-lift); }
.mona-post__media { aspect-ratio: 1400 / 788; background: var(--ground-2); }
.mona-post__media img { width: 100%; height: 100%; object-fit: cover; }
.mona-post__body { padding: 18px 20px 20px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.mona-post__title { font-family: var(--f-display); font-weight: 700; font-size: var(--t-h3); line-height: 1.3;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.mona-post:hover .mona-post__title { color: var(--brand-ink); }
.mona-post__meta { margin-top: auto; font-size: var(--t-micro); color: var(--ink-2); }

/* ══ Bốn bước đặt hàng ════════════════════════════════════════════════════
   Người mua lần đầu trên một shop chưa quen cần biết "đặt xong thì sao".    */
.mona-steps { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(14px, 1.6vw, 26px); counter-reset: s; }
.mona-steps > li { counter-increment: s; position: relative; padding-top: 46px; }
.mona-steps > li::before {
	content: counter(s, decimal-leading-zero);
	position: absolute; top: 0; left: 0;
	width: 34px; height: 34px; border-radius: 50%;
	background: var(--brand); color: var(--on-dark);
	font-family: var(--f-num); font-size: var(--t-micro); font-weight: 800;
	display: grid; place-items: center;
}
/* Đường nối giữa các bước — chỉ ở desktop, và không vẽ sau bước cuối */
.mona-steps > li::after {
	content: ""; position: absolute; top: 17px; left: 44px; right: -14px;
	height: 1px; border-top: 1px dashed var(--line-2);
}
.mona-steps > li:last-child::after { display: none; }
.mona-steps b { display: block; font-family: var(--f-display); font-weight: 700; font-size: var(--t-card); }
.mona-steps p { color: var(--ink-2); font-size: var(--t-small); margin-top: 4px; }
@media (max-width: 860px) {
	.mona-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mona-steps > li::after { display: none; }
}
@media (max-width: 480px) { .mona-steps { grid-template-columns: minmax(0, 1fr); } }

/* ══ Đường ray ngang ══════════════════════════════════════════════════════
   Dùng cho hàng sản phẩm ở khổ hẹp: cuộn được bằng chạm/trackpad/bàn phím
   trước khi JS chạy. Mũi tên chỉ THÊM vào, nên tắt JS không để lại nút chết. */
/* ══ Mũi tên carousel ═════════════════════════════════════════════════════
   Hai nút nằm HAI BÊN hàng thẻ, căn giữa theo chiều dọc — đúng chỗ mắt và tay
   tìm chúng. Bản đầu nhét chúng vào đầu dải cạnh đồng hồ: chúng vừa xa thứ mà
   chúng điều khiển, vừa chen vào một hàng vốn đã có tiêu đề và đồng hồ.

   Cả cụm là một lớp phủ `inset: 0` với `pointer-events: none`, chỉ hai nút
   nhận chuột — nếu không nó sẽ chặn mọi thao tác vuốt lên hàng thẻ.          */
.mona-railwrap { position: relative; }

.mona-railnav { display: none; }
/* :not([hidden]) — thiếu nó thì `.js .mona-railnav { display:block }` (0,2,0)
   thắng `[hidden]{display:none}` của UA stylesheet, và `nav.hidden = true`
   trong main.js không giấu được gì. Một thuộc tính đặt đúng mà không có tác
   dụng là loại lỗi khó thấy nhất. */
.js .mona-railnav:not([hidden]) { display: block; }
.mona-railnav {
	position: absolute; inset: 0; z-index: 5;
	pointer-events: none;   /* để vuốt ngang trên hàng thẻ vẫn đi tới ray */
}
.mona-railnav button {
	pointer-events: auto;
	position: absolute; top: 50%; transform: translateY(-50%);
	width: 44px; height: 44px; border-radius: 50%;
	border: 1px solid var(--line); background: var(--card);
	display: grid; place-items: center;
	box-shadow: 0 4px 14px -4px rgba(23,18,14,.30);
	transition: background var(--dur) var(--ease-2), color var(--dur) var(--ease-2),
	            opacity var(--dur) var(--ease-2), border-color var(--dur) var(--ease-2);
}
.mona-railnav [data-rail-prev] { left: -19px; }
.mona-railnav [data-rail-next] { right: -19px; }
.mona-railnav button:disabled { opacity: .3; cursor: default; box-shadow: none; }
.mona-railnav button:not(:disabled):hover { background: var(--ink); color: var(--on-dark); border-color: transparent; }

/* Dưới 1024px máng lề hẹp lại, nên nút lùi vào TRONG mép ray. Ra ngoài ở khổ
   đó là đẩy nút ra sát mép màn hình. */
@media (max-width: 1024px) {
	.mona-railnav [data-rail-prev] { left: 5px; }
	.mona-railnav [data-rail-next] { right: 5px; }
}

/* ══ Footer ═══════════════════════════════════════════════════════════════
   Footer của một shop phải trả lời được ba câu mà người mua hỏi ở cuối trang:
   liên hệ ai, trả tiền kiểu gì, và có gì đảm bảo. Bản đầu chỉ có bốn cột link.
   ══════════════════════════════════════════════════════════════════════════ */

/* Dải đăng ký footer tự kéo lên tối đa 52px (translateY) và straddle mép trên
   footer. Chừa sẵn khoảng này DƯỚI mọi nội dung để phần kéo lên luôn rơi vào
   chỗ trống, không đè content — thay cho việc vá từng trang. */
#main { padding-bottom: clamp(60px, 6vw, 88px); }

.mona-footer { background: var(--ink); color: var(--on-dark-soft); }

/* ── Dải đăng ký, nằm đè lên mép trên của footer ───────────────────────────
   Tấm sáng đè lên nền tối: nó là thứ đầu tiên mắt gặp khi tới footer, thay vì
   một bức tường link. */
.mona-foot-cta {
	position: relative; z-index: 2;
	transform: translateY(clamp(-52px, -4vw, -34px));
	margin-bottom: clamp(-38px, -3vw, -22px);
	background: var(--card); color: var(--ink);
	/* Thẻ này nằm vắt ngang mép footer tối, nên nửa dưới của nó không còn bóng
	   để tựa vào: bóng trên nền đen là vô hình. Viền là thứ duy nhất giữ được
	   mép ở cả hai nửa. */
	border: 1px solid var(--line);
	border-radius: var(--r-l); padding: clamp(22px, 2.6vw, 34px) clamp(20px, 2.6vw, 38px);
	box-shadow: var(--sh-lift);
	display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, auto);
	align-items: center; gap: 20px 36px;
}
.mona-foot-cta h2 { font-size: clamp(1.2rem, .98rem + .9vw, 1.6rem); max-inline-size: 22ch; }
.mona-foot-cta p { color: var(--ink-2); font-size: var(--t-small); margin-top: 6px; max-inline-size: 46ch; }
.mona-sub { display: flex; gap: 8px; }
.mona-sub input {
	flex: 1; min-width: 0; min-height: var(--tap); padding: 10px 18px;
	border: 1.5px solid var(--line-2); border-radius: var(--r-full);
	font: inherit; font-size: var(--t-small); background: var(--ground);
}
.mona-sub input:focus { border-color: var(--ink); outline: none; }

/* Dải đăng ký chạy bằng MONA Smart Form, nên markup là của plugin (.msf-*),
   không phải .mona-sub của prototype. dynamic-content.md §7: tô lại markup của
   plugin, KHÔNG dựng lại form trong theme để lấy đúng hình — dựng lại là tách
   đôi đường gửi và mất luôn chống spam (nonce + honeypot + time-trap).
   Các giá trị dưới đây chép nguyên từ .mona-sub / .mona-btn--brand. */
.mona-foot-cta .msf-form { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.mona-foot-cta .msf-field { flex: 1 1 200px; margin: 0; min-width: 0; }
/* Nhãn vẫn phải tồn tại cho trình đọc màn hình — placeholder không phải nhãn.
   Ẩn bằng clip chứ không display:none, để nó còn được đọc. */
.mona-foot-cta .msf-field > label {
	position: absolute; width: 1px; height: 1px; overflow: hidden;
	clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.mona-foot-cta .msf-field input {
	width: 100%; min-width: 0; min-height: var(--tap); padding: 10px 18px;
	border: 1.5px solid var(--line-2); border-radius: var(--r-full);
	font: inherit; font-size: var(--t-small); background: var(--ground); color: var(--ink);
}
.mona-foot-cta .msf-field input:focus { border-color: var(--ink); outline: none; }
.mona-foot-cta .msf-form > p:last-of-type { margin: 0; }
.mona-foot-cta .msf-btn {
	display: inline-flex; align-items: center; justify-content: center;
	min-height: var(--tap); padding: 11px 22px; cursor: pointer;
	border: 1.5px solid transparent; border-radius: var(--r-full);
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-small);
	background: var(--brand); color: #fff; box-shadow: var(--sh-pop); white-space: nowrap;
	transition: background var(--dur) var(--ease-2), transform var(--dur) var(--ease);
}
.mona-foot-cta .msf-btn:hover { background: var(--brand-ink); transform: translateY(-1px); }
/* Vùng báo kết quả AJAX chiếm trọn hàng, nếu không nó chen vào giữa ô và nút. */
.mona-foot-cta .msf-status:not(:empty), .mona-foot-cta .msf-alert { flex: 1 0 100%; margin: 0; font-size: var(--t-small); }
.mona-foot-cta .msf-err, .mona-foot-cta .msf-field .msf-error { color: var(--brand); }

@media (max-width: 420px) {
	.mona-foot-cta .msf-form { flex-direction: column; align-items: stretch; }
	.mona-foot-cta .msf-btn { width: 100%; }
}
/* minmax(0, 1fr), KHÔNG phải 1fr. `1fr` là `minmax(auto, 1fr)`, và cận dưới
   `auto` bằng min-content của ô lớn nhất — ở đây là form đăng ký, 315px vì
   <input> mang size=20 mặc định. Track rộng hơn cả thẻ, và ở máy 320px thì
   tràn ngang. Đây đúng là ca kinh điển cần minmax(0, 1fr). */
@media (max-width: 780px) {
	.mona-foot-cta { grid-template-columns: minmax(0, 1fr); }
}
.mona-foot-cta > * { min-width: 0; }
/* Dưới 420px nút và ô nhập không đủ chỗ nằm cạnh nhau: nút "Đăng ký" là
   nowrap 102px, phần còn lại không đủ để gõ một email. */
@media (max-width: 420px) {
	.mona-sub { flex-direction: column; }
	.mona-sub .mona-btn { width: 100%; }
}

.mona-footer__main { padding-block: clamp(44px, 5vw, 68px) 26px; }

/* BA khối, không phải năm. Bản đầu để năm cột và ở ≤1060px chúng rơi vào lưới
   ba cột: hàng hai còn đúng hai ô, cột ba bỏ trống — một mảng rỗng to bằng cả
   một cột. Năm không chia chẵn cho ba hay hai ở bất kỳ mốc nào.
   Gom ba cột link vào một lưới con, còn lại đúng ba khối: thương hiệu · link ·
   liên hệ. Ba khối chia chẵn ở mọi mốc, và không mốc nào để lại ô trống. */
.mona-footer__cols {
	display: grid;
	grid-template-columns: minmax(0, 1.15fr) minmax(0, 2fr) minmax(0, 1.2fr);
	gap: clamp(22px, 2.6vw, 46px);
}
.mona-footer__links {
	display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(18px, 2.2vw, 36px);
}
.mona-footer h3 { font-size: var(--t-small); letter-spacing: .1em; text-transform: uppercase;
	color: var(--on-dark); font-weight: 700; margin-bottom: 15px; font-family: var(--f-display); }
.mona-footer ul { display: flex; flex-direction: column; gap: 6px; }
/* min-height 24px thay vì để chiều cao chạy theo dòng chữ (21px). Khoảng cách
   giữa các mục giảm từ 10 xuống 6 để cột không cao thêm — tổng nhịp giữ nguyên
   31px, chỉ chuyển từ "khoảng trống" sang "vùng bấm". */
.mona-footer ul a { display: inline-flex; align-items: center; min-height: 24px; }
.mona-footer a:hover { color: var(--on-dark); }
.mona-footer__blurb { font-size: var(--t-small); margin-top: 14px; max-inline-size: 40ch; }
.mona-footer .mona-logo__word { color: var(--on-dark); }
.mona-footer .mona-logo__word span { color: var(--on-dark-soft); }

/* Khối liên hệ — hotline là dòng to nhất footer, vì nó là thứ được bấm nhiều nhất */
.mona-contact { display: flex; flex-direction: column; gap: 14px; }
.mona-contact li { display: flex; gap: 11px; align-items: flex-start; font-size: var(--t-small); }
.mona-contact svg { width: 16px; height: 16px; color: var(--sun); flex: none; margin-top: 3px; }
.mona-contact b { display: block; color: var(--on-dark); }
.mona-contact a.mona-contact__hot {
	font-family: var(--f-num); font-weight: 800; font-size: 1.28rem;
	color: var(--sun); letter-spacing: -.02em;
}

.mona-social { display: flex; gap: 9px; margin-top: 18px; }
.mona-social a {
	width: 38px; height: 38px; border-radius: 50%;
	border: 1px solid var(--line-dark); display: grid; place-items: center;
	color: var(--on-dark-soft);
}
.mona-social a:hover { background: var(--brand); border-color: transparent; color: var(--on-dark); }
.mona-social svg { width: 17px; height: 17px; }

.mona-pay { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 18px; }
.mona-pay span {
	padding: 5px 11px; border-radius: var(--r-s);
	border: 1px solid var(--line-dark); font-size: 11px; letter-spacing: .04em;
}

/* Ô này là CHỖ ĐẶT, không phải một huy hiệu. Xem ghi chú trong index.html. */
.mona-govslot {
	margin-top: 16px; padding: 10px 14px;
	border: 1px dashed rgba(255,255,255,.28); border-radius: var(--r-s);
	font-size: 11px; color: rgba(255,255,255,.55); max-inline-size: 30ch; line-height: 1.5;
}

.mona-sign {
	display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
	margin-top: clamp(30px, 4vw, 48px); padding-top: 20px;
	border-top: 1px solid var(--line-dark); font-size: var(--t-micro);
}
.mona-sign a { color: var(--on-dark); }
/* Link "MONA.Media" nằm giữa một câu — WCAG 2.2 SC 2.5.8 miễn trừ đích inline,
   và nới nó sẽ phá nhịp dòng chữ. Ba link <nav> dưới đây là đích độc lập nên
   không được miễn. */
.mona-sign nav { display: flex; gap: 18px; flex-wrap: wrap; }
.mona-sign nav a { display: inline-flex; align-items: center; min-height: 24px; }

/* 1060 → thương hiệu và liên hệ đứng cạnh nhau ở hàng một, lưới link chiếm
   trọn hàng hai. Vẫn ba khối, vẫn không ô nào trống. */
@media (max-width: 1060px) {
	.mona-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mona-footer__links { order: 3; grid-column: 1 / -1; }
}
@media (max-width: 620px) {
	.mona-footer__cols { grid-template-columns: minmax(0, 1fr); }
	.mona-footer__links { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 380px) { .mona-footer__links { grid-template-columns: minmax(0, 1fr); } }

/* ══ Dock nổi ═════════════════════════════════════════════════════════════
   Quy ước bắt buộc của shop Việt: gọi và nhắn nằm trong tầm ngón cái, mọi
   lúc. Cả hai dự án MONA trước đều có, và cả hai đặt ở góc phải dưới.       */
.mona-dock {
	position: fixed; right: clamp(12px, 1.6vw, 22px); bottom: clamp(12px, 1.6vw, 22px);
	z-index: 70; display: flex; flex-direction: column; gap: 10px;
}
.mona-dock a, .mona-dock button {
	width: 50px; height: 50px; border-radius: 50%;
	display: grid; place-items: center; color: var(--on-dark);
	box-shadow: 0 10px 24px -8px rgba(23,18,14,.5);
	transition: transform var(--dur) var(--ease);
}
.mona-dock a:hover, .mona-dock button:hover { transform: scale(1.06); }
.mona-dock svg { width: 22px; height: 22px; }
.mona-dock__call { background: var(--brand); }
.mona-dock__zalo { background: var(--sky); }
.mona-dock__top  { background: var(--ink); }
/* Nút lên đầu chỉ có nghĩa khi đã cuộn — JS gắn .is-on */
.mona-dock__top { opacity: 0; pointer-events: none; transition: opacity var(--dur) var(--ease-2); }
.mona-dock__top.is-on { opacity: 1; pointer-events: auto; }

/* ══════════════════════════════════════════════════════════════════════════
   HERO — bản có chuyển động
   Mọi hiệu ứng dưới đây đều tắt bằng prefers-reduced-motion (cuối file), và
   không cái nào là điều kiện để đọc được nội dung: tắt JS thì spotlight đứng
   ở mẫu đầu, marquee vẫn là một danh sách link, đồng hồ đếm ngược biến mất
   chứ không để lại ô trống.
   ══════════════════════════════════════════════════════════════════════════ */

.mona-hero { position: relative; overflow: hidden; }

/* Quầng sáng ấm sau hero — gợi nắng trên mặt bàn gỗ trong ảnh, thở rất chậm.
   Dùng blur lớn + radial-gradient, không phải ảnh: một file nữa cho một vệt
   sáng là không đáng. */
.mona-hero__glow {
	position: absolute; inset: -30% -10% auto -20%; height: 130%;
	pointer-events: none; z-index: 0;
	background:
		radial-gradient(38% 46% at 22% 34%, rgba(255,200,51,.30), transparent 70%),
		radial-gradient(34% 42% at 76% 24%, rgba(217,43,56,.14), transparent 72%);
	filter: blur(28px);
	animation: mona-breathe 13s var(--ease-2) infinite alternate;
}
@keyframes mona-breathe {
	from { transform: translate3d(0,0,0) scale(1); opacity: .85; }
	to   { transform: translate3d(2%, 2%, 0) scale(1.08); opacity: 1; }
}
.mona-hero__in { position: relative; z-index: 1; }

/* Chấm "đang bán" nhấp nháy trong nhãn hero — dấu hiệu shop đang hoạt động,
   thứ mà một trang tĩnh không nói được. */
.mona-live { display: inline-flex; align-items: center; gap: 7px; }
.mona-live::before {
	content: ""; width: 7px; height: 7px; border-radius: 50%;
	background: var(--green); box-shadow: 0 0 0 0 rgba(20,125,78,.55);
	animation: mona-pulse 2.4s var(--ease-2) infinite;
}
@keyframes mona-pulse {
	0%   { box-shadow: 0 0 0 0 rgba(20,125,78,.55); }
	70%  { box-shadow: 0 0 0 7px rgba(20,125,78,0); }
	100% { box-shadow: 0 0 0 0 rgba(20,125,78,0); }
}

/* ── Spotlight: ba mẫu tự luân phiên trên nền ảnh đời thường ───────────────
   Đây là chuyển động chính của hero. Ba lớp chồng nhau, đổi bằng opacity +
   dịch nhẹ; JS chỉ đổi class. Không JS → mẫu đầu hiện, hai mẫu sau ẩn, và
   ba chấm điều hướng vẫn bấm được vì chúng là <button> có handler; nếu JS
   chết hẳn thì chúng chỉ là ba chấm tĩnh, không phải nút gãy. */
.mona-spot {
	position: absolute; left: -5%; bottom: -30px; z-index: 3;
	width: min(300px, 66%);
}
.mona-spot__stack { position: relative; }
.mona-spot__item {
	position: absolute; inset: 0;
	background: var(--card); border-radius: var(--r-m);
	box-shadow: var(--sh-lift); padding: 12px;
	display: flex; gap: 12px; align-items: center;
	opacity: 0; transform: translateY(10px) scale(.98);
	transition: opacity .5s var(--ease), transform .5s var(--ease);
	pointer-events: none;
}
.mona-spot__item:first-child { position: relative; }   /* giữ chiều cao stack */
.mona-spot__item.is-on { opacity: 1; transform: none; pointer-events: auto; }
.mona-spot__item img {
	width: 70px; height: 70px; border-radius: var(--r-s); flex: none;
	background: var(--ground-2); object-fit: contain;
}
.mona-spot__item b { display: block; font-family: var(--f-display); font-size: .92rem; font-weight: 700; line-height: 1.3; }
.mona-spot__item .mona-price { margin-top: 4px; }

/* Chấm nhìn thấy cao 4px, nhưng vùng bấm phải đủ 24px (coding-standards.md).
   padding-block + background-clip:content-box tách hai thứ đó ra: nền chỉ tô
   trong content-box nên hình dạng không đổi, còn hộp bấm cao 4+10+10 = 24px.
   Không dùng ::before phủ lên vì nó sẽ chặn chính nút bên cạnh. */
.mona-spot__dots { display: flex; gap: 6px; margin-top: 0; padding-left: 12px; }
.mona-spot__dots button {
	width: 22px; height: 4px; padding-block: 10px; box-sizing: content-box;
	border-radius: 2px; background: var(--line-2); background-clip: content-box;
	transition: background var(--dur) var(--ease-2), width var(--dur) var(--ease);
}
.mona-spot__dots button.is-on { background: var(--brand); background-clip: content-box; width: 34px; }

/* ── Con dấu xoay ─────────────────────────────────────────────────────────
   Mô-típ MONA đã dùng ở congviencavoi: vòng chữ chạy quanh một dấu hiệu.
   Chữ đặt trên textPath của SVG, vòng tự xoay — không phải 30 thẻ span xoay
   từng chữ. */
.mona-seal {
	position: absolute; right: -18px; top: -22px; z-index: 4;
	width: clamp(88px, 9vw, 118px); aspect-ratio: 1;
	display: grid; place-items: center;
	background: var(--ink); border-radius: 50%;
	box-shadow: var(--sh-lift);
}
.mona-seal__ring { position: absolute; inset: 0; animation: mona-spin 18s linear infinite; }
.mona-seal__ring text { fill: var(--sun); font-family: var(--f-display); font-size: 9.2px; font-weight: 700; letter-spacing: .16em; }
.mona-seal__ico { color: var(--on-dark); }
@keyframes mona-spin { to { transform: rotate(360deg); } }

@media (max-width: 900px) {
	.mona-spot { left: auto; right: 10px; bottom: -22px; }
	.mona-seal { right: 6px; top: -16px; }
}

/* ══ Marquee nhân vật ══════════════════════════════════════════════════════
   Dải chạy ngang dưới hero. Nội dung được nhân đôi trong markup và dịch đúng
   -50%, nên vòng lặp liền mạch mà không cần JS. aria-hidden trên bản sao để
   trình đọc màn hình không đọc hai lần. */
.mona-marquee {
	background: var(--ink); color: var(--on-dark);
	padding-block: 13px; overflow: hidden;
	--speed: 46s;
}
.mona-marquee__track { display: flex; width: max-content; animation: mona-slide var(--speed) linear infinite; }
.mona-marquee__track a { display: inline-flex; align-items: center; min-height: 24px; }
.mona-marquee:hover .mona-marquee__track { animation-play-state: paused; }
.mona-marquee ul { display: flex; align-items: center; gap: 30px; padding-right: 30px; }
.mona-marquee li { display: inline-flex; align-items: center; gap: 30px; white-space: nowrap; }
.mona-marquee a {
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-small);
	color: var(--on-dark-soft); letter-spacing: .01em;
}
.mona-marquee a:hover { color: var(--sun); }
.mona-marquee li::after { content: ""; width: 7px; height: 7px; border-radius: 2px; background: var(--brand); flex: none; }
@keyframes mona-slide { to { transform: translateX(-50%); } }

/* ══ Flash sale ═══════════════════════════════════════════════════════════
   Dải phải gây ấn tượng nhất trang. Bản đầu chỉ là `--band--dark`: một mảng
   tối phẳng, đọc ra "một dải nữa, nhưng tối" — đúng thứ nó không được là.

   Ba việc làm nó tách ra:
   1. Nó là một TẤM BO TRÒN nằm trong container, trong khi mọi dải khác đều
      tràn viền. Khác về cấu trúc, không chỉ khác về màu.
   2. Nền đỏ chuyển sắc + tia chéo + quầng nắng, thay cho một mảng phẳng.
   3. Một vệt sáng quét ngang mỗi 7 giây.

   ⚠️ Tương phản đo được trên chuyển sắc này:
        trắng trên var(--flash-1) 6.92 · var(--flash-2) 4.82 · var(--flash-3) 10.97  → an toàn cả ba
        --sun  trên var(--flash-2) chỉ **3.12** → KHÔNG được làm chữ trên nền đỏ.
      Nên --sun chỉ xuất hiện ở hai chỗ: nền pill (chữ --ink, 12.01) và chữ số
      đồng hồ đặt trên chip tối var(--flash-chip) (12.12).                              */

.mona-flash {
	position: relative; isolation: isolate; overflow: hidden;
	border-radius: clamp(18px, 2vw, 30px);
	padding: clamp(26px, 3.4vw, 52px) clamp(18px, 2.6vw, 44px) clamp(24px, 3vw, 44px);
	color: var(--on-dark);
	background:
		radial-gradient(58% 88% at 10% -6%, rgba(255,200,51,.34), transparent 62%),
		linear-gradient(128deg, var(--flash-1) 0%, var(--flash-2) 44%, var(--flash-3) 100%);
	box-shadow: 0 26px 54px -26px rgba(122,16,24,.75);
}
/* Chỉ tiêu đề của DẢI, không phải mọi h2/h3 bên trong nó.
   Bản trước viết `.mona-flash h2, .mona-flash h3` — nó quét luôn
   <h3 class="mona-pcard__title"> của từng thẻ sản phẩm, và thẻ có nền TRẮNG,
   nên tên mọi sản phẩm trong dải giảm giá thành chữ trắng trên nền trắng: vô
   hình. Không có phép đo cấu trúc nào bắt được — thẻ vẫn ở đó, vẫn đúng kích
   thước, vẫn đủ tương phản theo cách tính thông thường vì màu nền lấy từ tổ
   tiên tối. Chỉ nhìn mới thấy. */
.mona-flash__head h2, .mona-flash__head h3 { color: var(--on-dark); }

/* Tia chéo — nền lặp, không phải hai chục thẻ div */
.mona-flash__rays {
	position: absolute; inset: -20% -30%; z-index: -1; pointer-events: none;
	background: repeating-linear-gradient(104deg,
		rgba(255,255,255,.055) 0 3px, transparent 3px 26px);
}
/* Vệt sáng quét ngang. transform trên một lớp riêng, không phải trên tấm nền —
   animate background-position ép repaint cả tấm mỗi khung hình. */
.mona-flash__rays::after {
	content: ""; position: absolute; top: -30%; bottom: -30%; width: 34%;
	background: linear-gradient(100deg, transparent, rgba(255,255,255,.16), transparent);
	transform: translateX(-160%) skewX(-14deg);
	animation: mona-sweep 7s var(--ease-2) infinite;
}
@keyframes mona-sweep {
	0%, 62% { transform: translateX(-160%) skewX(-14deg); }
	100%    { transform: translateX(420%)  skewX(-14deg); }
}

/* Bản đầu dùng flex + space-between với tiêu đề bó ở 16ch: tiêu đề hẹp, đồng
   hồ bị đẩy sát mép phải, và giữa hai thứ là một khoảng trống rộng không có gì.
   Grid hai cột: cột trái co giãn, cột phải đúng bằng nội dung của nó — và đồng
   hồ trở thành một TẤM có nền và viền, nên mép phải có vật thể để tựa vào chứ
   không phải mấy con số trôi lơ lửng. */
.mona-flash__head {
	display: grid; grid-template-columns: minmax(0, 1fr) auto;
	align-items: end; gap: 22px 32px; margin-bottom: clamp(22px, 2.6vw, 34px);
}
.mona-flash__head h2 { font-size: clamp(1.7rem, 1.15rem + 2.1vw, 2.7rem); max-inline-size: 21ch; }
.mona-flash__head p { color: rgba(255,255,255,.82); font-size: var(--t-small); margin-top: 8px; max-inline-size: 52ch; }
.mona-flash__aside { display: flex; align-items: flex-end; gap: 12px; }
@media (max-width: 820px) { .mona-flash__head { grid-template-columns: minmax(0, 1fr); } }

/* Pill "GIẢM SỐC HÔM NAY" — nền nắng, chữ mực. Đây là chỗ duy nhất --sun
   được làm nền cho chữ, và cặp đó đo được 12.01. */
.mona-flash__tag {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 6px 14px 6px 10px; border-radius: var(--r-full);
	background: var(--sun); color: var(--ink);
	font-family: var(--f-display); font-weight: 800; font-size: var(--t-micro);
	letter-spacing: .1em; text-transform: uppercase;
	margin-bottom: 12px;
}
.mona-flash__tag svg { width: 15px; height: 15px; }

/* ── Đồng hồ ───────────────────────────────────────────────────────────────*/
.mona-clock {
	display: flex; flex-direction: column; gap: 9px; align-items: flex-start;
	padding: 14px 16px 16px; border-radius: var(--r-m);
	background: rgba(0,0,0,.26); border: 1px solid rgba(255,255,255,.14);
	backdrop-filter: blur(2px);
}
.mona-clock__l {
	font-size: var(--t-micro); letter-spacing: .12em; text-transform: uppercase;
	color: rgba(255,255,255,.85); font-family: var(--f-display); font-weight: 700;
}
.mona-clock__row { display: flex; align-items: center; gap: 6px; }
.mona-clock b {
	min-width: 62px; padding: 12px 8px; border-radius: var(--r-m);
	background: var(--flash-chip); border: 1px solid rgba(255,255,255,.13);
	font-family: var(--f-num); font-weight: 800;
	font-size: clamp(1.5rem, 1.1rem + 1.1vw, 2.1rem);
	color: var(--sun); text-align: center;
	font-variant-numeric: tabular-nums; letter-spacing: -.03em;
	/* Ô này chỉ chứa chữ số do JS ghi, nên 1.1 vốn đủ. Vẫn để 1.27 — bằng sàn
	   tiếng Việt — để tools/qa/vn-leading.js báo đúng 0 lỗi. Một checker luôn
	   kèm "một lỗi đã biết là ổn" thì lần sau người ta bỏ qua cả báo cáo. */
	line-height: 1.27;
	box-shadow: inset 0 -2px 0 rgba(0,0,0,.35);
}
.mona-clock i { font-style: normal; color: rgba(255,255,255,.6); font-weight: 800; }
/* Ô giây nhấp nhẹ theo nhịp — cho thấy đồng hồ đang CHẠY, không phải một ảnh */
.mona-clock b:last-of-type { animation: mona-tick 1s steps(1) infinite; }
@keyframes mona-tick { 0%, 49% { color: var(--sun); } 50%, 100% { color: var(--sun-lit); } }

/* ── Thẻ sản phẩm trong tấm đỏ ─────────────────────────────────────────────*/
.mona-flash .mona-pcard { border-color: transparent; box-shadow: 0 14px 30px -18px rgba(60,4,9,.8); }
.mona-flash .mona-pcard::before {
	content: ""; position: absolute; inset: 0 0 auto 0; height: 4px; z-index: 3;
	background: linear-gradient(90deg, var(--sun), var(--sun-2));
}
.mona-flash .mona-pcard { position: relative; }
.mona-flash .mona-badge--off { background: var(--ink); color: var(--sun); }

/* Trong tấm đỏ: nút trắng đặc để nổi khỏi nền, không phải nút mờ chìm vào nó */
.mona-flash .mona-railnav button {
	background: var(--card); color: var(--ink);
	border-color: transparent; box-shadow: 0 6px 18px -6px rgba(60,4,9,.65);
}
.mona-flash .mona-railnav button:not(:disabled):hover { background: var(--ink); color: var(--on-dark); }
.mona-flash .mona-railnav [data-rail-prev] { left: -14px; }
.mona-flash .mona-railnav [data-rail-next] { right: -14px; }

.mona-flash__foot { margin-top: clamp(20px, 2.4vw, 32px); display: flex; justify-content: center; }
.mona-flash__foot .mona-btn {
	background: var(--on-dark); color: var(--brand-ink); border-color: transparent;
	padding-inline: 30px;
}
.mona-flash__foot .mona-btn:hover { background: var(--sun); color: var(--ink); }

@media (max-width: 700px) {
	.mona-flash__head { align-items: flex-start; }
	.mona-clock b { min-width: 54px; padding: 10px 6px; }
}
/* Dưới 640px bỏ mũi tên của MỌI đường ray. Ở khổ này ray được vuốt, không
   được bấm — mũi tên là thứ của con trỏ. Giữ lại thì cụm đồng hồ + mũi tên
   cần tối thiểu 342px trong khi khung chỉ còn 237px ở máy 320px, và cả dải
   tràn ngang. */
@media (max-width: 640px) {
	.mona-railnav, .js .mona-railnav:not([hidden]) { display: none; }
}
@media (max-width: 400px) {
	.mona-clock b { min-width: 46px; padding: 9px 4px; font-size: 1.32rem; }
	.mona-clock { padding: 12px 12px 13px; }
}

/* Thanh "đã bán" — dữ liệu thật khi port (đã bán / tồn kho), không phải
   một thanh trang trí cho đầy chỗ. */
.mona-sold { margin-top: 9px; }
.mona-sold__bar { height: 6px; border-radius: 3px; background: var(--ground-2); overflow: hidden; }
.mona-sold__bar > i { display: block; height: 100%; border-radius: 3px; width: var(--p, 0%);
	background: linear-gradient(90deg, var(--sun), var(--brand)); }
.mona-sold span { display: block; font-size: var(--t-micro); color: var(--ink-2); margin-top: 4px; }
.mona-sold b { color: var(--brand-ink); font-weight: 700; }

/* ══ Tìm nhanh theo nhân vật ═══════════════════════════════════════════════
   50 nhân vật là 50 truy vấn người ta thật sự gõ. Dải chip này vừa là lối
   tắt cho người mua, vừa là liên kết nội bộ cho 50 trang sản phẩm. */
.mona-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.mona-chips a {
	display: inline-flex; align-items: center; min-height: 38px; padding: 8px 16px;
	border-radius: var(--r-full); background: var(--card);
	border: 1px solid var(--line); font-size: var(--t-small); font-weight: 500;
	transition: border-color var(--dur) var(--ease-2), color var(--dur) var(--ease-2), transform var(--dur) var(--ease);
}
.mona-chips a:hover { border-color: var(--ink); color: var(--brand-ink); transform: translateY(-2px); }

/* ══ Đánh giá ═════════════════════════════════════════════════════════════*/
.mona-rev { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-m);
	padding: 20px 20px 18px; display: flex; flex-direction: column; gap: 11px; height: 100%; }
.mona-stars { display: flex; gap: 2px; color: var(--sun); }
.mona-stars svg { width: 16px; height: 16px; }
.mona-rev p { font-size: var(--t-small); }
.mona-rev__who { margin-top: auto; padding-top: 12px; border-top: 1px solid var(--line); display: flex; align-items: center; gap: 10px; }
.mona-rev__ava {
	width: 36px; height: 36px; border-radius: 50%; flex: none;
	background: var(--brand-wash); color: var(--brand-ink);
	display: grid; place-items: center;
	font-family: var(--f-num); font-weight: 800; font-size: var(--t-micro);
}
/* Chỉ nhắm span TÊN SẢN PHẨM (span liền sau <b>). Luật cũ `.mona-rev__who span`
   vơ luôn cả .mona-rev__ava (cũng là <span> con của .mona-rev__who) với đặc
   trưng cao hơn, biến display:grid của avatar thành block — nên chữ cái đầu
   không còn được canh giữa và rơi ra góc, còn màu thì bị đổi. */
.mona-rev__who b { display: block; font-size: var(--t-small); font-family: var(--f-display); font-weight: 700; }
.mona-rev__who b + span { display: block; font-size: var(--t-micro); color: var(--ink-2); }

/* ══ FAQ ══════════════════════════════════════════════════════════════════
   <details>/<summary> — mở đóng chạy không cần một dòng JS nào, đúng phím
   Enter/Space, và trình đọc màn hình hiểu sẵn. Không tự dựng accordion. */
.mona-faq { display: grid; grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); gap: clamp(24px, 3vw, 56px); align-items: start; }
@media (max-width: 860px) { .mona-faq { grid-template-columns: minmax(0, 1fr); } }
.mona-faq__list > details { border-bottom: 1px solid var(--line); }
.mona-faq__list > details:first-child { border-top: 1px solid var(--line); }
.mona-faq summary {
	list-style: none; cursor: pointer;
	display: flex; align-items: center; justify-content: space-between; gap: 16px;
	padding: 17px 0; min-height: var(--tap);
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-card);
}
.mona-faq summary::-webkit-details-marker { display: none; }
.mona-faq summary::after {
	content: ""; flex: none; width: 13px; height: 13px;
	border-right: 2px solid var(--ink-2); border-bottom: 2px solid var(--ink-2);
	transform: rotate(45deg) translate(-3px,-3px);
	transition: transform var(--dur) var(--ease);
}
.mona-faq details[open] summary::after { transform: rotate(-135deg) translate(-3px,-3px); }
.mona-faq details[open] summary { color: var(--brand-ink); }
.mona-faq__a { padding: 0 0 18px; color: var(--ink-2); font-size: var(--t-small); max-inline-size: 60ch; }

/* ══ Tắt mọi chuyển động khi người dùng yêu cầu ════════════════════════════*/
@media (prefers-reduced-motion: reduce) {
	.mona-hero__glow, .mona-live::before, .mona-seal__ring, .mona-marquee__track,
	.mona-flash__rays::after, .mona-clock b:last-of-type { animation: none !important; }
	.mona-spot__item { transition: none !important; }
}

/* ══ Drawer di động ═══════════════════════════════════════════════════════
   Ở ≤900px nav ngang và ô tìm kiếm bị ẩn, nên TOÀN BỘ đường đi của trang nằm
   trong drawer này. Nó không phải phần thêm cho đẹp — không có nó thì trên
   điện thoại người dùng chỉ còn logo, hotline và giỏ hàng.

   Cấp bậc bên trong theo đúng thứ tự người mua cần: tìm kiếm → danh mục →
   hotline. Hai nhóm có con dùng <details>, nên đóng mở chạy không cần JS và
   phím Enter/Space đã đúng sẵn.
   ══════════════════════════════════════════════════════════════════════════ */

.mona-drawer {
	position: fixed; inset: 0; z-index: 200;
	visibility: hidden;
	/* Trễ 0s khi MỞ, trễ đúng --dur khi ĐÓNG. Viết `transition: visibility
	   var(--dur)` như bản đầu thì lúc gọi .focus() vào nút đóng, panel vẫn còn
	   hidden — trình duyệt từ chối focus và không báo gì, tiêu điểm rơi về
	   <body>. Cách này giữ được hoạt cảnh trượt ra mà vẫn focus được ngay. */
	transition: visibility 0s linear var(--dur);
}
.mona-drawer.is-open { visibility: visible; transition: visibility 0s; }

.mona-drawer__scrim {
	position: absolute; inset: 0;
	background: rgba(23,18,14,.55);
	opacity: 0; transition: opacity var(--dur) var(--ease-2);
}
.mona-drawer.is-open .mona-drawer__scrim { opacity: 1; }

.mona-drawer__panel {
	position: absolute; inset: 0 0 0 auto;
	width: min(400px, 88vw);
	background: var(--ground);
	display: flex; flex-direction: column;
	transform: translateX(100%);
	transition: transform var(--dur) var(--ease);
	overflow-y: auto; overscroll-behavior: contain;
	box-shadow: -20px 0 44px -20px rgba(23,18,14,.45);
}
.mona-drawer.is-open .mona-drawer__panel { transform: none; }

.mona-drawer__top {
	display: flex; align-items: center; justify-content: space-between; gap: 14px;
	padding: 14px var(--gutter);
	border-bottom: 1px solid var(--line);
	position: sticky; top: 0; background: var(--ground); z-index: 2;
}
.mona-drawer__close {
	width: var(--tap); height: var(--tap); border-radius: 50%;
	border: 1.5px solid var(--line-2); display: grid; place-items: center; flex: none;
}
.mona-drawer__close:hover { border-color: var(--ink); }

.mona-drawer__body { padding: 16px var(--gutter) 0; }
.mona-drawer .mona-search { display: flex; margin-bottom: 8px; }

.mona-drawer nav ul { display: flex; flex-direction: column; }
.mona-drawer nav > ul > li { border-bottom: 1px solid var(--line); }
.mona-drawer nav > ul > li > a,
.mona-drawer summary {
	display: flex; align-items: center; justify-content: space-between; gap: 12px;
	min-height: 54px; padding: 8px 0;
	font-family: var(--f-display); font-weight: 700; font-size: 1.02rem;
	list-style: none; cursor: pointer;
}
.mona-drawer summary::-webkit-details-marker { display: none; }
.mona-drawer summary svg { transition: transform var(--dur) var(--ease); flex: none; }
.mona-drawer details[open] > summary { color: var(--brand-ink); }
.mona-drawer details[open] > summary svg { transform: rotate(180deg); }

/* Danh sách con: thụt vào và nhẹ hơn, để cấp bậc đọc được mà không cần kẻ ô */
.mona-drawer details ul { padding: 2px 0 12px 14px; border-left: 2px solid var(--line); margin-left: 2px; }
.mona-drawer details ul a {
	display: flex; align-items: center; min-height: 42px;
	font-size: var(--t-small); font-weight: 500; color: var(--ink-2);
}
.mona-drawer details ul a:hover { color: var(--brand-ink); }
.mona-drawer .is-hot { color: var(--brand-ink); }

.mona-drawer__foot {
	margin-top: auto; padding: 20px var(--gutter) 24px;
	background: var(--ground-2); border-top: 1px solid var(--line);
	display: flex; flex-direction: column; gap: 12px;
}
.mona-drawer__foot .mona-hot { justify-content: center; }
.mona-drawer__chips { display: flex; flex-wrap: wrap; gap: 6px; }
.mona-drawer__chips span {
	display: inline-flex; align-items: center; gap: 5px;
	font-size: var(--t-micro); color: var(--ink-2);
	padding: 5px 10px; border-radius: var(--r-full);
	background: var(--card); border: 1px solid var(--line);
}
.mona-drawer__chips svg { width: 12px; height: 12px; color: var(--green); flex: none; }

/* Khoá cuộn nền khi drawer mở — nếu không, cuộn trong drawer tới đáy là trang
   phía sau cuộn tiếp, và người dùng mất chỗ đang đọc. */
body.mona-locked { overflow: hidden; }

@media (min-width: 901px) { .mona-drawer { display: none; } }
@media (prefers-reduced-motion: reduce) {
	.mona-drawer__panel, .mona-drawer__scrim { transition: none !important; }
}

/* ══════════════════════════════════════════════════════════════════════════
   TRANG CON
   Mọi thành phần dưới đây dùng lại token và primitive của trang chủ. Không
   token mới, không hex cứng — một trang con trông "lạ" là lỗi nặng hơn một
   trang con trông đơn giản. template-mapping.md § Step 4.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Breadcrumb ────────────────────────────────────────────────────────────
   MONA SEO sở hữu breadcrumb khi port (mseo_breadcrumb). Ở bản dựng thì đây
   là hình dạng nó phải khớp. */
.mona-crumb { padding-block: 14px; background: var(--card); }

.mona-crumb ol { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--t-micro); color: var(--ink-2); }
.mona-crumb li { display: inline-flex; align-items: center; gap: 6px; }
.mona-crumb a { display: inline-flex; align-items: center; min-height: 24px; }
.mona-crumb li + li::before { content: "/"; color: var(--line-2); }
.mona-crumb a:hover { color: var(--brand-ink); }
.mona-crumb [aria-current] { color: var(--ink); font-weight: 600; }

/* ── Đầu trang ─────────────────────────────────────────────────────────────*/
.mona-ph { padding-block: clamp(26px, 3vw, 44px) clamp(20px, 2.4vw, 32px); }
.mona-ph h1 { font-size: clamp(1.6rem, 1.15rem + 1.8vw, 2.5rem); max-inline-size: 20ch; }
.mona-ph__lede { color: var(--ink-2); margin-top: 10px; max-inline-size: 62ch; font-size: var(--t-small); }
.mona-ph__n { font-family: var(--f-num); font-weight: 700; color: var(--ink-2); font-size: var(--t-small); }
.mona-ph__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin-top: 14px; font-size: var(--t-small); color: var(--ink-2); }
.mona-ph__meta b { color: var(--ink); font-weight: 600; }

/* ── Thanh lọc và sắp xếp ──────────────────────────────────────────────────
   dynamic-content.md §3: mỗi tab là một <a href> tới URL thật, không phải
   href="#" cộng một handler. Đó là thứ làm trạng thái lọc chia sẻ được, quay
   lại được bằng nút Back, và bò được bằng máy tìm kiếm. */
.mona-filter {
	display: flex; align-items: center; justify-content: space-between;
	gap: 14px 20px; flex-wrap: wrap;
	padding-block: 14px; border-block: 1px solid var(--line);
}
.mona-tabs { display: flex; gap: 8px; flex-wrap: wrap; }
.mona-tab {
	display: inline-flex; align-items: center; gap: 7px;
	min-height: 38px; padding: 7px 15px; border-radius: var(--r-full);
	border: 1px solid var(--line-2); font-size: var(--t-small); font-weight: 500;
	white-space: nowrap;
}
.mona-tab:hover { border-color: var(--ink); }
.mona-tab.is-on { background: var(--ink); color: var(--on-dark); border-color: transparent; }
.mona-tab var { font-style: normal; font-size: var(--t-micro); opacity: .7; font-variant-numeric: tabular-nums; }

.mona-sort { display: inline-flex; align-items: center; gap: 8px; font-size: var(--t-small); color: var(--ink-2); }
/* Mũi tên vẽ bằng pseudo-element chứ không phải data-URI SVG: màu trong một
   data-URI là một mã hex cứng mà var() không với tới được, nên nó sẽ không
   đổi theo bảng màu và không ai nhớ ra để sửa. */
.mona-sort__f { position: relative; display: inline-flex; }
.mona-sort__f::after {
	content: ""; position: absolute; right: 14px; top: 50%;
	width: 8px; height: 8px; margin-top: -6px; pointer-events: none;
	border-right: 2px solid var(--ink-2); border-bottom: 2px solid var(--ink-2);
	transform: rotate(45deg);
}
.mona-sort select {
	font: inherit; font-size: var(--t-small); font-weight: 600; color: var(--ink);
	min-height: 38px; padding: 6px 34px 6px 14px;
	border: 1px solid var(--line-2); border-radius: var(--r-full);
	background: var(--card);
	-webkit-appearance: none; appearance: none;
}

/* ── Phân trang ────────────────────────────────────────────────────────────
   Số trang, không phải "trước / sau". Mũi tên mang aria-hidden và có nhãn
   chữ cho trình đọc màn hình — dynamic-content.md §2. */
.mona-pagi { display: flex; justify-content: center; gap: 6px; flex-wrap: wrap; margin-top: clamp(28px, 3vw, 44px); }
.mona-pagi a, .mona-pagi span {
	min-width: 42px; min-height: 42px; padding: 8px 12px;
	display: inline-flex; align-items: center; justify-content: center;
	border-radius: var(--r-s); border: 1px solid var(--line);
	font-family: var(--f-num); font-weight: 700; font-size: var(--t-small);
	font-variant-numeric: tabular-nums;
}
.mona-pagi a:hover { border-color: var(--ink); }
.mona-pagi [aria-current="page"] { background: var(--ink); color: var(--on-dark); border-color: transparent; }
.mona-pagi .is-gap { border: 0; min-width: 24px; color: var(--ink-2); }

/* ── Trạng thái rỗng ───────────────────────────────────────────────────────
   dynamic-content.md §5: nói cái gì rỗng và làm gì tiếp theo. Một dòng
   "Không có kết quả" đứng một mình không phải một thiết kế. */
.mona-none {
	text-align: center; padding: clamp(40px, 6vw, 80px) 20px;
	border: 1px dashed var(--line-2); border-radius: var(--r-m);
	max-inline-size: 52ch; margin-inline: auto;
}
.mona-none h2 { font-size: var(--t-h3); }
.mona-none p { color: var(--ink-2); font-size: var(--t-small); margin-top: 8px; }
.mona-none .mona-btn { margin-top: 18px; }

/* ── Trang sản phẩm ────────────────────────────────────────────────────────*/
.mona-pd { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: clamp(28px, 4.2vw, 68px); align-items: start; }
@media (max-width: 900px) { .mona-pd { grid-template-columns: minmax(0, 1fr); } }

/* Không có .mona-gal__* ở đây nữa. Cả khối — khung ảnh chính, dải thumbnail,
   trạng thái is-on — là CSS chết: không một file PHP hay JS nào in ra class đó.
   Gallery thật do plugin dựng và mang .mecom-single__media.mecom-gal__stage,
   được ánh xạ kiểu ở phần MONA Ecommerce cuối file, kèm đúng cảnh báo này.
   prototype-fidelity.md § "Delete the page-scoped patch when you fix the
   source" — khối cũ sống sót vì nó trông đúng, không vì nó chạy. */

.mona-pd__k { font-size: var(--t-micro); color: var(--ink-2); letter-spacing: .04em; }
.mona-pd h1 { font-size: clamp(1.35rem, 1.05rem + 1.2vw, 1.95rem); margin-top: 6px; }
.mona-pd__price { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-top: 22px; }
.mona-pd__price b { font-family: var(--f-num); font-weight: 800; font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.2rem); color: var(--brand-ink); letter-spacing: -.03em; }
.mona-pd__price del { color: var(--ink-2); }
.mona-pd__price .mona-badge { position: static; }

/* Bảng thông số. Ô nào chưa có nguồn thì để "—", KHÔNG điền số nghe hợp lý. */
.mona-spec { margin-top: 20px; border-top: 1px solid var(--line); }
.mona-spec div { display: grid; grid-template-columns: minmax(0, 11rem) minmax(0, 1fr); gap: 8px 16px; padding: 11px 0; border-bottom: 1px solid var(--line); font-size: var(--t-small); }
.mona-spec dt { color: var(--ink-2); }
.mona-spec dd { font-weight: 600; }
.mona-spec dd.is-empty { color: var(--ink-2); font-weight: 400; }

.mona-buy { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 28px; }
.mona-qty { display: inline-flex; align-items: center; border: 1.5px solid var(--line-2); border-radius: var(--r-full); overflow: hidden; }
.mona-qty button { width: 42px; height: 46px; display: grid; place-items: center; font-size: 1.1rem; }
.mona-qty button:hover { background: var(--ground-2); }
.mona-qty input {
	width: 46px; height: 46px; border: 0; text-align: center; font: inherit;
	font-family: var(--f-num); font-weight: 700; background: transparent;
	-moz-appearance: textfield;
}
.mona-qty input::-webkit-outer-spin-button, .mona-qty input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.mona-buy .mona-btn { flex: 1; min-width: 160px; }

/* MONA Ecommerce đóng gói ô số lượng và nút bấm trong MỘT <form> — hợp đồng của
   nó, không đổi được. Nên hàng ba món của prototype (số lượng · Thêm vào giỏ ·
   Mua ngay) trong WordPress là form-con-của-.mona-buy, và `flex: 1` ở trên rơi
   vào cái form chứ không tới được nút: nút co về bề rộng chữ và hàng hụt 69px.
   Chuyển vai trò hàng flex xuống chính cái form. */
.mona-buy__form { display: flex; gap: 10px; flex-wrap: wrap; flex: 1 1 100%; min-width: 0; }
.mona-buy__form .mona-btn { flex: 1; min-width: 160px; }
/* Giữ foot là flex và cho form flex:1. Đổi foot sang display:block thì
   .mona-buy__form (inline-flex) co lại bằng chữ và nút "Thêm vào giỏ" chỉ còn
   rộng bằng nhãn của nó. Thứ làm nút chiếm trọn hàng là việc chip "Còn hàng"
   đã dọn đi, không phải việc đổi display của foot. */
.mona-pcard__foot .mona-buy__form { flex: 1 1 auto; gap: 0; }
.mona-pcard__foot .mona-buy__form .mona-add { width: 100%; }

/* Prototype không có nút yêu thích ở hàng mua — nó chỉ nằm trên thẻ sản phẩm.
   Nút này là chức năng thật của plugin nên giữ, nhưng cho xuống dòng riêng để
   không bẻ tỉ lệ hàng ba món ở trên. */
.mona-buy .mecom-wish--single { flex: 1 0 100%; }
.mona-buy .mecom-wish--single button {
	display: inline-flex; align-items: center; gap: 8px; min-height: var(--tap);
	padding: 0; background: none; border: 0; cursor: pointer;
	font: inherit; font-size: var(--t-small); color: var(--ink-2);
}
.mona-buy .mecom-wish--single button:hover { color: var(--brand-ink); }

/* .mona-pd__trust được khai ở phần MONA Ecommerce phía dưới file, đầy đủ hơn
   (grid 18px, --ok-ink, line-height) và đứng sau nên luôn thắng. Khối cũ ở đây
   là mã chết — prototype-fidelity.md § "Delete the page-scoped patch when you
   fix the source". Chỉ giữ lại phần nới nhịp dọc, đặt cùng chỗ với bản thật. */

/* ══ Ghi chú bản demo ══════════════════════════════════════════════════════
   Nền --sun-wash chứ không phải --brand-wash. Đỏ trên trang thanh toán đọc ra
   là LỖI — người dùng tưởng đơn hỏng và bỏ đi. Vàng ấm là quy ước của "lưu ý",
   và --ink trên --sun-wash đo được 15.9:1, thừa AAA kể cả ở cỡ chữ nhỏ.

   Không position:fixed, không nút đóng. Đây là thông tin phải đọc được khi
   người ta đang điền form, không phải banner để gạt đi. */
.mona-demo__box {
	display: grid; grid-template-columns: 40px minmax(0, 1fr);
	gap: 14px; align-items: start;
	padding: clamp(16px, 1.8vw, 22px);
	background: var(--sun-wash);
	border: 1px solid var(--sun);
	border-radius: var(--r-m);
	color: var(--ink);
}
.mona-demo__ico {
	display: grid; place-items: center;
	width: 40px; height: 40px; border-radius: 50%;
	background: var(--sun); color: var(--ink);
}
.mona-demo__ico svg { width: 20px; height: 20px; }
.mona-demo__h {
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-card);
	line-height: var(--lh-head); margin-bottom: 6px;
}
.mona-demo__t { font-size: var(--t-small); line-height: var(--lh-body); }
.mona-demo__t p + p { margin-top: .6em; }
@media (max-width: 560px) {
	.mona-demo__box { grid-template-columns: minmax(0, 1fr); }
}

/* ══ Đối tác công nghệ ═════════════════════════════════════════════════════
   Tên là phần tử chính, logo là phần đỡ. Hai trong ba mục là plugin của cùng
   một nhà phát hành nên chúng mang cùng một logo, và ba logo mà hai cái giống
   hệt nhau thì đọc ra là lỗi hiển thị chứ không phải dải đối tác. Đảo thứ bậc
   lại thì lặp logo thành đúng nghĩa: cùng nhà phát hành. */
.mona-partners__row {
	display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(14px, 1.8vw, 24px);
}
.mona-partner { list-style: none; min-width: 0; }
.mona-partner__in {
	display: flex; flex-direction: column; height: 100%;
	padding: clamp(20px, 2vw, 28px);
	border: 1px solid var(--line); border-radius: var(--r-m);
	background: var(--card); color: var(--ink);
	transition: border-color var(--dur) var(--ease-2), transform var(--dur) var(--ease),
	            box-shadow var(--dur) var(--ease);
}
a.mona-partner__in:hover { border-color: var(--ink); transform: translateY(-2px); box-shadow: var(--sh-card); }

/* Chiều cao logo cố định, không phải bề rộng. Hai logo này có tỉ lệ rất khác
   nhau (1991×400 và 2679×400); bó theo bề rộng thì cái dài hơn tụt nhỏ lại và
   hai hàng chữ bên dưới không còn thẳng nhau. */
.mona-partner__logo {
	display: flex; align-items: center; height: 34px; margin-bottom: 16px;
}
.mona-partner__logo img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }

.mona-partner__name {
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-h3);
	line-height: var(--lh-head);
}
.mona-partner__desc {
	margin-top: 8px; color: var(--ink-2);
	font-size: var(--t-small); line-height: var(--lh-body);
}
.mona-partner__go {
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: auto; padding-top: 16px;
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-small);
	color: var(--brand-ink);
}
.mona-partner__go svg { width: 15px; height: 15px; transition: transform var(--dur) var(--ease-2); }
a.mona-partner__in:hover .mona-partner__go svg { transform: translateX(3px); }

@media (max-width: 900px) { .mona-partners__row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .mona-partners__row { grid-template-columns: minmax(0, 1fr); } }

/* ══ Từ mảnh rời tới tượng ═════════════════════════════════════════════════
   Dải cao nhất trang chủ, và cố ý như vậy. Mười hai dải trước đó nằm giữa 451
   và 925px, không dải nào dẫn mắt — trang đọc ra một chuỗi đều đều. Ảnh dọc 2:3
   ở đây đẩy dải lên khoảng 1000px và cho trang một đỉnh.

   Hàng lệch tầng là điểm khác biệt duy nhất, nên nó phải rõ: ba khung giống hệt
   xếp thẳng là bố cục trang này đã dùng năm lần rồi. Chỉ lệch ở màn rộng — dưới
   900px nó xếp dọc, và một khung tụt xuống trong cột dọc chỉ trông như lỗi. */
.mona-build__row {
	display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(18px, 2.4vw, 36px);
	align-items: start;
}
.mona-build__step { list-style: none; min-width: 0; }
/* Khung giữa tụt xuống một phần ba bước. Dùng margin-top chứ không transform:
   transform không đẩy chiều cao dải ra, nên đáy khung giữa sẽ thò khỏi nền. */
@media (min-width: 901px) {
	.mona-build__step:nth-child(2) { margin-top: clamp(28px, 4vw, 64px); }
}
.mona-build__pic { margin: 0 0 clamp(14px, 1.4vw, 20px); }
.mona-build__pic img {
	width: 100%; aspect-ratio: 2 / 3; object-fit: cover;
	border-radius: var(--r-l); background: var(--ground);
	box-shadow: var(--sh-card);
}
/* Tiêu đề dải này dài hơn các dải khác và .mona-head h2 bó ở 20ch, nên nó rớt
   chữ cuối xuống một mình. text-wrap: balance chia đều số chữ giữa các dòng —
   trình duyệt không hỗ trợ thì rơi về cách ngắt thường, không hỏng gì. */
.mona-build .mona-head h2 { max-inline-size: 24ch; text-wrap: balance; }

.mona-build__t h3 { font-size: var(--t-h3); }
.mona-build__t p {
	margin-top: 8px; color: var(--ink-2);
	font-size: var(--t-small); line-height: var(--lh-body);
	max-inline-size: 34ch;
}
@media (max-width: 900px) {
	.mona-build__row { grid-template-columns: minmax(0, 1fr); gap: clamp(26px, 5vw, 40px); }
	.mona-build__pic img { aspect-ratio: 4 / 3; }
}

/* ── Trang tìm kiếm ────────────────────────────────────────────────────────
   Ba khai báo này từng là thuộc tính style= viết thẳng trong search.php. Một
   giá trị nằm trong markup thì không ai grep ra được khi đổi thang chữ, và
   coding-standards.md § CSS đã nói rõ chỗ của nó là bundle. */
.mona-srch__form { max-inline-size: 32rem; margin-top: 18px; }
.mona-srch__head {
	display: flex; flex-wrap: wrap; align-items: baseline;
	justify-content: space-between; gap: 10px 24px; margin-bottom: 18px;
}
.mona-srch__h { font-size: var(--t-h3); }

/* ── Bài viết: đầu trang ───────────────────────────────────────────────────
   Không dùng chung .mona-ph với các trang tĩnh. Đầu một bài viết mang thêm
   chuyên mục, hai mốc ngày, thời gian đọc, lượt đọc và ảnh bìa — nhồi hết vào
   component dùng chung thì mọi trang khác phải nhận tham số chỉ trang này cần.
   prototype-fidelity.md § "Do not consolidate across pages". */
/* Chữ bên trái, ảnh bên phải — KHÔNG phải ảnh bìa chạy hết bề ngang.
   Ảnh đại diện của các bài này là ảnh sản phẩm chụp vuông; kéo nó ra hết khung
   1280px rồi cắt về 3:2 thì cao 740px, đẩy đoạn mở bài xuống dưới màn hình thứ
   hai và vẫn cắt mất đầu với đế của mô hình. Đặt cạnh nhau: ảnh giữ tỉ lệ 4:3
   đúng như kích thước đã đăng ký, chữ được cột rộng gần bằng cột nội dung bên
   dưới nên hai phần của trang thẳng hàng nhau. */
.mona-ah {
	padding-block: clamp(22px, 2.6vw, 38px) clamp(18px, 2.2vw, 30px);
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 25rem);
	gap: clamp(26px, 3.6vw, 56px);
	align-items: center;
}
.mona-ah__t { min-width: 0; }
@media (max-width: 860px) { .mona-ah { grid-template-columns: minmax(0, 1fr); } }

.mona-ah__cat {
	display: inline-flex; align-items: center; min-height: 28px;
	padding: 4px 12px; border-radius: var(--r-full);
	background: var(--brand-wash); color: var(--brand-ink);
	font-family: var(--f-display); font-weight: 700;
	font-size: var(--t-micro); line-height: 1.45;
	letter-spacing: .09em; text-transform: uppercase;
}
.mona-ah__cat:hover { background: var(--brand); color: #fff; }

.mona-ah__h {
	margin-top: 14px;
	font-size: clamp(1.75rem, 1.1rem + 2.4vw, 2.9rem);
	line-height: var(--lh-tight);
	max-inline-size: 22ch;
}
.mona-ah__lede {
	margin-top: 14px; max-inline-size: 62ch;
	color: var(--ink-2); font-size: var(--t-body); line-height: var(--lh-body);
}

/* Hàng thông tin. Dấu chấm phân cách vẽ bằng ::before của phần tử SAU, không
   phải ::after của phần tử trước — khi một mục bị ẩn (bài chưa sửa lần nào,
   bài chưa có lượt đọc) thì dấu biến mất cùng nó, không để lại chấm mồ côi. */
.mona-ah__meta {
	display: flex; flex-wrap: wrap; align-items: center;
	gap: 6px 0; margin-top: 18px;
	font-size: var(--t-small); color: var(--ink-2);
}
.mona-ah__meta li { display: inline-flex; align-items: center; gap: 7px; }
.mona-ah__meta li + li::before {
	content: ""; display: block; flex: none;
	width: 3px; height: 3px; border-radius: 50%;
	background: var(--line-2); margin-inline: 14px;
}
.mona-ah__meta svg { width: 15px; height: 15px; flex: none; color: var(--brand-ink); }
.mona-ah__meta time { font-variant-numeric: tabular-nums; }

.mona-ah__fig img {
	width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
	border-radius: var(--r-l); box-shadow: var(--sh-card);
	background: var(--ground-2);
}
.mona-ah__fig figcaption {
	margin-top: 10px; font-size: var(--t-micro); color: var(--ink-2);
	max-inline-size: 62ch;
}

/* ── Thanh tiến độ đọc ─────────────────────────────────────────────────────
   scaleX chứ không phải width: chỉ chạm tới transform nên trình duyệt không
   phải layout lại gì trên mỗi lần cuộn. Ẩn hẳn khi người dùng tắt hiệu ứng —
   một vạch chạy ngang màn hình là chuyển động, không phải nội dung. */
.mona-prog {
	position: fixed; inset-block-start: 0; inset-inline: 0; z-index: 70;
	height: 3px; pointer-events: none;
}
.mona-prog span {
	display: block; height: 100%; width: 100%;
	transform: scaleX(0); transform-origin: 0 50%;
	background: linear-gradient(90deg, var(--brand) 0%, var(--sun-2) 100%);
}
.no-js .mona-prog { display: none; }
@media (prefers-reduced-motion: reduce) { .mona-prog { display: none; } }

/* ── Thân bài viết ─────────────────────────────────────────────────────────
   Giới hạn bề rộng đặt lên TỪNG PHẦN TỬ, không lên wrapper — một max-width
   trên wrapper bóp luôn ảnh và bảng nằm cùng cấp. */
.mona-art > * + * { margin-top: 1.1em; }
.mona-art > p, .mona-art > ul, .mona-art > ol, .mona-art > h2, .mona-art > h3, .mona-art > blockquote { max-inline-size: 64ch; }
.mona-art > p { font-size: var(--t-body); line-height: var(--lh-body); }
.mona-art h2 { font-size: var(--t-h2); margin-top: 1.9em; }
.mona-art h3 { font-size: var(--t-h3); margin-top: 1.5em; }

/* Không đặt scroll-margin-top ở đây. base.css đã có
   `html { scroll-padding-top: calc(var(--mona-head-h) + 16px) }`, và hai thuộc
   tính này CỘNG vào nhau chứ không thay thế nhau: đặt cả hai thì tiêu đề nhảy
   tới dừng ở 274px thay vì 135px, tức là lơ lửng giữa màn hình với một khoảng
   trống to phía trên. Đo được đúng như vậy trước khi rule này bị gỡ. */

/* Vạch nhỏ trước mỗi h2 — cùng ngôn ngữ với .mona-eyebrow ở các dải khác,
   giúp mắt bắt được nhịp chia mục khi lướt nhanh. Chỉ trong .mona-artcol (tức
   chỉ single.php): page.php, template-about.php và hai khối SEO của shop cũng
   dùng .mona-art, và ở đó vạch đỏ là một thay đổi thiết kế không ai yêu cầu. */
.mona-artcol .mona-art h2::before {
	content: ""; display: block;
	width: 34px; height: 3px; border-radius: 2px;
	background: var(--brand); margin-bottom: 14px;
}
.mona-art ul, .mona-art ol { padding-left: 1.2em; }
.mona-art ul > li { list-style: disc; margin-top: .4em; }
.mona-art ol > li { list-style: decimal; margin-top: .4em; }
.mona-art a { color: var(--brand-ink); text-decoration: underline; text-underline-offset: .18em; }
.mona-art strong { font-weight: 600; color: var(--ink); }

/* Ảnh trong bài đi theo cùng một cột đo với chữ. Trước đây ảnh chiếm trọn
   909px cột trong khi chữ ngắt ở 64ch (~660px), nên mép phải của trang so le
   ở mỗi lần có ảnh. */
.mona-art figure, .mona-art > img { max-inline-size: 64ch; }
.mona-art figure img, .mona-art > img { border-radius: var(--r-m); width: 100%; }
.mona-art figcaption { font-size: var(--t-micro); color: var(--ink-2); margin-top: 8px; }
.mona-art blockquote {
	border-left: 3px solid var(--brand); padding: 4px 0 4px 18px;
	color: var(--ink-2); font-size: var(--t-body);
}
.mona-art table { width: 100%; border-collapse: collapse; font-size: var(--t-small); }
.mona-art th, .mona-art td { text-align: left; padding: 10px 12px; border-bottom: 1px solid var(--line); }
.mona-art th { font-family: var(--f-display); font-weight: 700; background: var(--ground-2); }

/* ── Khung hai cột ─────────────────────────────────────────────────────────
   align-items để mặc định (stretch), KHÔNG phải start: cột phải phải cao bằng
   cả hàng thì .mona-aside__stick mới dính được suốt chiều dài bài. Đặt start
   thì cột phải chỉ cao bằng nội dung của nó và mục lục trôi mất ngay sau màn
   hình đầu tiên — đúng lúc nó bắt đầu có ích. */
.mona-artwrap {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 19.5rem);
	gap: clamp(28px, 3.4vw, 56px);
}
.mona-artcol { min-width: 0; }
.mona-aside { display: flex; flex-direction: column; }
/* max-height là phần bắt buộc, không phải trang trí. Một phần tử sticky CAO
   HƠN khung nhìn thì ghim mép trên rồi thôi: phần dưới của nó — ở đây là hộp
   hotline — không bao giờ cuộn tới được, và trên thực tế cả cột trôi mất ngay
   khi đọc quá nửa bài, tức là mục lục biến mất đúng lúc cần nó nhất. Giới hạn
   trong đúng một khung nhìn thì sticky chạy suốt chiều dài bài, và phần dư
   (nếu màn thấp) cuộn được bên trong. Màn cao thì không có gì để cuộn. */
.mona-aside__stick {
	position: sticky; top: calc(var(--mona-head-h, 96px) + 18px);
	display: flex; flex-direction: column; gap: 16px;
	max-height: calc(100dvh - var(--mona-head-h, 96px) - 36px);
	overflow-y: auto;
	scrollbar-width: thin;
	/* Chừa chỗ cho thanh cuộn trong để hộp không nhích ngang khi nó xuất hiện. */
	padding-right: 2px;
}
.mona-aside__stick::-webkit-scrollbar { width: 6px; }
.mona-aside__stick::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 3px; }
.mona-aside__stick::-webkit-scrollbar-track { background: transparent; }

/* Dưới 900px: cột phải tan ra thành các phần tử con của chính lưới, và mục lục
   nhảy lên TRƯỚC bài viết — đó là chỗ nó đáng giá nhất trên điện thoại. Vì
   landmark <aside> biến mất ở bề rộng này nên mỗi hộp tự mang nhãn riêng
   (<nav aria-labelledby>, <section aria-labelledby>) chứ không dựa vào nó. */
@media (max-width: 900px) {
	.mona-artwrap { grid-template-columns: minmax(0, 1fr); }
	.mona-aside, .mona-aside__stick { display: contents; }
	/* max-height/overflow không còn nghĩa gì khi phần tử là display:contents,
	   nhưng viết lại cho rõ: dưới 900px không có cột dính, không có cuộn lồng. */
	.mona-aside__stick { max-height: none; overflow: visible; }
	.mona-aside__box { margin-bottom: 16px; }
	.mona-toc { order: -1; margin-bottom: clamp(20px, 3vw, 28px); }
}

/* ── Hộp cột phải ──────────────────────────────────────────────────────────*/
.mona-aside__box {
	background: var(--card); border: 1px solid var(--line);
	border-radius: var(--r-m); padding: 18px;
	box-shadow: 0 1px 2px rgba(23,18,14,.05);
}
/* line-height 1.45, không phải --lh-head (1.30). Nhãn này IN HOA, mà sàn mực
   in hoa đo được ở 14px là 1.309 — dấu của Ê/Ố đội lên trên cap height, cao
   hơn hẳn chữ thường. 1.30 lọt xuống dưới sàn đúng 0.009em. 1.45 khớp luôn
   với các nhãn caps nhỏ khác trong thiết kế (.mona-hot span, chip bộ sưu tập). */
.mona-aside__k {
	display: flex; align-items: center; gap: 8px;
	font-size: var(--t-small); line-height: 1.45;
	letter-spacing: .09em; text-transform: uppercase;
	color: var(--ink-2); margin-bottom: 14px;
}
.mona-aside__k svg { width: 15px; height: 15px; flex: none; color: var(--brand-ink); }
/* .mona-trust là hàng ngang ở dải cam kết trang chủ; trong cột phải nó phải
   xếp dọc, và trước đây được xếp dọc nhờ chính selector này. Đừng loại nó ra —
   loại ra thì rule ngang ở dải kia thắng và ba mục bị bóp thành ba cột hẹp. */
.mona-aside__box > ul:not(.mona-mini) { display: flex; flex-direction: column; gap: 6px; }
.mona-aside__box > ul:not(.mona-mini) a { display: inline-flex; align-items: center; min-height: 26px; font-size: var(--t-small); font-weight: 500; }
.mona-aside__box > ul:not(.mona-mini) a:hover { color: var(--brand-ink); }
.mona-aside__more {
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: 14px; min-height: 24px;
	font-size: var(--t-small); font-weight: 600; color: var(--brand-ink);
}
.mona-aside__more:hover { gap: 10px; }
.mona-aside__more svg { width: 14px; height: 14px; }

/* ── Mục lục ───────────────────────────────────────────────────────────────
   Trạng thái đang đọc là một vạch dọc bên trái chứ không phải đổi nền: hàng
   không nhảy chỗ khi vạch xuất hiện, nên mắt không bị giật mỗi lần cuộn qua
   một tiêu đề. */
.mona-toc__list { display: flex; flex-direction: column; }
.mona-toc__item { list-style: none; }
.mona-toc__item a {
	display: flex; align-items: flex-start; gap: 10px;
	padding: 8px 10px 8px 12px; min-height: var(--tap);
	border-left: 2px solid var(--line);
	font-size: var(--t-small); line-height: 1.5; color: var(--ink-2);
	transition: color var(--dur) var(--ease-2), border-color var(--dur) var(--ease-2);
}
.mona-toc__item a:hover { color: var(--ink); border-left-color: var(--line-2); }
.mona-toc__item--l3 a { padding-left: 26px; font-size: var(--t-micro); }
.mona-toc__n {
	flex: none; min-width: 1.4em;
	font-family: var(--f-num); font-weight: 700; font-variant-numeric: tabular-nums;
	color: var(--line-2);
}
.mona-toc__item.is-on a { color: var(--brand-ink); border-left-color: var(--brand); font-weight: 600; }
.mona-toc__item.is-on .mona-toc__n { color: var(--brand); }

/* ── Danh sách rút gọn trong cột phải ──────────────────────────────────────*/
.mona-mini { display: flex; flex-direction: column; gap: 4px; }
.mona-mini__i { list-style: none; }
.mona-mini__l {
	display: grid; grid-template-columns: 56px minmax(0, 1fr);
	gap: 12px; align-items: center;
	padding: 8px; margin-inline: -8px;
	border-radius: var(--r-s);
	transition: background var(--dur) var(--ease-2);
}
.mona-mini__l:hover { background: var(--ground-2); }
.mona-mini__pic {
	display: block; width: 56px; aspect-ratio: 1; overflow: hidden;
	border-radius: var(--r-s); background: var(--ground-2);
}
.mona-mini--post .mona-mini__pic { aspect-ratio: 4 / 3; }
.mona-mini__pic img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mona-mini__b { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.mona-mini__t {
	font-size: var(--t-small); font-weight: 500; line-height: 1.45; color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden; overflow-wrap: anywhere;
}
.mona-mini__l:hover .mona-mini__t { color: var(--brand-ink); }
.mona-mini__p { font-family: var(--f-num); font-weight: 700; font-size: var(--t-small); color: var(--brand-ink); }
.mona-mini__d { font-size: var(--t-micro); color: var(--ink-2); font-variant-numeric: tabular-nums; }

/* ── Hộp gọi hành động ở cột phải ──────────────────────────────────────────*/
.mona-aside__box--cta { background: var(--ink); border-color: var(--ink); color: var(--on-dark); }
.mona-aside__k--on { color: var(--on-dark-soft); }
.mona-aside__cta { font-size: var(--t-small); line-height: var(--lh-body); color: var(--on-dark-soft); margin-bottom: 14px; }
.mona-aside__box--cta .mona-btn { width: 100%; }
.mona-aside__box--cta .mona-btn + .mona-btn { margin-top: 8px; }
.mona-aside__box--cta .mona-btn--ghost { border-color: var(--line-dark); color: var(--on-dark); }
.mona-aside__box--cta .mona-btn--ghost:hover { border-color: var(--on-dark); background: rgba(255,255,255,.07); }

/* ── Câu hỏi thường gặp cuối bài ───────────────────────────────────────────*/
.mona-afaq { margin-top: clamp(34px, 4vw, 52px); max-inline-size: 64ch; }
.mona-afaq__h { font-size: var(--t-h2); margin-bottom: 18px; }
.mona-afaq__row { border-bottom: 1px solid var(--line); }
.mona-afaq__row summary {
	display: flex; align-items: center; justify-content: space-between; gap: 16px;
	padding: 16px 0; min-height: var(--tap); cursor: pointer;
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-card);
	line-height: var(--lh-head); list-style: none;
}
.mona-afaq__row summary::-webkit-details-marker { display: none; }
.mona-afaq__row summary svg { flex: none; color: var(--ink-2); transition: transform var(--dur) var(--ease-2); }
.mona-afaq__row[open] summary svg { transform: rotate(180deg); }
.mona-afaq__a { padding-bottom: 16px; color: var(--ink-2); font-size: var(--t-body); line-height: var(--lh-body); }
.mona-afaq__a p + p { margin-top: .8em; }

/* ── Chân bài ──────────────────────────────────────────────────────────────*/
.mona-artfoot { margin-top: clamp(34px, 4vw, 52px); }
.mona-artfoot > * + * { margin-top: clamp(20px, 2.4vw, 30px); }

.mona-tags { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.mona-tags__k { font-size: var(--t-micro); letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2); margin-right: 4px; }
.mona-tags__t {
	display: inline-flex; align-items: center; min-height: 30px;
	padding: 4px 12px; border-radius: var(--r-full);
	background: var(--ground-2); color: var(--ink-2); font-size: var(--t-small);
}
.mona-tags__t:hover { background: var(--brand-wash); color: var(--brand-ink); }

.mona-share {
	display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
	padding-block: clamp(18px, 2vw, 24px);
	border-block: 1px solid var(--line);
}
.mona-share__k { font-size: var(--t-micro); letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2); margin-right: 6px; }
.mona-share__b {
	display: inline-flex; align-items: center; gap: 8px;
	min-height: 38px; padding: 6px 14px;
	border: 1px solid var(--line); border-radius: var(--r-full);
	background: var(--card); color: var(--ink);
	font: inherit; font-size: var(--t-small); font-weight: 500; cursor: pointer;
	transition: border-color var(--dur) var(--ease-2), color var(--dur) var(--ease-2);
}
.mona-share__b:hover { border-color: var(--ink); color: var(--brand-ink); }
.mona-share__b svg { width: 16px; height: 16px; flex: none; }
.mona-share__b.is-done { border-color: var(--ok-ink); color: var(--ok-ink); background: var(--ok-bg); }

/* ── Hộp tác giả ───────────────────────────────────────────────────────────*/
.mona-abx {
	display: grid; grid-template-columns: 84px minmax(0, 1fr); gap: 18px;
	align-items: start;
	background: var(--ground-2); border-radius: var(--r-m);
	padding: clamp(18px, 2vw, 24px);
}
.mona-abx__av img { width: 84px; height: 84px; border-radius: 50%; object-fit: cover; display: block; }
.mona-abx__k { font-size: var(--t-micro); letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2); }
.mona-abx__name { font-family: var(--f-display); font-weight: 700; font-size: var(--t-h3); margin-top: 4px; }
.mona-abx__role { font-size: var(--t-small); color: var(--ink-2); margin-top: 2px; }
.mona-abx__desc { font-size: var(--t-small); line-height: var(--lh-body); color: var(--ink-2); margin-top: 10px; }
@media (max-width: 560px) { .mona-abx { grid-template-columns: minmax(0, 1fr); } }

/* ── Bài trước / bài sau ───────────────────────────────────────────────────
   Một bài không có bài trước (hoặc bài sau) thì ô còn lại phải nằm đúng phía
   của nó, không trượt sang chiếm chỗ trống — nên ô "bài sau" tự đẩy mình về
   cột cuối thay vì dựa vào việc luôn có hai ô. */
.mona-pnav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.mona-pnav__a {
	display: flex; flex-direction: column; gap: 8px;
	padding: 16px 18px; border: 1px solid var(--line); border-radius: var(--r-m);
	background: var(--card); transition: border-color var(--dur) var(--ease-2), transform var(--dur) var(--ease);
}
.mona-pnav__a:hover { border-color: var(--ink); transform: translateY(-2px); }
.mona-pnav__a--next { grid-column: 2; text-align: right; }
.mona-pnav__k {
	display: inline-flex; align-items: center; gap: 6px;
	font-size: var(--t-micro); letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2);
}
.mona-pnav__a--next .mona-pnav__k { justify-content: flex-end; }
.mona-pnav__k svg { width: 14px; height: 14px; }
.mona-pnav__t {
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-card);
	line-height: var(--lh-head); color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.mona-pnav__a:hover .mona-pnav__t { color: var(--brand-ink); }
@media (max-width: 560px) {
	.mona-pnav { grid-template-columns: minmax(0, 1fr); }
	.mona-pnav__a--next { grid-column: 1; text-align: left; }
	.mona-pnav__a--next .mona-pnav__k { justify-content: flex-start; }
}

/* ── Giỏ hàng ──────────────────────────────────────────────────────────────*/
.mona-cartwrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 22rem); gap: clamp(24px, 3vw, 48px); align-items: start; }
/* Cột trái (danh sách sản phẩm trong <form class="mecom-cart__form">) từng nằm
   trơ trên nền trang trong khi cột phải là thẻ tóm tắt — nên trông trôi nổi,
   trống. Cho nó thành thẻ cùng ngôn ngữ để neo lại. */
.mona-cartwrap .mecom-cart__form {
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: 4px clamp(18px, 2vw, 26px) clamp(16px, 1.8vw, 24px);
}
.mona-cartwrap .mecom-cart__form ul { margin: 0; }
.mona-cartwrap .mona-line:last-child { border-bottom: 0; }
@media (max-width: 900px) { .mona-cartwrap { grid-template-columns: minmax(0, 1fr); } }
.mona-line { display: grid; grid-template-columns: 84px minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 16px 0; border-bottom: 1px solid var(--line); }
.mona-line__img { aspect-ratio: 1/1; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s); overflow: hidden; }
.mona-line__img img { width: 100%; height: 100%; object-fit: contain; padding: 6%; }
.mona-line h3 { font-size: var(--t-card); font-weight: 700; line-height: 1.35; }
.mona-line__k { font-size: var(--t-micro); color: var(--ink-2); margin-bottom: 3px; }
.mona-line__act { display: flex; align-items: center; gap: 14px; }
.mona-line__act button { min-height: 24px; }
.mona-line h3 a { display: inline-flex; align-items: center; min-height: 24px; }
.mona-line__x { color: var(--ink-2); font-size: var(--t-micro); text-decoration: underline; }
.mona-line__x:hover { color: var(--brand-ink); }
@media (max-width: 560px) {
	.mona-line { grid-template-columns: 68px minmax(0, 1fr); }
	.mona-line__act { grid-column: 2; justify-content: space-between; }
}
.mona-sum { background: var(--ground-2); border-radius: var(--r-m); padding: clamp(18px, 2vw, 26px); position: sticky; top: 92px; }
.mona-sum h2 { font-size: var(--t-h3); margin-bottom: 14px; }
.mona-sum dl { display: flex; flex-direction: column; gap: 11px; font-size: var(--t-small); }
.mona-sum dl > div { display: flex; justify-content: space-between; gap: 16px; }
.mona-sum dd { font-weight: 600; font-family: var(--f-num); }
.mona-sum__total { border-top: 1px solid var(--line-2); margin-top: 14px; padding-top: 14px; }
.mona-sum__total dd { font-size: 1.3rem; font-weight: 800; color: var(--brand-ink); letter-spacing: -.02em; }
.mona-sum > .mona-btn { width: 100%; margin-top: 18px; }
.mona-sum__note { font-size: var(--t-micro); color: var(--ink-2); margin-top: 12px; }
/* Chừa đáy cho dải đăng ký footer (translateY -52px) đè lên KHOẢNG TRỐNG,
   không đè lên box tóm tắt đang sticky. Đo được chồng -3px trước khi thêm. */

/* Khối liên hệ trên trang /lien-he/ nằm trên thẻ SÁNG (.mona-sum), không phải
   nền tối của footer. .mona-contact gốc tô nhãn bằng --on-dark và hotline/icon
   bằng --sun (vàng) — đúng cho footer, nhưng trên nền sáng thì nhãn gần như
   tàng hình và số hotline vàng chìm. --light lật lại đúng các vai màu. */
.mona-contact--light b { color: var(--ink); }
.mona-contact--light { color: var(--ink-2); }
.mona-contact--light svg { color: var(--ink-2); }
.mona-contact--light a { color: var(--ink-2); }
.mona-contact--light a:hover { color: var(--brand-ink); }
.mona-contact--light a.mona-contact__hot { color: var(--brand-ink); }

/* Form liên hệ chạy bằng MONA Smart Form: markup là .msf-* của plugin, bọc
   trong .mona-form. Nút gửi mặc định của plugin màu cam; kéo về đỏ brand cho
   khớp .mona-btn--brand của prototype. Chỉ đổi lớp trình bày, không đụng đường
   gửi (dynamic-content.md §7). */
.mona-form .msf-btn {
	display: inline-flex; align-items: center; justify-content: center;
	min-height: var(--tap); padding: 11px 26px; cursor: pointer;
	border: 1.5px solid transparent; border-radius: var(--r-full);
	font-family: var(--f-display); font-weight: 700; font-size: var(--t-small);
	background: var(--brand); color: #fff; box-shadow: var(--sh-pop);
	transition: background var(--dur) var(--ease-2), transform var(--dur) var(--ease);
}
.mona-form .msf-btn:hover { background: var(--brand-ink); transform: translateY(-1px); }
/* Ô bắt buộc: dấu * đỏ như .mona-field .req, và hàng hai ô tên+sđt chia đôi
   như .mona-form__row của prototype (plugin xếp mỗi field một dòng). */
.mona-form .msf-req { color: var(--brand-ink); }

/* ── Trang liên hệ (/lien-he/) ─────────────────────────────────────────────
   Nền TRẮNG (mona-band--white), không dùng nền kem của site. Trái là form gọn
   trên nền trắng, phải là thẻ thông tin viền để tách ra. Form là markup .msf-*
   của MONA Smart Form bọc trong .mona-form — chỉ tô lại, không dựng lại. */
/* ── Giỏ hàng xem nhanh ────────────────────────────────────────────────────
   Panel thả xuống từ nút giỏ trên header. Nội dung do plugin render
   (mona-ecommerce/mini-cart.php), phần này chỉ là hình dạng. */
.mona-mc { position: relative; }
.mona-mc__panel {
	position: absolute; top: calc(100% + 12px); right: 0; z-index: 80;
	width: min(92vw, 380px);
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	box-shadow: var(--sh-lift); overflow: hidden;
}
/* shop.css khai `.mecom-mini { display: inline-flex; align-items: center; gap: 8px }`
   cho bản mini-cart gốc của plugin, vốn chỉ là một cái link. Bản override của
   theme dựng cả một panel bên trong cùng class đó, nên luật kia xếp danh sách,
   phần chân và nút thành MỘT HÀNG NGANG: tên sản phẩm bị nén còn "Mô hình…",
   ô tổng trôi sang phải. Trả nó về block, và gỡ luôn align/gap của flex. */
.mona-mc__panel .mecom-mini {
	display: block; align-items: initial; gap: 0; font-size: inherit;
}

/* Thuộc tính hidden của HTML phải thắng. Bất kỳ display nào khai ở đây cũng đè
   lên luật [hidden]{display:none} của trình duyệt, và panel sẽ không bao giờ
   đóng — đúng cái bẫy đã cắn một lần ở form đánh giá. */
.mona-mc__panel[hidden] { display: none; }

/* Mũi nhọn chỉ về nút, để panel dính vào nút chứ không lơ lửng. */
.mona-mc__panel::before {
	content: ""; position: absolute; top: -7px; right: 18px;
	width: 12px; height: 12px; transform: rotate(45deg);
	background: var(--card); border-left: 1px solid var(--line); border-top: 1px solid var(--line);
}

.mona-mc__list {
	list-style: none; margin: 0; padding: 6px;
	/* Giỏ dài thì cuộn trong panel. Một dropdown cao hơn màn hình là dropdown
	   không đóng lại được trên điện thoại. */
	max-height: min(46vh, 340px); overflow-y: auto; overscroll-behavior: contain;
}
.mona-mc__row {
	display: grid; grid-template-columns: 52px minmax(0, 1fr) auto;
	gap: 12px; align-items: center; padding: 10px;
	border-radius: var(--r-m);
}
.mona-mc__row + .mona-mc__row { border-top: 1px solid var(--line); border-radius: 0; }
.mona-mc__pic {
	width: 52px; height: 52px; border-radius: var(--r-s); overflow: hidden;
	border: 1px solid var(--line); background: var(--card); display: block;
}
.mona-mc__pic img { width: 100%; height: 100%; object-fit: contain; padding: 6%; display: block; }
.mona-mc__t { min-width: 0; display: grid; gap: 2px; }
.mona-mc__name {
	font-size: var(--t-small); font-weight: 600; color: var(--ink); text-decoration: none;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.mona-mc__name:hover { color: var(--brand-ink); }
.mona-mc__attr,
.mona-mc__q { font-size: var(--t-micro); color: var(--ink-2); }
.mona-mc__sum { font-family: var(--f-num, var(--f-display)); font-size: var(--t-small); white-space: nowrap; }

.mona-mc__foot { padding: 14px 16px 16px; border-top: 1px solid var(--line); }
.mona-mc__tot { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.mona-mc__tot span { font-size: var(--t-small); color: var(--ink-2); }
.mona-mc__tot b { font-family: var(--f-display); font-size: var(--t-h4, 1.15rem); }
.mona-mc__note { margin-top: 2px; font-size: var(--t-micro); color: var(--ink-2); }
.mona-mc__act { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 14px; }
.mona-mc__act .mona-btn { width: 100%; justify-content: center; }

/* Giỏ trống — cả khối là MỘT lưới có đệm riêng, kể cả nút.
   Bản cũ để icon màu --line-2 (gần như tan vào nền), dòng mô tả chạy hết bề
   ngang panel nên ngắt thành "…thêm vào / giỏ”." lửng lơ, và cái nút nằm ngoài
   khối với margin 14px 20px 20px — nút inline-flex trong một thẻ div nên nó
   dạt trái dưới chữ căn giữa. Ba lỗi đó cộng lại là cái panel trông dở dang. */
.mona-mc__empty {
	display: grid; justify-items: center; text-align: center;
	padding: 30px 24px 26px; color: var(--ink-2);
}
/* Icon có vòng nền để nó là một chi tiết cố ý, không phải một hình mờ bị bỏ
   quên. --brand-wash chỉ là nền trang trí, chữ không đặt lên nên không có
   ngưỡng tương phản nào bị phá; --brand-ink trên nó đo được 4.98:1. */
.mona-mc__empty-ic {
	display: grid; place-items: center;
	width: 54px; height: 54px; border-radius: 50%;
	background: var(--brand-wash); color: var(--brand-ink);
	margin-bottom: 14px;
}
.mona-mc__empty-ic svg { width: 22px; height: 22px; }
.mona-mc__empty-h { font-family: var(--f-display); font-size: var(--t-card); line-height: var(--lh-head); color: var(--ink); }
.mona-mc__empty-p {
	margin-top: 7px; font-size: var(--t-small); line-height: var(--lh-body);
	/* Ngắt dòng ở 26ch chứ không phải ở mép panel: hai dòng cân nhau thay vì
	   một dòng dài và một chữ mồ côi. */
	max-inline-size: 26ch; text-wrap: pretty;
}
.mona-mc__go { margin-top: 20px; width: 100%; }

@media (max-width: 480px) {
	.mona-mc__panel { position: fixed; top: auto; right: 10px; left: 10px; width: auto; }
	.mona-mc__panel::before { display: none; }
	.mona-mc__act { grid-template-columns: 1fr; }
}

/* ── Trang giới thiệu ──────────────────────────────────────────────────────
   Trang này trước đây chạy qua page.php với post_content RỖNG, nên nó chỉ có
   tiêu đề và hai ô phụ. Các dải dưới đây là nội dung thật của nó. */

.mona-abhero {
	display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: clamp(24px, 3.4vw, 56px); align-items: center;
}
@media (max-width: 860px) { .mona-abhero { grid-template-columns: minmax(0, 1fr); } }
/* Chưa có ảnh thì đừng để lại nửa lưới trống: một cột, và chữ giữ bề rộng đọc
   được thay vì kéo dài hết dải. */
.mona-abhero--solo { grid-template-columns: minmax(0, 1fr); }
.mona-abhero__lede { font-size: var(--t-card); line-height: var(--lh-body); color: var(--ink); max-width: var(--measure); }
.mona-abhero__pic img,
.mona-abhero__pic picture { display: block; width: 100%; border-radius: var(--r-l); }

/* Ba con số này được ĐẾM trong template chứ không gõ tay, nên chúng không bao
   giờ lệch với số sản phẩm thật. Dùng chữ số bảng để hàng không nhảy khi số đổi. */
.mona-abstats {
	/* 96px chứ không phải 120px: ở khổ 390 thì ba ô 120px không đủ chỗ nên ô thứ
	   ba rơi xuống hàng riêng, đứng lệch một mình. 96px cho cả ba nằm cùng hàng
	   ở mọi khổ, và ở khổ rộng thì 1fr vẫn kéo chúng ra bằng nhau. */
	display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr));
	gap: clamp(10px, 1.4vw, 20px); list-style: none; margin: 28px 0 0; padding: 0;
}
.mona-abstats > li {
	padding: 16px 18px; background: var(--card);
	border: 1px solid var(--line); border-radius: var(--r-m);
	box-shadow: var(--sh-card);
}
.mona-abstats b {
	display: block; font-family: var(--f-display); font-size: var(--t-h3);
	line-height: 1.1; color: var(--ink); font-variant-numeric: tabular-nums;
}
.mona-abstats span { display: block; margin-top: 2px; font-size: var(--t-micro); color: var(--ink-2); }

.mona-abwho {
	max-width: 62rem; padding: clamp(22px, 2.6vw, 34px);
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	box-shadow: var(--sh-card);
}
.mona-abwho h2 { font-size: var(--t-h3); margin-bottom: 10px; }
.mona-abwho p { color: var(--ink-2); line-height: var(--lh-body); }
.mona-abwho__links { display: flex; flex-wrap: wrap; gap: 8px 24px; margin-top: 18px; }
.mona-abwho__links a {
	display: inline-flex; align-items: center; gap: 7px; min-height: var(--tap);
	font-size: var(--t-small); font-weight: 600; color: var(--ink); text-decoration: none;
}
.mona-abwho__links a:hover { color: var(--brand-ink); }

/* ── Trang liên hệ ─────────────────────────────────────────────────────────
   Bản đầu chỉ có form và một danh sách bốn dòng, nên trang trông như còn dở.
   Giờ chia làm ba dải: cách liên hệ, form kèm cột phụ, rồi bản đồ. */

/* Bốn cách liên hệ, mỗi cách một thẻ. Auto-fit chứ không cố định 4 cột: hotline
   và Zalo là field có thể bỏ trống, nên số thẻ chạy từ 1 tới 4 và hàng vẫn kín. */
.mona-waylist {
	display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: clamp(12px, 1.4vw, 18px); list-style: none; margin: 0; padding: 0;
}
.mona-way {
	display: grid; gap: 4px; align-content: start;
	padding: 18px 18px 20px;
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	box-shadow: var(--sh-card);
}
/* Không đĩa màu sau icon: mặt trắng là mặc định của site, phần nổi bật để cho
   viền thẻ và cỡ chữ lo. Icon giữ màu thương hiệu nên vẫn bắt mắt. */
.mona-way__i {
	display: grid; place-items: center; width: 26px; height: 26px; margin-bottom: 10px;
	color: var(--brand-ink);
}
.mona-way__h { font-size: var(--t-micro); color: var(--ink-2); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
.mona-way__v { font-family: var(--f-display); font-size: var(--t-card); color: var(--ink); text-decoration: none; overflow-wrap: anywhere; }
a.mona-way__v:hover { color: var(--brand-ink); }
.mona-way__n { font-size: var(--t-micro); color: var(--ink-2); line-height: var(--lh-body); margin-top: 4px; }

/* Cột phụ: ba câu hỏi hay gặp, trỏ thẳng tới trang đã có câu trả lời. */
.mona-helplist { list-style: none; margin: 0 0 22px; padding: 0; display: grid; gap: 2px; }
.mona-helplist a {
	display: flex; align-items: center; justify-content: space-between; gap: 12px;
	min-height: var(--tap); padding: 12px 0;
	border-bottom: 1px solid var(--line);
	font-size: var(--t-small); color: var(--ink); text-decoration: none;
}
.mona-helplist li:last-child a { border-bottom: 0; }
.mona-helplist a:hover { color: var(--brand-ink); }
.mona-helplist svg { flex: none; }

.mona-contactp__addr { padding: 16px 18px; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-m); box-shadow: var(--sh-card); }
.mona-contactp__addr b { display: block; font-size: var(--t-micro); color: var(--ink-2); text-transform: uppercase; letter-spacing: .04em; }
.mona-contactp__addr p { margin: 4px 0 0; font-size: var(--t-small); }

/* Bản đồ. aspect-ratio đặt chỗ trước khi iframe nạp, nếu không cả dải nhảy một
   phát khi bản đồ về (CLS là chỉ số bị chấm trên dự án này). */
.mona-mapwrap { position: relative; }
.mona-map {
	width: 100%; aspect-ratio: 21/8; border-radius: var(--r-l); overflow: hidden;
	border: 1px solid var(--line); background: var(--card);
}
.mona-map iframe { display: block; width: 100%; height: 100%; border: 0; }
@media (max-width: 700px) { .mona-map { aspect-ratio: 4/3; } }
.mona-map__open {
	position: absolute; top: 14px; right: 14px; z-index: 1;
	display: inline-flex; align-items: center; gap: 8px;
	min-height: var(--tap); padding: 0 16px;
	border-radius: var(--r-full);
	background: var(--card); box-shadow: var(--sh-card);
	font-size: var(--t-small); font-weight: 600; color: var(--ink); text-decoration: none;
}
.mona-map__open:hover { color: var(--brand-ink); box-shadow: var(--sh-lift); }
.mona-map__open:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
@media (max-width: 480px) { .mona-map__open { top: 10px; right: 10px; padding: 0 12px; } }

.mona-contactp { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 21rem); gap: clamp(28px, 3.5vw, 56px); align-items: start; }
@media (max-width: 900px) { .mona-contactp { grid-template-columns: minmax(0, 1fr); } }
/* Cột form cũng là một thẻ, cùng khung với cột phụ bên phải. Không có khung thì
   nó trôi trên nền trắng: các ô nhập chỉ còn là mấy đường viền rời rạc, và cột
   phải có thẻ hẳn hoi làm chỗ lệch càng rõ. Bóng nhẹ hơn cột phụ một nấc để cột
   phụ vẫn là thứ nổi lên trước. */
.mona-contactp__form {
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: clamp(20px, 2.4vw, 32px); box-shadow: var(--sh-card);
}
.mona-contactp__h { font-size: var(--t-h3); }
.mona-contactp__lede { color: var(--ink-2); font-size: var(--t-small); margin: 6px 0 24px; }

/* Hàng tên + số điện thoại chia đôi; select, đoạn văn, nút và vùng báo trạng
   thái chiếm trọn. Plugin xếp mỗi field một dòng — lưới ở đây gom lại.
   ⚠️ .mona-form chỉ là DIV BỌC; field nằm trong <form class="msf-form"> bên
   trong, và plugin giới hạn form đó max-width:520px. Nên lưới đặt lên .msf-form
   (không phải .mona-form), và gỡ trần rộng để form lấp trọn cột. */
.mona-contactp .mona-form { max-width: none; }
.mona-contactp .msf-form { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; max-width: none; }
.mona-contactp .msf-form > * { grid-column: 1 / -1; }
.mona-contactp .msf-field-text,
.mona-contactp .msf-field-tel { grid-column: span 1; }
@media (max-width: 560px) { .mona-contactp .msf-field-text, .mona-contactp .msf-field-tel { grid-column: 1 / -1; } }
.mona-contactp .msf-field { margin: 0; display: flex; flex-direction: column; gap: 6px; }
.mona-contactp .msf-field > label { font-size: var(--t-small); font-weight: 600; margin: 0; }
.mona-contactp .msf-field input,
.mona-contactp .msf-field select,
.mona-contactp .msf-field textarea {
	width: 100%; font: inherit; font-size: var(--t-small); min-height: var(--tap);
	padding: 11px 14px; border: 1.5px solid var(--line-2); border-radius: var(--r-m);
	background: var(--card); color: var(--ink);
}
.mona-contactp .msf-field textarea { min-height: 130px; resize: vertical; }
.mona-contactp .msf-field input:focus,
.mona-contactp .msf-field select:focus,
.mona-contactp .msf-field textarea:focus {
	border-color: var(--brand); outline: none; box-shadow: 0 0 0 3px var(--brand-wash);
}
.mona-contactp .mona-form > p { margin: 0; }
.mona-contactp .msf-btn { padding-inline: 36px; }

/* Thẻ thông tin liên hệ — trắng, viền + bóng nhẹ để nổi trên nền trắng. */
.mona-contactp__side {
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: clamp(20px, 2.4vw, 30px); position: sticky; top: 92px; box-shadow: var(--sh-lift);
}
.mona-contactp__side > h2 { font-size: var(--t-h3); margin-bottom: 16px; }
.mona-contactp__side .mona-sum__note { font-size: var(--t-micro); color: var(--ink-2); margin-top: 16px; }

/* ── Biểu mẫu ──────────────────────────────────────────────────────────────
   <label for> thật trên mọi ô. Placeholder không phải nhãn: nó biến mất ngay
   khi người dùng bắt đầu gõ, đúng lúc họ cần nó nhất. dynamic-content.md §7. */
.mona-form { display: grid; gap: 16px; }
.mona-form__row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
@media (max-width: 620px) { .mona-form__row { grid-template-columns: minmax(0, 1fr); } }
.mona-field label { display: block; font-size: var(--t-small); font-weight: 600; margin-bottom: 6px; }
.mona-field label .req { color: var(--brand-ink); }
/* Radio và checkbox phải nằm ngoài quy tắc này. `width:100%` +
   `min-height:var(--tap)` + padding 15px thổi một <input type=radio> từ 13px
   lên 295px, đẩy nhãn ra ngoài khung — trang dat-hang tràn 31px ở 375px và
   không có class nào để nhìn ra thủ phạm. Loại theo type, không theo class,
   để checkbox thêm sau cũng an toàn. */
.mona-field input:not([type="radio"]):not([type="checkbox"]),
.mona-field textarea, .mona-field select {
	width: 100%; min-height: var(--tap); padding: 11px 15px;
	border: 1.5px solid var(--line-2); border-radius: var(--r-m);
	font: inherit; font-size: var(--t-small); background: var(--card); color: var(--ink);
}
.mona-field textarea { min-height: 110px; resize: vertical; }
.mona-field input:not([type="radio"]):not([type="checkbox"]):focus,
.mona-field textarea:focus, .mona-field select:focus { border-color: var(--ink); outline: none; }
.mona-field__hint { font-size: var(--t-micro); color: var(--ink-2); margin-top: 5px; }
.mona-radio { display: flex; flex-direction: column; gap: 10px; }
.mona-radio label {
	display: flex; align-items: flex-start; gap: 11px; cursor: pointer;
	border: 1.5px solid var(--line-2); border-radius: var(--r-m); padding: 13px 15px;
	font-size: var(--t-small); font-weight: 500;
}
.mona-radio label:has(input:checked) { border-color: var(--ink); background: var(--card); }
.mona-radio input { width: auto; min-height: 0; margin-top: 2px; accent-color: var(--brand); flex: none; }
.mona-radio b { display: block; font-weight: 700; }
.mona-radio span { color: var(--ink-2); font-size: var(--t-micro); }

/* ── 404 ───────────────────────────────────────────────────────────────────*/
.mona-404 { text-align: center; padding-block: clamp(48px, 7vw, 110px); }
.mona-404__n { font-family: var(--f-num); font-weight: 800; font-size: clamp(4rem, 2rem + 9vw, 8rem); line-height: 1; color: var(--brand); letter-spacing: -.05em; }
.mona-404 h1 { font-size: var(--t-h2); margin-top: 12px; }
.mona-404 p { color: var(--ink-2); max-inline-size: 46ch; margin: 12px auto 0; }
.mona-404__act { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; margin-top: 24px; }
.mona-404 .mona-search { max-width: 26rem; margin: 22px auto 0; }

/* ═══ Đánh giá sản phẩm ════════════════════════════════════════════════════
   Phân bố sao đứng trước danh sách nhận xét: một con số 4,8 không cho biết nó
   đến từ 53 lượt hay 3 lượt, mà đó mới là thứ người mua cần. */
.mona-rvwrap { display: grid; grid-template-columns: 19rem minmax(0, 1fr); gap: clamp(24px, 3.4vw, 52px); align-items: start; }
@media (max-width: 900px) { .mona-rvwrap { grid-template-columns: minmax(0, 1fr); } }

.mona-rvsum { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l); padding: 22px; position: sticky; top: 92px; }
@media (max-width: 900px) { .mona-rvsum { position: static; } }
.mona-rvsum__n { font-family: var(--f-num); font-weight: 800; font-size: 3.1rem; line-height: 1.1; color: var(--ink); }
.mona-rvsum__n small { font-size: 1.15rem; font-weight: 600; color: var(--ink-2); }
.mona-rvsum__s { display: flex; gap: 2px; color: var(--sun-lit); margin-top: 2px; }
.mona-rvsum__c { font-size: var(--t-small); color: var(--ink-2); margin-top: 6px; }
.mona-rvsum__note { font-size: var(--t-micro); color: var(--ink-2); line-height: var(--lh-body); margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line); }

.mona-rvbars { display: flex; flex-direction: column; gap: 7px; margin-top: 18px; }
.mona-rvbar { display: grid; grid-template-columns: 2.6rem minmax(0, 1fr) 1.8rem; gap: 9px; align-items: center; font-size: var(--t-micro); color: var(--ink-2); }
.mona-rvbar__t { height: 7px; border-radius: 4px; background: var(--ground-2); overflow: hidden; }
/* Bề rộng đi qua biến --w để con số ở lại trong HTML, cạnh dữ liệu sinh ra nó. */
.mona-rvbar__t i { display: block; height: 100%; width: var(--w); background: var(--sun-lit); border-radius: inherit; }
.mona-rvbar__n { text-align: right; font-family: var(--f-num); font-weight: 600; }

.mona-rvlist { display: flex; flex-direction: column; gap: 0; }
.mona-rv { padding: 20px 0; border-bottom: 1px solid var(--line); }
.mona-rv:first-child { padding-top: 0; }
.mona-rv__top { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; }
.mona-rv__top b { font-weight: 700; }
.mona-rv__top time { margin-left: auto; font-size: var(--t-micro); color: var(--ink-2); }
.mona-rv__ok { display: inline-flex; align-items: center; gap: 5px; font-size: var(--t-micro); font-weight: 600;
	color: var(--ok-ink); background: var(--ok-bg); border-radius: 999px; padding: 3px 9px; }
.mona-rv__stars { display: flex; gap: 2px; color: var(--sun-lit); margin: 7px 0 8px; }
.mona-rv p:last-child { color: var(--ink-2); line-height: var(--lh-body); }

.mona-rvform { margin-top: 30px; padding: 24px; background: var(--ground-2); border-radius: var(--r-l); display: grid; gap: 16px; }
.mona-rvform h3 { font-family: var(--f-display); font-size: var(--t-h4); }

/* ═══ Đặt hàng thành công ══════════════════════════════════════════════════ */
.mona-ty { max-inline-size: 44rem; text-align: center; padding-block: clamp(40px, 6vw, 76px); }
.mona-ty__ico { display: grid; place-items: center; width: 68px; height: 68px; margin: 0 auto 20px;
	border-radius: 50%; background: var(--ok-bg); color: var(--ok-ink); }
.mona-ty h1, .mona-ty__h { font-size: var(--t-h1); line-height: var(--lh-head); }
.mona-ty__lede { margin-top: 12px; color: var(--ink-2); font-size: var(--t-lede); line-height: var(--lh-body); }
.mona-ty__box { margin-top: 30px; text-align: left; background: var(--card); border: 1px solid var(--line);
	border-radius: var(--r-l); overflow: hidden; }
.mona-ty__box > div { display: grid; grid-template-columns: 9.5rem minmax(0, 1fr); gap: 14px;
	padding: 13px 20px; border-bottom: 1px solid var(--line); font-size: var(--t-small); }
.mona-ty__box > div:last-child { border-bottom: 0; }
.mona-ty__box dt { color: var(--ink-2); }
@media (max-width: 560px) { .mona-ty__box > div { grid-template-columns: minmax(0, 1fr); gap: 3px; } }
.mona-ty__next { margin-top: 26px; text-align: left; }
.mona-ty__next h2 { font-size: var(--t-h4); margin-bottom: 12px; }
.mona-ty__next ol { display: flex; flex-direction: column; gap: 11px; counter-reset: ty; list-style: none; }
.mona-ty__next li { position: relative; padding-left: 34px; color: var(--ink-2); line-height: var(--lh-body); font-size: var(--t-small); }
.mona-ty__next li::before { counter-increment: ty; content: counter(ty); position: absolute; left: 0; top: 0;
	width: 23px; height: 23px; display: grid; place-items: center; border-radius: 50%;
	background: var(--ink); color: var(--on-dark); font-family: var(--f-num); font-weight: 700; font-size: 12px; }
.mona-ty__next li b { color: var(--ink); }
.mona-ty__help { margin-top: 26px; font-size: var(--t-small); color: var(--ink-2); }
.mona-ty__help a { font-weight: 700; color: var(--brand-ink); }

/* ═══ Cầu nối với MONA Ecommerce ═══════════════════════════════════════════
   Plugin dựng gallery, biến thể, đánh giá, giỏ và checkout bằng markup .mecom-*
   của nó. CSS đó viết để sống chung: mọi selector đều có tiền tố, layout dùng
   container query, và màu đi qua custom property trên .mecom-shell. Nên ở đây
   chỉ đặt lại token, KHÔNG dequeue — bỏ style của plugin thì mất luôn phần
   trình bày của những khối theme không dựng lại. */
/* Chọn kép `.mecom-shell.mecom-shell` là cố ý, không phải thừa.
   Trên trang dùng shortcode ([mecom_cart], [mecom_checkout]…) plugin enqueue
   shop.css TRONG lúc render nội dung, nên nó in ra SAU main.css và thắng ở thế
   ngang điểm — nút "Tiến hành thanh toán" giữ nguyên màu cam mặc định của
   plugin trong khi nút cùng loại ở trang sản phẩm đã đúng màu thương hiệu.
   Cùng một class viết hai lần cộng thêm một điểm class, đủ để thắng mà không
   cần !important và không phụ thuộc thứ tự nạp. */
.mecom-shell.mecom-shell,
.mona-pd,
.mona-artwrap,
.mona-container {
	--mecom-ink:    var(--ink);
	--mecom-mut:    var(--ink-2);
	--mecom-line:   var(--line);
	--mecom-paper:  var(--card);
	--mecom-cta:    var(--brand);
	--mecom-sale:   var(--brand-ink);
	--mecom-ok:     var(--ok-ink);
	--mecom-radius: var(--r-m);
}

/* Vùng chạm: hai link này đứng một mình (không nằm giữa câu), nên không được
   miễn trừ inline của SC 2.5.8 — phải đủ 24px như mọi đích độc lập khác. */
.mona-pd__k a,
.mona-pd__info > a {
	display: inline-flex;
	align-items: center;
	min-height: 24px;
}


/* Link tên sản phẩm trong bảng giỏ hàng của plugin: cao 21px theo dòng chữ.
   Nó là đích độc lập (ảnh trong bảng không bọc link), nên không rơi vào miễn
   trừ nào của SC 2.5.8. */
.mecom-table a { display: inline-flex; align-items: center; min-height: 24px; }

/* ── Gallery của plugin, mặc hình dạng của thiết kế ─────────────────────────
   MONA Ecommerce dựng gallery kèm data-mecom-gal-sets — bản đồ ảnh nào thuộc
   biến thể nào — và shop.js đọc nó để lọc dải thumb khi chọn biến thể. Dựng lại
   markup ở theme nghĩa là viết lại phần lọc đó, nên ở đây chỉ ánh xạ kiểu.

   ⚠️ Tên class phải lấy từ file thật của plugin, không đoán: khối đầu tôi viết
   nhắm vào .mecom-gal__main — plugin không hề có class đó (nó là
   .mecom-single__media.mecom-gal__stage), nên gallery không nhận một luật nào. */
.mecom-gal__stage,
.mecom-single__media {
	position: relative; aspect-ratio: 1/1; border-radius: var(--r-l);
	background: var(--card); border: 1px solid var(--line); overflow: hidden;
}
/* 2%, không phải 5%. Cùng lý do như .mona-pcard__media: ảnh studio của shop đã
   tự chừa lề quanh mô hình. Đây là ảnh lớn nhất của cả site và là thứ khách
   nhìn trước khi đọc chữ nào, nên lề thừa ở đây tốn hơn ở thẻ trong lưới —
   28px mỗi bên trên khung 559px. */
.mecom-gal__stage img,
.mecom-single__media img { width: 100%; height: 100%; object-fit: contain; padding: 2%; }

/* Dải thumbnail: một hàng cuộn ngang kéo được, không phải lưới xuống dòng.
   Với hơn năm ảnh, lưới đẩy hàng thứ hai xuống và cột phải của trang sản phẩm
   bị tụt theo; một hàng cuộn thì chiều cao đứng yên bất kể có bao nhiêu ảnh.
   Cùng cơ chế kéo với .mona-prail, dùng chung hàm dragScroll() trong main.js. */
.mecom-gal__thumbs {
	--tn: 5;
	display: grid; grid-auto-flow: column;
	grid-auto-columns: calc((100% - (var(--tn) - 1) * 10px) / var(--tn));
	gap: 10px; margin-top: 10px; list-style: none;
	/* Chừa chỗ cho viền 2px của ô đang chọn, nếu không nó bị cắt mất một cạnh */
	padding: 2px; margin-inline: -2px;
	overflow-x: auto; overscroll-behavior-x: contain;
	scroll-snap-type: x proximity;
	scrollbar-width: none; cursor: grab;
}
.mecom-gal__thumbs::-webkit-scrollbar { display: none; }
.mecom-gal__thumbs.is-grabbing { cursor: grabbing; user-select: none; }
.mecom-gal__t { margin: 0; scroll-snap-align: start; }

/* Viền thuộc về thẻ <a>, không phải <li>. Plugin vẽ viền và cả dấu tích trạng
   thái lên .mecom-gal__link; đặt thêm một viền lên <li> bọc ngoài là hai đường
   lồng nhau, và .mecom-gal__t[aria-current] thì không bao giờ khớp vì plugin
   gắn aria-current lên thẻ <a>. */
.mecom-gal .mecom-gal__link {
	width: 100%; height: auto; aspect-ratio: 1/1;
	border-radius: var(--r-m); border-color: var(--line); background: var(--card);
}
.mecom-gal .mecom-gal__link.is-current { border-color: var(--ink); }
.mecom-gal__timg { object-fit: contain; padding: 8%; }
@media (max-width: 560px) { .mecom-gal__thumbs { --tn: 4; } }

/* Ảnh lớn mở được ô xem phóng to, nên nói ra bằng con trỏ. */
.mecom-gal__stage img { cursor: zoom-in; }

/* ── Ô xem ảnh phóng to ────────────────────────────────────────────────────
   <dialog> lo backdrop, Esc và bẫy tiêu điểm; phần khoá cuộn trang thì tự làm,
   giống popup đánh giá, vì <dialog> không khoá. */
.mona-lb {
	width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh;
	margin: 0; padding: clamp(12px, 3vw, 32px);
	border: 0; background: transparent; color: var(--on-dark);
	display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center; gap: clamp(6px, 1.5vw, 18px);
}
.mona-lb:not([open]) { display: none; }
.mona-lb::backdrop { background: rgba(12, 8, 6, .92); }
.mona-lb__fig { margin: 0; display: grid; justify-items: center; gap: 12px; min-width: 0; }
.mona-lb__fig img {
	max-width: 100%; max-height: calc(100dvh - clamp(90px, 12vw, 140px));
	width: auto; height: auto; object-fit: contain;
	border-radius: var(--r-m); background: var(--card);
}
.mona-lb__cap { font-size: var(--t-small); color: var(--on-dark-soft); font-variant-numeric: tabular-nums; }
.mona-lb__nav, .mona-lb__x {
	display: grid; place-items: center;
	width: var(--tap); height: var(--tap);
	border: 0; border-radius: var(--r-full); cursor: pointer;
	background: rgba(255, 255, 255, .12); color: var(--on-dark);
	font-size: 26px; line-height: 1;
}
.mona-lb__nav:hover, .mona-lb__x:hover { background: rgba(255, 255, 255, .24); }
.mona-lb__nav:focus-visible, .mona-lb__x:focus-visible { outline: 2px solid var(--sun); outline-offset: 3px; }
.mona-lb__x { position: absolute; top: clamp(12px, 3vw, 28px); right: clamp(12px, 3vw, 28px); font-size: 30px; }
@media (max-width: 560px) {
	.mona-lb { grid-template-columns: minmax(0, 1fr); }
	.mona-lb__nav { position: absolute; bottom: 18px; }
	.mona-lb__nav--prev { left: 22%; }
	.mona-lb__nav--next { right: 22%; }
}

/* Nút mua: form của plugin nằm trong .mona-buy nên phải là flex item, không
   phải một khối chiếm cả hàng. */
.mona-buy__form { display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.mona-buy__form .mona-qty input { width: 3.2rem; }

/* Sao đánh giá dưới tiêu đề sản phẩm */
.mecom-stars, .mona-stars { display: inline-flex; gap: 2px; color: var(--sun-lit); }
.mona-pd .mecom-stars, .mona-pd__info > a { margin-top: 10px; }

/* Ba dòng cam kết: icon một cột, chữ một cột, tiêu đề in đậm mở đầu câu. */
.mona-pd__trust { display: flex; flex-direction: column; gap: 12px; margin-top: 30px; padding-top: 26px; border-top: 1px solid var(--line); }
.mona-pd__trust li { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 10px; align-items: start; font-size: var(--t-small); color: var(--ink-2); line-height: var(--lh-body); }
.mona-pd__trust svg { color: var(--ok-ink); margin-top: 3px; }
.mona-pd__trust b { color: var(--ink); }

/* Sao rỗng phải là xám trung tính, không phải --sun-lit: vàng nhạt trên nền
   trắng gần như vô hình, và người đọc mất luôn thang "mấy trên năm". */
.mecom-stars__off { color: var(--line-2); }

/* Nút lưu số lượng — bắt buộc có, không phải trang trí: khi JS tắt, đây là
   đường duy nhất để số lượng đã sửa tới được server. Hai nút −/+ chỉ sửa ô nhập. */
.mona-cartwrap__save { margin-top: 18px; }

/* Ô nhập mã giảm giá dưới tóm tắt đơn */
.mona-coupon { display: flex; gap: 8px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--line); flex-wrap: wrap; }
.mona-coupon input {
	flex: 1 1 8rem; min-width: 0; min-height: var(--tap); padding: 10px 14px;
	border: 1.5px solid var(--line-2); border-radius: var(--r-m);
	font: inherit; font-size: var(--t-small); background: var(--card); color: var(--ink);
}
.mona-coupon input:focus { border-color: var(--ink); outline: none; }
.mona-coupon .mona-btn { flex: 0 0 auto; }
.mona-coupon p { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: var(--t-small); }
.mona-btn--link { background: none; border: 0; padding: 0; color: var(--brand-ink); text-decoration: underline; font-size: var(--t-micro); min-height: 24px; }

/* ── Form của plugin: checkout, tài khoản, tra cứu đơn ─────────────────────
   Không override template — checkout.php của plugin mang hợp đồng JS thật
   (nạp tỉnh/phường theo lựa chọn, và live.js thay nguyên vùng tóm tắt khi đổi
   tỉnh). Dựng lại markup là nhận nuôi cả hai thứ đó. Chỉ đặt lại kiểu.

   `font: inherit` là bắt buộc: <input> KHÔNG thừa kế font từ trang, nó lấy mặc
   định của trình duyệt, nên mọi ô nhập đang là Arial 15px giữa một trang
   Be Vietnam Pro. Không phép đo cấu trúc nào thấy được. */
.mecom-field input,
.mecom-field select,
.mecom-field textarea,
.mecom-shell input:not([type="radio"]):not([type="checkbox"]):not([type="hidden"]):not([name^="qty"]),
.mecom-shell select,
.mecom-shell textarea {
	font: inherit;
	font-size: var(--t-small);
	min-height: var(--tap);
	padding: 11px 15px;
	border: 1.5px solid var(--line-2);
	border-radius: var(--r-m);
	background: var(--card);
	color: var(--ink);
}
.mecom-field input:focus,
.mecom-field select:focus,
.mecom-field textarea:focus { border-color: var(--ink); outline: none; }

.mecom-field label,
.mecom-shell label { font-size: var(--t-small); font-weight: 600; }
.mecom-req { color: var(--brand-ink); }
.mecom-hint { font-size: var(--t-micro); color: var(--ink-2); }
.mecom-field-err { color: var(--brand-ink); font-size: var(--t-micro); }

/* ══ Trang thanh toán ═══════════════════════════════════════════════════════
   Toàn bộ markup là .mecom-* của plugin (không dựng lại — checkout mang hợp
   đồng JS: nạp tỉnh/phường, và live.js thay vùng tóm tắt khi đổi tỉnh). Chỉ
   đặt kiểu. MỌI selector phải hơn shop.css một bậc đặc trưng, vì shop.css nạp
   SAU main.css trên trang shortcode — nên đều gắn tiền tố .mecom-shell. */

/* Hai cột: form bên trái, tóm tắt dính bên phải. */
.mecom-shell .mecom-checkout__cols {
	display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 23rem);
	gap: clamp(20px, 3vw, 40px); align-items: start;
}
@media (max-width: 900px) {
	.mecom-shell .mecom-checkout__cols { grid-template-columns: minmax(0, 1fr); }
}

/* Lời mời đăng nhập — một thanh nhạt, không phải một dòng trần. */
.mecom-shell .mecom-checkout__signin {
	background: var(--brand-wash); border-radius: var(--r-m);
	padding: 13px 18px; margin: 0 0 24px; font-size: var(--t-small); color: var(--ink);
}
.mecom-shell .mecom-checkout__signin a { color: var(--brand-ink); font-weight: 700; }

/* Khối form là một thẻ trắng, và các ô chia lưới 2 cột: tên+sđt một hàng,
   tỉnh+phường một hàng, còn lại chiếm trọn. Dùng :has() để khỏi đụng markup —
   Chrome hỗ trợ, và shop.css của chính plugin cũng dùng :has(). */
.mecom-shell .mecom-checkout__fields {
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: clamp(20px, 2.4vw, 32px);
	display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-content: start;
}
.mecom-shell .mecom-checkout__fields > h2 { grid-column: 1 / -1; margin: 0 0 2px; font-size: var(--t-h3); }
.mecom-shell .mecom-checkout__fields > .mecom-field { grid-column: 1 / -1; margin: 0; display: flex; flex-direction: column; gap: 6px; }
.mecom-shell .mecom-checkout__fields > .mecom-field:has(input[name="name"]),
.mecom-shell .mecom-checkout__fields > .mecom-field:has(input[name="phone"]),
.mecom-shell .mecom-checkout__fields > .mecom-field:has(select[name="province_code"]),
.mecom-shell .mecom-checkout__fields > .mecom-field:has(select[name="ward_code"]),
.mecom-shell .mecom-checkout__fields > .mecom-field:has(input[name="city"]),
.mecom-shell .mecom-checkout__fields > .mecom-field:has(input[name="state"]) { grid-column: span 1; }
@media (max-width: 560px) {
	.mecom-shell .mecom-checkout__fields { grid-template-columns: 1fr; }
	.mecom-shell .mecom-checkout__fields > .mecom-field { grid-column: 1 / -1; }
}
.mecom-shell .mecom-field > label { margin: 0; }

/* Tỉnh/phường/địa chỉ nằm trong một wrapper [data-mecom-addr] mà JS của plugin
   thay theo quốc gia (VN có tỉnh+phường; nước ngoài có tỉnh/bang/thành phố tự
   nhập). Wrapper là MỘT ô của lưới cha, nên phải cho nó chiếm trọn hàng rồi tự
   chia 2 cột bên trong: tỉnh + phường một hàng, địa chỉ chi tiết chiếm trọn.
   Chỉ áp cho wrapper ĐANG HIỆN (:not([hidden])) — cái nước ngoài bị ẩn bằng
   thuộc tính hidden, cho nó thành grid sẽ vô tình bật lại. */
.mecom-shell .mecom-checkout__fields > [data-mecom-addr] { grid-column: 1 / -1; }
.mecom-shell [data-mecom-addr]:not([hidden]) { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.mecom-shell [data-mecom-addr] > .mecom-field { grid-column: span 1; margin: 0; display: flex; flex-direction: column; gap: 6px; }
.mecom-shell [data-mecom-addr] > .mecom-field:has(input[name="address"]),
.mecom-shell [data-mecom-addr] > .mecom-field:has(input[name="address_intl"]) { grid-column: 1 / -1; }
@media (max-width: 560px) {
	.mecom-shell [data-mecom-addr]:not([hidden]) { grid-template-columns: 1fr; }
	.mecom-shell [data-mecom-addr] > .mecom-field { grid-column: 1 / -1; }
}

/* Vòng focus mang màu thương hiệu — ô nhập trông "sống" khi gõ. */
.mecom-shell input:focus,
.mecom-shell select:focus,
.mecom-shell textarea:focus {
	border-color: var(--brand); outline: none;
	box-shadow: 0 0 0 3px var(--brand-wash);
}

/* Cột phải: thẻ dính, xếp dọc tóm tắt · vận chuyển · thanh toán · nút. */
.mecom-shell .mecom-checkout__summary {
	background: var(--ground-2); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: clamp(20px, 2.2vw, 28px); position: sticky; top: 92px;
	display: flex; flex-direction: column; gap: 20px;
}
.mecom-shell .mecom-checkout__summary > h2 { margin: 0; font-size: var(--t-h3); }
.mecom-shell [data-mecom-summary] { display: flex; flex-direction: column; gap: 18px; }

/* Bảng tóm tắt — trong suốt, canh giá về phải. */
.mecom-shell .mecom-summary { width: 100%; border-collapse: collapse; background: none; border: 0; font-size: var(--t-small); margin: 0; }
.mecom-shell .mecom-summary th,
.mecom-shell .mecom-summary td { padding: 7px 0; text-align: left; vertical-align: top; font-weight: 400; }
.mecom-shell .mecom-summary td { text-align: right; font-family: var(--f-num); font-weight: 600; white-space: nowrap; padding-left: 12px; }
.mecom-shell .mecom-summary__qty { color: var(--ink-2); font-weight: 400; }
.mecom-shell .mecom-summary tfoot th,
.mecom-shell .mecom-summary tfoot td { border-top: 1px solid var(--line-2); padding-top: 11px; }
.mecom-shell .mecom-summary__total th,
.mecom-shell .mecom-summary__total td { font-weight: 800; font-size: 1.2rem; }
.mecom-shell .mecom-summary__total td { color: var(--brand-ink); letter-spacing: -.02em; }

/* Vận chuyển / thanh toán: mỗi lựa chọn là một thẻ bấm được như .mona-radio. */
.mecom-shell .mecom-choices { border: 0; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; min-inline-size: 0; }
.mecom-shell .mecom-choices legend { float: none; width: auto; padding: 0; margin: 0 0 4px; font-size: var(--t-small); font-weight: 700; color: var(--ink); }
.mecom-shell .mecom-choice {
	display: flex; align-items: flex-start; gap: 12px; margin: 0;
	padding: 14px; border: 1.5px solid var(--line-2); border-radius: var(--r-m);
	background: var(--card); cursor: pointer;
	transition: border-color var(--dur) var(--ease-2), background var(--dur) var(--ease-2);
}
.mecom-shell .mecom-choice:hover { border-color: var(--ink-2); }
/* Trạng thái ĐANG CHỌN: viền đậm + nền thẻ, KHÔNG dùng đỏ thương hiệu. Viền đỏ
   quanh mọi lựa chọn được chọn đọc y như lỗi validation — cả box trông như
   hỏng. Prototype (.mona-radio) dùng đúng cách này: viền ink, nền card, thêm
   một vòng mảnh cho rõ "đã chọn". */
/* Tắt luôn vòng inset ĐỎ mà shop.css tự thêm khi chọn
   (.mecom-choice:has(:checked){box-shadow:0 0 0 1px var(--mecom-cta) inset}) —
   nó chồng lên viền ink của mình thành viền đúp, một đường đen một đường đỏ. */
.mecom-shell .mecom-choice:has(input:checked) { border-color: var(--ink); background: var(--card); box-shadow: none; }
.mecom-shell .mecom-choice input[type="radio"] { flex: none; width: auto; min-height: 0; margin: 3px 0 0; accent-color: var(--brand); }
.mecom-shell .mecom-choice__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.mecom-shell .mecom-choice__title { font-weight: 600; font-size: var(--t-small); }
.mecom-shell .mecom-choice__meta { color: var(--ink-2); font-size: var(--t-micro); }
.mecom-shell .mecom-choice__cost { font-weight: 700; font-family: var(--f-num); font-size: var(--t-small); white-space: nowrap; margin-top: 1px; }
.mecom-shell .mecom-choice__logo { width: 32px; height: 32px; object-fit: contain; flex: none; border-radius: 6px; }

/* Nút đặt hàng — tròn, đậm, chiếm trọn cột như .mona-btn--brand. */
.mecom-shell .mecom-checkout__summary .mecom-btn--primary {
	width: 100%; min-height: var(--tap); border-radius: var(--r-full);
	font-family: var(--f-display); font-weight: 700; box-shadow: var(--sh-pop);
}

/* Trang shop nằm trong page.php nên đã có .mona-ph phía trên — bỏ khoảng đệm
   thừa mà dải tự thêm, nếu không tiêu đề và form cách nhau gần hai màn. */
.mona-band--tight > .mona-container.mecom-shell { padding-block: 0; }

/* Khối "Tiếp theo là gì" — gắn vào trang đơn hàng qua hook mecom_thankyou */
.mona-ty__next { margin-top: 28px; padding-top: 22px; border-top: 1px solid var(--line); }
.mona-ty__next h2 { font-size: var(--t-h4); margin-bottom: 14px; }
.mona-ty__next ol { display: flex; flex-direction: column; gap: 11px; counter-reset: ty; list-style: none; padding: 0; }
.mona-ty__next li { position: relative; padding-left: 34px; color: var(--ink-2); line-height: var(--lh-body); font-size: var(--t-small); }
.mona-ty__next li::before {
	counter-increment: ty; content: counter(ty); position: absolute; left: 0; top: 1px;
	width: 23px; height: 23px; display: grid; place-items: center; border-radius: 50%;
	background: var(--ink); color: var(--on-dark); font-family: var(--f-num); font-weight: 700; font-size: 12px;
}
.mona-ty__next li b { color: var(--ink); }

/* Chọn số sao trong form đánh giá: nhãn của plugin chỉ 14×14px, mà đây là cách
   DUY NHẤT để chấm điểm — dưới sàn 24px của coding-standards.md và của
   WCAG 2.2 SC 2.5.8, không rơi vào miễn trừ nào (không inline trong câu, không
   có điều khiển tương đương). Nới bằng padding: ngôi sao vẫn 14px, ngón tay
   được 26px. */
.mecom-revstar { padding: 6px; }
.mecom-revstars { margin-left: -6px; }

/* ═══ Đánh giá sản phẩm — markup plugin, bố cục thiết kế ═══════════════════
   parts/reviews.php mang ba hidden field bắt buộc (nonce, honeypot, mốc thời
   gian render) mà bỏ đi là mọi submit bị từ chối im lặng, nên không override
   template — ánh xạ class.

   ⚠️ Khối này từng chạy TRÀN HẾT BỀ NGANG: nó được bọc trong .mecom-shell mà
   quên .mona-container, nên tên người đánh giá dính mép trái màn hình còn thanh
   tỉ lệ kéo tới mép phải. Không phép đo cấu trúc nào bắt được — không tràn
   ngang, thẻ vẫn cân, h1 vẫn đúng một. */
/* Grid đặt lên .mecom-reviews, và wrapper KHÔNG được mang .mona-rvwrap.
   Hai lý do, cả hai đều đã cắn một lần:
     · plugin gói cả bốn khối trong một <section class="mecom-reviews">, nên
       grid đặt ở lớp bọc chỉ có một con và không làm gì;
     · .mona-rvwrap ĐÃ có sẵn grid 2 cột trong CSS của prototype (khối đánh giá
       bản HTML dùng chính class đó), nên gắn nó vào lớp bọc thì .mecom-reviews
       rơi vào cột 1 rộng 304px rồi lại tự chia đôi — cột phải còn 0px và cả
       danh sách nhận xét biến mất.
   Ô nào nằm cột nào phải nói tường minh: thứ tự nguồn là h2 → tóm tắt → danh
   sách → form, luồng tự động sẽ đẩy form về cột trái. */
.mecom-reviews {
	display: grid; grid-template-columns: 19rem minmax(0, 1fr);
	column-gap: clamp(24px, 3.4vw, 52px);
	row-gap: clamp(14px, 1.6vw, 20px);
	align-items: start;
}
.mecom-reviews > h2 { display: none; }            /* .mona-head đã in tiêu đề dải */
/* Tóm tắt chỉ chiếm row 1 (dính khi cuộn); danh sách cạnh nó. Form/nút "Viết
   đánh giá" tràn NGANG cả hai cột ở hàng dưới — trước đây form chen vào cột 2
   hẹp và tóm tắt bị kéo cao span 2 để lại mảng trống bên trái. */
/* Cột trái: ô tóm tắt điểm và nút "Viết đánh giá" ngay dưới nó. Nút bỏ chỗ cũ ở
   đáy dải vì đây mới là lúc người đọc vừa xem xong điểm trung bình và mấy thanh
   sao, tức đúng lúc họ nghĩ tới việc tự viết một cái.

   Hai thứ đó phải nằm trong MỘT lớp bọc (main.js dựng .mona-rvside), không phải
   hai ô grid chồng hàng. Cách kia đã thử: nút ở hàng 2, danh sách span hai hàng
   để nút khỏi tụt xuống đáy — nhưng phần tử span vẫn đóng góp vào kích thước
   max-content của hàng 1, nên hàng 1 phình từ 330px lên 397px và nút hở 87px so
   với ô nó phải dính vào. Đo ra mới thấy, nhìn thì tưởng chỉ là thừa khoảng. */
.mecom-reviews > .mona-rvside {
	grid-column: 1; grid-row: 1;
	display: flex; flex-direction: column; gap: 14px; min-width: 0;
}
.mecom-reviews > .mecom-revlist { grid-column: 2; grid-row: 1; }
.mona-rvside > .mona-revtoggle { width: 100%; }

/* ── Popup viết đánh giá ───────────────────────────────────────────────────
   <dialog> có sẵn backdrop, Esc, bẫy focus. Form nằm trong thẻ trắng của modal
   nên gỡ nền/khung riêng của .mecom-revform. */
.mona-modal {
	width: min(92vw, 640px); padding: 0; border: 0; border-radius: var(--r-l);
	background: var(--card); color: var(--ink); box-shadow: var(--sh-lift);
	overflow: hidden;
}
.mona-modal::backdrop { background: rgba(23, 18, 14, .55); }
.mona-modal__body { padding: clamp(20px, 2.2vw, 26px); max-height: 85vh; overflow-y: auto; }
.mona-modal__close {
	position: absolute; top: 12px; right: 12px; z-index: 2;
	width: 34px; height: 34px; border-radius: 50%; border: 0; cursor: pointer;
	background: var(--ground-2); color: var(--ink); font-size: 22px; line-height: 1;
	display: grid; place-items: center;
}
.mona-modal__close:hover { background: var(--line); }
.mona-modal .mecom-revform {
	background: transparent; padding: 0; margin: 0; border-radius: 0;
	max-width: none; width: 100%; display: grid; gap: 12px;
}
/* Tiêu đề form làm tiêu đề popup — chừa chỗ cho nút đóng, ghì sát khối dưới. */
.mona-modal .mecom-revform > :is(h2, h3, legend):first-child { margin: 0 40px 2px 0; }
/* Ô nhận xét vừa phải, không cao chiếm cả popup. */
.mona-modal .mecom-revform textarea { min-height: 96px; }
/* Bỏ margin thừa của từng field/hàng — lưới gap 12px đã lo khoảng cách. */
.mona-modal .mecom-revform .mecom-field,
.mona-modal .mecom-revform .mecom-field-row,
.mona-modal .mecom-revform .mecom-vpick__group { margin: 0; }

@media (max-width: 900px) {
	.mecom-reviews { grid-template-columns: minmax(0, 1fr); }
	.mecom-reviews > .mona-rvside,
	.mecom-reviews > .mecom-revsum,
	.mecom-reviews > .mecom-revlist,
	.mecom-reviews > .mona-revtoggle,
	/* .mecom-revform vẫn phải có mặt ở đây: JS chỉ chuyển form vào <dialog> khi
	   trình duyệt có HTMLDialogElement, không có thì form nằm nguyên tại chỗ. */
	.mecom-reviews > .mecom-revform { grid-column: 1; grid-row: auto; }
}

/* Chưa có đánh giá nào: plugin chỉ in một .mecom-empty, nên lưới hai cột không
   còn gì để chia — lời nhắn co vào cột 304px và form vẫn bị ghim ở ô (2,2), để
   lại hai ô trống. Lớp bọc mang .mona-rv--empty do single-product.php đặt (đọc
   sẵn số đánh giá trên bảng lookup), nên không cần :has() và chạy ở mọi trình
   duyệt. Một cột, lời nhắn hết bề ngang, form xuống dưới. */
.mona-rv--empty .mecom-reviews { grid-template-columns: minmax(0, 1fr); }
.mona-rv--empty .mecom-reviews > .mecom-empty,
.mona-rv--empty .mecom-reviews > .mona-revtoggle,
.mona-rv--empty .mecom-reviews > .mecom-revform { grid-column: 1; grid-row: auto; }
.mona-rv--empty .mecom-reviews > .mona-revtoggle { justify-self: start; }
.mona-rv--empty .mecom-empty { max-inline-size: none; text-align: left; }

/* Bảng tóm tắt điểm — cột trái. KHÔNG sticky: form "Viết đánh giá" tràn ngang
   cả hai cột ở hàng dưới, nếu tóm tắt dính thì nó nổi đè lên nửa trái form. */
.mecom-revsum {
	background: var(--card); border: 1px solid var(--line); border-radius: var(--r-l);
	padding: 22px;
}
.mecom-revsum__score { display: flex; align-items: baseline; gap: 10px; }
.mecom-revsum__avg { font-family: var(--f-num); font-weight: 800; font-size: 3.1rem; line-height: 1.1; color: var(--ink); }
.mecom-revsum__n { font-size: var(--t-small); color: var(--ink-2); }

.mecom-revbars { display: flex; flex-direction: column; gap: 7px; margin-top: 18px; }
.mecom-revbars__row { display: grid; grid-template-columns: 3.2rem minmax(0, 1fr) 1.8rem; gap: 9px; align-items: center; font-size: var(--t-micro); color: var(--ink-2); }
.mecom-revbars__track { height: 7px; border-radius: 4px; background: var(--ground-2); overflow: hidden; }
.mecom-revbars__fill { height: 100%; background: var(--sun-lit); border-radius: inherit; }
.mecom-revbars__n { text-align: right; font-family: var(--f-num); font-weight: 600; }

/* Danh sách nhận xét — cột phải */
.mecom-revlist { display: flex; flex-direction: column; list-style: none; padding: 0; margin: 0; }
.mecom-rev { padding: 20px 0; border-bottom: 1px solid var(--line); }
.mecom-rev:first-child { padding-top: 0; }
.mecom-rev__head { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; }
.mecom-rev__who { font-weight: 700; color: var(--ink); }
.mecom-rev__when { margin-left: auto; font-size: var(--t-micro); color: var(--ink-2); }
.mecom-rev__badge {
	display: inline-flex; align-items: center; gap: 5px;
	font-size: var(--t-micro); font-weight: 600;
	color: var(--ok-ink); background: var(--ok-bg);
	border-radius: 999px; padding: 3px 9px;
}
.mecom-rev__body { color: var(--ink-2); line-height: var(--lh-body); margin-top: 8px; }
.mecom-rev .mecom-stars { margin-top: 7px; }

/* Form gửi đánh giá — chiếm hết cột phải, không phải một hộp hẹp lệch trái */
.mecom-revform {
	margin-top: 30px; padding: 24px; width: 100%;
	background: var(--ground-2); border: 0; border-radius: var(--r-l);
	display: grid; gap: 16px;
}
.mecom-revform > :is(h2, h3, legend) { font-family: var(--f-display); font-size: var(--t-h4); }
.mecom-revform .mecom-field-row--2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }

/* Ô đính kèm ảnh/video của khách (MONA Ecommerce 1.17.0+, bật ở Cài đặt → Đánh giá).
   Plugin đã lo toàn bộ phần hiển thị: ô preview, nút xoá từng tệp, và dải ảnh trong
   từng đánh giá đều dùng biến --mecom-* mà theme đã override trên .mecom-shell, nên
   không cần chép lại ở đây.

   Việc còn lại đúng một chỗ: `.mecom-field input` phía trên (0,0,2,0) cũng bắt luôn
   input[type=file], nên ô chọn tệp thừa hưởng viền 1.5px và padding 11/15 của ô chữ.
   Một ô file gốc nằm trong khung đó nhìn như bị lồng hai lớp. Nên biến nó thành vùng
   thả tệp có chủ đích, và tự vẽ nút "chọn tệp" bằng ::file-selector-button.

   ⚠️ KHÔNG được đặt tiền tố `.mecom-shell` cho mấy rule dưới đây. Popup đánh giá của
   theme dời hẳn node .mecom-revform vào một <dialog> gắn thẳng lên <body>, tức là ra
   NGOÀI .mecom-shell. Bản đầu viết `.mecom-shell .mecom-field-media input[type=file]`
   nên không khớp gì cả, trong khi `.mecom-field input` (không cần .mecom-shell) vẫn
   khớp — đo trong DOM thấy ô file giữ nguyên viền liền 1.5px và padding 11/15.
   Nhân đôi class `.mecom-field.mecom-field-media` (0,0,3,1) để thắng cả rule đó lẫn
   rule cùng tên của shop.css mà không phụ thuộc thứ tự nạp. */
.mecom-field.mecom-field-media input[type="file"] {
	width: 100%;
	min-height: 0;
	padding: 12px 14px;
	border: 1.5px dashed var(--line-2);
	border-radius: var(--r-m);
	background: var(--card);
	color: var(--ink-2);
	font-size: var(--t-micro);
	cursor: pointer;
}
.mecom-field.mecom-field-media input[type="file"]:hover { border-color: var(--ink); }
.mecom-field.mecom-field-media input[type="file"]:focus-visible {
	outline: 2px solid var(--brand);
	outline-offset: 2px;
}
.mecom-field.mecom-field-media input[type="file"]::file-selector-button {
	margin-right: 12px;
	padding: 8px 14px;
	border: 0;
	border-radius: var(--r-s);
	background: var(--ink);
	color: var(--card);
	font: inherit;
	font-weight: 600;
	cursor: pointer;
}
.mecom-field.mecom-field-media input[type="file"]:hover::file-selector-button { background: var(--brand); }

/* Trong popup thì sáu ô 84px đẩy nút gửi xuống dưới tầm nhìn, nên thu lại một nấc.
   Tên tệp giữ nguyên vì thông báo lỗi gọi tệp theo tên. */
.mona-modal .mecom-revmedia__item { width: 68px; }
.mona-modal .mecom-revmedia__item :is(img, video) { width: 68px; height: 68px; }
@media (max-width: 560px) { .mecom-revform .mecom-field-row--2 { grid-template-columns: minmax(0, 1fr); } }
.mecom-revstars { display: flex; gap: 2px; }

/* Nút yêu thích trên thẻ: plugin dùng .mecom-wish (một <form>) bọc
   .mecom-wish__btn (icon + nhãn chữ), thiết kế vẽ .mona-fav — một nút tròn chỉ
   có trái tim ở góc. Ánh xạ thay vì override template, vì nút mang hợp đồng
   AJAX của live.js.

   BẪY đã cắn: bản đầu style cái <form> thành hình tròn 32px, nhưng phần tử bấm
   thật là .mecom-wish__btn BÊN TRONG, và nó còn kéo theo .mecom-wish__label
   ("Thêm vào yêu thích"). Nhãn không bị ẩn nên chữ tràn dọc ra khỏi thẻ. Phải
   nhắm đúng __btn cho hình tròn, và giấu __label (giữ cho trình đọc màn hình,
   ẩn bằng clip chứ không display:none). Giá trị chép từ .mona-fav. */
.mona-pcard { position: relative; }
.mona-pcard .mecom-wish {
	position: absolute; top: 8px; right: 8px; z-index: 3; margin: 0;
}
.mona-pcard .mecom-wish__btn {
	width: 34px; height: 34px; padding: 0; border-radius: 50%;
	display: grid; place-items: center; cursor: pointer;
	background: rgba(255, 255, 255, .9); border: 1px solid var(--line);
	color: var(--ink-2); opacity: .6;
	transition: opacity var(--dur) var(--ease-2), color var(--dur) var(--ease-2);
}
.mona-pcard:hover .mecom-wish__btn,
.mona-pcard .mecom-wish__btn:focus-visible { opacity: 1; }
.mona-pcard .mecom-wish__btn:hover { color: var(--brand); }
.mona-pcard .mecom-wish.is-on .mecom-wish__btn { color: var(--brand); opacity: 1; }
.mona-pcard .mecom-wish__icon { width: 17px; height: 17px; }
.mona-pcard .mecom-wish__icon path { fill: currentColor; }
/* Nhãn chữ chỉ dành cho trình đọc màn hình — nút trên thẻ chỉ là trái tim. */
.mona-pcard .mecom-wish__label,
.mona-pcard .mecom-wish__n {
	position: absolute; width: 1px; height: 1px; overflow: hidden;
	clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}

/* ══ Trạng thái tải ═══════════════════════════════════════════════════════
   Spinner cho nút hành động đang gửi, và skeleton nhấp nháy cho ảnh đang tải.
   Gắn/gỡ class bằng main.js. */

/* Nút đang xử lý: ẩn nội dung, hiện spinner, chặn bấm lại. */
.mona-btn.is-loading,
.mona-add.is-loading,
.mecom-btn.is-loading,
.msf-btn.is-loading {
	position: relative; color: transparent !important; pointer-events: none;
}
.mona-btn.is-loading > *,
.mona-add.is-loading > *,
.mecom-btn.is-loading > *,
.msf-btn.is-loading > * { visibility: hidden; }
.mona-btn.is-loading::after,
.mona-add.is-loading::after,
.mecom-btn.is-loading::after,
.msf-btn.is-loading::after {
	content: ""; position: absolute; top: 50%; left: 50%;
	width: 16px; height: 16px; margin: -8px 0 0 -8px; border-radius: 50%;
	border: 2px solid rgba(255, 255, 255, .4); border-top-color: #fff;
	animation: mona-spin .6s linear infinite;
}
/* Nút nền sáng (ghost/link) → spinner mực đậm cho thấy được. */
.mona-btn--ghost.is-loading::after,
.mona-btn--link.is-loading::after {
	border-color: rgba(23, 18, 14, .25); border-top-color: var(--ink);
}
@keyframes mona-spin { to { transform: rotate(360deg); } }

/* Skeleton ảnh: khung xám + vệt sáng chạy ngang tới khi ảnh tải xong. */
.is-skel { position: relative; overflow: hidden; background: var(--ground-2); }
.is-skel img { opacity: 0; }
.is-skel::after {
	content: ""; position: absolute; inset: 0; z-index: 1;
	background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .55), transparent);
	transform: translateX(-100%);
	animation: mona-shimmer 1.3s infinite;
}
@keyframes mona-shimmer { 100% { transform: translateX(100%); } }

/* Tôn trọng người tắt hiệu ứng chuyển động. */
@media (prefers-reduced-motion: reduce) {
	.mona-btn.is-loading::after, .mona-add.is-loading::after,
	.mecom-btn.is-loading::after, .msf-btn.is-loading::after,
	.is-skel::after { animation: none; }
}

/* ══ Màn hình tải trang ═══════════════════════════════════════════════════
   Hiện từ lúc trang bắt đầu vẽ cho tới khi DOM parse xong + font sẵn sàng.
   Script inline trong <head> gắn .is-loaded (tín hiệu THẬT, không hẹn giờ).

   Mặc định ẩn: trình duyệt không chạy JS sẽ không bao giờ có .js, nên không
   bao giờ thấy tấm che này — không có kiểu kẹt sau màn tải. */
.mona-preload {
	position: fixed; inset: 0; z-index: 9999;
	place-content: center; justify-items: center; gap: 20px;
	background: var(--card);
	display: none;
}
/* Ẩn/hiện bằng `display`, KHÔNG bằng transition opacity/visibility. Một tấm che
   toàn màn hình mà chỉ biến mất nhờ transition là quá mạo hiểm: trình duyệt
   throttle tab (đúng cái bẫy animation của dự án này) thì transition không chạy
   và trang kẹt sau tấm che vĩnh viễn. `display` áp dụng tức thì, không phụ
   thuộc animation frame. */
.js:not(.is-loaded) .mona-preload { display: grid; }
/* Khoá cuộn trong lúc còn màn tải; tự mở khi .is-loaded xuất hiện. */
.js:not(.is-loaded) { overflow: hidden; }

/* ── Lớp mờ khi tan ────────────────────────────────────────────────────────
   Chỉ là trang trí phủ lên cơ chế display ở trên, KHÔNG thay nó. Script inline
   hẹn .is-loaded bằng setTimeout độc lập, nên tab bị throttle làm transition
   không chạy thì tấm che vẫn biến mất đúng hạn. Đây là điều kiện để được phép
   thêm hiệu ứng vào đây.

   Chỉ chạy khi màn tải đã hiện đủ lâu để mắt ghi nhận; lượt tải nhanh đi thẳng
   sang .is-loaded và không bao giờ chạm tới lớp này. */
.mona-preload { transition: opacity .28s var(--ease-2); }
.js.is-preload-out .mona-preload { opacity: 0; pointer-events: none; }

/* Mở khoá cuộn NGAY khi bắt đầu mờ, không đợi gỡ xong. Trang dùng được trong
   lúc lớp phủ đang tan, nên 280ms mờ không cộng vào thời gian chờ của ai cả.
   Cùng điểm đặc hiệu (0,2,0) với luật khoá ở trên nên phải đứng sau nó.

   :not(.is-loaded) là chốt an toàn thứ hai. Script đã gỡ is-preload-out trong
   hide(), nhưng nếu nó còn sót lại thì luật này (0,2,0) sẽ thắng
   `html.mona-scroll-lock{overflow:hidden}` (0,1,1) và mọi popup mở sau đó đều
   mất khoá cuộn. Ràng thêm :not(.is-loaded) thì luật chỉ sống đúng 280ms của
   lớp mờ, không thể vọng về sau. */
.js.is-preload-out:not(.is-loaded) { overflow: visible; }

.mona-preload__mark { display: block; animation: mona-preload-pulse 1.4s var(--ease-2) infinite; }
@keyframes mona-preload-pulse {
	0%, 100% { transform: scale(1); opacity: 1; }
	50%      { transform: scale(.92); opacity: .72; }
}

/* Thanh chạy — báo "đang tải", không phải thanh phần trăm giả. */
.mona-preload__bar {
	width: 132px; height: 3px; border-radius: 2px;
	background: var(--line); overflow: hidden;
}
.mona-preload__bar i {
	display: block; width: 40%; height: 100%; border-radius: inherit;
	background: var(--brand);
	animation: mona-preload-run 1.05s var(--ease-2) infinite;
}
@keyframes mona-preload-run {
	0%   { transform: translateX(-105%); }
	100% { transform: translateX(355%); }
}

@media (prefers-reduced-motion: reduce) {
	.mona-preload__mark { animation: none; }
	.mona-preload__bar i { animation: none; width: 100%; opacity: .6; }
	/* Không mờ dần. Tấm che vẫn biến mất đúng lúc vì setTimeout không đổi. */
	.mona-preload { transition: none; }
}
