/* Auto-generated by `npm run build:css`. Do not edit directly. */

/* Source: wp-content/themes/gocvuong/assets/css/style.css */
/* ==========================================================================
   Goc Vuong — front-end style bundle.
   File này KHÔNG chứa rule trực tiếp; chỉ điều phối thứ tự nạp partials.

   Cấu trúc partials/:
   - base.css            tokens, reset, font-display utility, paper-grain
   - layout.css          .gv-home__container, .gv-home-section variants
   - components.css      icon-button, ed-link, card, reveal, back-to-top, sticky-cta...
   - section-intro.css   .gv-section-intro / __num / -title (block dùng chung)
   - header.css          .gv-home-header + nav + brand + .gv-menu-toggle
   - mobile-menu.css     .mobile-menu drawer
   - search-modal.css    .search-modal
   - footer.css          .gv-home-footer
   - block-*.css         1–1 với template-parts/blocks/*.php

   Thêm partial mới: tạo file partials/<name>.css rồi append @import bên dưới.
   Đặt @media của riêng component cùng file (mobile-first), không gộp cuối bundle.
   ========================================================================== */

/* 1. Fonts */

/* Source: wp-content/themes/gocvuong/assets/fonts/fonts.css */
@font-face {
    font-family: 'Cormorant Garamond';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('../fonts/cormorant-garamond-400.ttf') format('truetype');
}

@font-face {
    font-family: 'Cormorant Garamond';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('../fonts/cormorant-garamond-500.ttf') format('truetype');
}

@font-face {
    font-family: 'Cormorant Garamond';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('../fonts/cormorant-garamond-600.ttf') format('truetype');
}

@font-face {
    font-family: 'Cormorant Garamond';
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url('../fonts/cormorant-garamond-700.ttf') format('truetype');
}

@font-face {
    font-family: 'Cormorant Garamond';
    font-style: italic;
    font-weight: 500;
    font-display: swap;
    src: url('../fonts/cormorant-garamond-500-italic.ttf') format('truetype');
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url('../fonts/inter-400.ttf') format('truetype');
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url('../fonts/inter-500.ttf') format('truetype');
}

@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('../fonts/inter-600.ttf') format('truetype');
}



/* 2. Foundation */

/* Source: wp-content/themes/gocvuong/assets/css/partials/base.css */
/* ==========================================================================
   Base — design tokens, page reset, font-display utility, paper-grain.
   Tokens declare ở `:root` để dùng cross-site (header/footer cùng màu mọi page).
   Inner-page partials có thể re-declare cùng giá trị trong scope hẹp hơn —
   cascade vẫn hoạt động đúng, không cần cleanup.
   ========================================================================== */

:root {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
}

body {
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    background: var(--paper);
}

body.home {
    margin: 0;
}

.gv-home *,
.gv-home *::before,
.gv-home *::after {
    box-sizing: border-box;
}

.gv-home a {
    color: inherit;
    text-decoration: none;
}

.gv-home p,
.gv-home h1,
.gv-home h2,
.gv-home h3,
.gv-home h4,
.gv-home h5,
.gv-home h6,
.gv-home blockquote,
.gv-home ul {
    margin: 0;
}

:where(.gv-home) h1,
:where(.gv-home) h2,
:where(.gv-home) h3,
:where(.gv-home) h4,
:where(.gv-home) h5,
:where(.gv-home) h6 {
    font-size: inherit;
    font-weight: inherit;
}

.gv-home ul {
    padding: 0;
}

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

.gv-home em {
    font-style: italic;
}

/* Display font utility — gom mọi element cần serif Cormorant. */
.font-display,
.hero-headline,
.section-num,
.ed-link,
.gv-section-title,
.gv-category-card h3,
.gv-template-card h3,
.gv-pick h3,
.quote,
.sticky-cta span:first-child,
.gv-brand__text,
.stretched-wordmark,
.gv-home-footer__lede {
    font-family: 'Cormorant Garamond', serif;
}

/* Paper grain texture overlay — dùng cho section có background tone giấy. */
.gv-paper-grain {
    position: relative;
}

.gv-paper-grain::after {
    content: '';
    position: absolute;
    inset: 0;
    pointer-events: none;
    background-image:
        radial-gradient(rgba(10, 10, 10, 0.025) 1px, transparent 1px),
        radial-gradient(rgba(10, 10, 10, 0.015) 1px, transparent 1px);
    background-size: 4px 4px, 7px 7px;
    background-position: 0 0, 2px 2px;
    opacity: 0.6;
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/layout.css */
/* ==========================================================================
   Layout — page container & section variants.
   ========================================================================== */

.gv-home__container {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.25rem;
    box-sizing: border-box;
}

.gv-home-section {
    position: relative;
    padding: 3.5rem 0;
}

.gv-home-section--hero {
    padding-top: 5rem;
    padding-bottom: 2rem;
}

.gv-home-section--warm {
    background: var(--paper-warm);
}

.gv-home-section--cream {
    background: var(--paper-cream);
}

.gv-home-section--ink {
    background: var(--ink);
    color: var(--paper);
    overflow: hidden;
}

@media (min-width: 1024px) {
    .gv-home__container {
        padding: 0 2.5rem;
    }

    .gv-home-section {
        padding: 7rem 0;
    }

    .gv-home-section--hero {
        padding-top: 6rem;
        padding-bottom: 3rem;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/components.css */
/* ==========================================================================
   Components — primitive UI dùng chung giữa các block & layout chunks.
   Mỗi nhóm có comment kicker để dễ scan & mở rộng.
   ========================================================================== */

/* --- Icon button family ------------------------------------------------- */
/* Base style chia sẻ giữa header search button, mobile menu toggle / close,
   và search modal close. Mỗi nơi sẽ override hình dạng cụ thể (xem header,
   mobile-menu, search-modal partials) khi cần. */

.icon-button,
.gv-menu-toggle,
.mobile-menu-close,
.search-close {
    width: 40px;
    height: 40px;
    border: 1px solid transparent;
    background: transparent;
    color: var(--ink);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background 0.2s ease-out, border-color 0.2s ease-out, transform 0.2s ease-out;
}

.icon-button:hover,
.gv-menu-toggle:hover,
.mobile-menu-close:hover,
.search-close:hover {
    background: rgba(10, 10, 10, 0.04);
    border-color: rgba(10, 10, 10, 0.08);
    transform: translateY(-1px);
}

.icon-button svg,
.search-close svg {
    width: 18px;
    height: 18px;
}

/* --- Meta labels & section kickers -------------------------------------- */
/* Eyebrow text dùng trong section-intro, hero caption, footer columns... */

.gv-meta-label,
.gv-meta-code,
.gv-section-kicker,
.gv-scroll-hint {
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    font-weight: 500;
    color: var(--ink-muted);
}

.gv-meta-code {
    font-family: 'Inter', system-ui, sans-serif;
    letter-spacing: 0.12em;
}

.gv-section-kicker--light {
    color: rgba(255, 255, 255, 0.6);
}

/* --- Editorial link ----------------------------------------------------- */
/* Italic CTA inline, dùng ở section-intro và curator-picks. */

.ed-link {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.4em;
    width: fit-content;
    font-style: italic;
    font-weight: 500;
    font-size: 1.25rem;
    line-height: 1;
}

.ed-link::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -0.35rem;
    height: 1px;
    background: currentColor;
    transform-origin: left;
    transition: transform 0.35s ease-out;
}

.ed-link:hover::after {
    transform: scaleX(1.05);
}

/* --- Image placeholder (ph) & media wrapper ----------------------------- */
/* `.ph` là khung giữ tỉ lệ; `.gv-media img` ép ảnh fill khung và crop center. */

.ph {
    position: relative;
    overflow: hidden;
    background: var(--paper-warm);
}

.gv-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* --- Card hover --------------------------------------------------------- */
/* `.card` dùng cho category-card và template-card. */

.card {
    transition: transform 0.35s ease-out;
}

.card:hover {
    transform: translateY(-3px);
}

.card .gv-media img {
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

.card:hover .gv-media img {
    transform: scale(1.03);
    filter: brightness(1.04);
}

/* --- Reveal on scroll --------------------------------------------------- */
/* Element gắn `data-reveal` sẽ fade-up khi vào viewport (xem reveal.js). */

[data-reveal] {
    opacity: 0;
    transform: translateY(20px);
    transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}

[data-reveal].is-visible {
    opacity: 1;
    transform: translateY(0);
}

/* --- Floating actions: back-to-top & sticky CTA ------------------------- */

.back-to-top {
    position: fixed;
    right: 1rem;
    bottom: 5.5rem;
    z-index: 30;
    width: 44px;
    height: 44px;
    border: 0;
    background: var(--ink);
    color: var(--paper);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    opacity: 0;
    transform: translateY(8px) scale(0.95);
    pointer-events: none;
    transition: opacity 0.3s ease-out, transform 0.3s ease-out, background 0.2s;
}

.back-to-top.is-visible {
    opacity: 1;
    transform: none;
    pointer-events: auto;
}

.back-to-top:hover {
    background: var(--ink-soft);
}

.back-to-top svg {
    width: 18px;
    height: 18px;
}

/* `a.sticky-cta` (0,1,1) thay vì `.sticky-cta` để bump specificity khớp với
   `.gv-home a` trong base.css — tránh `color: inherit` đè màu trắng. */
a.sticky-cta {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 40;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.875rem 1.25rem;
    background: var(--ink);
    color: var(--paper);
    font-size: 0.875rem;
    font-weight: 500;
    box-shadow: 0 -4px 24px -4px rgba(10, 10, 10, 0.15);
    transition: transform 0.3s ease-out;
    will-change: transform;
}

a.sticky-cta:hover {
    background: var(--ink-soft);
}

a.sticky-cta span:first-child {
    font-size: 1.125rem;
}

/* Khi footer lọt viewport, JS toggle class này để slide sticky-cta xuống dưới. */
a.sticky-cta.is-hidden {
    transform: translateY(100%);
    pointer-events: none;
}

@media (min-width: 1024px) {
    .back-to-top {
        right: 1.75rem;
        bottom: 1.75rem;
        width: 48px;
        height: 48px;
    }

    .back-to-top svg {
        width: 20px;
        height: 20px;
    }

    /* Sticky CTA chỉ hiện ở mobile — desktop có header CTA. */
    a.sticky-cta {
        display: none;
    }
}

/* --- Reduced motion overrides ------------------------------------------ */

@media (prefers-reduced-motion: reduce) {
    [data-reveal] {
        opacity: 1;
        transform: none;
        transition: none;
    }

    .marquee-track,
    .testi-track {
        animation: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/forms.css */
/* ==========================================================================
   forms.css — SSOT cho input / select / textarea / label / form-row / submit.

   Áp lên mọi form Woo + form auth + utility class `.gv-form`. Định nghĩa MỘT
   chỗ duy nhất; partial khác (account, auth, commerce-flow) chỉ override khác
   biệt layout/grid của riêng mình, KHÔNG re-define visual style của control.

   Tokens kế thừa từ base.css. Standard control: boxed 48px, paper background,
   ink-line border, Cormorant không xuất hiện ở đây (form là Inter only).
   ========================================================================== */

/* --- Selector base. Bao tất cả form Woo + variant editorial auth + utility +
       quick-login modal (`.auth-modal__form` — Group I header overlay). */
.woocommerce form,
.gv-auth__form,
.auth-modal__form,
.gv-form,
.gv-page .entry-content form,
body.single-product #reviews form {
    --gv-control-height: 48px;
    --gv-control-radius: 0;
}

/* --- Form row: stack layout chuẩn. Variant -inline cho 1-dòng inline.
       `.auth-modal__form > p.form-row` KHÔNG join nhóm này — modal dùng
       flex-gap thay vì margin-bottom row, override riêng trong auth.css. */
.woocommerce form .form-row,
.woocommerce form .woocommerce-form-row,
.gv-form .form-row,
.gv-auth__form .form-row {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin: 0 0 18px;
    padding: 0;
}

@media (min-width: 768px) {
    .woocommerce form .form-row-first,
    .woocommerce form .form-row-last {
        width: calc(50% - 8px);
        display: inline-flex;
    }

    .woocommerce form .form-row-first {
        margin-right: 16px;
    }
}

/* --- Label: Inter eyebrow, không có ngoại lệ. */
.woocommerce form label,
.gv-auth__form label,
.gv-form label,
.gv-page .entry-content form label,
body.single-product #reviews label {
    display: block;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    line-height: 1.2;
    margin: 0;
}

.gv-page .entry-content form label,
body.single-product #reviews label {
    margin-bottom: 0.5rem;
}

.woocommerce form label .required,
.woocommerce form label .optional,
.gv-form label .required,
.gv-form label .optional,
body.single-product #reviews label .required,
body.single-product #reviews label .optional {
    color: var(--ink-muted);
    text-decoration: none;
    margin-left: 0.25em;
}

/* `.screen-reader-text` — visible to screen readers, hidden visually. WP core
   enqueues this in /wp-includes/css/buttons.css conditionally; theme tắt
   `woocommerce_enqueue_styles` nên Woo `.screen-reader-text` không được nạp
   → label "Bắt buộc" / "Required" hiện trực tiếp + wrap label sang 2 dòng.
   Định nghĩa lại theo WP standard. */
.screen-reader-text {
    border: 0;
    clip: rect(1px, 1px, 1px, 1px);
    -webkit-clip-path: inset(50%);
    clip-path: inset(50%);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    word-wrap: normal !important;
}

/* --- Inline checkbox/radio label: bỏ uppercase / letter-spacing để đọc được. */
.woocommerce form .woocommerce-form__label-for-checkbox,
.woocommerce form label.checkbox,
.gv-auth__form .woocommerce-form-login__rememberme,
.gv-auth__form .woocommerce-form__label-for-checkbox {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 0.8125rem;
    letter-spacing: normal;
    text-transform: none;
    color: var(--ink-muted);
    font-weight: 400;
    transition: color 0.18s ease-out;
}

@media (prefers-reduced-motion: reduce) {
    .woocommerce form .woocommerce-form__label-for-checkbox,
    .woocommerce form label.checkbox,
    .gv-auth__form .woocommerce-form-login__rememberme,
    .gv-auth__form .woocommerce-form__label-for-checkbox {
        transition: none;
    }
}

/* Checked state — text shift muted → ink để khách thấy phản hồi rõ hơn
   ngoài tick mark mặc định (đặc biệt quan trọng cho terms-and-conditions
   ở checkout: confirm acknowledgement). */
.woocommerce form .woocommerce-form__label-for-checkbox:has(input:checked),
.woocommerce form label.checkbox:has(input:checked),
.gv-auth__form .woocommerce-form-login__rememberme:has(input:checked),
.gv-auth__form .woocommerce-form__label-for-checkbox:has(input:checked) {
    color: var(--ink);
}

/* --- Control: boxed 48px. Áp cho input text-like, select, textarea (height
       auto), select2 selection. */
.woocommerce form input[type="text"],
.woocommerce form input[type="email"],
.woocommerce form input[type="password"],
.woocommerce form input[type="tel"],
.woocommerce form input[type="number"],
.woocommerce form input[type="url"],
.woocommerce form input[type="search"],
.woocommerce form input.input-text,
.woocommerce form select,
.woocommerce form textarea,
.woocommerce form .select2-selection,
.gv-auth__form input[type="text"],
.gv-auth__form input[type="email"],
.gv-auth__form input[type="password"],
.auth-modal__form input[type="text"],
.auth-modal__form input[type="email"],
.auth-modal__form input[type="password"],
.auth-modal__form input[type="tel"],
.auth-modal__form input[type="number"],
.auth-modal__form input[type="url"],
.auth-modal__form input.input-text,
.gv-form input[type="text"],
.gv-form input[type="email"],
.gv-form input[type="password"],
.gv-form input[type="tel"],
.gv-form input[type="number"],
.gv-form input[type="url"],
.gv-form input[type="search"],
.gv-form select,
.gv-form textarea,
.gv-page .entry-content form input[type="text"],
.gv-page .entry-content form input[type="email"],
.gv-page .entry-content form input[type="password"],
.gv-page .entry-content form input[type="tel"],
.gv-page .entry-content form input[type="number"],
.gv-page .entry-content form input[type="url"],
.gv-page .entry-content form input[type="search"],
.gv-page .entry-content form select,
.gv-page .entry-content form textarea,
body.single-product #reviews input[type="text"],
body.single-product #reviews input[type="email"],
body.single-product #reviews textarea {
    width: 100%;
    height: var(--gv-control-height);
    padding: 0 14px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    border-radius: var(--gv-control-radius);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    line-height: 1.4;
    color: var(--ink);
    box-sizing: border-box;
    box-shadow: none;
    outline: 0;
    transition: border-color 0.2s ease-out;
}

/* Textarea: variable height. */
.woocommerce form textarea,
.gv-form textarea,
.gv-page .entry-content form textarea,
body.single-product #reviews textarea {
    height: auto;
    min-height: 120px;
    padding: 12px 14px;
    line-height: 1.5;
    resize: vertical;
}

/* Select: custom chevron, đồng bộ visual trên mọi browser (override UA arrow). */
.woocommerce form select,
.gv-form select,
.gv-page .entry-content form select {
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'><path d='M1 1.5 L6 6 L11 1.5' stroke='%230a0a0a' stroke-width='1.4' stroke-linecap='square'/></svg>");
    background-repeat: no-repeat;
    background-position: right 14px center;
    padding-right: 36px;
}

/* Focus: ink border. */
.woocommerce form input:focus,
.woocommerce form select:focus,
.woocommerce form textarea:focus,
.gv-auth__form input:focus,
.auth-modal__form input:focus,
.gv-form input:focus,
.gv-form select:focus,
.gv-form textarea:focus,
.gv-page .entry-content form input:focus,
.gv-page .entry-content form select:focus,
.gv-page .entry-content form textarea:focus,
body.single-product #reviews input:focus,
body.single-product #reviews textarea:focus {
    border-color: var(--ink);
}

/* Woo wrap password input trong `<span class="password-input">` để gắn nút show/hide
   eye icon. Theme disable Woo stylesheet (`woocommerce_enqueue_styles=__return_empty_array`)
   nên các rule mặc định cho wrapper + nút không được nạp → input + nút stack dọc.
   Re-define position relative + absolute toggle để eye icon overlay đúng vị trí. */
.woocommerce form .password-input,
.gv-auth__form .password-input,
.gv-form .password-input {
    position: relative;
    display: block;
    width: 100%;
}

.woocommerce form .password-input .show-password-input,
.gv-auth__form .password-input .show-password-input,
.gv-form .password-input .show-password-input {
    position: absolute;
    right: 12px;
    top: 50%;
    transform: translateY(-50%);
    background: transparent;
    border: 0;
    padding: 4px;
    color: var(--ink-muted);
    cursor: pointer;
    line-height: 0;
}

.woocommerce form .password-input .show-password-input::before {
    content: '';
    display: inline-block;
    width: 18px;
    height: 18px;
    background: currentColor;
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6'><path d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z'/><circle cx='12' cy='12' r='3'/></svg>") no-repeat center / contain;
    mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6'><path d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z'/><circle cx='12' cy='12' r='3'/></svg>") no-repeat center / contain;
}

.woocommerce form .password-input .show-password-input.display-password::before {
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6'><path d='M3 3l18 18M10.5 10.5a2.1 2.1 0 003 3M9.4 5.1A10 10 0 0112 5c6.5 0 10 7 10 7-1 1.7-2.4 3.3-4 4.5M6.6 6.6C4.6 8 3 9.8 2 12c0 0 3.5 7 10 7 1 0 2-.2 3-.5'/></svg>") no-repeat center / contain;
    mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6'><path d='M3 3l18 18M10.5 10.5a2.1 2.1 0 003 3M9.4 5.1A10 10 0 0112 5c6.5 0 10 7 10 7-1 1.7-2.4 3.3-4 4.5M6.6 6.6C4.6 8 3 9.8 2 12c0 0 3.5 7 10 7 1 0 2-.2 3-.5'/></svg>") no-repeat center / contain;
}

/* Để eye icon không che chữ password khi gõ, thêm padding-right cho input bên trong wrapper. */
.woocommerce form .password-input input.input-text,
.woocommerce form .password-input input[type="password"],
.woocommerce form .password-input input[type="text"],
.gv-auth__form .password-input input,
.gv-form .password-input input {
    padding-right: 38px;
}

/* Validation states (Woo). */
.woocommerce form .form-row.woocommerce-invalid input.input-text,
.woocommerce form .form-row.woocommerce-invalid select,
.woocommerce form .form-row.woocommerce-invalid textarea {
    border-color: #8a1f1f;
}

.woocommerce form .form-row.woocommerce-validated input.input-text,
.woocommerce form .form-row.woocommerce-validated select,
.woocommerce form .form-row.woocommerce-validated textarea {
    border-color: var(--ink);
}

/* Select2 cosmetic alignment với input height. */
.woocommerce .select2-container .select2-selection--single,
.woocommerce .select2-container--default .select2-selection--single {
    height: var(--gv-control-height);
    border: 1px solid var(--ink-line);
    border-radius: var(--gv-control-radius);
    background: var(--paper);
}

.woocommerce .select2-container .select2-selection--single .select2-selection__rendered {
    line-height: calc(var(--gv-control-height) - 2px);
    padding-left: 14px;
    color: var(--ink);
    font-size: 0.9375rem;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__arrow {
    height: calc(var(--gv-control-height) - 2px);
}

/* --- Fieldset (edit-account password section, address). */
.woocommerce form fieldset,
.gv-form fieldset {
    border: 1px solid var(--ink-line);
    padding: 24px;
    margin: 24px 0;
}

.woocommerce form fieldset legend,
.gv-form fieldset legend {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
    padding: 0 8px;
}

/* --- Submit button: solid ink, full Inter caps. Variant ed-link riêng cho
       inline link không định nghĩa ở đây. */
.woocommerce form .button,
.woocommerce form button[type="submit"],
.woocommerce form input[type="submit"],
.woocommerce form .woocommerce-Button,
.gv-auth__form .button,
.gv-auth__form button[type="submit"],
.gv-auth__form input[type="submit"],
.gv-auth__form .woocommerce-button,
.auth-modal__form button[type="submit"],
.auth-modal__form input[type="submit"],
.gv-form .button,
.gv-form button[type="submit"],
.gv-form input[type="submit"],
.gv-page .entry-content form button[type="submit"],
.gv-page .entry-content form input[type="submit"],
body.single-product #reviews button[type="submit"],
body.single-product #reviews input[type="submit"] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin-top: 8px;
    border: 0;
    background: var(--ink);
    color: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    padding: 14px 24px;
    cursor: pointer;
    text-decoration: none;
    border-radius: 0;
    transition: background 0.2s ease-out, transform 0.2s ease-out;
}

.woocommerce form .button:hover,
.woocommerce form button[type="submit"]:hover,
.woocommerce form input[type="submit"]:hover,
.gv-auth__form button[type="submit"]:hover,
.gv-auth__form input[type="submit"]:hover,
.auth-modal__form button[type="submit"]:hover,
.auth-modal__form input[type="submit"]:hover,
.gv-form button[type="submit"]:hover,
.gv-form input[type="submit"]:hover,
.gv-page .entry-content form button[type="submit"]:hover,
.gv-page .entry-content form input[type="submit"]:hover,
body.single-product #reviews button[type="submit"]:hover,
body.single-product #reviews input[type="submit"]:hover {
    background: var(--ink-soft);
    transform: translateY(-1px);
}

@media (prefers-reduced-motion: reduce) {
    .woocommerce form .button:hover,
    .woocommerce form button[type="submit"]:hover,
    .woocommerce form input[type="submit"]:hover,
    .gv-auth__form button[type="submit"]:hover,
    .gv-auth__form input[type="submit"]:hover,
    .auth-modal__form button[type="submit"]:hover,
    .auth-modal__form input[type="submit"]:hover,
    .gv-form button[type="submit"]:hover,
    .gv-form input[type="submit"]:hover,
    .gv-page .entry-content form button[type="submit"]:hover,
    .gv-page .entry-content form input[type="submit"]:hover,
    body.single-product #reviews button[type="submit"]:hover,
    body.single-product #reviews input[type="submit"]:hover {
        transform: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/data-tables.css */
/* ==========================================================================
   data-tables.css — SSOT cho data table editorial.

   Áp lên `table.shop_table` (cart/checkout/order-pay/order-received/view-order),
   `.woocommerce-orders-table` (account orders list), `.woocommerce-table`
   (downloads, payment-methods…) và utility class `.gv-table`.

   Phong cách: bordered card, thead Inter eyebrow trên `--paper-warm`, tbody
   row chia bằng `--ink-line`, cell padding rộng tay. KHÔNG còn variant airy
   borderless — orders/downloads cũng dùng pattern này để toàn bộ data của
   khách trông như một family table.
   ========================================================================== */

/* --- Base table: bordered card. */
.woocommerce table.shop_table,
.woocommerce-orders-table,
.woocommerce-table,
.gv-table,
.gv-page .entry-content table,
.gv-page .entry-content .wp-block-table table,
.gv-post-body .entry-content table {
    width: 100%;
    border-collapse: collapse;
    border: 1px solid var(--ink-line);
    border-radius: 0;
    margin: 0 0 32px;
    background: var(--paper);
    font-size: 0.9375rem;
}

/* --- Thead: eyebrow trên paper-warm strip. */
.woocommerce table.shop_table thead th,
.woocommerce-orders-table thead th,
.woocommerce-table thead th,
.gv-table thead th,
.gv-page .entry-content thead th,
.gv-page .entry-content table th,
.gv-post-body .entry-content table th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-align: left;
    padding: 18px 20px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--ink-line);
}

/* --- Body + foot: ink trên paper. */
.woocommerce table.shop_table tbody td,
.woocommerce table.shop_table tfoot td,
.woocommerce table.shop_table tfoot th,
.woocommerce-orders-table tbody td,
.woocommerce-table tbody td,
.gv-table tbody td,
.gv-table tfoot td,
.gv-table tfoot th,
.gv-page .entry-content tbody td,
.gv-page .entry-content table td,
.gv-post-body .entry-content table td {
    padding: 20px;
    border-bottom: 1px solid var(--ink-line);
    vertical-align: middle;
    color: var(--ink);
    font-size: 0.9375rem;
    line-height: 1.55;
}

.woocommerce table.shop_table tbody tr:last-child td,
.woocommerce-orders-table tbody tr:last-child td,
.woocommerce-table tbody tr:last-child td,
.gv-table tbody tr:last-child td,
.gv-page .entry-content tbody tr:last-child td,
.gv-page .entry-content table tr:last-child td,
.gv-post-body .entry-content table tr:last-child td {
    border-bottom: 1px solid var(--ink-line);
}

.woocommerce table.shop_table tfoot tr:last-child td,
.woocommerce table.shop_table tfoot tr:last-child th,
.gv-table tfoot tr:last-child td,
.gv-table tfoot tr:last-child th {
    border-bottom: 0;
}

.gv-page .entry-content table,
.gv-page .entry-content .wp-block-table table,
.gv-post-body .entry-content table {
    margin: 2rem 0;
}

/* --- Footer-of-table totals (cart, checkout, order-received): label
       Inter eyebrow tràn trái, value ink-bold align phải. */
.woocommerce table.shop_table tfoot th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-align: left;
    background: var(--paper-warm);
}

.woocommerce table.shop_table tfoot td {
    text-align: right;
    background: var(--paper-warm);
    font-weight: 500;
}

.woocommerce table.shop_table tfoot tr.order-total th,
.woocommerce table.shop_table tfoot tr.order-total td {
    background: var(--ink);
    color: var(--paper);
    border-bottom: 0;
}

.woocommerce table.shop_table tfoot tr.order-total th {
    color: var(--paper);
}

.woocommerce table.shop_table tfoot tr.order-total td .amount,
.woocommerce table.shop_table tfoot tr.order-total td .woocommerce-Price-amount {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.375rem;
    letter-spacing: -0.01em;
}

/* --- Action button trong cell (View, Pay, Cancel…). */
.woocommerce table.shop_table .button,
.woocommerce-orders-table .button,
.woocommerce-table .button,
.gv-table .button {
    display: inline-flex;
    align-items: center;
    padding: 8px 14px;
    background: transparent;
    border: 1px solid var(--ink);
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0;
    transition: background 0.15s ease-out, color 0.15s ease-out;
}

.woocommerce table.shop_table .button:hover,
.woocommerce-orders-table .button:hover,
.woocommerce-table .button:hover,
.gv-table .button:hover {
    background: var(--ink);
    color: var(--paper);
}

.woocommerce table.shop_table .button + .button,
.woocommerce-orders-table .button + .button,
.woocommerce-table .button + .button {
    margin-left: 6px;
}

/* --- Order number cell: render link như button outline để đồng bộ visual
       với cột Action ("Xem"). Tránh link plain mất focus cue. */
.woocommerce-orders-table__cell-order-number a {
    display: inline-flex;
    align-items: center;
    padding: 8px 14px;
    background: transparent;
    border: 1px solid var(--ink);
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    font-weight: 500;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0;
    transition: background 0.15s ease-out, color 0.15s ease-out;
}

.woocommerce-orders-table__cell-order-number a:hover {
    background: var(--ink);
    color: var(--paper);
}

/* --- Status pill trong order/download tables. */
.woocommerce-orders-table__cell-order-status,
.woocommerce-table__cell-order-status {
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-soft);
}

/* --- Mobile + tablet: tables stack thành card. Áp cho responsive list.
   Breakpoint extended từ 767 → 1024 (2026-05-09) vì desktop fixed-table có
   sum column widths ~1100px (thumb 76 + name 55%/min 500 + price 110 + qty
   150 + subtotal 132 + remove 32). Trong 2-col grid 1.6fr/2.6fr ở viewport
   <=1024, table column ~600-630px → fixed-layout overflow ép columns hẹp,
   text wrap ký tự dọc. Mobile responsive stack (tr-card per item) là pattern
   industry-standard cho tablet (Shopify, Tiki, Lazada) và rất scalable. */
@media (max-width: 1024px) {
    .woocommerce table.shop_table.shop_table_responsive,
    .woocommerce-orders-table.shop_table_responsive {
        border: 0;
    }

    .woocommerce table.shop_table.shop_table_responsive thead,
    .woocommerce-orders-table.shop_table_responsive thead {
        display: none;
    }

    .woocommerce table.shop_table.shop_table_responsive tbody tr,
    .woocommerce-orders-table.shop_table_responsive tbody tr {
        display: block;
        border: 1px solid var(--ink-line);
        margin-bottom: 16px;
        background: var(--paper);
    }

    .woocommerce table.shop_table.shop_table_responsive tbody td,
    .woocommerce-orders-table.shop_table_responsive tbody td {
        display: flex;
        justify-content: space-between;
        align-items: center;
        gap: 16px;
        padding: 14px 16px;
        border-bottom: 1px solid var(--ink-line);
        text-align: right;
    }

    .woocommerce table.shop_table.shop_table_responsive tbody tr td:last-child,
    .woocommerce-orders-table.shop_table_responsive tbody tr td:last-child {
        border-bottom: 0;
    }

    .woocommerce table.shop_table.shop_table_responsive tbody td::before,
    .woocommerce-orders-table.shop_table_responsive tbody td::before {
        content: attr(data-title);
        font-family: 'Inter', system-ui, sans-serif;
        font-size: 0.6875rem;
        font-weight: 500;
        letter-spacing: 0.18em;
        text-transform: uppercase;
        color: var(--ink-muted);
        text-align: left;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/section-intro.css */
/* ==========================================================================
   Section intro — kicker + section-num + section-title + meta column.
   Dùng chung bởi categories, template-gallery, curator-picks blocks.
   ========================================================================== */

.gv-section-intro {
    display: grid;
    gap: 1.5rem;
    margin-bottom: 2.5rem;
    align-items: end;
}

.gv-section-intro__num {
    display: none;
}

.section-num {
    font-weight: 400;
    font-style: italic;
    font-size: clamp(4.5rem, 14vw, 13.75rem);
    line-height: 0.8;
    letter-spacing: -0.05em;
}

.gv-section-title {
    font-size: clamp(2.25rem, 6vw, 3.75rem);
    line-height: 0.95;
    letter-spacing: -0.025em;
}

.gv-section-title__line,
.gv-section-title__sub {
    display: block;
}

.gv-section-title__sub,
.gv-section-title__line--muted {
    color: var(--ink-muted);
}

.gv-section-title--light {
    color: var(--paper);
}

.gv-section-intro__meta {
    display: grid;
    gap: 0.75rem;
    font-size: 0.875rem;
    line-height: 1.7;
    color: var(--ink-muted);
}

@media (min-width: 1024px) {
    .gv-section-intro {
        grid-template-columns: 2fr 7fr 3fr;
        gap: 1.5rem;
        margin-bottom: 4rem;
    }

    .gv-section-intro__num {
        display: block;
    }

    .gv-section-intro__meta {
        padding-top: 1rem;
        text-align: right;
    }
}



/* 3. Page chrome */

/* Source: wp-content/themes/gocvuong/assets/css/partials/header.css */
/* ==========================================================================
   Header — site header (gv-home-header), dùng cho mọi page.
   Markup: header.php (1 class duy nhất, không variant theo trang).
   JS: assets/js/modules/header.js — scroll show/hide chạy ở mọi page
   (xem GLOBAL_JS_MODULES trong includes/theme.php). State `is-scrolled`
   được toggle bởi JS khi scrollY > 16px.
   ========================================================================== */

.gv-home-header {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
    z-index: 50;
    border-bottom: 1px solid var(--ink-line);
    transition: transform 0.35s ease-out, background 0.3s ease-out, border-color 0.3s ease-out;
    will-change: transform;
}

.gv-home-header.is-scrolled {
    background: rgba(255, 255, 255, 0.96);
    border-bottom-color: var(--ink-line);
    backdrop-filter: blur(12px);
}

.gv-home-header.is-hidden {
    transform: translateY(-100%);
}

/* WP admin bar: fixed top:0, 32px desktop / 46px mobile.
   Header cũng fixed top:0 nên cần đẩy xuống khi admin bar hiện. */
.admin-bar .gv-home-header {
    top: 32px;
}

@media screen and (max-width: 782px) {
    .admin-bar .gv-home-header {
        top: 46px;
    }
}

/* Body offset — header `position: fixed` chiếm 3.5rem mobile / 4rem desktop.
   Front-page (`body.home`) cố tình overlap hero nên không thêm padding. */
body:not(.home) {
    padding-top: 3.5rem;
}

.gv-home-header__inner {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.25rem;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 3.5rem;
}

.gv-brand {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--ink);
    text-decoration: none;
}

.gv-brand__text {
    font-size: 1.25rem;
    line-height: 1;
    font-weight: 600;
    letter-spacing: -0.02em;
}

.logo-mark {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
    transition: transform 0.3s ease-out;
}

.gv-brand:hover .logo-mark {
    transform: rotate(-90deg);
}

.gv-home-nav {
    display: none;
    align-items: center;
    gap: 1.75rem;
    font-size: 0.8125rem;
}

.gv-home-nav a {
    color: var(--ink);
    text-underline-offset: 0.375rem;
    text-decoration-thickness: 1px;
    text-decoration: none;
}

.gv-home-nav a:hover,
.gv-home-header__link:hover {
    text-decoration: underline;
    text-underline-offset: 0.35rem;
}

.gv-home-header__actions {
    display: flex;
    align-items: center;
    gap: 1rem;
    font-size: 0.8125rem;
}

.gv-home-header__link {
    color: var(--ink);
    text-decoration: none;
    text-underline-offset: 0.35rem;
    cursor: pointer;
}

.gv-home-header__link--desktop {
    display: none;
}

.gv-cart-count {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    vertical-align: top;
}

/* `.gv-menu-toggle` extends icon-button base (xem components.css). */
.gv-menu-toggle {
    display: inline-flex;
    flex-direction: column;
    gap: 5px;
    padding: 0;
}

.gv-menu-toggle span {
    display: block;
    width: 20px;
    height: 1px;
    background: currentColor;
}

@media (min-width: 1024px) {
    .gv-home-header__inner {
        padding: 0 2.5rem;
        height: 4rem;
    }

    .gv-brand__text {
        font-size: 1.375rem;
    }

    .logo-mark {
        width: 20px;
        height: 20px;
    }

    .gv-home-nav {
        display: flex;
    }

    .gv-home-header__link--desktop {
        display: inline;
    }

    .gv-menu-toggle {
        display: none;
    }

    body:not(.home) {
        padding-top: 4rem;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/mobile-menu.css */
/* ==========================================================================
   Mobile menu — full-screen drawer kích hoạt từ `.gv-menu-toggle`.
   Markup: header.php (nhánh `$gv_is_front_page`, `#gv-mobile-menu`).
   JS: assets/js/modules/mobile-menu.js.
   ========================================================================== */

.mobile-menu {
    position: fixed;
    inset: 0;
    z-index: 60;
    background: var(--paper);
    display: flex;
    flex-direction: column;
    transform: translateX(100%);
    transition: transform 0.35s ease-out, visibility 0.35s ease-out;
    visibility: hidden;
    overflow-y: auto;
}

.mobile-menu.is-open {
    transform: translateX(0);
    visibility: visible;
}

.mobile-menu-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: 56px;
    padding: 0 20px;
    border-bottom: 1px solid var(--ink-line);
}

.mobile-menu nav {
    display: flex;
    flex-direction: column;
    padding: 32px 20px 24px;
}

.mobile-menu nav a {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    padding: 14px 0;
    border-bottom: 1px solid var(--ink-line);
    color: var(--ink);
    font-family: 'Cormorant Garamond', serif;
    font-size: 2rem;
    line-height: 1.05;
    letter-spacing: -0.015em;
    font-weight: 500;
    text-decoration: none;
}

.mobile-menu nav a:last-child {
    border-bottom: 0;
}

.mobile-menu nav a .arrow {
    font-size: 1.5rem;
    opacity: 0.5;
    transition: transform 0.25s ease-out;
}

.mobile-menu nav a:active .arrow {
    transform: translateX(4px);
}

.mobile-menu-util {
    margin-top: auto;
    padding: 24px 20px 32px;
    border-top: 1px solid var(--ink-line);
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.mobile-menu-util a,
.mobile-menu-util button {
    color: var(--ink);
    background: transparent;
    border: 0;
    padding: 0;
    width: 100%;
    font: inherit;
    text-align: left;
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    cursor: pointer;
    text-decoration: none;
}

.mobile-menu-util .meta {
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.1em;
}

@media (min-width: 1024px) {
    .mobile-menu {
        display: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/search-modal.css */
/* ==========================================================================
   Search modal — global search dialog (#gv-search-modal).
   Markup: template-parts/header-search-modal.php; JS: assets/js/modules/search-modal.js.
   Tham chiếu static: _bmad-output/implementation-artifacts/home-static.html (#searchModal).
   ========================================================================== */

.search-modal {
    position: fixed;
    inset: 0;
    z-index: 70;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: 18px 16px;
    background: rgba(10, 10, 10, 0.22);
    backdrop-filter: blur(14px);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.25s ease-out;
}

.search-modal.is-open {
    opacity: 1;
    pointer-events: auto;
}

.search-shell {
    width: min(760px, 100%);
    margin-top: 6vh;
    /* Giới hạn chiều cao để body scroll khi nhiều kết quả; chừa 12vh breathing room. */
    max-height: calc(100vh - 12vh);
    display: flex;
    flex-direction: column;
    background: rgba(250, 250, 247, 0.96);
    color: var(--ink);
    border: 1px solid rgba(10, 10, 10, 0.08);
    box-shadow: 0 24px 80px -24px rgba(10, 10, 10, 0.35);
}

.search-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--ink-line);
    flex-shrink: 0;
}

.search-header svg {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
    color: var(--ink-muted);
}

.search-input {
    width: 100%;
    border: 0;
    background: transparent;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 1rem;
    line-height: 1.5;
    outline: none;
    padding: 0;
}

.search-input::placeholder {
    color: rgba(10, 10, 10, 0.42);
}

/* Ẩn native clear (X mặc định của <input type="search">) — thay bằng .search-clear bên dưới
   để tránh trùng visual với .search-close (X đóng modal). */
.search-input::-webkit-search-cancel-button,
.search-input::-webkit-search-decoration {
    -webkit-appearance: none;
    appearance: none;
    display: none;
}

/* Custom clear input button — icon backspace, ink-muted, kích thước nhỏ hơn .search-close
   để hierarchy rõ: close (40px, ink) vs clear (32px, muted). */
.search-clear {
    width: 32px;
    height: 32px;
    flex-shrink: 0;
    border: 0;
    background: transparent;
    color: var(--ink-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: color 0.2s ease-out, background 0.2s ease-out;
}

.search-clear:hover {
    color: var(--ink);
    background: rgba(10, 10, 10, 0.04);
}

.search-clear[hidden] {
    display: none;
}

.search-clear svg {
    width: 18px;
    height: 18px;
}

.search-body {
    padding: 16px;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    /* Scrollbar mảnh, B&W theo brand-guideline §7. */
    scrollbar-width: thin;
    scrollbar-color: rgba(10, 10, 10, 0.18) transparent;
}

.search-body::-webkit-scrollbar {
    width: 8px;
}

.search-body::-webkit-scrollbar-track {
    background: transparent;
}

.search-body::-webkit-scrollbar-thumb {
    background: rgba(10, 10, 10, 0.16);
    border-radius: 0;
}

.search-body::-webkit-scrollbar-thumb:hover {
    background: rgba(10, 10, 10, 0.28);
}

.search-meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    margin-bottom: 14px;
}

.search-meta p {
    margin: 0;
    font-size: 0.6875rem;
    line-height: 1.4;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.search-hint {
    font-family: 'Inter', system-ui, sans-serif;
    letter-spacing: 0.08em;
}

/* --- Sections (recent / viewed / featured) ------------------------------ */

.search-section {
    margin-bottom: 18px;
}

.search-section[hidden] {
    display: none;
}

/* Eyebrow flavor riêng cho search modal — 11px / 0.18em / weight 500.
   Khác với .gv-meta-label (10px / 0.25em) ở components.css. */
.search-section-title {
    margin: 0 0 8px;
    font-size: 0.6875rem;
    line-height: 1.2;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
}

/* --- Chips (base trước, modifier sau để cascade đúng) ------------------- */

.search-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 16px;
}

.search-chip {
    border: 1px solid rgba(10, 10, 10, 0.1);
    background: rgba(255, 255, 255, 0.65);
    color: var(--ink);
    padding: 8px 12px;
    font-size: 0.75rem;
    line-height: 1;
    cursor: pointer;
    transition: background 0.2s ease-out, border-color 0.2s ease-out;
}

.search-chip:hover {
    background: rgba(10, 10, 10, 0.05);
    border-color: rgba(10, 10, 10, 0.18);
}

.search-chip--recent {
    color: var(--ink-muted);
}

/* --- Product micro-cards (recent viewed grid) --------------------------- */

.search-product-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 10px;
}

.search-product-card {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 8px;
    border: 1px solid rgba(10, 10, 10, 0.08);
    background: rgba(255, 255, 255, 0.6);
    text-decoration: none;
    color: var(--ink);
    transition:
        border-color 0.2s ease-out,
        background 0.2s ease-out,
        transform 0.2s ease-out;
}

.search-product-card:hover {
    border-color: rgba(10, 10, 10, 0.18);
    background: rgba(255, 255, 255, 0.9);
    transform: translateY(-2px);
}

.search-product-card__media {
    display: block;
    aspect-ratio: 1 / 1;
    background: rgba(10, 10, 10, 0.04);
    overflow: hidden;
}

.search-product-card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform 0.25s ease-out;
}

.search-product-card:hover .search-product-card__media img {
    transform: scale(1.03);
}

.search-product-card__placeholder {
    display: block;
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, rgba(10, 10, 10, 0.04), rgba(10, 10, 10, 0.08));
}

.search-product-card__body {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.search-product-card__title {
    font-size: 0.8125rem;
    line-height: 1.3;
    color: var(--ink);
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

/* Số lượng / giá tiền → JetBrains Mono theo brand-guideline §5 ("meta kỹ thuật"). */
.search-product-card__price {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    line-height: 1.2;
    color: var(--ink-muted);
    letter-spacing: 0.04em;
}

/* --- Results list ------------------------------------------------------- */

.search-results {
    display: flex;
    flex-direction: column;
    border-top: 1px solid rgba(10, 10, 10, 0.08);
}

.search-result {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 16px;
    align-items: center;
    padding: 14px 0;
    border-bottom: 1px solid rgba(10, 10, 10, 0.08);
    color: inherit;
    text-decoration: none;
    font-family: 'Inter', system-ui, sans-serif;
}

.search-result:hover .search-result-title {
    text-decoration: underline;
    text-underline-offset: 5px;
}

.search-result-copy {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.search-result-kicker {
    font-size: 0.625rem;
    line-height: 1.2;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.search-result-title {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.875rem;
    line-height: 0.95;
    letter-spacing: -0.015em;
}

.search-result-desc {
    font-size: 0.8125rem;
    line-height: 1.55;
    color: var(--ink-muted);
    max-width: 54ch;
}

/* Mono cho price (số tiền là meta kỹ thuật). */
.search-result-price {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.4;
    color: var(--ink);
    font-weight: 500;
    margin-top: 2px;
    letter-spacing: 0.02em;
}

.search-result-arrow {
    font-size: 1.375rem;
    color: rgba(10, 10, 10, 0.45);
}

.search-empty {
    padding: 18px 0 2px;
    color: var(--ink-muted);
    font-size: 0.875rem;
    line-height: 1.7;
}

/* --- Mobile only — full-screen shell (≤767px khớp static reference) ----- */

@media (max-width: 767px) {
    .search-modal {
        padding: 0;
    }

    .search-shell {
        width: 100%;
        height: 100vh;
        max-height: 100vh;
        margin-top: 0;
        border: 0;
        box-shadow: none;
    }

    .search-header {
        padding: 12px 14px;
        background: rgba(250, 250, 247, 0.98);
    }

    .search-body {
        padding: 14px;
    }

    .search-meta {
        flex-direction: column;
        align-items: flex-start;
        gap: 6px;
    }

    .search-result {
        grid-template-columns: 1fr;
        gap: 8px;
    }

    .search-result-title {
        font-size: 1.5rem;
    }

    .search-result-arrow {
        display: none;
    }

    .search-product-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/mini-cart.css */
/* ==========================================================================
   Mini-cart drawer — slide từ phải, mobile bottom-sheet.
   Markup: template-parts/header-mini-cart.php
   JS: assets/js/modules/mini-cart.js
   ========================================================================== */

.mini-cart {
    position: fixed;
    inset: 0;
    z-index: 80;
    display: flex;
    justify-content: flex-end;
    background: rgba(10, 10, 10, 0.32);
    backdrop-filter: blur(10px);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.28s ease-out;
}

.mini-cart.is-open {
    opacity: 1;
    pointer-events: auto;
}

/* `hidden` HTML attribute phải luôn thắng class display rules trong drawer. */
.mini-cart [hidden] {
    display: none !important;
}

.mini-cart-shell {
    width: min(440px, 100%);
    height: 100vh;
    background: rgba(250, 250, 247, 0.99);
    color: var(--ink);
    border-left: 1px solid rgba(10, 10, 10, 0.08);
    box-shadow: -24px 0 80px -32px rgba(10, 10, 10, 0.4);
    display: flex;
    flex-direction: column;
    transform: translateX(24px);
    transition: transform 0.32s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.mini-cart.is-open .mini-cart-shell {
    transform: translateX(0);
}

.mini-cart-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 18px 20px 14px;
    border-bottom: 1px solid var(--ink-line);
}

.mini-cart-title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.625rem;
    line-height: 1;
    letter-spacing: -0.015em;
    font-weight: 500;
    display: inline-flex;
    align-items: baseline;
    gap: 8px;
}

.mini-cart-title-count {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    color: var(--ink-muted);
    letter-spacing: 0.04em;
}

.mini-cart-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    padding: 0;
    background: transparent;
    border: 0;
    color: var(--ink);
    cursor: pointer;
    transition: opacity 0.15s ease-out;
}

.mini-cart-close:hover {
    opacity: 0.6;
}

.mini-cart-close svg {
    width: 18px;
    height: 18px;
}

.mini-cart-body {
    flex: 1;
    overflow-y: auto;
    padding: 18px 20px 0;
    -webkit-overflow-scrolling: touch;
}

/* ---------- Loading state ---------- */
.mini-cart-loading {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px 0;
}

.mini-cart-spinner {
    width: 18px;
    height: 18px;
    border: 1.5px solid rgba(10, 10, 10, 0.18);
    border-top-color: var(--ink);
    border-radius: 50%;
    animation: gv-mini-spin 0.8s linear infinite;
}

@keyframes gv-mini-spin {
    to { transform: rotate(360deg); }
}

/* ---------- Empty state ---------- */
.mini-cart-empty {
    padding: 12px 0 24px;
}

.mini-cart-empty-kicker {
    margin: 0 0 8px;
    font-size: 0.6875rem;
    line-height: 1.2;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.mini-cart-empty-headline {
    margin: 0 0 22px;
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.5rem;
    line-height: 1.15;
    letter-spacing: -0.01em;
    color: var(--ink);
    max-width: 22ch;
}

.mini-cart-empty-links {
    list-style: none;
    margin: 0;
    padding: 0;
    border-top: 1px solid var(--ink-line);
}

.mini-cart-empty-links li {
    border-bottom: 1px solid var(--ink-line);
}

.mini-cart-empty-links a {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 14px 0;
    color: var(--ink);
    text-decoration: none;
    font-size: 0.9375rem;
    transition: padding 0.18s ease-out;
}

.mini-cart-empty-links a:hover {
    padding-left: 4px;
}

.mini-cart-empty-arrow {
    color: rgba(10, 10, 10, 0.4);
    transition: transform 0.2s ease-out, color 0.2s ease-out;
}

.mini-cart-empty-links a:hover .mini-cart-empty-arrow {
    transform: translateX(4px);
    color: var(--ink);
}

/* ---------- Free-shipping bar ---------- */
.mini-cart-shipping {
    padding: 12px 14px;
    background: rgba(10, 10, 10, 0.04);
    border: 1px solid rgba(10, 10, 10, 0.08);
    margin-bottom: 18px;
}

.mini-cart-shipping-label {
    margin: 0 0 8px;
    font-size: 0.8125rem;
    line-height: 1.45;
    color: var(--ink);
}

.mini-cart-shipping-label strong {
    font-weight: 600;
}

.mini-cart-shipping-bar {
    width: 100%;
    height: 3px;
    background: rgba(10, 10, 10, 0.1);
    overflow: hidden;
}

.mini-cart-shipping-bar span {
    display: block;
    height: 100%;
    background: var(--ink);
    width: 0;
    transition: width 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.mini-cart-shipping.is-eligible {
    background: rgba(28, 90, 50, 0.06);
    border-color: rgba(28, 90, 50, 0.18);
}

.mini-cart-shipping.is-eligible .mini-cart-shipping-bar span {
    background: rgb(28, 90, 50);
}

/* ---------- Items ---------- */
.mini-cart-items {
    list-style: none;
    margin: 0;
    padding: 0;
}

.mini-cart-item {
    display: grid;
    grid-template-columns: 72px 1fr auto;
    gap: 14px;
    padding: 14px 0;
    border-bottom: 1px solid var(--ink-line);
    align-items: flex-start;
    transition: opacity 0.25s ease-out, transform 0.25s ease-out, max-height 0.3s ease-out, padding 0.25s ease-out, border-color 0.2s ease-out;
}

.mini-cart-item.is-removing {
    opacity: 0;
    transform: translateX(24px);
    max-height: 0;
    padding: 0;
    border-color: transparent;
    overflow: hidden;
}

.mini-cart-item-media {
    display: block;
    width: 72px;
    height: 72px;
    background: rgba(10, 10, 10, 0.04);
    overflow: hidden;
}

.mini-cart-item-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.mini-cart-item-media__placeholder {
    display: block;
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, rgba(10, 10, 10, 0.04), rgba(10, 10, 10, 0.08));
}

.mini-cart-item-body {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}

.mini-cart-item-title {
    margin: 0;
    font-size: 0.9375rem;
    line-height: 1.3;
    color: var(--ink);
}

.mini-cart-item-title a {
    color: inherit;
    text-decoration: none;
}

.mini-cart-item-title a:hover {
    text-decoration: underline;
    text-underline-offset: 0.25rem;
}

.mini-cart-item-meta {
    font-size: 0.75rem;
    line-height: 1.4;
    color: var(--ink-muted);
}

.mini-cart-item-meta li {
    list-style: none;
    margin: 0;
    padding: 0;
}

.mini-cart-item-stepper {
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(10, 10, 10, 0.14);
    margin-top: 6px;
    width: fit-content;
}

.mini-cart-item-stepper button {
    width: 28px;
    height: 28px;
    background: transparent;
    border: 0;
    color: var(--ink);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    padding: 0;
    transition: background 0.15s ease-out;
}

.mini-cart-item-stepper button:hover:not(:disabled) {
    background: rgba(10, 10, 10, 0.05);
}

.mini-cart-item-stepper button:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

.mini-cart-item-stepper-value {
    min-width: 30px;
    text-align: center;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1;
}

.mini-cart-item-end {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: space-between;
    gap: 8px;
    min-height: 72px;
}

.mini-cart-item-price {
    font-size: 0.9375rem;
    line-height: 1.2;
    color: var(--ink);
    font-weight: 500;
    white-space: nowrap;
}

.mini-cart-item-remove {
    background: transparent;
    border: 0;
    padding: 4px;
    margin: -4px;
    color: rgba(10, 10, 10, 0.4);
    cursor: pointer;
    display: inline-flex;
    transition: color 0.15s ease-out;
}

.mini-cart-item-remove:hover {
    color: var(--ink);
}

.mini-cart-item-remove svg {
    width: 14px;
    height: 14px;
}

/* ---------- Section title ---------- */
.mini-cart-section-title {
    margin: 0 0 10px;
    font-size: 0.6875rem;
    line-height: 1.2;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
}

/* ---------- Add button (shared cho cross-sells + addons) ---------- */
.mini-cart-add-btn {
    align-self: center;
    flex-shrink: 0;
    padding: 8px 14px;
    background: var(--ink);
    color: var(--paper, #faf9f5);
    border: 1px solid var(--ink);
    font-size: 0.6875rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    cursor: pointer;
    transition: opacity 0.15s ease-out, background 0.15s ease-out, color 0.15s ease-out;
    white-space: nowrap;
    line-height: 1;
}

button.mini-cart-add-btn:hover:not(:disabled) {
    opacity: 0.85;
}

.mini-cart-add-btn:disabled {
    opacity: 0.55;
    cursor: progress;
}

.mini-cart-add-btn.is-added {
    background: transparent;
    color: var(--ink-muted);
    border-color: rgba(10, 10, 10, 0.18);
    cursor: default;
}

/* ---------- Cross-sells (list-row) ---------- */
.mini-cart-cross-sells {
    margin-top: 22px;
    padding-bottom: 4px;
}

.mini-cart-cross-sells-list {
    list-style: none;
    margin: 0;
    padding: 0;
    border-top: 1px solid var(--ink-line);
}

.mini-cart-cross-sell {
    display: grid;
    grid-template-columns: 56px 1fr auto;
    gap: 12px;
    align-items: center;
    padding: 10px 0;
    border-bottom: 1px solid var(--ink-line);
}

.mini-cart-cross-sell-media {
    display: block;
    width: 56px;
    height: 56px;
    background: rgba(10, 10, 10, 0.04);
    overflow: hidden;
}

.mini-cart-cross-sell-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.mini-cart-cross-sell-media__placeholder {
    display: block;
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, rgba(10, 10, 10, 0.04), rgba(10, 10, 10, 0.08));
}

.mini-cart-cross-sell-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.mini-cart-cross-sell-title {
    font-size: 0.875rem;
    line-height: 1.3;
    color: var(--ink);
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

.mini-cart-cross-sell-title:hover {
    text-decoration: underline;
    text-underline-offset: 0.25rem;
}

.mini-cart-cross-sell-price {
    font-size: 0.75rem;
    color: var(--ink-muted);
}

/* ---------- Service add-ons (horizontal scroll-snap slider) ---------- */
.mini-cart-addons {
    margin-top: 22px;
    padding: 14px 16px 14px;
    background: rgba(10, 10, 10, 0.03);
    border: 1px solid rgba(10, 10, 10, 0.08);
    overflow: hidden;
}

.mini-cart-addons .mini-cart-section-title {
    margin: 0;
}

.mini-cart-addons-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 10px;
}

.mini-cart-addons-nav {
    display: inline-flex;
    gap: 4px;
}

.mini-cart-addons-arrow {
    width: 26px;
    height: 26px;
    padding: 0;
    background: transparent;
    border: 1px solid rgba(10, 10, 10, 0.18);
    color: var(--ink);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    transition: background 0.15s ease-out, border-color 0.15s ease-out, opacity 0.15s ease-out;
}

.mini-cart-addons-arrow:hover:not(:disabled) {
    background: rgba(10, 10, 10, 0.06);
    border-color: rgba(10, 10, 10, 0.32);
}

.mini-cart-addons-arrow:disabled {
    opacity: 0.35;
    cursor: not-allowed;
}

.mini-cart-addons-track {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: 12px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
    /* Cho phép card thoát khỏi padding của container để snap đẹp tới mép trái. */
    margin-inline: -16px;
    padding-inline: 16px;
    padding-bottom: 2px;
}

.mini-cart-addons-track::-webkit-scrollbar {
    display: none;
}

.mini-cart-addon {
    flex: 0 0 100%;
    scroll-snap-align: start;
    scroll-snap-stop: always;
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 12px;
    align-items: center;
    padding: 12px 14px;
    background: rgba(255, 255, 255, 0.7);
    border: 1px solid rgba(10, 10, 10, 0.08);
    box-sizing: border-box;
}

.mini-cart-addon-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.mini-cart-addon-title {
    font-size: 0.875rem;
    line-height: 1.3;
    color: var(--ink);
    font-weight: 500;
}

.mini-cart-addon-blurb {
    margin: 0;
    font-size: 0.75rem;
    line-height: 1.45;
    color: var(--ink-muted);
}

.mini-cart-addon-price {
    margin-top: 4px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    color: var(--ink);
}

.mini-cart-addons-dots {
    display: flex;
    justify-content: center;
    gap: 6px;
    margin-top: 12px;
}

.mini-cart-addons-dot {
    width: 6px;
    height: 6px;
    padding: 0;
    border: 0;
    background: rgba(10, 10, 10, 0.2);
    border-radius: 50%;
    cursor: pointer;
    transition: background 0.18s ease-out, transform 0.18s ease-out;
}

.mini-cart-addons-dot.is-active {
    background: var(--ink);
    transform: scale(1.4);
}

/* ---------- Unavailable cart item ---------- */
.mini-cart-item.is-unavailable .mini-cart-item-media {
    opacity: 0.4;
}

.mini-cart-item.is-unavailable .mini-cart-item-title a,
.mini-cart-item.is-unavailable .mini-cart-item-title {
    color: var(--ink-muted);
}

.mini-cart-warning-icon {
    width: 14px;
    height: 14px;
    flex: 0 0 14px;
    flex-shrink: 0;
    color: rgb(140, 32, 32);
    display: block;
}

.mini-cart-item-warning {
    display: inline-flex;
    align-items: flex-start;
    gap: 6px;
    margin-top: 6px;
    padding: 6px 10px;
    font-size: 0.6875rem;
    line-height: 1.4;
    letter-spacing: 0.02em;
    color: rgb(140, 32, 32);
    background: rgba(180, 32, 32, 0.06);
    border: 1px solid rgba(180, 32, 32, 0.18);
    max-width: 100%;
}

.mini-cart-item-warning .mini-cart-warning-icon {
    margin-top: 1px;
}

.mini-cart-item-warning > span {
    min-width: 0;
}

/* ---------- Footer blocker + disabled CTA ---------- */
.mini-cart-blocker {
    margin: 0 0 12px;
    padding: 10px 12px;
    display: flex;
    align-items: flex-start;
    gap: 8px;
    font-size: 0.75rem;
    line-height: 1.45;
    color: rgb(140, 32, 32);
    background: rgba(180, 32, 32, 0.06);
    border: 1px solid rgba(180, 32, 32, 0.18);
}

.mini-cart-blocker .mini-cart-warning-icon {
    width: 16px;
    height: 16px;
    flex: 0 0 16px;
    margin-top: 1px;
}

.mini-cart-blocker > span {
    min-width: 0;
}

.mini-cart-cta-primary.is-disabled,
.mini-cart-cta-primary[aria-disabled="true"] {
    background: rgba(10, 10, 10, 0.18);
    border-color: rgba(10, 10, 10, 0.18);
    color: rgba(255, 255, 255, 0.85);
    pointer-events: none;
    cursor: not-allowed;
}

/* ---------- Footer ---------- */
.mini-cart-footer {
    border-top: 1px solid var(--ink-line);
    padding: 16px 20px 18px;
    background: rgba(250, 250, 247, 0.99);
}

.mini-cart-totals {
    margin: 0 0 10px;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.mini-cart-totals > div {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 16px;
}

.mini-cart-totals dt {
    font-size: 0.8125rem;
    color: var(--ink-muted);
    margin: 0;
}

.mini-cart-totals dd {
    margin: 0;
    font-size: 1rem;
    line-height: 1.2;
    color: var(--ink);
    font-weight: 500;
}

.mini-cart-totals-meta dt,
.mini-cart-totals-meta dd {
    font-size: 0.75rem;
    color: var(--ink-muted);
    font-weight: 400;
}

.mini-cart-trust {
    margin: 0 0 14px;
    font-size: 0.6875rem;
    line-height: 1.4;
    letter-spacing: 0.04em;
    color: var(--ink-muted);
}

.mini-cart-cta {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.mini-cart-cta-primary,
.mini-cart-cta-secondary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 44px;
    text-decoration: none;
    font-size: 0.8125rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    cursor: pointer;
    transition: background 0.18s ease-out, color 0.18s ease-out, opacity 0.18s ease-out;
}

.mini-cart-cta-primary {
    background: var(--ink);
    color: var(--paper, #faf9f5);
    border: 1px solid var(--ink);
}

.mini-cart-cta-primary:hover {
    opacity: 0.88;
}

.mini-cart-cta-secondary {
    background: transparent;
    color: var(--ink);
    border: 1px solid rgba(10, 10, 10, 0.18);
    font-size: 0.75rem;
}

.mini-cart-cta-secondary:hover {
    background: rgba(10, 10, 10, 0.04);
    border-color: rgba(10, 10, 10, 0.32);
}

/* ---------- Error ---------- */
.mini-cart-error {
    margin: 0;
    padding: 10px 20px;
    background: rgba(180, 32, 32, 0.06);
    color: rgb(140, 32, 32);
    font-size: 0.8125rem;
    border-top: 1px solid rgba(180, 32, 32, 0.18);
}

/* ---------- Mobile bottom-sheet ---------- */
@media (max-width: 640px) {
    .mini-cart {
        align-items: flex-end;
        justify-content: stretch;
    }

    .mini-cart-shell {
        width: 100%;
        height: 88vh;
        max-height: 88vh;
        border-left: 0;
        border-top: 1px solid rgba(10, 10, 10, 0.08);
        box-shadow: 0 -24px 80px -32px rgba(10, 10, 10, 0.4);
        transform: translateY(24px);
    }

    .mini-cart.is-open .mini-cart-shell {
        transform: translateY(0);
    }

    .mini-cart-header {
        padding: 14px 16px 12px;
    }

    .mini-cart-body {
        padding: 14px 16px 0;
    }

    .mini-cart-footer {
        padding: 14px 16px 18px;
        padding-bottom: max(18px, env(safe-area-inset-bottom));
    }

    .mini-cart-cta {
        flex-direction: row;
    }

    .mini-cart-cta-primary,
    .mini-cart-cta-secondary {
        flex: 1;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/footer.css */
/* ==========================================================================
   Footer — gv-home-footer.
   Markup: footer.php — 1 nhánh duy nhất, content load từ configs/footer.php.
   Dùng chung cho mọi page (front + inner).
   ========================================================================== */

.gv-home-footer {
    background: var(--paper-warm);
    color: var(--ink);
}

.gv-home-footer__frame {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.25rem;
    box-sizing: border-box;
}

.gv-home-footer__wordmark-wrap {
    padding: 3.5rem 20px 1.5rem;
    overflow: hidden;
}

.stretched-wordmark {
    display: flex;
    justify-content: space-between;
    width: 100%;
    white-space: nowrap;
    font-size: clamp(3rem, 14vw, 15rem);
    line-height: 0.85;
    letter-spacing: -0.04em;
    font-weight: 500;
}

.gv-wordmark-dot {
    font-style: italic;
    font-weight: 400;
    color: var(--ink-muted);
}

.gv-home-footer__main,
.gv-home-footer__sub {
    border-top: 1px solid var(--ink-line);
}

.gv-home-footer__main {
    position: relative;
}

.gv-home-footer__sub {
    padding-top: 10px;
    padding-bottom: 10px;
}

.gv-home-footer__container {
    padding-top: 3rem;
    padding-bottom: 3rem;
}

.gv-home-footer__lede {
    max-width: 28rem;
    margin-bottom: 2.5rem;
    font-size: 1.5rem;
    line-height: 1.3;
}

.gv-home-footer__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 2rem 1.5rem;
    align-items: start;
}

.gv-home-footer__col h4 {
    margin: 0 0 1rem;
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
}

.gv-home-footer__col ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

.gv-home-footer__col li + li {
    margin-top: 0.625rem;
}

.gv-home-footer__col a {
    color: inherit;
    font-size: 0.8125rem;
    line-height: 1.35;
    text-decoration: none;
}

.gv-home-footer__col a:hover,
.gv-home-footer__contact a:hover {
    text-decoration: underline;
    text-underline-offset: 0.35rem;
}

.gv-home-footer__col p {
    font-size: 0.8125rem;
    line-height: 1.65;
    color: var(--ink-muted);
}

.gv-home-footer__col--about {
    grid-column: 1 / -1;
}

.gv-home-footer__col--about > p:first-child {
    max-width: 24rem;
}

.gv-home-footer__contact {
    margin-top: 1rem;
}

.gv-home-footer__contact a {
    color: inherit;
}

.gv-home-footer__sub-inner {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding-top: 1.25rem;
    padding-bottom: 1.25rem;
    color: var(--ink-muted);
    font-size: 0.6875rem;
}

@media (min-width: 1024px) {
    .gv-home-footer__frame {
        padding: 0 2.5rem;
    }

    .gv-home-footer__wordmark-wrap {
        padding: 6rem 40px 1.5rem;
    }

    .gv-home-footer__container {
        padding-top: 4rem;
        padding-bottom: 4rem;
    }

    .gv-home-footer__lede {
        margin-bottom: 3rem;
        font-size: 2rem;
    }

    .gv-home-footer__grid {
        grid-template-columns: 4fr 2fr 2fr 2fr 2fr;
        gap: 2rem;
    }

    .gv-home-footer__col--about {
        grid-column: auto;
    }

    .gv-home-footer__sub-inner {
        flex-direction: row;
        justify-content: space-between;
        gap: 1rem;
    }
}



/* 4. Home blocks (1–1 với template-parts/blocks/*.php) */

/* Source: wp-content/themes/gocvuong/assets/css/partials/block-hero.css */
/* ==========================================================================
   Block: hero — template-parts/blocks/hero.php
   Bao gồm `gv-hero` và `gv-door-list` (3 cánh cửa CTA bên trong hero).
   ========================================================================== */

.hero-headline {
    font-weight: 500;
    font-size: clamp(2.5rem, 6.5vw, 6.25rem);
    line-height: 0.94;
    letter-spacing: -0.025em;
    position: relative;
    z-index: 2;
}

.hero-headline .dot {
    color: var(--ink-muted);
}

.gv-hero {
    position: relative;
}

.gv-hero__eyebrow {
    display: none;
}

.gv-hero__eyebrow-mobile {
    margin-bottom: 1.5rem;
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
}

.gv-hero__headline-line {
    display: block;
}

.gv-hero__grid {
    display: grid;
    gap: 2rem;
    margin-top: 1.5rem;
    position: relative;
}

.gv-hero__image {
    aspect-ratio: 5 / 4;
}

.gv-hero__caption {
    position: absolute;
    left: 1rem;
    bottom: 1rem;
    max-width: 16rem;
    padding: 0.875rem 1rem;
    background: var(--paper);
    box-shadow: 0 8px 24px -8px rgba(10, 10, 10, 0.18);
}

.gv-hero__caption-copy {
    margin-top: 0.25rem;
    font-family: 'Cormorant Garamond', serif;
    font-size: 0.95rem;
    line-height: 1.35;
}

.gv-inline-link {
    display: inline-block;
    margin-top: 0.375rem;
    font-size: 0.75rem;
    text-decoration: underline;
    text-underline-offset: 0.25rem;
}

.gv-hero__lead {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1.5rem;
    color: var(--ink-muted);
}

.gv-hero__sublead {
    margin-bottom: 1.5rem;
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.8rem;
    line-height: 1.1;
}

/* --- Door list — CTA stack 01/02/03 ------------------------------------- */

.gv-door-list {
    list-style: none;
}

.door-row {
    display: grid;
    grid-template-columns: 44px 1fr auto;
    align-items: center;
    gap: 1rem;
    padding: 1.125rem 0;
    border-bottom: 1px solid rgba(10, 10, 10, 0.18);
    transition: padding 0.3s ease-out;
}

.door-row:hover {
    padding-left: 0.625rem;
}

.door-num {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1.375rem;
    color: var(--ink-muted);
    font-weight: 500;
}

.door-title {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.375rem, 4vw, 2.375rem);
    font-weight: 500;
    line-height: 1.05;
    letter-spacing: -0.01em;
}

.door-arrow {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.75rem;
    transition: transform 0.3s ease-out;
}

.door-row:hover .door-arrow {
    transform: translateX(6px);
}

@media (min-width: 1024px) {
    .gv-hero__eyebrow {
        display: block;
        position: absolute;
        top: 1rem;
        left: 2.5rem;
        writing-mode: vertical-rl;
        transform: rotate(180deg);
        text-transform: uppercase;
        letter-spacing: 0.3em;
        font-size: 0.6875rem;
        font-weight: 500;
        color: var(--ink-muted);
        z-index: 3;
    }

    .gv-hero__eyebrow-mobile {
        display: none;
    }

    .hero-headline {
        max-width: 60%;
        padding-left: 4rem;
        margin-bottom: -0.65em;
    }

    .gv-hero__grid {
        grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
        gap: 3rem;
        margin-top: 1rem;
        align-items: end;
    }

    .gv-hero__image {
        aspect-ratio: 16 / 9;
    }

    .gv-hero__caption {
        left: 1.5rem;
        bottom: 1.5rem;
        max-width: 16.25rem;
        padding: 1rem;
    }

    .gv-hero__lead {
        font-size: 2rem;
    }

    .gv-hero__sublead {
        margin-bottom: 1.75rem;
        font-size: 2.25rem;
    }

    .door-row {
        grid-template-columns: 56px 1fr auto;
        gap: 1.25rem;
        padding: 1.375rem 0;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/block-marquee.css */
/* ==========================================================================
   Block: marquee — template-parts/blocks/marquee.php (gv-home-marquee).
   Animation: gv-home-marquee keyframe (xem cuối file).
   Reduced motion: bỏ animation (xem components.css).
   ========================================================================== */

.gv-home-marquee {
    display: flex;
    overflow: hidden;
    white-space: nowrap;
    user-select: none;
    padding: 0.8rem 0;
    border-top: 1px solid var(--ink);
    border-bottom: 1px solid var(--ink);
    background: var(--ink);
    color: var(--paper);
}

.marquee-track {
    display: flex;
    flex-shrink: 0;
    animation: gv-home-marquee 60s linear infinite;
}

.marquee-item {
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;
    padding: 0 0.4em;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.6rem, 4.48vw, 4.4rem);
    line-height: 1;
}

.marquee-item .dot {
    display: inline-block;
    width: 0.35em;
    height: 0.35em;
    border-radius: 50%;
    margin: 0 0.4em;
    background: currentColor;
    vertical-align: middle;
}

@keyframes gv-home-marquee {
    from {
        transform: translateX(0);
    }

    to {
        transform: translateX(-50%);
    }
}

@media (min-width: 1024px) {
    .gv-home-marquee {
        padding: 1.12rem 0;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/block-categories.css */
/* ==========================================================================
   Block: categories — template-parts/blocks/categories.php
   Bao gồm horizontal scroller (`gv-category-scroller` + `gv-category-card`),
   `gv-scroll-hint` (chỉ block này dùng), và `gv-pull-quote` đặt cuối block.
   ========================================================================== */

.gv-category-scroller {
    display: flex;
    gap: 0.875rem;
    overflow-x: auto;
    padding-bottom: 1.125rem;
    scroll-snap-type: x mandatory;
    scrollbar-width: thin;
    scrollbar-color: var(--ink-line) transparent;
}

.gv-category-scroller::-webkit-scrollbar {
    height: 3px;
}

.gv-category-scroller::-webkit-scrollbar-thumb {
    background: var(--ink-line);
}

.gv-category-card {
    flex: 0 0 78%;
    scroll-snap-align: start;
}

.gv-category-card__media {
    aspect-ratio: 4 / 5;
}

.gv-category-card__meta {
    padding-top: 0.875rem;
}

.gv-category-card h3 {
    font-size: clamp(1.5rem, 4vw, 1.875rem);
    line-height: 1.05;
}

.gv-category-card__meta p:last-child {
    margin-top: 0.35rem;
    font-size: 0.75rem;
    color: var(--ink-muted);
}

/* Scroll hint kế bên scroller — typography utility ở components.css. */
.gv-scroll-hint {
    display: none;
    margin-top: 1rem;
    font-family: 'Inter', system-ui, sans-serif;
}

/* --- Pull quote đặt sau scroller --------------------------------------- */

.gv-pull-quote {
    display: grid;
    gap: 1rem;
    margin-top: 4rem;
    align-items: start;
}

.gv-pull-quote__mark {
    display: none;
}

.gv-pull-quote blockquote {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-weight: 400;
    font-size: clamp(1.5rem, 3.6vw, 3.25rem);
    line-height: 1.2;
    letter-spacing: -0.005em;
}

.gv-pull-quote__author {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.gv-pull-quote__author span {
    width: 2.5rem;
    height: 1px;
    background: var(--ink);
}

.gv-pull-quote__author p {
    font-size: 0.75rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    font-weight: 500;
}

@media (min-width: 768px) {
    .gv-category-card {
        flex-basis: 340px;
    }
}

@media (min-width: 1024px) {
    .gv-category-scroller {
        gap: 1.5rem;
        padding-bottom: 1.5rem;
    }

    .gv-category-card {
        flex-basis: 380px;
    }

    .gv-scroll-hint {
        display: flex;
        align-items: center;
        gap: 0.5rem;
    }

    .gv-pull-quote {
        grid-template-columns: 2fr 9fr;
        gap: 1.5rem;
        margin-top: 6rem;
    }

    .gv-pull-quote__mark {
        display: flex;
        justify-content: center;
        padding-top: 0.5rem;
        font-family: 'Cormorant Garamond', serif;
        font-size: 3.75rem;
        line-height: 1;
    }

    .gv-pull-quote__author {
        grid-column: 2;
        margin-top: 0.5rem;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/block-template-gallery.css */
/* ==========================================================================
   Block: template gallery — template-parts/blocks/template-gallery.php
   Bao gồm `gv-template-grid`, `gv-template-card`, và `gv-section-cta`.
   ========================================================================== */

.gv-template-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.125rem;
}

.gv-template-card__media {
    aspect-ratio: 3 / 4;
}

.gv-template-card__meta {
    padding-top: 0.75rem;
}

.gv-template-card h3 {
    font-size: 1.125rem;
    line-height: 1.25;
}

.gv-template-card__meta p:last-child {
    margin-top: 0.35rem;
    font-size: 0.75rem;
    color: var(--ink-muted);
}

.gv-section-cta {
    margin-top: 2.5rem;
    text-align: center;
}

@media (min-width: 1024px) {
    .gv-template-grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 1.75rem 1.5rem;
    }

    .gv-template-card:nth-child(2) {
        margin-top: 3rem;
    }

    .gv-template-card:nth-child(2) .gv-template-card__media,
    .gv-template-card:nth-child(4) .gv-template-card__media,
    .gv-template-card:nth-child(7) .gv-template-card__media {
        aspect-ratio: 3 / 5;
    }

    .gv-template-card:nth-child(4) {
        margin-top: 4rem;
    }

    .gv-template-card:nth-child(5) {
        margin-top: 2rem;
    }

    .gv-template-card:nth-child(7) {
        margin-top: 5.5rem;
    }

    .gv-template-card:nth-child(8) {
        margin-top: 1rem;
    }

    .gv-template-card h3 {
        font-size: 1.25rem;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/block-curator-picks.css */
/* ==========================================================================
   Block: curator picks — template-parts/blocks/curator-picks.php
   Bao gồm `gv-picks` (stack) và `gv-pick` (mỗi pick, có biến thể `--reverse`).
   ========================================================================== */

.gv-picks {
    display: grid;
    gap: 3rem;
}

.gv-pick {
    display: grid;
    gap: 1.5rem;
    align-items: center;
}

.gv-pick__image {
    aspect-ratio: 4 / 5;
}

.gv-pick h3 {
    margin-top: 0.5rem;
    font-size: clamp(1.875rem, 5vw, 3rem);
    line-height: 0.95;
}

.gv-pick__description {
    margin-top: 1rem;
    max-width: 36rem;
    font-size: 0.95rem;
    line-height: 1.75;
    color: var(--ink-soft);
}

.gv-pick__price {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem 1.25rem;
    align-items: baseline;
    margin: 1rem 0;
}

.gv-pick__price > span:first-child {
    font-family: 'Cormorant Garamond', serif;
    font-size: 2rem;
}

.gv-pick__price small {
    margin-left: 0.125rem;
    font-size: 0.875rem;
    color: var(--ink-muted);
}

@media (min-width: 1024px) {
    .gv-picks {
        gap: 6rem;
    }

    .gv-pick {
        grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
        gap: 3rem;
    }

    .gv-pick--reverse {
        grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    }

    .gv-pick--reverse .gv-pick__media {
        order: 1;
    }

    .gv-pick--reverse .gv-pick__copy {
        order: 2;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/block-testimonials.css */
/* ==========================================================================
   Block: testimonials — template-parts/blocks/testimonials.php
   Section nền `--ink` + marquee các quote.
   Animation: gv-home-testi-marquee keyframe.
   Reduced motion: bỏ animation (xem components.css).
   ========================================================================== */

.gv-testimonials__intro {
    max-width: 54rem;
}

.testi-marquee {
    display: flex;
    overflow: hidden;
    white-space: nowrap;
    user-select: none;
    margin-top: 2rem;
}

.testi-track {
    display: flex;
    flex-shrink: 0;
    animation: gv-home-testi-marquee 80s linear infinite;
}

.testi-item {
    display: flex;
    gap: 1rem;
    align-items: center;
    flex-shrink: 0;
    padding: 0 2rem;
    border-right: 1px solid rgba(255, 255, 255, 0.18);
}

.quote {
    max-width: 38ch;
    white-space: normal;
    font-style: italic;
    font-weight: 400;
    font-size: clamp(1.25rem, 2.6vw, 2.375rem);
    line-height: 1.25;
}

.quote em {
    font-style: normal;
    font-weight: 500;
}

.testi-item .meta {
    white-space: nowrap;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.7);
}

@keyframes gv-home-testi-marquee {
    from {
        transform: translateX(0);
    }

    to {
        transform: translateX(-50%);
    }
}

@media (min-width: 1024px) {
    .gv-testimonials__intro {
        max-width: 42rem;
    }

    .testi-marquee {
        margin-top: 3.5rem;
    }

    .testi-item {
        gap: 1.125rem;
        padding: 0 3rem;
    }
}



/* 5. Cross-page templates
   Mỗi partial chỉ ảnh hưởng selector của trang mình (vd .entry-content,
   .woocommerce-cart, .woocommerce-account…) → an toàn để gộp chung 1 bundle.
   Khi bundle vượt ~200KB hoặc một group cần asset nặng riêng (vd font extra),
   cân nhắc tách enqueue có điều kiện trong includes/theme.php. */

/* Source: wp-content/themes/gocvuong/assets/css/partials/notices.css */
/* ==========================================================================
   notices.css — Toast / inline notice toàn site

   Single source of truth cho mọi WooCommerce notice + custom notice. Style
   thống nhất 4 case status:

     - .woocommerce-info        (neutral, ink)
     - .woocommerce-message     (success, green)
     - .woocommerce-error       (error, red)
     - .woocommerce-warning     (warning, amber)   ← custom; Woo gốc không phát

   + Coupon error inline:
     - .coupon-error-notice  (Woo AJAX inject vào .coupon wrapper khi apply
       coupon thất bại — phải break xuống full-width row mới, không inline
       cạnh button)

   Scope: áp lên mọi context có notice — cart, checkout, order-pay,
   order-received, my-account, single-product, archive-product (empty state),
   auth (login/register), shortcode bất kỳ. Dùng :where() để giảm specificity
   để file scope-specific (vd archive-product `.gv-shop-empty`) override được
   layout/spacing nếu cần.

   Tokens (--ink, --paper-warm, ...) đã re-scope ở từng partial Woo (Group
   B-H). Mỗi rule ở đây dùng var() — fallback hex để page non-Woo (vd auth
   page custom) vẫn render đúng.
   ========================================================================== */

/* --- Base ---------------------------------------------------------------- */

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message, .woocommerce-error, .woocommerce-warning) {
    background: var(--paper-warm, #fafaf7);
    border: 1px solid var(--ink-line, #e5e5e5);
    border-left: 3px solid var(--ink, #0a0a0a);
    border-radius: 5px;
    padding: 16px 20px 16px 18px;
    /* margin: 0 0 1.75rem; */
    font-size: 0.9375rem;
    line-height: 1.55;
    list-style: none;
    box-shadow: none;
    color: var(--ink, #0a0a0a);
    display: grid;
    grid-template-columns: 22px 1fr auto;
    column-gap: 14px;
    row-gap: 0.4rem;
    align-items: start;
}

/* Icon ::before — base layout (mask-image set theo từng status) */
:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message, .woocommerce-error, .woocommerce-warning)::before {
    content: '';
    display: block;
    width: 22px;
    height: 22px;
    margin-top: 1px;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}

/* List items inside notice — pin vào col 2 grid */
:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message, .woocommerce-error, .woocommerce-warning) li {
    list-style: none;
    margin: 0;
    padding: 0;
    grid-column: 2;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message, .woocommerce-error, .woocommerce-warning) li:first-child {
    grid-row: 1;
}

/* CTA button bên trong notice (vd "View cart", "Browse products") —
   col 3 right-aligned + visual style outline ink (đồng bộ với button pattern
   của theme: cùng family `.gv-address-card__edit`, `.woocommerce-orders-table .button`). */
:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message) .button {
    grid-column: 3;
    grid-row: 1;
    align-self: center;
    margin: 0;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 18px;
    background: transparent;
    border: 1px solid var(--ink);
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0;
    transition: background 0.15s ease-out, color 0.15s ease-out;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) :where(.woocommerce-info, .woocommerce-message) .button:hover {
    background: var(--ink);
    color: var(--paper);
}

/* Mobile: bỏ col 3 — button wrap xuống dòng mới */
@media (max-width: 540px) {
    :where(
        body.woocommerce-cart,
        body.woocommerce-checkout,
        body.woocommerce-order-pay,
        body.woocommerce-order-received,
        body.woocommerce-account,
        body.single-product
    ) :where(.woocommerce-info, .woocommerce-message, .woocommerce-error, .woocommerce-warning) {
        grid-template-columns: 22px 1fr;
    }

    :where(
        body.woocommerce-cart,
        body.woocommerce-checkout,
        body.woocommerce-order-pay,
        body.woocommerce-order-received,
        body.woocommerce-account,
        body.single-product
    ) :where(.woocommerce-info, .woocommerce-message) .button {
        grid-column: 2;
        grid-row: auto;
        justify-self: start;
        margin-top: 0.5rem;
    }
}

/* Wrapper rỗng → ẩn hẳn để không chiếm khoảng trống */
:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-notices-wrapper:empty {
    display: none;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-notices-wrapper > * + * {
    margin-top: 0.75rem;
}

/* --- Status: Error (red) ------------------------------------------------- */

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-error {
    background: #fbf3f1;
    border-color: #e8d4ce;
    border-left-color: #8a1f1f;
    color: #5e1414;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-error::before {
    background-color: #8a1f1f;
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='13'/><circle cx='12' cy='16.5' r='0.9' fill='currentColor'/></svg>");
    mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='13'/><circle cx='12' cy='16.5' r='0.9' fill='currentColor'/></svg>");
}

/* --- Status: Success / Message (green) ----------------------------------- */

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-message {
    background: #f1f6f1;
    border-color: #d4e2d4;
    border-left-color: #2f5d3a;
    color: #1f3f27;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-message::before {
    background-color: #2f5d3a;
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><polyline points='8 12.5 11 15.3 16 9.6'/></svg>");
    mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><polyline points='8 12.5 11 15.3 16 9.6'/></svg>");
}

/* --- Status: Warning (amber) — custom; theme inject hoặc plugin phát ----- */

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-warning {
    background: #faf3e3;
    border-color: #ecdcb1;
    border-left-color: #8a5a0e;
    color: #5e3e0a;
}

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-warning::before {
    background-color: #8a5a0e;
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3.5 L21.5 20 H2.5 Z'/><line x1='12' y1='10' x2='12' y2='14.5'/><circle cx='12' cy='17.5' r='0.9' fill='currentColor'/></svg>");
    mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3.5 L21.5 20 H2.5 Z'/><line x1='12' y1='10' x2='12' y2='14.5'/><circle cx='12' cy='17.5' r='0.9' fill='currentColor'/></svg>");
}

/* --- Status: Info (ink neutral) ------------------------------------------ */

:where(
    body.woocommerce-cart,
    body.woocommerce-checkout,
    body.woocommerce-order-pay,
    body.woocommerce-order-received,
    body.woocommerce-account,
    body.single-product
) .woocommerce-info::before {
    background-color: var(--ink, #0a0a0a);
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='11' x2='12' y2='16.5'/><circle cx='12' cy='7.8' r='0.9' fill='currentColor'/></svg>");
    mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='11' x2='12' y2='16.5'/><circle cx='12' cy='7.8' r='0.9' fill='currentColor'/></svg>");
}

/* --- Coupon error inline ------------------------------------------------- */
/* WooCommerce AJAX (cart.js show_coupon_error) inject `<p class="coupon-
   error-notice">` vào `.coupon` wrapper khi apply coupon thất bại. Vì
   `.coupon` là flex row (input + button), notice xuất hiện làm sibling thứ 3
   → nằm cạnh button. Fix: full-width row mới + style như compact error. */

.woocommerce-cart .woocommerce-cart-form .coupon,
.woocommerce-checkout .checkout_coupon {
    flex-wrap: wrap;
}

.woocommerce-cart #coupon_code.has-error,
.woocommerce-checkout #coupon_code.has-error {
    border-color: #8a1f1f;
    box-shadow: 0 0 0 1px #8a1f1f;
}

.woocommerce-cart .coupon .coupon-error-notice,
.woocommerce-checkout .checkout_coupon .coupon-error-notice {
    flex-basis: 100%;
    margin: 4px 0 0;
    padding: 10px 14px 10px 12px;
    background: #fbf3f1;
    border: 1px solid #e8d4ce;
    border-left: 3px solid #8a1f1f;
    color: #5e1414;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.5;
    display: grid;
    grid-template-columns: 18px 1fr;
    column-gap: 10px;
    align-items: start;
}

.woocommerce-cart .coupon .coupon-error-notice::before,
.woocommerce-checkout .checkout_coupon .coupon-error-notice::before {
    content: '';
    display: block;
    width: 18px;
    height: 18px;
    margin-top: 2px;
    background-color: #8a1f1f;
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='13'/><circle cx='12' cy='16.5' r='0.9' fill='currentColor'/></svg>");
    mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='13'/><circle cx='12' cy='16.5' r='0.9' fill='currentColor'/></svg>");
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/page-content.css */
/* ==========================================================================
   page-content.css — Group B (content pages)
   Áp lên `.gv-page` (page.php) cho 6 page tĩnh: gioi-thieu, lien-he,
   bang-gia, chinh-sach-bao-mat, dieu-khoan, chinh-sach-giao-hang,
   chinh-sach-doi-tra. Foundation typography editorial cho `.entry-content`
   (Gutenberg output) + section header (eyebrow + H1 serif + lead).

   Bám brand-guideline:
   - Mục 5 — Typography: Cormorant Garamond display, Inter/Be Vietnam Pro body.
   - Mục 6 — Layout/Spacing: container 720px (reading) hoặc 1400px (marketing),
     section padding 56px mobile / 112px desktop.
   - Mục 12 — Page translation: legal/policy ưu tiên line-length đọc (~65ch).

   Token color (`--ink`, `--paper`, …) đã khai báo ở base.css scope `body.home,
   .gv-home`. Page WP không có `body.home` nên ta khai báo lại scope `.gv-page`
   để mọi page có thể self-contained mà không phụ thuộc layout home.
   ========================================================================== */

.gv-page {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;

    color: var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    line-height: 1.7;
}

.gv-page *,
.gv-page *::before,
.gv-page *::after {
    box-sizing: border-box;
}

.gv-page a {
    color: inherit;
}

.gv-page__article {
    display: block;
}

/* --- Container variant -------------------------------------------------- */
/* Title section (gv-page-header__inner) LUÔN max-width 1400px + padding-inline
   1.25rem mobile / 2.5rem desktop, mirror chuẩn `.gv-post-header__inner` ở
   `archive-blog.css` mục 1. Lý do: section header trên trang đơn (page +
   single post) phải đồng nhịp container — text không chạm mép viewport
   <1400px, gutter cố định ở mọi breakpoint. `.gv-page *` đã set
   `box-sizing: border-box` (dòng 36-40) nên padding nằm TRONG width.

   Content section (`.entry-content`) được bọc trong wrapper `.gv-page-body`
   (mirror `.gv-post-body` của single.php) — wrapper sở hữu max-width +
   padding inline. Selector list shared `.gv-post-body, .gv-page-body` ở
   `archive-blog.css` mục 1 + 9 set default 720px (reading) + padding mirror
   post body. Variant `--marketing` override 1400px cho page có cover/columns.

   SCOPE: rule scope về `.gv-page` ancestor — tránh double-padding trên Woo
   flow (cart/checkout/my-account/order-*) vì `page.php` đặt wrapper `.gv-woo`
   (KHÔNG `.gv-page`) cho các trang đó, và `commerce-flow.css` đã render
   container `.gv-woo { padding: 1.5rem 1.25rem 3rem }` mobile / `2rem 2.5rem
   4rem` desktop. Nếu un-scoped, H1 trong `.gv-woo > .gv-page-header__inner`
   sẽ ăn 2 lần padding (5rem desktop) lệch với cart-table không có inner
   wrapper. Trên Woo, gutter của H1 đã đúng nhờ `.gv-woo` outer padding. */

.gv-page .gv-page-header__inner {
    width: 100%;
    max-width: 1400px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
}

.gv-page--marketing .gv-page-body {
    /* Override default 720px (reading) — page có cover/columns cần 1400px.
       `box-sizing: border-box` để 1400 + padding 2.5rem desktop ≤ 1480px outer
       không tạo scroll ngang ở viewport 1440-1479. */
    max-width: 1400px;
    box-sizing: border-box;
}

@media (min-width: 1024px) {
    .gv-page .gv-page-header__inner {
        padding-left: 2.5rem;
        padding-right: 2.5rem;
    }
}

/* --- Composed variant — page chứa gv-blocks (full-bleed compositions) --- */
/* Auto-detect: page.php set khi post_content có block prefix `wp:gv/*`
   (about-intro, contact-info, cta-band, testimonials, pricing-table, …).
   Composed pages bypass cả `.gv-page-body` wrapper lẫn `.gv-page-hero` — block
   composition phía trong sở hữu layout full-bleed của route đó. Header cũng
   bị skip ở `template-parts/content-page.php` để block sở hữu H1.

   Defensive bypass: tránh mọi rule có thể leak vào `.entry-content` direct
   (composed không qua `.gv-page-body`) — explicit `max-width: none; padding: 0`. */

.gv-page--composed .entry-content {
    max-width: none;
    padding: 0;
}

.gv-page--composed .entry-content > * + * {
    margin-top: 0;
}

/* --- Section header (eyebrow + H1 serif + lead) ------------------------- */
/* Vertical padding mirror `.gv-post-header` ở `archive-blog.css` mục 7
   (2.5rem 0 2.5rem mobile, 3.5rem 0 4rem desktop) — page header inner đồng
   nhịp single post. Không dùng border-bottom — nhịp giữa header và
   entry-content do whitespace (padding) đảm nhận. */

.gv-page-header {
    padding: 0 0 2.5rem;
}

.gv-post-breadcrumb + .gv-page .gv-page-header {
    padding-top: 1.5rem;
}

.gv-page-header__eyebrow {
    margin: 0 0 1.5rem;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-page-header__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.25rem, 5.5vw, 4rem);
    line-height: 1;
    letter-spacing: -0.015em;
    color: var(--ink);
    max-width: 22ch;
}

.gv-page-header__lead {
    margin: 1.5rem 0 0;
    max-width: 40em;
    font-size: 1.125rem;
    line-height: 1.6;
    color: var(--ink-soft);
}

@media (min-width: 1024px) {
    .gv-page-header {
        padding: 0 0 4rem;
    }

    .gv-post-breadcrumb + .gv-page .gv-page-header {
        padding-top: 2rem;
    }

    .gv-page-header__lead {
        font-size: 1.25rem;
    }
}

/* --- Entry content typography baseline ---------------------------------- */
/* Typography baseline (h1-h6, p, ul/ol/li, blockquote, figure, hr, code, a)
   được define duy nhất 1 lần ở `archive-blog.css` mục 9 qua selector list
   shared `.gv-post-body .entry-content, .gv-page-body .entry-content`. Ở đây
   chỉ giữ rule page-unique: large font size class, nested list, list-item
   wp-quote variant, separator wp-element-caption — những thứ post body chưa
   có pattern. Single post = source of truth (rule "single is canonical"). */

.gv-page-body .entry-content p.has-large-font-size,
.gv-page-body .entry-content .has-large-font-size {
    /* Gutenberg "large" preset từ size selector — page-only vì post body
       hiện không expose preset này. */
    font-size: 1.25rem;
    line-height: 1.55;
}

.gv-page-body .entry-content li > ul,
.gv-page-body .entry-content li > ol {
    /* Nested list — post body chưa có pattern; page có FAQ + outline list
       trong content. */
    margin-top: 0.625rem;
    margin-bottom: 0;
}

.gv-page-body .entry-content .wp-block-quote {
    /* Gutenberg block quote alias — `archive-blog.css` define `blockquote`
       generic; thêm class wp-block-quote để cover khi user dùng block UI. */
    margin: 2.5rem 0;
    padding: 0 0 0 1.5rem;
    border-left: 2px solid var(--ink-line);
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: clamp(1.25rem, 2vw, 1.5rem);
    line-height: 1.4;
    color: var(--ink);
    max-width: 30em;
}

.gv-page-body .entry-content .wp-block-quote cite {
    display: block;
    margin-top: 1rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-style: normal;
    font-size: 0.6875rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-page-body .entry-content .wp-block-separator {
    /* Alias cho hr — Gutenberg separator block. */
    border: 0;
    border-top: 1px solid var(--ink-line);
    margin: 3.75rem 0;
    height: 0;
    background: none;
}

/* --- Gutenberg columns block ------------------------------------------- */

.gv-page .entry-content .wp-block-columns {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    margin: 2rem 0;
}

.gv-page .entry-content .wp-block-columns .wp-block-column > * + * {
    margin-top: 1rem;
}

@media (min-width: 768px) {
    .gv-page .entry-content .wp-block-columns {
        flex-direction: row;
        gap: 2.5rem;
    }

    .gv-page .entry-content .wp-block-columns .wp-block-column {
        flex: 1;
        min-width: 0;
    }
}

/* --- Gutenberg image / cover / media ------------------------------------ */
/* `figure`, `img`, `figcaption` baseline ở `archive-blog.css` mục 9 qua
   selector list shared. Ở đây chỉ giữ `.wp-element-caption` (Gallery wrapper
   Gutenberg dùng `<span>` không phải `<figcaption>`) + `.wp-block-cover`
   spacing — page-only patterns. Mirror values của post figcaption để đồng
   bộ visual. */

.gv-page-body .entry-content .wp-element-caption {
    margin-top: 0.75rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-align: left;
}

.gv-page-body .entry-content .wp-block-cover {
    margin: 2.5rem 0;
}

/* --- Gutenberg button --------------------------------------------------- */

.gv-page .entry-content .wp-block-button__link {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.875rem 1.5rem;
    background: var(--ink);
    color: var(--paper);
    border-radius: 0;
    border: 1px solid var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    font-weight: 500;
    letter-spacing: 0.02em;
    text-decoration: none;
    transition: background 0.2s ease-out, color 0.2s ease-out;
}

.gv-page .entry-content .wp-block-button__link:hover {
    background: var(--ink-soft);
    color: var(--paper);
}

.gv-page .entry-content .is-style-outline .wp-block-button__link {
    background: transparent;
    color: var(--ink);
}

.gv-page .entry-content .is-style-outline .wp-block-button__link:hover {
    background: var(--ink);
    color: var(--paper);
}

/* --- Accordion: <details><summary> -------------------------------------- */
/* Pattern dùng cho FAQ trên page lien-he (HTML thuần trong Gutenberg
   "Custom HTML" block hoặc <details> block khi WP hỗ trợ). */

.gv-page .entry-content details {
    border-bottom: 1px solid var(--ink-line);
    padding: 1.5rem 0;
}

.gv-page .entry-content details:first-of-type {
    border-top: 1px solid var(--ink-line);
}

.gv-page .entry-content details > summary {
    list-style: none;
    cursor: pointer;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1.5rem;
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.375rem;
    line-height: 1.25;
    color: var(--ink);
    font-weight: 500;
    user-select: none;
}

.gv-page .entry-content details > summary::-webkit-details-marker {
    display: none;
}

.gv-page .entry-content details > summary::after {
    content: '+';
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 1.25rem;
    line-height: 1;
    color: var(--ink-muted);
    flex-shrink: 0;
    transition: transform 0.2s ease-out;
}

.gv-page .entry-content details[open] > summary::after {
    content: '–';
}

.gv-page .entry-content details > *:not(summary) {
    margin-top: 1rem;
    color: var(--ink-soft);
}

@media (min-width: 1024px) {
    .gv-page .entry-content details {
        padding: 2rem 0;
    }

    .gv-page .entry-content details > summary {
        font-size: 1.625rem;
    }
}

/* --- Pagination (wp_link_pages cho page chia trang nhỏ) ----------------- */

.gv-page__pagination {
    margin-top: 4rem;
    padding-top: 2rem;
    border-top: 1px solid var(--ink-line);
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    align-items: center;
    font-size: 0.875rem;
    color: var(--ink-muted);
}

.gv-page__pagination a,
.gv-page__pagination > span:not(:first-child) {
    padding: 0.25rem 0.625rem;
    border: 1px solid var(--ink-line);
    color: var(--ink);
    text-decoration: none;
}

.gv-page__pagination a:hover {
    border-color: var(--ink);
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/archive-blog.css */
/* ==========================================================================
   archive-blog.css — Group C (blog index, single, category)
   Áp lên home.php (.gv-blog), archive.php/category.php (.gv-blog), single.php
   (.gv-post). Foundation typography editorial cho blog list + reading
   experience cho single post.

   Bám brand-guideline:
   - Mục 5 — Typography: Cormorant Garamond display, Inter/Be Vietnam Pro body,
     JetBrains Mono meta.
   - Mục 6 — Layout/Spacing: container 1400px (list) / 720px (reading);
     section padding 56px mobile / 112px desktop.

   Token color khai báo lại scope `.gv-blog` & `.gv-post` để self-contained.
   ========================================================================== */

.gv-blog,
.gv-post {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;

    color: var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    line-height: 1.7;
}

.gv-blog *,
.gv-blog *::before,
.gv-blog *::after,
.gv-post *,
.gv-post *::before,
.gv-post *::after {
    box-sizing: border-box;
}

.gv-blog a,
.gv-post a {
    color: inherit;
}

/* ==========================================================================
   1. Containers
   ========================================================================== */

.gv-blog-header__inner,
.gv-blog-list__inner,
.gv-post-breadcrumb__inner,
.gv-post-header__inner,
.gv-post-related__inner {
    width: 100%;
    max-width: 1400px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
    /* Padding nằm trong width — tránh overflow ngang khi viewport ≤ 1480
       (rộng 1400 + 2×40 padding desktop). Nếu thiếu, page bị scroll ngang
       40px trên mọi non-front-page (breadcrumb render trong header.php). */
    box-sizing: border-box;
}

.gv-post-body,
.gv-page-body,
.gv-post-hero,
.gv-page-hero {
    width: 100%;
    max-width: 720px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
}

.gv-post-hero,
.gv-page-hero {
    /* Hero ảnh đi rộng hơn body chữ → cảm giác editorial. */
    max-width: 1080px;
}

@media (min-width: 1024px) {

    .gv-blog-header__inner,
    .gv-blog-list__inner,
    .gv-post-breadcrumb__inner,
    .gv-post-header__inner,
    .gv-post-related__inner,
    .gv-post-body,
    .gv-page-body {
        padding-left: 2.5rem;
        padding-right: 2.5rem;
    }
}

/* ==========================================================================
   2. Blog header (home.php / archive.php) — eyebrow + H1 + lead
   ========================================================================== */

.gv-blog-header {
    padding: 3.5rem 0 2.5rem;
    border-bottom: 1px solid var(--ink-line);
}

.gv-blog-header__eyebrow {
    margin: 0 0 1.5rem;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-blog-header__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.5rem, 6vw, 4.5rem);
    line-height: 0.98;
    letter-spacing: -0.015em;
    color: var(--ink);
}

.gv-blog-header__lead {
    margin: 1.5rem 0 0;
    max-width: 38em;
    font-size: 1.125rem;
    line-height: 1.55;
    color: var(--ink-muted);
}

@media (min-width: 1024px) {
    .gv-blog-header {
        padding: 7rem 0 3.5rem;
    }

    .gv-blog-header__title {
        max-width: 16ch;
    }

    .gv-blog-header__lead {
        font-size: 1.25rem;
    }
}

/* ==========================================================================
   3. Blog list — grid bài viết
   ========================================================================== */

.gv-blog-list {
    padding: 3.5rem 0;
}

@media (min-width: 1024px) {
    .gv-blog-list {
        padding: 7rem 0;
    }
}

.gv-post-grid {
    display: grid;
    grid-template-columns: 1fr;
    column-gap: 2.5rem;
    row-gap: 3.5rem;
}

@media (min-width: 640px) {
    .gv-post-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .gv-post-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        column-gap: 2.5rem;
        row-gap: 3.5rem;
    }
}

/* ==========================================================================
   4. Post card (template-parts/content.php)
   ========================================================================== */

.gv-post-card {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    transition: transform 0.35s ease-out;
}

.gv-post-card:hover {
    transform: translateY(-3px);
}

.gv-post-card__link {
    display: block;
    text-decoration: none;
}

.gv-post-card__media {
    display: block;
    position: relative;
    overflow: hidden;
    background: var(--paper-warm);
    aspect-ratio: 4 / 5;
}

.gv-post-card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

.gv-post-card:hover .gv-post-card__media img {
    transform: scale(1.03);
    filter: brightness(1.04);
}

.gv-post-card__media--empty {
    background: var(--paper-cream);
}

.gv-post-card__body {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.gv-post-card__kicker {
    margin: 0;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-post-card__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.5rem, 2.5vw, 1.75rem);
    line-height: 1.1;
    letter-spacing: -0.01em;
    color: var(--ink);
}

.gv-post-card__title a {
    color: inherit;
    text-decoration: none;
    transition: color 0.2s ease-out;
}

.gv-post-card__title a:hover {
    color: var(--ink-soft);
}

.gv-post-card__date {
    margin: 0;
    color: var(--ink-muted);
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    font-family: 'Inter', system-ui, sans-serif;
}

.gv-post-card__excerpt {
    margin: 0;
    font-size: 0.9375rem;
    line-height: 1.6;
    color: var(--ink-soft);
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.gv-post-card__cta {
    margin-top: 0.25rem;
    font-size: 1rem;
    color: var(--ink);
}

/* ==========================================================================
   5. Pagination editorial
   ========================================================================== */

.gv-blog-pagination,
.gv-blog .pagination {
    margin-top: 4rem;
    padding-top: 2.5rem;
    border-top: 1px solid var(--ink-line);
}

.gv-blog-pagination .nav-links,
.gv-blog .pagination .nav-links {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.5rem 1rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    letter-spacing: 0.08em;
}

.gv-blog-pagination .page-numbers,
.gv-blog .pagination .page-numbers {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.25rem;
    height: 2.25rem;
    padding: 0 0.5rem;
    color: var(--ink-muted);
    text-decoration: none;
    transition: color 0.2s ease-out;
}

.gv-blog-pagination .page-numbers.current,
.gv-blog .pagination .page-numbers.current {
    color: var(--ink);
    border-bottom: 1px solid var(--ink);
}

.gv-blog-pagination .page-numbers:hover,
.gv-blog .pagination .page-numbers:hover {
    color: var(--ink);
    text-decoration: underline;
    text-underline-offset: 0.25em;
}

.gv-blog-pagination .page-numbers.dots,
.gv-blog .pagination .page-numbers.dots {
    color: var(--ink-muted);
}

.gv-blog-pagination .prev,
.gv-blog-pagination .next {
    text-transform: uppercase;
}

.gv-blog-pagination .screen-reader-text {
    border: 0;
    clip: rect(1px, 1px, 1px, 1px);
    clip-path: inset(50%);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute !important;
    width: 1px;
    word-wrap: normal !important;
}

/* ==========================================================================
   6. Single post — breadcrumb
   ========================================================================== */

.gv-post-breadcrumb {
    padding: 2rem 0 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    color: var(--ink-muted, #5c5c5c);
}

.gv-post-breadcrumb a,
.gv-post-breadcrumb__back {
    color: var(--ink-muted, #5c5c5c);
    text-decoration: none;
    transition: color 0.2s ease-out;
}

.gv-post-breadcrumb a:hover,
.gv-post-breadcrumb__back:hover {
    color: var(--ink, #0a0a0a);
    text-decoration: underline;
    text-underline-offset: 0.25em;
}

.gv-post-breadcrumb__back span[aria-hidden] {
    margin-right: 0.5em;
}

@media (min-width: 1024px) {
    .gv-post-breadcrumb {
        padding-top: 2.5rem;
    }
}

.gv-post-breadcrumb + .gv-blog .gv-blog-header,
.gv-post-breadcrumb + .gv-post .gv-post-header {
    padding-top: 1.5rem;
}

@media (min-width: 1024px) {
    .gv-post-breadcrumb + .gv-blog .gv-blog-header,
    .gv-post-breadcrumb + .gv-post .gv-post-header {
        padding-top: 2rem;
    }
}

/* ==========================================================================
   7. Single post — header (eyebrow + H1 + lead + meta)
   ========================================================================== */

.gv-post-header {
    padding: 0 0 2.5rem;
}

.gv-post-header__eyebrow {
    margin: 0 0 1.5rem;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-post-header__eyebrow a {
    color: inherit;
    text-decoration: none;
    transition: color 0.2s ease-out;
}

.gv-post-header__eyebrow a:hover {
    color: var(--ink);
}

.gv-post-header__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.25rem, 5.5vw, 4rem);
    line-height: 1;
    letter-spacing: -0.015em;
    color: var(--ink);
    max-width: 22ch;
}

.gv-post-header__lead {
    margin: 1.5rem 0 0;
    max-width: 40em;
    font-size: 1.125rem;
    line-height: 1.6;
    color: var(--ink-soft);
}

.gv-post-header__meta {
    margin-top: 2rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.75rem;
    color: var(--ink-muted);
    font-size: 0.8125rem;
}

.gv-post-header__meta-author {
    font-style: italic;
    color: var(--ink-soft);
}

.gv-post-header__meta-sep {
    color: var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-post-header {
        padding: 3.5rem 0 4rem;
    }

    .gv-post-header__lead {
        font-size: 1.25rem;
    }
}

/* ==========================================================================
   8. Single post / page — hero image
   Selector list shared `.gv-post-hero, .gv-page-hero` — 1 SSOT, 2 context
   (single.php + page.php khi `has_post_thumbnail()` && variant !== composed).
   ========================================================================== */

.gv-post-hero,
.gv-page-hero {
    margin: 0 auto;
    padding-bottom: 3.5rem;
}

.gv-post-hero__media,
.gv-page-hero__media {
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--paper-warm);
}

.gv-post-hero__media img,
.gv-page-hero__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.gv-post-hero__caption,
.gv-page-hero__caption {
    margin: 1rem 1.25rem 0;
    color: var(--ink-muted);
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

@media (min-width: 1024px) {
    .gv-post-hero,
    .gv-page-hero {
        padding-bottom: 5rem;
    }

    .gv-post-hero__caption,
    .gv-page-hero__caption {
        margin-left: 0;
    }
}

/* ==========================================================================
   9. Single post / page — body (.entry-content reading 720px)
   Selector list shared `.gv-post-body, .gv-page-body` cho container +
   `.gv-post-body .entry-content, .gv-page-body .entry-content` cho typography
   baseline (h1-h6, p, ul/ol/li, blockquote, figure, table, code). 1 SSOT,
   2 context (single.php + content-page.php non-composed). Variant
   `--marketing` override max-width 1400px ở page-content.css; default 720px.
   ========================================================================== */

.gv-post-body,
.gv-page-body {
    padding-top: 0;
    padding-bottom: 5rem;
    color: var(--ink-soft);
    font-size: 1.0625rem;
    line-height: 1.75;
}

.gv-post-body .entry-content > * + *,
.gv-page-body .entry-content > * + * {
    margin-top: 1.5rem;
}

.gv-post-body .entry-content > h2 + *,
.gv-post-body .entry-content > h3 + *,
.gv-post-body .entry-content > h4 + *,
.gv-page-body .entry-content > h2 + *,
.gv-page-body .entry-content > h3 + *,
.gv-page-body .entry-content > h4 + * {
    margin-top: 1rem;
}

.gv-post-body .entry-content h1,
.gv-page-body .entry-content h1 {
    /* H1 đã render ở gv-post-header / gv-page-header → ẩn trong body để tránh
       trùng heading khi user accidentally chèn H1 trong Gutenberg. */
    display: none;
}

.gv-post-body .entry-content h2,
.gv-post-body .entry-content h3,
.gv-post-body .entry-content h4,
.gv-post-body .entry-content h5,
.gv-post-body .entry-content h6,
.gv-page-body .entry-content h2,
.gv-page-body .entry-content h3,
.gv-page-body .entry-content h4,
.gv-page-body .entry-content h5,
.gv-page-body .entry-content h6 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: -0.01em;
    line-height: 1.1;
    max-width: 30ch;
}

.gv-post-body .entry-content h2,
.gv-page-body .entry-content h2 {
    margin-top: 3.5rem;
    margin-bottom: 1rem;
    font-size: clamp(1.625rem, 3vw, 2.25rem);
}

.gv-post-body .entry-content h3,
.gv-page-body .entry-content h3 {
    margin-top: 2.75rem;
    margin-bottom: 0.75rem;
    font-size: clamp(1.375rem, 2.4vw, 1.75rem);
}

.gv-post-body .entry-content h4,
.gv-page-body .entry-content h4 {
    margin-top: 2.25rem;
    margin-bottom: 0.5rem;
    font-size: 1.25rem;
}

.gv-post-body .entry-content :is(h2, h3, h4) + :is(h2, h3, h4),
.gv-page-body .entry-content :is(h2, h3, h4) + :is(h2, h3, h4) {
    margin-top: 1.25rem;
}

.gv-post-body .entry-content p,
.gv-page-body .entry-content p {
    margin: 0;
    max-width: 65ch;
    color: var(--ink-soft);
}

.gv-post-body .entry-content strong,
.gv-post-body .entry-content b,
.gv-page-body .entry-content strong,
.gv-page-body .entry-content b {
    color: var(--ink);
    font-weight: 600;
}

.gv-post-body .entry-content em,
.gv-post-body .entry-content i,
.gv-page-body .entry-content em,
.gv-page-body .entry-content i {
    font-style: italic;
}

.gv-post-body .entry-content a:not(.wp-block-button__link),
.gv-page-body .entry-content a:not(.wp-block-button__link) {
    color: var(--ink);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.25em;
    transition: color 0.2s ease-out;
}

.gv-post-body .entry-content a:not(.wp-block-button__link):hover,
.gv-page-body .entry-content a:not(.wp-block-button__link):hover {
    color: var(--ink-muted);
}

.gv-post-body .entry-content ul,
.gv-post-body .entry-content ol,
.gv-page-body .entry-content ul,
.gv-page-body .entry-content ol {
    margin: 0;
    padding-left: 1.5rem;
    max-width: 65ch;
}

.gv-post-body .entry-content li,
.gv-page-body .entry-content li {
    margin-bottom: 0.625rem;
    color: var(--ink-soft);
}

.gv-post-body .entry-content li::marker,
.gv-page-body .entry-content li::marker {
    color: var(--ink-muted);
}

.gv-post-body .entry-content blockquote,
.gv-page-body .entry-content blockquote {
    margin: 2.5rem 0;
    padding: 0 0 0 1.5rem;
    border-left: 2px solid var(--ink-line);
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: clamp(1.25rem, 2vw, 1.5rem);
    line-height: 1.4;
    color: var(--ink);
    max-width: 30em;
}

.gv-post-body .entry-content blockquote p,
.gv-page-body .entry-content blockquote p {
    margin: 0;
    max-width: none;
}

.gv-post-body .entry-content blockquote cite,
.gv-page-body .entry-content blockquote cite {
    display: block;
    margin-top: 1rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-style: normal;
    font-size: 0.6875rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-post-body .entry-content figure,
.gv-page-body .entry-content figure {
    margin: 2.5rem 0;
}

.gv-post-body .entry-content img,
.gv-page-body .entry-content img {
    max-width: 100%;
    height: auto;
}

.gv-post-body .entry-content figcaption,
.gv-page-body .entry-content figcaption {
    margin-top: 0.75rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-post-body .entry-content hr,
.gv-page-body .entry-content hr {
    margin: 3.75rem 0;
    border: 0;
    border-top: 1px solid var(--ink-line);
}

.gv-post-body .entry-content code,
.gv-post-body .entry-content kbd,
.gv-post-body .entry-content samp,
.gv-page-body .entry-content code,
.gv-page-body .entry-content kbd,
.gv-page-body .entry-content samp {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875em;
    background: var(--paper-warm);
    padding: 0.125rem 0.375rem;
    border-radius: 2px;
}

.gv-post-body .entry-content pre,
.gv-page-body .entry-content pre {
    margin: 2rem 0;
    padding: 1.25rem;
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    overflow-x: auto;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    line-height: 1.55;
}

@media (min-width: 1024px) {
    .gv-post-body,
    .gv-page-body {
        padding-bottom: 7rem;
        font-size: 1.125rem;
    }
}

/* ==========================================================================
   10. Single post — footer tags
   ========================================================================== */

.gv-post-footer {
    margin-top: 3.5rem;
    padding-top: 2.5rem;
    border-top: 1px solid var(--ink-line);
}

.gv-post-footer__label {
    margin: 0 0 1rem;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-post-tags {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 0.625rem;
}

.gv-post-tag {
    display: inline-flex;
    align-items: center;
    padding: 0.375rem 0.875rem;
    border: 1px solid var(--ink-line);
    color: var(--ink-soft);
    font-size: 0.8125rem;
    text-decoration: none;
    transition: border-color 0.2s ease-out, color 0.2s ease-out, background 0.2s ease-out;
}

.gv-post-tag:hover {
    border-color: var(--ink);
    color: var(--ink);
    background: var(--paper-warm);
}

/* ==========================================================================
   11. Related posts
   ========================================================================== */

.gv-post-related {
    padding: 4rem 0;
    background: var(--paper-cream);
    border-top: 1px solid var(--ink-line);
}

.gv-post-related__header {
    margin-bottom: 2.5rem;
    display: grid;
    gap: 0.75rem;
}

.gv-post-related__header .gv-meta-label {
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    margin: 0;
}

.gv-post-related__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.75rem, 4vw, 2.75rem);
    line-height: 1;
    letter-spacing: -0.01em;
    color: var(--ink);
    max-width: 18ch;
}

@media (min-width: 1024px) {
    .gv-post-related {
        padding: 7rem 0;
    }

    .gv-post-related__header {
        margin-bottom: 4rem;
    }
}

/* Slider: scroll-snap horizontal với peek item kế tiếp ở rìa phải.
   Mobile 1+0.25, tablet 2+0.25, desktop 4+0.25. Card con là `.gv-post-card`
   render từ `template-parts/content.php`; KHÔNG đổi schema card. */
.gv-post-related__slider {
    display: flex;
    flex-wrap: nowrap;
    gap: 1.25rem;
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    /* Hide scrollbar — visual cue dựa vào peek edge. */
    scrollbar-width: none;
    /* Cho card cuối có thể snap-end mà không bị cảm giác cụt sát mép phải. */
    padding-bottom: 0.5rem;
}

.gv-post-related__slider::-webkit-scrollbar {
    display: none;
}

.gv-post-related__slider > .gv-post-card {
    flex: 0 0 calc((100% - 1.25rem) / 1.25);
    scroll-snap-align: start;
    min-width: 0;
}

@media (min-width: 640px) {
    .gv-post-related__slider {
        gap: 1.75rem;
    }

    .gv-post-related__slider > .gv-post-card {
        flex-basis: calc((100% - 2 * 1.75rem) / 2.25);
    }
}

@media (min-width: 1024px) {
    .gv-post-related__slider {
        gap: 2.5rem;
    }

    .gv-post-related__slider > .gv-post-card {
        flex-basis: calc((100% - 4 * 2.5rem) / 4.25);
    }
}

/* ==========================================================================
   12. ed-link override (theme components.css đã định nghĩa font-size 1.25rem
   hợp cho hero; trong card list ta giảm xuống cho cân với title 1.75rem).
   ========================================================================== */

.gv-post-card__cta.ed-link {
    font-size: 1rem;
}

.gv-post-card__cta.ed-link::after {
    bottom: -0.25rem;
}

/* ==========================================================================
   13. Reduced motion
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {

    .gv-post-card,
    .gv-post-card__media img {
        transition: none;
    }

    .gv-post-card:hover {
        transform: none;
    }

    .gv-post-card:hover .gv-post-card__media img {
        transform: none;
        filter: none;
    }

    .gv-post-related__slider {
        scroll-behavior: auto;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/archive-search.css */
/* ==========================================================================
   archive-search.css — Group 5 (cross-page templates)
   Áp lên body.gv-search-page (search.php). Editorial header + filter tabs +
   asymmetric result grid + FacetWP pagination + empty state.

   Bám brand-guideline: typography Cormorant Garamond / Inter, container
   1400px, eyebrow 0.6875rem uppercase tracked. Memory feedback "visual
   boldness": title prefix italic nhỏ trên query lớn → 2 dòng tương phản;
   card aspect khác nhau theo type để grid không symmetric.
   ========================================================================== */

.gv-search-page {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;

    background: var(--paper);
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    line-height: 1.6;
}

.gv-search-page *,
.gv-search-page *::before,
.gv-search-page *::after {
    box-sizing: border-box;
}

/* Container */
.gv-search-page .gv-search {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 2.5rem 1.25rem 3.5rem;
}

@media (min-width: 1024px) {
    .gv-search-page .gv-search {
        padding: 4rem 2.5rem 6rem;
    }
}

/* ==========================================================================
   1. Header — eyebrow + title (prefix italic + query oversize) + lead
   ========================================================================== */

.gv-search__head {
    border-bottom: 1px solid var(--ink-line);
    padding-bottom: 1.25rem;
    margin-bottom: 0;
}

.gv-search__eyebrow {
    margin: 0 0 1rem;
    color: var(--ink-muted);
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-search__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.75rem, 4.5vw, 2.75rem);
    line-height: 1;
    letter-spacing: -0.015em;
    color: var(--ink);
    max-width: 28ch;
}

.gv-search__title-prefix {
    display: block;
    font-style: italic;
    font-size: clamp(0.9375rem, 1.6vw, 1.125rem);
    line-height: 1;
    letter-spacing: 0;
    color: var(--ink-muted);
    margin-bottom: 0.375rem;
}

.gv-search__title-query {
    display: block;
}

.gv-search__lead {
    margin: 1rem 0 0;
    max-width: 56em;
    font-size: 0.875rem;
    line-height: 1.55;
    color: var(--ink-muted);
}

@media (min-width: 1024px) {
    .gv-search__head {
        padding-bottom: 1.4rem;
    }
    .gv-search__title {
        font-size: clamp(2.25rem, 4vw, 3.25rem);
    }
    .gv-search__lead {
        font-size: 0.9375rem;
    }
}

/* ==========================================================================
   2. Chips — text-link filter (đồng style với .gv-stories-mast__facet)
   Format markup: <Category> (count). Active: bold + underline 1px ::after.
   ========================================================================== */

.gv-search__chips {
    padding-top: 0.875rem;
    padding-bottom: 0.875rem;
    margin-bottom: 1.5rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.625rem 1.5rem;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-search__chips {
        padding-top: 0.9375rem;
        padding-bottom: 0.9375rem;
        margin-bottom: 2rem;
        flex-wrap: nowrap;
    }
}

.gv-search__chips-label {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    flex: 0 0 auto;
}

.gv-search__facet {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-wrap: nowrap;
    gap: 0.25rem 1.125rem;
    overflow-x: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--ink-line) transparent;
    white-space: nowrap;
}

.gv-search__facet::-webkit-scrollbar {
    height: 2px;
}

.gv-search__facet::-webkit-scrollbar-thumb {
    background: var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-search__facet {
        overflow: visible;
        flex-wrap: wrap;
        white-space: normal;
    }
}

.gv-search__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    margin: 0;
    padding: 0.25rem 0;
    border: 0;
    background: none;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.78125rem;
    font-weight: 400;
    letter-spacing: 0.01em;
    line-height: 1.4;
    color: var(--ink-soft);
    text-decoration: none;
    cursor: pointer;
    position: relative;
    flex: 0 0 auto;
    transition: color 0.15s ease-out;
}

.gv-search__chip:hover {
    color: var(--ink);
}

.gv-search__chip.is-checked {
    color: var(--ink);
    font-weight: 500;
}

.gv-search__chip.is-checked::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 1px;
    background: var(--ink);
}

.gv-search__chip-counter {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    color: var(--ink-muted);
    margin-left: 0.125rem;
}

/* ==========================================================================
   3. Result grid + cards — asymmetric qua aspect-ratio per type
   ========================================================================== */

.gv-search__results {
    display: grid;
    grid-template-columns: 1fr;
    gap: 2rem 1.25rem;
    list-style: none;
    margin: 0;
    padding: 0;
}

@media (min-width: 480px) {
    .gv-search__results {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 768px) {
    .gv-search__results {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media (min-width: 1024px) {
    .gv-search__results {
        grid-template-columns: repeat(4, 1fr);
        gap: 2.5rem 1.25rem;
    }
}

.gv-search-card {
    margin: 0;
}

.gv-search-card__link {
    display: flex;
    flex-direction: column;
    gap: 0.875rem;
    color: inherit;
    text-decoration: none;
    transition: opacity 0.18s ease-out;
}

.gv-search-card__link:hover {
    opacity: 0.78;
}

.gv-search-card__thumb {
    margin: 0;
    overflow: hidden;
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
}

.gv-search-card__img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Aspect ratios chọn để 4 card cùng hàng không lệch quá:
   product 1:1 (sản phẩm in vuông) — post 4:5 (portrait nhẹ) — page 4:3 (text-light). */
.gv-search-card--product .gv-search-card__thumb {
    aspect-ratio: 1 / 1;
}

.gv-search-card--post .gv-search-card__thumb {
    aspect-ratio: 4 / 5;
}

.gv-search-card--page .gv-search-card__thumb {
    aspect-ratio: 4 / 3;
}

.gv-search-card__body {
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
}

.gv-search-card__eyebrow {
    margin: 0;
    font-size: 0.625rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-search-card__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.125rem;
    line-height: 1.15;
    letter-spacing: -0.005em;
    color: var(--ink);
}

.gv-search-card__price {
    margin: 0.125rem 0 0;
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.01em;
}

.gv-search-card__price del {
    color: var(--ink-muted);
    margin-right: 0.4em;
    text-decoration: line-through;
}

.gv-search-card__price ins {
    text-decoration: none;
    color: var(--ink);
}

.gv-search-card__price bdi {
    direction: inherit;
}

.gv-search-card__excerpt {
    margin: 0.125rem 0 0;
    font-size: 0.8125rem;
    line-height: 1.5;
    color: var(--ink-muted);
    /* Compact 2-line clamp để card cao đồng đều khi excerpt dài. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

@media (min-width: 1024px) {
    .gv-search-card__title {
        font-size: 1.25rem;
        line-height: 1.1;
    }
}

/* ==========================================================================
   4. Pagination (FacetWP shortcode output)
   ========================================================================== */

.gv-search__pagination {
    margin-top: 4rem;
    padding-top: 2.5rem;
    border-top: 1px solid var(--ink-line);
    display: flex;
    justify-content: center;
}

.gv-search__pagination .facetwp-pager {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0;
}

.gv-search__pagination .facetwp-page {
    min-width: 2.75rem;
    padding: 0.625rem 0.875rem;
    text-align: center;
    background: transparent;
    border: 1px solid var(--ink-line);
    color: var(--ink);
    text-decoration: none;
    font-size: 0.875rem;
    font-weight: 500;
    cursor: pointer;
    transition: background 0.15s ease-out, color 0.15s ease-out;
}

.gv-search__pagination .facetwp-page + .facetwp-page {
    margin-left: -1px;
}

.gv-search__pagination .facetwp-page:hover:not(.active):not([disabled]) {
    background: var(--paper-warm);
}

.gv-search__pagination .facetwp-page.active {
    background: var(--ink);
    color: var(--paper);
    border-color: var(--ink);
}

@media (min-width: 1024px) {
    .gv-search__pagination {
        margin-top: 6rem;
        padding-top: 4rem;
    }
}

/* ==========================================================================
   5. Empty state — eyebrow + title + lead + 3 CTA hairline grid
   ========================================================================== */

.gv-search-empty {
    padding: 3rem 0 1rem;
}

.gv-search-empty__eyebrow {
    margin: 0 0 1.5rem;
    color: var(--ink-muted);
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}

.gv-search-empty__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2rem, 5vw, 3.5rem);
    line-height: 1.05;
    letter-spacing: -0.01em;
    color: var(--ink);
    max-width: 22ch;
}

.gv-search-empty__query {
    font-style: italic;
}

.gv-search-empty__lead {
    margin: 1.5rem 0 0;
    max-width: 38em;
    font-size: 1.125rem;
    line-height: 1.55;
    color: var(--ink-muted);
}

.gv-search-empty__cta {
    margin-top: 3.5rem;
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
    border-top: 1px solid var(--ink-line);
    border-left: 1px solid var(--ink-line);
}

.gv-search-empty__cta-item {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 1.5rem 1.25rem;
    border-right: 1px solid var(--ink-line);
    border-bottom: 1px solid var(--ink-line);
    color: var(--ink);
    text-decoration: none;
    transition: background 0.18s ease-out;
    min-height: 7.5rem;
}

.gv-search-empty__cta-item:hover {
    background: var(--paper-warm);
}

.gv-search-empty__cta-num {
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-search-empty__cta-label {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.625rem;
    line-height: 1.05;
    color: var(--ink);
}

.gv-search-empty__cta-meta {
    margin-top: auto;
    font-size: 0.8125rem;
    color: var(--ink-muted);
    line-height: 1.4;
}

@media (min-width: 640px) {
    .gv-search-empty__cta {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media (min-width: 1024px) {
    .gv-search-empty {
        padding: 4rem 0 2rem;
    }
    .gv-search-empty__title {
        font-size: clamp(2.5rem, 6vw, 4.5rem);
        max-width: 18ch;
    }
    .gv-search-empty__cta-item {
        padding: 2rem 1.5rem;
        min-height: 9rem;
    }
    .gv-search-empty__cta-label {
        font-size: 1.875rem;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/page-stories-mast.css */
/* ==========================================================================
   page-stories-mast.css — /stories editorial header (α "Editorial Index").
   Áp lên template-parts/blocks/stories-mast.php (.gv-stories-mast).

   α pattern: shop-style compact header — eyebrow mono + H1 serif (italic em
   muted) + lead 50ch + chips text-link + count flush right. Không marquee.

   Bám brand-guideline:
   - Mục 5 Typography: Cormorant Garamond display (italic em accent), Inter
     body, JetBrains Mono uppercase meta.
   - Mục 6 Layout/Spacing: container 1400px, hairline border-bottom dividers.
   - Mục 12 PLP/index: tone điềm tĩnh, không CTA fill, ed-link cho text.

   Token color khai báo lại scope `.gv-stories-mast` để self-contained — body
   không có class `home`. Cùng pattern với .gv-shop / .gv-blog.

   Total target ≤ 280px desktop (per spec AC; padding + eyebrow + H1 +
   lead 2-3 lines + chips row).
   ========================================================================== */

.gv-stories-mast {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;

    color: var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
}

.gv-stories-mast *,
.gv-stories-mast *::before,
.gv-stories-mast *::after {
    box-sizing: border-box;
}

.gv-stories-mast a {
    color: inherit;
    text-decoration: none;
}

/* --- Container ---------------------------------------------------------- */

.gv-stories-mast__head,
.gv-stories-mast__chips {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
}

@media (min-width: 1024px) {

    .gv-stories-mast__head,
    .gv-stories-mast__chips {
        padding-left: 2.5rem;
        padding-right: 2.5rem;
    }
}

/* --- Header (eyebrow + H1 + lead) --------------------------------------- */

.gv-stories-mast__head {
    padding-top: 1.75rem;
    padding-bottom: 1.25rem;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-stories-mast__head {
        padding-top: 2rem;
        padding-bottom: 1.4rem;
    }
}

.gv-stories-mast__eyebrow {
    margin: 0 0 0.875rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem; /* 11px */
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-stories-mast__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2rem, 4.4vw, 3.5rem);
    line-height: 1;
    letter-spacing: -0.02em;
    color: var(--ink);
    max-width: 16ch;
}

.gv-stories-mast__title em {
    font-style: italic;
    font-weight: 400;
    color: var(--ink-muted);
}

.gv-stories-mast__lead {
    margin: 0.875rem 0 0;
    max-width: 50ch;
    color: var(--ink-muted);
    font-size: 0.9375rem;
    line-height: 1.55;
}

@media (min-width: 1024px) {
    .gv-stories-mast__lead {
        font-size: 1rem;
    }
}

/* --- Chips row (label + facet + count) ---------------------------------- */

.gv-stories-mast__chips {
    padding-top: 0.875rem;
    padding-bottom: 0.875rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.625rem 1.5rem;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-stories-mast__chips {
        padding-top: 0.9375rem;
        padding-bottom: 0.9375rem;
        flex-wrap: nowrap;
    }
}

.gv-stories-mast__chips-label {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem; /* 10px */
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    flex: 0 0 auto;
}

.gv-stories-mast__facet {
    flex: 1 1 auto;
    min-width: 0;
    overflow-x: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--ink-line) transparent;
}

.gv-stories-mast__facet::-webkit-scrollbar {
    height: 2px;
}

.gv-stories-mast__facet::-webkit-scrollbar-thumb {
    background: var(--ink-line);
}

@media (min-width: 1024px) {
    .gv-stories-mast__facet {
        overflow: visible;
    }
}

/* FacetWP override — text-link Inter (no pill bg) */

.gv-stories-mast__facet .facetwp-facet {
    margin: 0;
    display: flex;
    flex-wrap: nowrap;
    gap: 0.25rem 1.125rem;
    white-space: nowrap;
}

@media (min-width: 1024px) {
    .gv-stories-mast__facet .facetwp-facet {
        flex-wrap: wrap;
        white-space: normal;
    }
}

/* FacetWP plugin gắn `background: url(../css/partials/radio.png/radio-on.png)` cho
   `.facetwp-radio` và `.facetwp-radio.checked`. Specificity (0,2,0) bằng nhau
   → order quyết định, plugin có thể thắng khi JS re-render. Override cả 2
   state để xoá radio image + plugin's padding-left: 20px. */
.gv-stories-mast__facet .facetwp-radio,
.gv-stories-mast__facet .facetwp-radio.checked,
.gv-stories-mast__facet .facetwp-radio.disabled {
    background: none;
    background-image: none;
    padding-left: 0;
}

.gv-stories-mast__facet .facetwp-radio {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    margin: 0;
    padding: 0.25rem 0;
    border: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.78125rem; /* 12.5px */
    font-weight: 400;
    letter-spacing: 0.01em;
    line-height: 1.4;
    color: var(--ink-soft);
    cursor: pointer;
    position: relative;
    flex: 0 0 auto;
    transition: color 0.15s ease-out;
}

.gv-stories-mast__facet .facetwp-radio:hover {
    color: var(--ink);
}

.gv-stories-mast__facet .facetwp-radio.checked {
    color: var(--ink);
    font-weight: 500;
}

.gv-stories-mast__facet .facetwp-radio.checked::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 1px;
    background: var(--ink);
}

.gv-stories-mast__facet .facetwp-radio .facetwp-counter {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    color: var(--ink-muted);
    margin-left: 0.125rem;
}

/* Count flush right */

.gv-stories-mast__count {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.04em;
    color: var(--ink-muted);
    flex: 0 0 auto;
}

@media (min-width: 1024px) {
    .gv-stories-mast__count {
        margin-left: auto;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/archive-product.css */
/* ==========================================================================
   archive-product.css — Group D (Shop / product_cat / product_tag)
   Áp lên woocommerce/archive-product.php override.

   Bám brand-guideline:
   - Mục 5 Typography: Cormorant Garamond display, Inter body, JetBrains Mono meta.
   - Mục 6 Layout/Spacing: container 1400px, padding 56px / 112px.
   - Mục 8 Motion: hover lift -3px + scale 1.03, respect reduced-motion.
   - Mục 12 PLP: giữ shell home, density vừa phải, card-first, filter utility
     không lấn át gallery.
   - Mục 13 Don't: tránh badge sale tràn lan, tránh button fill lớn ở list view.

   Token color (--ink, --paper-warm…) được khai báo lại scope `.gv-shop` để
   archive product self-contained — body không có class `home`. Cùng pattern
   với page-content.css (.gv-page).
   ========================================================================== */

.gv-shop {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;

    color: var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
}

.gv-shop *,
.gv-shop *::before,
.gv-shop *::after {
    box-sizing: border-box;
}

.gv-shop a {
    color: inherit;
    text-decoration: none;
}

.gv-shop ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

/* --- Container ---------------------------------------------------------- */
/* Header dùng container đầy đủ; layout 2-col (.gv-shop-layout) cũng dùng
   container nhưng padding áp lên wrapper, không lên từng block con để sidebar
   có thể flush border-right edge container. */

.gv-shop-header__inner,
.gv-shop-layout {
    width: 100%;
    max-width: 1400px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
}

@media (min-width: 1024px) {
    .gv-shop-header__inner,
    .gv-shop-layout {
        padding-left: 2.5rem;
        padding-right: 2.5rem;
    }
}

/* --- Header ------------------------------------------------------------- */
/* Editorial section intro: eyebrow mono + H1 serif lớn + (optional) hero
   image + lead/description. Padding theo nhịp guideline 56/112. */

.gv-shop-header {
    padding: 3.5rem 0 2rem;
    border-bottom: 1px solid var(--ink-line);
}

.gv-post-breadcrumb + .gv-shop .gv-shop-header {
    padding-top: 1.5rem;
}

.gv-shop-header__inner {
    display: grid;
    gap: 1.5rem;
}

.gv-shop-header__eyebrow {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-shop-header__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.5rem, 6vw, 4.5rem);
    line-height: 0.98;
    letter-spacing: -0.015em;
    color: var(--ink);
}

.gv-shop-header__media {
    width: 100%;
    aspect-ratio: 16 / 9;
    max-height: 360px;
    overflow: hidden;
    background: var(--paper-warm);
    margin-top: 1rem;
}

.gv-shop-header__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.gv-shop-header__lead {
    margin: 0;
    max-width: 38em;
    font-size: 1.0625rem;
    line-height: 1.6;
    color: var(--ink-muted);
}

.gv-shop-header__description {
    max-width: 65ch;
    color: var(--ink-soft);
    font-size: 0.9375rem;
    line-height: 1.7;
}

.gv-shop-header__description > * + * {
    margin-top: 0.75rem;
}

@media (min-width: 1024px) {
    .gv-shop-header {
        padding: 7rem 0 3rem;
    }

    .gv-post-breadcrumb + .gv-shop .gv-shop-header {
        padding-top: 2rem;
    }

    .gv-shop-header__title {
        max-width: 16ch;
    }

    .gv-shop-header__lead {
        font-size: 1.1875rem;
    }
}

/* --- Layout 2-col + sidebar -------------------------------------------- */
/* Desktop ≥1024px: sidebar 280px cố định trái + main grid phải.
   Mobile <1024px: sidebar fixed off-canvas trượt từ trái, mở bằng button
   `.gv-shop-filter-toggle`. Tuân brand-guideline mục 12 PLP — filter là
   utility layer, không lấn gallery. */

.gv-shop-layout {
    display: block;
    padding-top: 1.5rem;
    padding-bottom: 1rem;
}

.gv-shop-main {
    min-width: 0; /* prevent grid blowout từ products grid */
}

@media (min-width: 1024px) {
    .gv-shop-layout {
        display: grid;
        grid-template-columns: 280px 1fr;
        gap: 2.5rem;
        padding-top: 0;
        padding-bottom: 0;
    }
}

/* --- Sidebar ------------------------------------------------------------- */

.gv-shop-sidebar {
    background: var(--paper-warm);
    padding: 2rem 1.25rem;
}

.gv-shop-sidebar__close {
    display: none; /* chỉ hiện ở mobile drawer */
    position: absolute;
    top: 1rem;
    right: 1rem;
    width: 2.5rem;
    height: 2.5rem;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: 0;
    color: var(--ink);
    font-size: 1.5rem;
    line-height: 1;
    cursor: pointer;
    padding: 0;
}

.gv-shop-facet + .gv-shop-facet {
    margin-top: 2.25rem;
    padding-top: 2rem;
    border-top: 1px solid var(--ink-line);
}

.gv-shop-facet__heading {
    margin: 0 0 1rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    line-height: 1.2;
}

/* Desktop sidebar — sticky, paper-warm border-right ink-line. */
@media (min-width: 1024px) {
    .gv-shop-sidebar {
        position: sticky;
        top: 6rem; /* xấp xỉ chiều cao header */
        align-self: start;
        max-height: calc(100vh - 7rem);
        overflow-y: auto;
        padding: 2.5rem 2rem 2.5rem 0;
        background: transparent;
        border-right: 1px solid var(--ink-line);
        scrollbar-width: thin;
        scrollbar-color: var(--ink-line) transparent;
    }

    .gv-shop-sidebar::-webkit-scrollbar {
        width: 3px;
    }

    .gv-shop-sidebar::-webkit-scrollbar-thumb {
        background: var(--ink-line);
    }
}

/* Mobile drawer — fixed off-canvas L→R, paper full-cover, slide trừ khi
   reduced-motion. Default ẩn (translateX -100%); mở khi `.is-open`. */
@media (max-width: 1023.98px) {
    .gv-shop-sidebar {
        position: fixed;
        top: 0;
        left: 0;
        bottom: 0;
        width: min(320px, 86vw);
        z-index: 60;
        background: var(--paper);
        padding: 4rem 1.5rem 2rem;
        overflow-y: auto;
        transform: translateX(-100%);
        transition: transform 0.3s ease-out;
        box-shadow: 0 0 0 0 transparent;
    }

    .gv-shop-sidebar.is-open {
        transform: translateX(0);
        box-shadow: 1px 0 24px rgba(10, 10, 10, 0.08);
    }

    .gv-shop-sidebar__close {
        display: inline-flex;
    }
}

@media (max-width: 1023.98px) and (prefers-reduced-motion: reduce) {
    .gv-shop-sidebar {
        transition: none;
        transform: translateX(-100%);
    }

    .gv-shop-sidebar.is-open {
        transform: translateX(0);
    }
}

/* --- Filter toggle button (mobile only) -------------------------------- */
/* `ed-link` style: italic serif Cormorant, underline expand on hover.
   Brand-guideline mục 13 Don't: tránh button fill lớn ở list view. */

.gv-shop-filter-toggle {
    position: relative;
    display: inline-flex;
    align-items: center;
    margin: 0;
    padding: 0;
    background: transparent;
    color: var(--ink);
    border: 0;
    border-radius: 0;
    box-shadow: none;
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-weight: 500;
    font-size: 1.0625rem;
    line-height: 1.2;
    letter-spacing: 0;
    text-transform: none;
    cursor: pointer;
    align-self: flex-start;
}

.gv-shop-filter-toggle::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -0.25rem;
    height: 1px;
    background: currentColor;
    transform-origin: left;
    transition: transform 0.35s ease-out;
}

.gv-shop-filter-toggle:hover::after {
    transform: scaleX(1.05);
}

@media (min-width: 1024px) {
    .gv-shop-filter-toggle {
        display: none;
    }
}

/* --- Overlay (mobile drawer backdrop) ---------------------------------- */

.gv-shop-overlay {
    position: fixed;
    inset: 0;
    z-index: 50;
    background: rgba(10, 10, 10, 0.4);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease-out;
}

.gv-shop-overlay[hidden] {
    display: block; /* override [hidden] để dùng opacity transition */
}

.gv-shop-overlay.is-open {
    opacity: 1;
    pointer-events: auto;
}

@media (min-width: 1024px) {
    .gv-shop-overlay {
        display: none;
    }
}

@media (prefers-reduced-motion: reduce) {
    .gv-shop-overlay {
        transition: none;
    }
}

/* Body scroll lock khi drawer mở — KHÔNG scope `.gv-shop` vì class trên body. */

/* --- FacetWP scope (sidebar) ------------------------------------------- */
/* FacetWP markup theo type:
   - Checkboxes: `.facetwp-checkbox` (clickable div, multi-select)
   - Radio:      `.facetwp-radio`    (clickable div, single-select)
   Hai type chung styling pill-button — mỗi facet item là 1 row button paper
   border-line; checked = solid ink; counter mono inline-end. Bỏ icon
   ○/☐/◉/☑ mặc định FacetWP (background-image) để tone editorial. */

.gv-shop-sidebar .facetwp-facet {
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
}

.gv-shop-sidebar .facetwp-checkbox,
.gv-shop-sidebar .facetwp-radio {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    padding: 0.5rem 0.875rem !important; /* override FacetWP padding-left ~24px cho icon */
    background: var(--paper) !important; /* reset FacetWP inline bg */
    color: var(--ink-soft);
    border: 1px solid var(--ink-line);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.3;
    cursor: pointer;
    background-image: none !important; /* FacetWP đính icon dưới dạng BG image */
    transition: background 0.2s ease-out, color 0.2s ease-out, border-color 0.2s ease-out;
}

.gv-shop-sidebar .facetwp-checkbox:hover,
.gv-shop-sidebar .facetwp-radio:hover {
    color: var(--ink);
    border-color: var(--ink);
}

.gv-shop-sidebar .facetwp-checkbox.checked,
.gv-shop-sidebar .facetwp-radio.checked {
    background: var(--ink) !important;
    color: var(--paper);
    border-color: var(--ink);
    font-weight: 500;
}

/* Phân biệt semantic checkbox vs radio: checkbox checked thêm `✓` ở đầu
   row (multi-select có dấu tích), radio chỉ solid bg (single-select đảo
   màu là đủ). */
.gv-shop-sidebar .facetwp-checkbox.checked::before {
    content: '\2713'; /* ✓ */
    flex: 0 0 auto;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    font-weight: 600;
    line-height: 1;
    margin-right: -0.125rem;
}

.gv-shop-sidebar .facetwp-checkbox.checked .facetwp-counter,
.gv-shop-sidebar .facetwp-radio.checked .facetwp-counter {
    color: rgba(255, 255, 255, 0.7);
}

.gv-shop-sidebar .facetwp-checkbox.disabled,
.gv-shop-sidebar .facetwp-radio.disabled {
    opacity: 0.35;
    cursor: default;
}

.gv-shop-sidebar .facetwp-checkbox.disabled:hover,
.gv-shop-sidebar .facetwp-radio.disabled:hover {
    color: var(--ink-soft);
    border-color: var(--ink-line);
    background: var(--paper) !important;
}

.gv-shop-sidebar .facetwp-counter {
    margin-left: auto;
    flex: 0 0 auto;
    color: var(--ink-muted);
    font-family: 'JetBrains Mono', ui-monospace, monospace;
    font-size: 0.6875rem;
    font-style: normal;
    letter-spacing: 0.02em;
}

/* Hierarchical depth — child term thụt vào nhẹ. */
.gv-shop-sidebar .facetwp-depth {
    margin-left: 0.875rem;
}

/* Loading state — FacetWP add `.facetwp-loading` lên template khi AJAX. */
.facetwp-template.is-faceted-loading,
.facetwp-template.facetwp-loading {
    opacity: 0.5;
    pointer-events: none;
    transition: opacity 0.2s ease-out;
}

/* --- Toolbar (result count + ordering) ---------------------------------- */
/* WooCommerce render `.woocommerce-result-count` (p) và
   `.woocommerce-ordering` (form > select.orderby) bên trong
   `do_action('woocommerce_before_shop_loop')`. Giữ y nguyên markup, tô lại
   typography + spacing. Mobile: stack; desktop: space-between. */

.gv-shop-toolbar {
    padding-top: 1.5rem;
    padding-bottom: 1.5rem;
    margin-top: 0;
    border-bottom: 1px solid var(--ink-line);
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

@media (min-width: 768px) {
    .gv-shop-toolbar {
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: 1.5rem;
    }
}

.gv-shop-toolbar .woocommerce-result-count,
.gv-shop-toolbar p.woocommerce-result-count {
    margin: 0;
    color: var(--ink-muted);
    font-size: 0.8125rem;
    line-height: 1.4;
    letter-spacing: 0.01em;
}

.gv-shop-toolbar .woocommerce-ordering {
    margin: 0;
}

.gv-shop-toolbar .woocommerce-ordering select.orderby {
    appearance: none;
    -webkit-appearance: none;
    background: transparent;
    border: 0;
    border-bottom: 1px solid var(--ink);
    border-radius: 0;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.4;
    padding: 0.4rem 1.75rem 0.4rem 0;
    background-image: linear-gradient(45deg, transparent 50%, var(--ink) 50%),
        linear-gradient(135deg, var(--ink) 50%, transparent 50%);
    background-position: calc(100% - 12px) 55%, calc(100% - 7px) 55%;
    background-size: 5px 5px, 5px 5px;
    background-repeat: no-repeat;
    cursor: pointer;
    transition: border-color 0.2s ease-out;
}

.gv-shop-toolbar .woocommerce-ordering select.orderby:focus {
    outline: none;
    border-bottom-color: var(--ink);
}

/* WooCommerce notices nằm trong woocommerce_before_shop_loop — tô neutral. */
.gv-shop-toolbar .woocommerce-notices-wrapper:empty {
    display: none;
}

.gv-shop-toolbar .woocommerce-notices-wrapper {
    width: 100%;
    order: -1;
}

/* --- Product grid (Woo default loop) ------------------------------------ */
/* Selector mặc định: `ul.products` chứa `li.product` (xem
   loop/loop-start.php). Override grid-layout, gap, card. */

.gv-shop-grid {
    padding-top: 2.5rem;
    padding-bottom: 3.5rem;
}

.gv-shop-grid ul.products,
.gv-shop-grid .products {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.75rem 1rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.gv-shop-grid ul.products::before,
.gv-shop-grid ul.products::after {
    /* WC dùng clearfix legacy ::before/::after — disable để grid sạch. */
    display: none;
    content: none;
}

.gv-shop-grid ul.products li.product,
.gv-shop-grid .products li.product {
    width: auto !important;
    max-width: none !important;
    margin: 0 !important;
    padding: 0;
    float: none !important;
    clear: none !important;
    list-style: none;
    background: transparent;
    border: 0;
    transition: transform 0.35s ease-out;
}

.gv-shop-grid ul.products li.product:hover {
    transform: translateY(-3px);
}

/* Product link wrapper (woocommerce_template_loop_product_link_open). */
.gv-shop-grid ul.products li.product > a.woocommerce-LoopProduct-link {
    display: block;
    color: inherit;
    text-decoration: none;
    overflow: hidden;
    background: var(--paper-warm);
}

/* Product thumbnail (woocommerce_template_loop_product_thumbnail). */
.gv-shop-grid ul.products li.product img,
.gv-shop-grid ul.products li.product .attachment-woocommerce_thumbnail {
    width: 100%;
    height: 100%;
    aspect-ratio: 4 / 5;
    object-fit: cover;
    margin: 0;
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

.gv-shop-grid ul.products li.product:hover img,
.gv-shop-grid ul.products li.product:hover .attachment-woocommerce_thumbnail {
    transform: scale(1.03);
    filter: brightness(1.04);
}

/* Sale flash badge — minimal pill ink-on-paper. */
.gv-shop-grid ul.products li.product .onsale,
.gv-shop-grid ul.products li.product span.onsale {
    position: absolute;
    top: 0.75rem;
    left: 0.75rem;
    z-index: 2;
    padding: 0.25rem 0.625rem;
    background: var(--ink);
    color: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    line-height: 1.2;
    border-radius: 0;
    border: 0;
    margin: 0;
    min-height: auto;
    min-width: auto;
}

/* Để onsale absolute hoạt động — link wrapper relative. */
.gv-shop-grid ul.products li.product {
    position: relative;
}

/* Title (woocommerce_template_loop_product_title -> h2/h3.woocommerce-loop-product__title). */
.gv-shop-grid ul.products li.product .woocommerce-loop-product__title,
.gv-shop-grid ul.products li.product h2,
.gv-shop-grid ul.products li.product h3 {
    margin: 0.875rem 0 0;
    padding: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.25rem;
    line-height: 1.15;
    letter-spacing: -0.005em;
    color: var(--ink);
}

/* Price (woocommerce_template_loop_price). */
.gv-shop-grid ul.products li.product .price,
.gv-shop-grid ul.products li.product span.price {
    display: block;
    margin: 0.5rem 0 0;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    letter-spacing: 0.04em;
    line-height: 1.4;
}

.gv-shop-grid ul.products li.product .price del {
    color: var(--ink-muted);
    opacity: 1;
    margin-right: 0.5rem;
}

.gv-shop-grid ul.products li.product .price ins {
    background: transparent;
    color: var(--ink);
    text-decoration: none;
    font-weight: 500;
}

/* Star rating (woocommerce_template_loop_rating). */
.gv-shop-grid ul.products li.product .star-rating {
    margin: 0.5rem 0 0;
    font-size: 0.75rem;
    color: var(--ink);
}

/* Add-to-cart link/button (woocommerce_template_loop_add_to_cart -> a.button).
   Tô như `ed-link` editorial: italic serif, underline expand on hover.
   Tránh button fill lớn để giữ tone PLP editorial (guideline mục 12 + Don't). */
.gv-shop-grid ul.products li.product .button,
.gv-shop-grid ul.products li.product a.button,
.gv-shop-grid ul.products li.product .add_to_cart_button,
.gv-shop-grid ul.products li.product a.add_to_cart_button {
    position: relative;
    display: inline-flex;
    align-items: center;
    margin: 0.875rem 0 0;
    padding: 0;
    background: transparent;
    color: var(--ink);
    border: 0;
    border-radius: 0;
    box-shadow: none;
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-weight: 500;
    font-size: 1rem;
    line-height: 1.2;
    letter-spacing: 0;
    text-transform: none;
    text-decoration: none;
    min-height: auto;
    cursor: pointer;
    transition: color 0.2s ease-out;
}

.gv-shop-grid ul.products li.product .button::after,
.gv-shop-grid ul.products li.product a.button::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -0.25rem;
    height: 1px;
    background: currentColor;
    transform-origin: left;
    transition: transform 0.35s ease-out;
}

.gv-shop-grid ul.products li.product .button:hover::after,
.gv-shop-grid ul.products li.product a.button:hover::after {
    transform: scaleX(1.05);
}

.gv-shop-grid ul.products li.product .added_to_cart {
    display: inline-block;
    margin: 0.5rem 0 0 0.875rem;
    color: var(--ink-muted);
    font-size: 0.8125rem;
}

@media (min-width: 768px) {
    .gv-shop-grid ul.products,
    .gv-shop-grid .products {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: 2rem 1.25rem;
    }
}

@media (min-width: 1024px) {
    .gv-shop-grid {
        padding-top: 3.5rem;
        padding-bottom: 5rem;
    }

    .gv-shop-grid ul.products,
    .gv-shop-grid .products {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 2.5rem 1.5rem;
    }

    .gv-shop-grid ul.products li.product .woocommerce-loop-product__title,
    .gv-shop-grid ul.products li.product h2,
    .gv-shop-grid ul.products li.product h3 {
        font-size: 1.375rem;
    }
}

/* --- Pagination --------------------------------------------------------- */
/* WC pagination markup: `nav.woocommerce-pagination > ul.page-numbers > li`.
   Editorial: số trang inline, current ink solid underline, prev/next hiển
   thị text "Trước"/"Tiếp" thay icon. */

.gv-shop-pagination {
    padding-top: 2rem;
    padding-bottom: 4rem;
    border-top: 1px solid var(--ink-line);
}

.gv-shop-pagination .woocommerce-pagination {
    margin: 0;
    text-align: center;
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    margin: 0;
    padding: 0;
    list-style: none;
    border: 0;
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li {
    margin: 0;
    padding: 0;
    border: 0;
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li .page-numbers {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.5rem;
    padding: 0.5rem 0.75rem;
    background: transparent;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    letter-spacing: 0.04em;
    line-height: 1.2;
    border: 1px solid transparent;
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li a.page-numbers:hover {
    color: var(--ink);
    border-color: var(--ink-line);
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li span.page-numbers.current {
    color: var(--ink);
    border-color: var(--ink);
    text-decoration: none;
    font-weight: 600;
}

/* Prev / Next text override — WC mặc định icon. Dùng pseudo ::before để
   thay vì hiện "← Previous"/"Next →" gốc. WC text vẫn ở trong, ta hide
   bằng font-size 0 rồi inject. */
.gv-shop-pagination .woocommerce-pagination ul.page-numbers li a.prev,
.gv-shop-pagination .woocommerce-pagination ul.page-numbers li a.next {
    font-size: 0;
    line-height: 0;
    color: var(--ink);
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li a.prev::before {
    content: '\2190 \00a0 Tr\01B0\1EDB c';
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.2;
    letter-spacing: 0.02em;
    font-style: italic;
}

.gv-shop-pagination .woocommerce-pagination ul.page-numbers li a.next::before {
    content: 'Ti\1EBF p \00a0 \2192';
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    line-height: 1.2;
    letter-spacing: 0.02em;
    font-style: italic;
}

/* FacetWP pager facet — markup mặc định:
   `.facetwp-facet-page_number > .facetwp-page[.active]`. Match style
   editorial của WC pagination để consistency. */
.gv-shop-pagination .facetwp-facet-page_number {
    margin: 0;
    text-align: center;
}

.gv-shop-pagination .facetwp-page {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.5rem;
    margin: 0 0.125rem;
    padding: 0.5rem 0.75rem;
    background: transparent;
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    letter-spacing: 0.04em;
    line-height: 1.2;
    border: 1px solid transparent;
    cursor: pointer;
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

.gv-shop-pagination .facetwp-page:hover {
    color: var(--ink);
    border-color: var(--ink-line);
}

.gv-shop-pagination .facetwp-page.active {
    color: var(--ink);
    border-color: var(--ink);
    font-weight: 600;
    cursor: default;
}

.gv-shop-pagination .facetwp-page.first,
.gv-shop-pagination .facetwp-page.last,
.gv-shop-pagination .facetwp-page.prev,
.gv-shop-pagination .facetwp-page.next {
    font-style: italic;
}

/* --- Empty state -------------------------------------------------------- */
/* WC `wc_no_products_found` render `<p class="woocommerce-info">…</p>`.
   Editorial paper-warm panel. */

.gv-shop-empty {
    padding-top: 3rem;
    padding-bottom: 4rem;
}

.gv-shop-empty .woocommerce-info,
.gv-shop-empty p.woocommerce-info {
    margin: 0;
    padding: 2rem 1.5rem;
    background: var(--paper-warm);
    border: 0;
    border-left: 2px solid var(--ink);
    color: var(--ink-soft);
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1.25rem;
    line-height: 1.4;
}

@media (min-width: 1024px) {
    .gv-shop-empty {
        padding-top: 5rem;
        padding-bottom: 6rem;
    }

    .gv-shop-empty .woocommerce-info {
        padding: 3rem 2.5rem;
        font-size: 1.5rem;
    }
}

/* --- Reduced motion ----------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .gv-shop-grid ul.products li.product,
    .gv-shop-grid ul.products li.product img,
    .gv-shop-grid ul.products li.product .attachment-woocommerce_thumbnail,
    .gv-shop-grid ul.products li.product .button::after {
        transition: none !important;
    }

    .gv-shop-grid ul.products li.product:hover {
        transform: none;
    }

    .gv-shop-grid ul.products li.product:hover img,
    .gv-shop-grid ul.products li.product:hover .attachment-woocommerce_thumbnail {
        transform: none;
        filter: none;
    }
}

/* --- Body scroll lock (drawer mở) -------------------------------------- */
/* Không scope `.gv-shop` vì class trên `body`. Áp khi
   `assets/js/modules/shop-filter-drawer.js` toggle class. */

body.is-shop-filter-open {
    overflow: hidden;
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/single-product.css */
/* ==========================================================================
   single-product.css — Group E (PDP)

   Áp lên page do WooCommerce render khi `is_singular('product')`. Theme
   override `woocommerce/single-product.php` (canonical) và
   `woocommerce/single-product/related.php` (editorial grid). Layout PDP
   được áp bằng CSS grid trên `.product` — không cần JS DOM move.

   Brand rules theo guideline mục 12 — PDP:
   - Ảnh và chất liệu là hero → gallery cột rộng hơn summary.
   - CTA rõ hơn home nhưng vẫn điềm tĩnh → button ink solid, không glow.
   - Info kỹ thuật chia block bằng divider mảnh → meta border-top 1px ink-line.

   Tokens (--ink, --paper, …) được khai báo ở `body.home / .gv-home` trong
   base.css. Ở đây re-scope cho `body.single-product` để CSS không bị "khô".
   ========================================================================== */

/* --- Token re-scope cho PDP body class ---------------------------------- */

body.single-product {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    background: var(--paper);
}

body.single-product .gv-woo,
body.single-product .gv-woo *,
body.single-product .gv-woo *::before,
body.single-product .gv-woo *::after {
    box-sizing: border-box;
}

body.single-product .gv-woo a {
    color: inherit;
    text-decoration: none;
}

body.single-product .gv-woo img {
    display: block;
    max-width: 100%;
}

/* --- Container ----------------------------------------------------------- */
/* WC mặc định gói nội dung trong `.woocommerce-notices-wrapper` + content
   wrapper. Đặt max-width + padding trên `.gv-woo` để khớp shell home. */

body.single-product .gv-woo {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 24px 1.25rem 80px;
}

@media (min-width: 1024px) {
    body.single-product .gv-woo {
        padding: 40px 2.5rem 112px;
    }
}

/* --- Breadcrumb ---------------------------------------------------------- */
/* WC output `.woocommerce-breadcrumb` ở `woocommerce_before_main_content`. */

body.single-product .woocommerce-breadcrumb {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    padding: 0 0 24px;
    border-bottom: 1px solid var(--ink-line);
    margin-bottom: 40px;
}

body.single-product .woocommerce-breadcrumb a {
    color: var(--ink-muted);
    transition: color 0.2s ease-out;
}

body.single-product .woocommerce-breadcrumb a:hover {
    color: var(--ink);
}

@media (min-width: 1024px) {
    body.single-product .woocommerce-breadcrumb {
        margin-bottom: 56px;
    }
}

/* --- Layout 2 cột editorial — `.gv-pdp-grid` --------------------------- */
/* Theme override `woocommerce/content-single-product.php` xuất:
   <div id="product-XX" class="gv-pdp product ...">
     <div class="gv-pdp-grid">
       <section class="gv-pdp-left">    ← gallery (1+2 grid) + description + attributes + reviews
         .woocommerce-product-gallery   ← grid: ảnh #1 big phải, #2-#3 stacked trái
         .gv-pdp-section.gv-pdp-description
         .gv-pdp-section.gv-pdp-attributes
         .gv-pdp-section.gv-pdp-reviews
       <aside class="gv-pdp-right">     ← buy-box full không max-height
         .summary.entry-summary         ← title + rating + price + excerpt + ATC + addons + meta
     </div>
     .gv-pdp-crosssells + .upsells.products + .gv-pdp-related (full-width)
   </div>

   Mobile (<960px): grid → block, .gv-pdp-right margin-top 32px → rớt
   xuống dưới .gv-pdp-left (gallery hiện trước, ATC sau).
*/

body.single-product div.product.gv-pdp {
    display: block;
    position: relative;
}

body.single-product .gv-pdp-grid {
    display: block;
}

body.single-product .gv-pdp-left,
body.single-product .gv-pdp-right {
    margin: 0;
    width: 100%;
    float: none;
}

body.single-product .gv-pdp-right {
    margin-top: 32px;
}

/* Mobile <960px: visual order gallery → buybox → description/specs để CTA gần
   ảnh, không phải cuộn qua hết tab description rồi mới chạm buybox. DOM giữ
   nguyên (gv-pdp-section vẫn nằm trong .gv-pdp-left) — dùng `display: contents`
   bung children left ra cấp .gv-pdp-grid rồi flexbox `order` reorder. */
@media (max-width: 959.98px) {
    body.single-product .gv-pdp-grid {
        display: flex;
        flex-direction: column;
    }

    body.single-product .gv-pdp-left {
        display: contents;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery {
        order: 1;
    }

    body.single-product .gv-pdp-right {
        order: 2;
    }

    body.single-product .gv-pdp-left .gv-pdp-section {
        order: 3;
    }
}

@media (min-width: 960px) {
    body.single-product .gv-pdp-grid {
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        column-gap: 56px;
        align-items: start;
    }

    body.single-product .gv-pdp-left {
        grid-column: 1;
        grid-row: 1;
    }

    body.single-product .gv-pdp-right {
        grid-column: 2;
        grid-row: 1;
        margin-top: 0;
        /* Sticky — buybox theo cuộn để CTA luôn trong tầm tay khi user lướt
           qua gallery dài bên trái. `top: 96px` đủ chừa header, `max-height`
           + `overflow-y: auto` chống vượt viewport (nếu buybox cao hơn vh do
           nhiều addon/variation). Default sticky behavior đã đảm bảo: buybox
           xuất phát ở vị trí tự nhiên trong grid → user thấy đủ nội dung khi
           gallery cuộn qua → khi top buybox chạm 96px thì stick. */
        position: sticky;
        top: 96px;
        /* max-height: calc(100vh - 112px); */
        overflow-y: auto;
    }
}

@media (min-width: 1280px) {
    body.single-product .gv-pdp-grid {
        column-gap: 64px;
    }
}

/* --- Gallery layout (override FlexSlider mặc định) ---------------------- */
/* WC mặc định gói gallery trong FlexSlider 1 ảnh + thumb strip.
   Desktop ≥960px: vertical stack — mỗi ảnh 1 dòng full-width, cuộn cùng page.
   Mobile <960px: horizontal scroll snap dạng "slide 1.5" — mỗi item ~75%
   viewport width, peek ~25% ảnh kế tiếp để hint user vuốt sang. */

body.single-product .gv-pdp-left .woocommerce-product-gallery {
    background: transparent;
    opacity: 1 !important; /* override inline `opacity:0` mà FlexSlider set */
}

/* === Desktop ≥960px: masonry grid 2-col, tối ưu không gian === */
/* WC core JS init FlexSlider → inject `<div class="flex-viewport">` bao quanh
   wrapper với inline `overflow:hidden; height:<1ảnh>`. Phải override viewport
   này nếu không sẽ chỉ thấy ảnh #1.
   Pattern editorial: ảnh #1 luôn span full-width làm hero; các ảnh tiếp theo
   chia 2 cột (1 hàng có 2 ảnh). Nếu tổng số ảnh chẵn (2, 4, 6…), ảnh cuối ở
   vị trí even cũng full-width để khỏi để trống 1 cột. */
@media (min-width: 960px) {
    body.single-product .gv-pdp-left .flex-viewport {
        height: auto !important;
        overflow: visible !important;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper {
        display: grid !important;
        grid-template-columns: 1fr 1fr;
        gap: 16px;
        transform: none !important;
        width: 100% !important;
        height: auto !important;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper
        > .woocommerce-product-gallery__image,
    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper > div {
        width: auto !important;
        float: none !important;
        margin: 0 !important;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper > :first-child,
    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper > :nth-child(even):last-child {
        grid-column: 1 / -1;
    }

    body.single-product .gv-pdp-left .flex-control-thumbs,
    body.single-product .gv-pdp-left .flex-direction-nav {
        display: none !important;
    }
}

/* === Mobile <960px: horizontal slide 1.5 (peek next) === */
@media (max-width: 959.98px) {
    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper {
        display: flex !important;
        flex-direction: row;
        gap: 12px;
        overflow-x: auto;
        scroll-snap-type: x mandatory;
        scroll-behavior: smooth;
        scrollbar-width: none;
        -webkit-overflow-scrolling: touch;
        transform: none !important;
        width: 100% !important;
        height: auto !important;
        /* Cho phép card thoát khỏi padding của container để snap đẹp tới mép trái. */
        margin-inline: -1.25rem;
        padding-inline: 1.25rem;
        padding-bottom: 4px;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper::-webkit-scrollbar {
        display: none;
    }

    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper
        > .woocommerce-product-gallery__image,
    body.single-product .gv-pdp-left .woocommerce-product-gallery__wrapper > div {
        flex: 0 0 75%;
        scroll-snap-align: start;
        scroll-snap-stop: always;
        float: none !important;
        margin: 0 !important;
    }

    body.single-product .gv-pdp-left .flex-control-thumbs,
    body.single-product .gv-pdp-left .flex-direction-nav {
        display: none !important;
    }
}

/* --- Variation image swap (option A — fallback gallery default) -------- */
/* Khi user chọn đủ attribute, JS (xem `pdp.php`) toggle
   `data-variation-active="true"` trên `.gv-pdp` CHỈ KHI variation có
   image riêng (`variation.image_id !== default_image_id`). Nếu variation
   fallback ảnh parent → JS không set attribute → gallery hiển thị nguyên.
   CSS ẩn các ảnh #2-N để gallery chỉ còn ảnh variation đã được Woo swap
   ở vị trí đầu (cột phải bự khi desktop, slide 1.5 đầu khi mobile). */

body.single-product .gv-pdp[data-variation-active="true"]
    .woocommerce-product-gallery__wrapper
    > .woocommerce-product-gallery__image:not(:first-child),
body.single-product .gv-pdp[data-variation-active="true"]
    .woocommerce-product-gallery__wrapper
    > div:not(:first-child) {
    display: none !important;
}

/* --- Tabs (description + specs) ----------------------------------------- */
/* Cột trái dùng tab system thay vì stack vertical 2 section. Reviews vẫn
   là section riêng dưới tabs. Markup từ `content-single-product.php`:
     .gv-pdp-tabs[data-pdp-tabs]
       > .gv-pdp-tabs__nav (role=tablist)
         > .gv-pdp-tabs__tab (role=tab) × N
       > .gv-pdp-tabs__panel.is-active (role=tabpanel)
   JS trong `includes/pdp.php` listen click trên tab → toggle is-active. */

body.single-product .gv-pdp-tabs__nav {
    list-style: none;
    margin: 0 0 24px;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 32px;
    border-bottom: 1px solid var(--ink-line);
}

body.single-product .gv-pdp-tabs__nav li {
    margin: 0;
    padding: 0;
    background: transparent;
    border: 0;
}

body.single-product .gv-pdp-tabs__tab {
    padding: 0 0 12px;
    background: transparent;
    border: 0;
    border-bottom: 2px solid transparent;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    cursor: pointer;
    margin-bottom: -1px; /* overlap với border-bottom của nav */
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

body.single-product .gv-pdp-tabs__tab:hover {
    color: var(--ink);
}

body.single-product .gv-pdp-tabs__tab.is-active {
    color: var(--ink);
    border-bottom-color: var(--ink);
}

body.single-product .gv-pdp-tabs__tab:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 4px;
}

body.single-product .gv-pdp-tabs__panel {
    padding-top: 8px;
}

body.single-product .gv-pdp-tabs__panel[hidden] {
    display: none;
}

/* --- Left-column sections (description, attributes, reviews) -------------- */

body.single-product .gv-pdp-section {
    margin-top: 56px;
    padding-top: 48px;
    border-top: 1px solid var(--ink-line);
}

body.single-product .gv-pdp-section .gv-meta-label {
    margin: 0 0 12px;
}

body.single-product .gv-pdp-description__body {
    font-size: 1rem;
    line-height: 1.75;
    color: var(--ink-soft);
    max-width: 56ch;
}

body.single-product .gv-pdp-description__body p,
body.single-product .gv-pdp-description__body ul,
body.single-product .gv-pdp-description__body ol {
    margin: 0 0 12px;
}

body.single-product .gv-pdp-description__body ul,
body.single-product .gv-pdp-description__body ol {
    padding-left: 1.25rem;
}

body.single-product .gv-pdp-description__body p:last-child,
body.single-product .gv-pdp-description__body ul:last-child,
body.single-product .gv-pdp-description__body ol:last-child {
    margin-bottom: 0;
}

body.single-product .gv-pdp-attributes table.shop_attributes,
body.single-product .gv-pdp-attributes .woocommerce-product-attributes {
    width: 100%;
    border-collapse: collapse;
    margin: 0;
}

body.single-product .gv-pdp-attributes table.shop_attributes th,
body.single-product .gv-pdp-attributes table.shop_attributes td,
body.single-product .gv-pdp-attributes .woocommerce-product-attributes th,
body.single-product .gv-pdp-attributes .woocommerce-product-attributes td {
    padding: 12px 0;
    border: 0;
    border-bottom: 1px solid var(--ink-line);
    background: transparent;
    text-align: left;
    font-style: normal;
}

body.single-product .gv-pdp-attributes table.shop_attributes th,
body.single-product .gv-pdp-attributes .woocommerce-product-attributes th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
    width: 30%;
}

body.single-product .gv-pdp-attributes table.shop_attributes td,
body.single-product .gv-pdp-attributes .woocommerce-product-attributes td {
    font-size: 0.9375rem;
    color: var(--ink);
}

body.single-product .gv-pdp-reviews #reviews #comments ol.commentlist {
    list-style: none;
    margin: 0;
    padding: 0;
}

body.single-product .gv-pdp-reviews #reviews #comments ol.commentlist li.review {
    margin: 0 0 24px;
    padding: 0 0 24px;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    body.single-product .gv-pdp-section {
        margin-top: 80px;
        padding-top: 64px;
    }
}

/* --- Gallery (images) ---------------------------------------------------- */
/* WC `.woocommerce-product-gallery` có wrapper FlexSlider; chỉ chỉnh visual,
   không can thiệp logic (zoom/lightbox đã được theme bật ở after_setup_theme). */

body.single-product .woocommerce-product-gallery {
    position: relative;
    background: var(--paper-warm);
}

body.single-product .woocommerce-product-gallery__image {
    aspect-ratio: 4 / 5;
    overflow: hidden;
    background: var(--paper-warm);
}

body.single-product .woocommerce-product-gallery__image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

body.single-product .flex-control-thumbs {
    list-style: none;
    margin: 12px 0 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 8px;
}

body.single-product .flex-control-thumbs li {
    margin: 0;
}

body.single-product .flex-control-thumbs img {
    aspect-ratio: 1 / 1;
    object-fit: cover;
    cursor: pointer;
    opacity: 0.7;
    transition: opacity 0.2s ease-out;
}

body.single-product .flex-control-thumbs img:hover,
body.single-product .flex-control-thumbs img.flex-active {
    opacity: 1;
}

body.single-product .woocommerce-product-gallery__trigger {
    position: absolute;
    top: 16px;
    right: 16px;
    z-index: 5;
    width: 40px;
    height: 40px;
    background: var(--paper);
    color: var(--ink);
    border: 1px solid var(--ink-line);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0;
    text-decoration: none;
}

body.single-product .woocommerce-product-gallery__trigger::before {
    content: '⌖';
    font-size: 18px;
    line-height: 1;
}

body.single-product p.stock {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin: 16px 0 0;
}

body.single-product p.stock.out-of-stock {
    color: var(--ink);
}

/* --- Sale flash ---------------------------------------------------------- */

body.single-product .onsale {
    position: absolute;
    top: 16px;
    left: 16px;
    z-index: 4;
    background: var(--ink);
    color: var(--paper);
    padding: 8px 12px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
}

/* --- Summary: title + rating + price + excerpt + form + meta ------------- */

body.single-product .summary .product_title {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(2rem, 5vw, 3.25rem);
    line-height: 1.05;
    letter-spacing: -0.02em;
    margin: 0 0 16px;
    font-weight: 400;
}

body.single-product .summary .woocommerce-product-rating {
    margin: 0 0 16px;
    font-size: 0.8125rem;
    color: var(--ink-muted);
}

body.single-product .summary .star-rating {
    color: var(--ink);
}

body.single-product .summary .price {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.5rem, 3vw, 2rem);
    line-height: 1.1;
    color: var(--ink);
    margin: 0 0 24px;
    padding-bottom: 24px;
    border-bottom: 1px solid var(--ink-line);
}

body.single-product .summary .price del {
    color: var(--ink-muted);
    margin-right: 12px;
    font-size: 0.85em;
}

body.single-product .summary .price ins {
    background: transparent;
    text-decoration: none;
    color: var(--ink);
    font-weight: 500;
}

body.single-product .summary .woocommerce-product-details__short-description {
    font-size: 1rem;
    line-height: 1.7;
    color: var(--ink-soft);
    margin: 0 0 32px;
}

body.single-product .summary .woocommerce-product-details__short-description p {
    margin: 0 0 12px;
}

body.single-product .summary .woocommerce-product-details__short-description p:last-child {
    margin-bottom: 0;
}

/* --- Add-to-cart form ---------------------------------------------------- */

body.single-product .summary form.cart {
    margin: 0 0 32px;
    padding-bottom: 32px;
    border-bottom: 1px solid var(--ink-line);
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: 12px;
}

body.single-product .summary form.cart .quantity {
    display: inline-flex;
}

body.single-product .summary form.cart input.qty {
    width: 72px;
    height: 48px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    text-align: center;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    color: var(--ink);
    -moz-appearance: textfield;
}

body.single-product .summary form.cart input.qty::-webkit-outer-spin-button,
body.single-product .summary form.cart input.qty::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

body.single-product .summary form.cart input.qty:focus {
    outline: none;
    border-color: var(--ink);
}

body.single-product .summary .single_add_to_cart_button,
body.single-product .summary button.single_add_to_cart_button,
body.single-product .summary button[name='add-to-cart'] {
    flex: 1 1 auto;
    min-height: 48px;
    padding: 14px 32px;
    background: var(--ink);
    color: var(--paper);
    border: 0;
    border-radius: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    cursor: pointer;
    transition: background 0.2s ease-out, transform 0.2s ease-out;
}

body.single-product .summary .single_add_to_cart_button:hover {
    background: var(--ink-soft);
    transform: translateY(-1px);
}

body.single-product .summary .single_add_to_cart_button:disabled,
body.single-product .summary .single_add_to_cart_button.disabled {
    opacity: 0.5;
    cursor: not-allowed;
    transform: none;
}

/* --- Variations form ----------------------------------------------------- */

body.single-product .summary table.variations {
    width: 100%;
    margin: 0 0 16px;
    border-collapse: collapse;
}

body.single-product .summary table.variations th,
body.single-product .summary table.variations td {
    padding: 8px 0;
    border: 0;
    background: transparent;
    vertical-align: middle;
}

body.single-product .summary table.variations th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
    text-align: left;
    width: 35%;
}

body.single-product .summary .reset_variations {
    display: inline-block;
    margin-left: 12px;
    font-size: 0.75rem;
    color: var(--ink-muted);
    font-style: italic;
    text-decoration: underline;
}

body.single-product .summary .single_variation_wrap .price {
    border-bottom: 0;
    padding-bottom: 8px;
    margin-bottom: 16px;
}

body.single-product .summary .woocommerce-variation-availability p.stock {
    margin: 8px 0 16px;
}

/* --- Service add-ons (`.gv-pdp-addons`) — render trong form sau ATC ----- */
/* Markup từ `gv_pdp_render_addons()` (theme/includes/pdp.php). Hook
   `woocommerce_after_add_to_cart_button` priority 10 → checkboxes nằm
   trong `<form class="cart">` để submit cùng ATC.
   Style theo phong cách `mini-cart-addons` — outer container muted bg,
   mỗi item là card-on-card (white 0.7 + border) để tách biệt khỏi block
   chọn variation/quantity/ATC ở trên. CHECKBOX VẪN GIỮ. */

body.single-product .summary .gv-pdp-addons {
    flex-basis: 100%;
    margin: 28px 0 0;
    padding: 16px;
    background: rgba(10, 10, 10, 0.03);
    border: 1px solid rgba(10, 10, 10, 0.08);
}

body.single-product .summary .gv-pdp-addons__head {
    margin-bottom: 12px;
}

body.single-product .summary .gv-pdp-addons__head .gv-meta-label {
    margin: 0 0 6px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

body.single-product .summary .gv-pdp-addons__heading {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.0625rem;
    line-height: 1.2;
    color: var(--ink);
    margin: 0 0 4px;
    font-weight: 400;
}

body.single-product .summary .gv-pdp-addons__sub {
    margin: 0;
    font-size: 0.75rem;
    color: var(--ink-muted);
    font-style: italic;
}

body.single-product .summary .gv-pdp-addons__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 10px;
}

body.single-product .summary .gv-pdp-addons__item {
    margin: 0;
    padding: 12px 14px;
    background: rgba(255, 255, 255, 0.7);
    border: 1px solid rgba(10, 10, 10, 0.08);
}

body.single-product .summary .gv-pdp-addons__label {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    cursor: pointer;
    margin: 0;
}

body.single-product .summary .gv-pdp-addons__item.is-unavailable .gv-pdp-addons__label {
    cursor: not-allowed;
    opacity: 0.5;
}

body.single-product .summary .gv-pdp-addons__checkbox {
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    margin: 4px 0 0;
    appearance: none;
    -webkit-appearance: none;
    border: 1px solid var(--ink);
    background: var(--paper);
    border-radius: 0;
    cursor: pointer;
    position: relative;
    transition: background 0.15s ease-out;
}

body.single-product .summary .gv-pdp-addons__checkbox:checked {
    background: var(--ink);
}

body.single-product .summary .gv-pdp-addons__checkbox:checked::after {
    content: '';
    position: absolute;
    left: 4px;
    top: 0;
    width: 5px;
    height: 10px;
    border: solid var(--paper);
    border-width: 0 1.6px 1.6px 0;
    transform: rotate(45deg);
}

body.single-product .summary .gv-pdp-addons__checkbox:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 2px;
}

body.single-product .summary .gv-pdp-addons__checkbox:disabled {
    cursor: not-allowed;
}

body.single-product .summary .gv-pdp-addons__body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1 1 auto;
    min-width: 0;
}

/* Typography clone từ `.mini-cart-addon-*` ở partials/mini-cart.css. */
body.single-product .summary .gv-pdp-addons__title {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    line-height: 1.3;
    color: var(--ink);
    font-weight: 500;
}

body.single-product .summary .gv-pdp-addons__flag {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin-left: 6px;
    font-weight: 400;
}

body.single-product .summary .gv-pdp-addons__blurb {
    margin: 0;
    font-size: 0.75rem;
    line-height: 1.45;
    color: var(--ink-muted);
}

body.single-product .summary .gv-pdp-addons__price {
    margin-top: 4px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    color: var(--ink);
}

body.single-product .summary .gv-pdp-addons__price .woocommerce-Price-amount {
    color: inherit;
}

/* --- Meta (SKU, category, tag) ------------------------------------------ */

body.single-product .summary .product_meta {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-muted);
    line-height: 1.8;
    margin: 0;
}

body.single-product .summary .product_meta > span {
    display: block;
    margin: 0;
}

body.single-product .summary .product_meta a {
    color: var(--ink-soft);
    border-bottom: 1px solid transparent;
    transition: border-color 0.2s ease-out;
}

body.single-product .summary .product_meta a:hover {
    border-bottom-color: var(--ink-soft);
}

/* --- Sharing buttons (theme woocommerce_template_single_sharing) -------- */

body.single-product .summary .woocommerce-social-sharing {
    margin-top: 24px;
    padding-top: 24px;
    border-top: 1px solid var(--ink-line);
    font-size: 0.8125rem;
    color: var(--ink-muted);
}

body.single-product .summary .woocommerce-social-sharing a {
    font-style: italic;
    border-bottom: 1px solid currentColor;
    padding-bottom: 1px;
    margin-right: 16px;
}

/* --- Tabs (description, additional_information, reviews) ---------------- */

body.single-product .woocommerce-tabs {
    margin-top: 80px;
    padding-top: 56px;
    border-top: 1px solid var(--ink-line);
}

body.single-product .woocommerce-tabs ul.tabs {
    list-style: none;
    margin: 0 0 32px;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 32px;
    border-bottom: 1px solid var(--ink-line);
}

body.single-product .woocommerce-tabs ul.tabs li {
    margin: 0;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 0;
    position: relative;
    bottom: -1px;
}

body.single-product .woocommerce-tabs ul.tabs li a {
    display: inline-block;
    padding: 0 0 16px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    border-bottom: 2px solid transparent;
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

body.single-product .woocommerce-tabs ul.tabs li a:hover {
    color: var(--ink);
}

body.single-product .woocommerce-tabs ul.tabs li.active a {
    color: var(--ink);
    border-bottom-color: var(--ink);
}

body.single-product .woocommerce-tabs .panel {
    padding: 16px 0 0;
    font-size: 1rem;
    line-height: 1.75;
    color: var(--ink-soft);
    max-width: 720px;
}

body.single-product .woocommerce-tabs .panel h2 {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.5rem, 3vw, 2rem);
    line-height: 1.15;
    letter-spacing: -0.015em;
    color: var(--ink);
    margin: 0 0 16px;
    font-weight: 400;
}

body.single-product .woocommerce-tabs .panel p,
body.single-product .woocommerce-tabs .panel ul,
body.single-product .woocommerce-tabs .panel ol {
    margin: 0 0 12px;
}

body.single-product .woocommerce-tabs .panel ul,
body.single-product .woocommerce-tabs .panel ol {
    padding-left: 1.25rem;
}

body.single-product .woocommerce-tabs table.shop_attributes {
    width: 100%;
    border-collapse: collapse;
    border: 0;
}

body.single-product .woocommerce-tabs table.shop_attributes th,
body.single-product .woocommerce-tabs table.shop_attributes td {
    padding: 12px 0;
    border: 0;
    border-bottom: 1px solid var(--ink-line);
    background: transparent;
    text-align: left;
    font-style: normal;
}

body.single-product .woocommerce-tabs table.shop_attributes th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
    width: 30%;
}

body.single-product .woocommerce-tabs table.shop_attributes td {
    font-size: 0.9375rem;
    color: var(--ink);
}

/* --- Reviews ------------------------------------------------------------- */

body.single-product #reviews #comments ol.commentlist {
    list-style: none;
    margin: 0;
    padding: 0;
}

body.single-product #reviews #comments ol.commentlist li.review {
    margin: 0 0 32px;
    padding: 0 0 32px;
    border-bottom: 1px solid var(--ink-line);
}

/* --- Cross-sells (full-width, render từ `gv_pdp_render_cross_sells`) --- */
/* Section "Mua cùng — Combo gợi ý" — pattern giống `.upsells.products`
   nhưng với heading riêng (kicker label + heading). Markup từ
   `gv_pdp_render_cross_sells()` ở `includes/pdp.php`. */

body.single-product .gv-pdp-crosssells {
    margin-top: 80px;
    padding-top: 56px;
    border-top: 1px solid var(--ink-line);
    list-style: none;
}

body.single-product .gv-pdp-crosssells__head {
    margin-bottom: 32px;
}

body.single-product .gv-pdp-crosssells__head .gv-meta-label {
    margin: 0 0 12px;
}

body.single-product .gv-pdp-crosssells__heading {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.75rem, 4vw, 2.5rem);
    line-height: 1.05;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 0;
    font-weight: 400;
}

body.single-product .gv-pdp-crosssells > ul.products {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.5rem 1.125rem;
}

body.single-product .gv-pdp-crosssells li.product {
    margin: 0;
    padding: 0;
    background: transparent;
    border: 0;
}

body.single-product .gv-pdp-crosssells li.product a {
    display: block;
    color: inherit;
    text-decoration: none;
}

body.single-product .gv-pdp-crosssells li.product img {
    aspect-ratio: 4 / 5;
    width: 100%;
    height: auto;
    object-fit: cover;
    background: var(--paper-warm);
    margin: 0 0 12px;
}

body.single-product .gv-pdp-crosssells li.product .woocommerce-loop-product__title,
body.single-product .gv-pdp-crosssells li.product h2,
body.single-product .gv-pdp-crosssells li.product h3 {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.125rem;
    line-height: 1.2;
    color: var(--ink);
    margin: 0 0 6px;
    font-weight: 400;
}

body.single-product .gv-pdp-crosssells li.product .price {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.06em;
    color: var(--ink-soft);
    margin: 0;
}

body.single-product .gv-pdp-crosssells li.product .button,
body.single-product .gv-pdp-crosssells li.product .added_to_cart {
    display: none;
}

@media (min-width: 1024px) {
    body.single-product .gv-pdp-crosssells {
        margin-top: 112px;
        padding-top: 80px;
    }

    body.single-product .gv-pdp-crosssells > ul.products {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 2rem 1.5rem;
    }

    body.single-product .gv-pdp-crosssells li.product .woocommerce-loop-product__title,
    body.single-product .gv-pdp-crosssells li.product h2,
    body.single-product .gv-pdp-crosssells li.product h3 {
        font-size: 1.25rem;
    }
}

/* --- Upsells (full-width, mirror pattern `.gv-pdp-related`) ------------- */
/* WC default `woocommerce_upsell_display()` xuất `<section class="upsells products">`
   với inner loop `content-product.php`. Style heading + grid để khớp editorial. */

body.single-product .upsells.products {
    margin-top: 80px;
    padding-top: 56px;
    border-top: 1px solid var(--ink-line);
    list-style: none;
}

body.single-product .upsells.products > h2 {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.75rem, 4vw, 2.5rem);
    line-height: 1.05;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 0 0 32px;
    font-weight: 400;
}

body.single-product .upsells.products > ul.products,
body.single-product .upsells.products ul.products {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.5rem 1.125rem;
}

body.single-product .upsells.products li.product {
    margin: 0;
    padding: 0;
    background: transparent;
    border: 0;
}

body.single-product .upsells.products li.product a {
    display: block;
    color: inherit;
    text-decoration: none;
}

body.single-product .upsells.products li.product img {
    aspect-ratio: 4 / 5;
    width: 100%;
    height: auto;
    object-fit: cover;
    background: var(--paper-warm);
    margin: 0 0 12px;
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

body.single-product .upsells.products li.product:hover img {
    transform: scale(1.03);
    filter: brightness(1.04);
}

body.single-product .upsells.products li.product .woocommerce-loop-product__title,
body.single-product .upsells.products li.product h2,
body.single-product .upsells.products li.product h3 {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.125rem;
    line-height: 1.2;
    color: var(--ink);
    margin: 0 0 6px;
    font-weight: 400;
}

body.single-product .upsells.products li.product .price {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.06em;
    color: var(--ink-soft);
    margin: 0;
}

body.single-product .upsells.products li.product .button,
body.single-product .upsells.products li.product .added_to_cart {
    display: none;
}

@media (min-width: 1024px) {
    body.single-product .upsells.products {
        margin-top: 112px;
        padding-top: 80px;
    }

    body.single-product .upsells.products > ul.products,
    body.single-product .upsells.products ul.products {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 2rem 1.5rem;
    }

    body.single-product .upsells.products li.product .woocommerce-loop-product__title,
    body.single-product .upsells.products li.product h2,
    body.single-product .upsells.products li.product h3 {
        font-size: 1.25rem;
    }
}

/* --- Related products (override `woocommerce/single-product/related.php`) --- */

body.single-product .gv-pdp-related {
    margin-top: 80px;
    padding-top: 56px;
    border-top: 1px solid var(--ink-line);
}

body.single-product .gv-pdp-related__intro {
    margin-bottom: 32px;
}

body.single-product .gv-pdp-related__intro .gv-meta-label {
    margin-bottom: 12px;
}

body.single-product .gv-pdp-related__heading {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.75rem, 4vw, 2.5rem);
    line-height: 1.05;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 0;
    font-weight: 400;
}

body.single-product .gv-pdp-related__grid {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.5rem 1.125rem;
}

body.single-product .gv-pdp-related__item {
    margin: 0;
    padding: 0;
    background: transparent;
    border: 0;
}

body.single-product .gv-pdp-related__link {
    display: block;
    color: inherit;
}

body.single-product .gv-pdp-related__media {
    aspect-ratio: 4 / 5;
    background: var(--paper-warm);
    overflow: hidden;
}

body.single-product .gv-pdp-related__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

body.single-product .gv-pdp-related__item.card:hover {
    transform: translateY(-3px);
}

body.single-product .gv-pdp-related__item.card:hover .gv-pdp-related__media img {
    transform: scale(1.03);
    filter: brightness(1.04);
}

body.single-product .gv-pdp-related__meta {
    padding-top: 12px;
}

body.single-product .gv-pdp-related__meta .gv-meta-label {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin: 0 0 6px;
}

body.single-product .gv-pdp-related__title {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.125rem;
    line-height: 1.2;
    color: var(--ink);
    margin: 0 0 6px;
    font-weight: 400;
}

body.single-product .gv-pdp-related__price {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.06em;
    color: var(--ink-soft);
    margin: 0;
}

body.single-product .gv-pdp-related__price del {
    color: var(--ink-muted);
    margin-right: 6px;
}

body.single-product .gv-pdp-related__price ins {
    background: transparent;
    text-decoration: none;
    color: var(--ink);
}

@media (min-width: 1024px) {
    body.single-product .gv-pdp-related {
        margin-top: 112px;
        padding-top: 80px;
    }

    body.single-product .gv-pdp-related__grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 2rem 1.5rem;
    }

    body.single-product .gv-pdp-related__title {
        font-size: 1.25rem;
    }
}

/* --- WC notices (success after add-to-cart, errors) --------------------- */
/* Style notice đã chuyển sang `partials/notices.css` (scope
   `body.single-product` đã cover). PDP-specific: spacing wrapper top. */

body.single-product .woocommerce-notices-wrapper:not(:empty) {
    margin: 0 0 24px;
}

/* PDP scope: button trong notice giữ pill solid để tương phản với card. */
body.single-product .woocommerce-message a.button,
body.single-product .woocommerce-info a.button {
    display: inline-block;
    padding: 8px 16px;
    background: var(--ink);
    color: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0;
}

/* --- Reduced motion ----------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    body.single-product .gv-pdp-related__media img,
    body.single-product .gv-pdp-related__item.card,
    body.single-product .single_add_to_cart_button {
        transition: none;
    }

    body.single-product .gv-pdp-related__item.card:hover {
        transform: none;
    }

    body.single-product .gv-pdp-related__item.card:hover .gv-pdp-related__media img {
        transform: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/page-template-library.css */
/* ==========================================================================
   page-template-library.css — Group F (/template/)

   Áp lên `page-template.php` (WP page slug `template`). Layout editorial:
   header (eyebrow + serif H1 + lead + filter chips) → StaggeredGallery
   (reuse `gv-template-grid` / `gv-template-card` từ
   `block-template-gallery.css`) → pagination → empty state.

   Token color (`--ink`, `--paper`, …) được declare ở base.css scope
   `body.home, .gv-home`. Page WP không có `body.home` nên ta khai báo lại
   scope `.gv-template-library` để self-contained.

   Reuse:
   - `.gv-template-grid` + `.gv-template-card*` (block-template-gallery.css)
     cung cấp grid + card foundation (4 col desktop, 2 col mobile, các
     :nth-child stagger). File này KHÔNG override grid; chỉ scope thêm
     base style + chips + pagination + empty + token.

   Bám brand-guideline mục 12 — Template library:
   "Kế thừa gallery-grid, search-modal, category chips, editorial section
    intro. Cho phép density cao hơn nhưng phải giữ một nhịp grid nhất quán."
   ========================================================================== */

.gv-template-library {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;

    color: var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    line-height: 1.6;
}

.gv-template-library *,
.gv-template-library *::before,
.gv-template-library *::after {
    box-sizing: border-box;
}

.gv-template-library a {
    color: inherit;
    text-decoration: none;
}

.gv-template-library h1,
.gv-template-library h2,
.gv-template-library h3,
.gv-template-library p,
.gv-template-library ul {
    margin: 0;
}

.gv-template-library ul {
    padding: 0;
    list-style: none;
}

.gv-template-library img {
    display: block;
    max-width: 100%;
}

.gv-template-library em {
    font-style: italic;
}

/* --- Container ---------------------------------------------------------- */
/* Width 1400 + padding 20/40 — đồng bộ với `.gv-home__container`. */

.gv-template-library__container {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.25rem;
}

/* --- Section paddings --------------------------------------------------- */
/* Header section trên paper-warm (giấy ấm) để phân biệt nhịp với body. */

.gv-template-library__header {
    padding: 3.5rem 0 2.5rem;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--ink-line);
}

.gv-post-breadcrumb + .gv-template-library .gv-template-library__header {
    padding-top: 1.5rem;
}

.gv-template-library__body {
    padding: 3.5rem 0 5rem;
}

/* --- Header intro ------------------------------------------------------- */

.gv-template-library__intro {
    display: grid;
    gap: 1rem;
    margin-bottom: 2rem;
}

.gv-template-library__title {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(2.5rem, 7vw, 4.5rem);
    line-height: 0.95;
    letter-spacing: -0.025em;
    color: var(--ink);
}

.gv-template-library__lead {
    max-width: 38rem;
    font-size: 0.9375rem;
    line-height: 1.65;
    color: var(--ink-muted);
}

/* --- Filter chips ------------------------------------------------------- */
/* Pill style, paper-warm bg, mono 11px tracking rộng, active = ink solid. */

.gv-template-library__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.gv-template-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.5rem 0.875rem;
    border: 1px solid var(--ink-line);
    border-radius: 999px;
    background: var(--paper);
    color: var(--ink-muted);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    line-height: 1;
    transition: background 0.2s ease-out, border-color 0.2s ease-out, color 0.2s ease-out;
}

.gv-template-chip:hover {
    border-color: var(--ink);
    color: var(--ink);
}

.gv-template-chip.is-active {
    background: var(--ink);
    border-color: var(--ink);
    color: var(--paper);
}

/* --- Grid + card -------------------------------------------------------- */
/* Foundation grid + staggered offsets sống ở `block-template-gallery.css`.
   Ở đây chỉ extend cho nhịp /template/ — :nth-child stagger được giới hạn
   trong block (1–8). Card thứ 9+ trên /template/ vẫn render đẹp vì grid
   base không append offset cho element ngoài range đó. */

.gv-template-library__list {
    margin-bottom: 3rem;
}

.gv-template-card-item {
    /* `.gv-template-grid > .gv-template-card-item` trong /template/ là <li>;
       trên home block thì children là <a class="gv-template-card"> trực tiếp.
       Cả hai cùng tham gia grid auto-flow nên không cần thay đổi. */
}

.gv-template-card__price {
    margin-top: 0.35rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    letter-spacing: 0.04em;
    color: var(--ink-muted);
}

.gv-template-card__price del {
    margin-right: 0.5rem;
    opacity: 0.55;
}

.gv-template-card__price ins {
    text-decoration: none;
    color: var(--ink);
}

.gv-template-card__cta {
    margin-top: 0.6rem;
    font-size: 0.95rem;
    color: var(--ink);
}

/* --- Pagination --------------------------------------------------------- */
/* Editorial: số trang ink-muted, current ink + serif italic, hover underline. */

.gv-template-library__pagination {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.75rem 1.25rem;
    padding-top: 2rem;
    border-top: 1px solid var(--ink-line);
}

.gv-template-library__page-item {
    display: inline-flex;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    letter-spacing: 0.08em;
    color: var(--ink-muted);
}

.gv-template-library__page-item .page-numbers {
    padding: 0.25rem 0.1rem;
    color: inherit;
    border-bottom: 1px solid transparent;
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

.gv-template-library__page-item .page-numbers:hover {
    color: var(--ink);
    border-bottom-color: var(--ink);
}

.gv-template-library__page-item .page-numbers.current {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1.125rem;
    color: var(--ink);
}

.gv-template-library__page-item .page-numbers.dots {
    color: var(--ink-line);
}

.gv-template-library__page-item .prev,
.gv-template-library__page-item .next {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1rem;
    color: var(--ink);
}

/* --- Empty state -------------------------------------------------------- */

.gv-template-library__empty {
    display: grid;
    gap: 0.75rem;
    padding: 3rem 1.5rem;
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    text-align: center;
    justify-items: center;
}

.gv-template-library__empty-title {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.75rem, 4vw, 2.5rem);
    line-height: 1.1;
    color: var(--ink);
}

.gv-template-library__empty-meta {
    max-width: 32rem;
    font-size: 0.875rem;
    color: var(--ink-muted);
}

/* --- Card hover (in case .gv-home > .card hover doesn't reach) ---------- */
/* `.card` rule trong `components.css` được scope ngầm trong `.gv-home`?
   Không — selector là `.card` trần. Tuy nhiên chắc chắn behavior: nếu sau
   này components.css chuyển sang scope home-only, fallback ở đây giữ hover. */

.gv-template-library .card {
    transition: transform 0.35s ease-out;
}

.gv-template-library .card:hover {
    transform: translateY(-3px);
}

.gv-template-library .card .gv-media img {
    transition: transform 0.5s ease-out, filter 0.3s ease-out;
}

.gv-template-library .card:hover .gv-media img {
    transform: scale(1.03);
    filter: brightness(1.04);
}

/* --- Responsive --------------------------------------------------------- */

@media (min-width: 768px) {
    .gv-template-library__intro {
        gap: 1.25rem;
    }
}

@media (min-width: 1024px) {
    .gv-template-library__container {
        padding: 0 2.5rem;
    }

    .gv-post-breadcrumb + .gv-template-library .gv-template-library__header {
        padding-top: 2rem;
    }

    .gv-template-library__header {
        padding: 7rem 0 3.5rem;
    }

    .gv-template-library__body {
        padding: 5rem 0 7rem;
    }

    .gv-template-library__intro {
        grid-template-columns: 7fr 5fr;
        align-items: end;
        gap: 2rem;
        margin-bottom: 2.5rem;
    }

    .gv-template-library__lead {
        text-align: right;
        margin-left: auto;
    }

    .gv-template-library__list {
        margin-bottom: 4rem;
    }
}

/* --- Reduced motion ----------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .gv-template-library .card,
    .gv-template-library .card .gv-media img,
    .gv-template-chip,
    .gv-template-library__page-item .page-numbers {
        transition: none;
    }

    .gv-template-library .card:hover {
        transform: none;
    }

    .gv-template-library .card:hover .gv-media img {
        transform: none;
        filter: none;
    }

    [data-reveal] {
        opacity: 1;
        transform: none;
        transition: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/commerce-flow.css */
/* ==========================================================================
   commerce-flow.css — Group G (cart / checkout / order-pay / order-received)

   Restyle CSS-only cho các page do WooCommerce render. Theme KHÔNG fork
   template Woo nào ở Group G — chỉ có wrapper `woocommerce.php` (đã có) bao
   shell. File này áp lên các selector mặc định Woo phát ra:
     .woocommerce-cart, .woocommerce-checkout,
     .woocommerce-order-pay, .woocommerce-order-received

   Brand rules theo guideline mục 12 — Cart/Checkout:
   - Serif (Cormorant Garamond) chỉ dùng cho heading + total figure.
   - Body / table cell / form / button label dùng sans (Inter / Be Vietnam Pro).
   - Button primary: ink solid, uppercase tracking rộng, no-radius.
   - Tăng clarity, giảm decoration.

   Tokens (--ink, --paper, …) chỉ được khai báo cho `.gv-home` ở base.css.
   Ở đây phải tự khai báo lại trên các body class Woo để CSS không bị "khô".
   ========================================================================== */

/* --- Token re-scope cho Woo flow body classes ---------------------------- */

body.woocommerce-cart,
body.woocommerce-checkout,
body.woocommerce-order-pay,
body.woocommerce-order-received {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    background: var(--paper);
}

/* --- Wrapper container --------------------------------------------------- */
/* Đồng bộ với `.gv-home__container` (layout.css): max-width 1400, padding ngang
   1.25rem (mobile) / 2.5rem (>=1024). Vertical padding nhỏ — không lặp lại
   `.gv-home-section` 3.5/7rem vì cart/checkout không phải section editorial. */

.woocommerce-cart .gv-woo,
.woocommerce-checkout .gv-woo,
.woocommerce-order-pay .gv-woo,
.woocommerce-order-received .gv-woo,
.woocommerce-account .gv-woo {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 1.5rem 1.25rem 3rem;
    box-sizing: border-box;
}

/* Woo gốc set `padding-top: 80px` trên `div.woocommerce` (theme reset). Reset
   để the_content + main padding tự lo nhịp dọc. */
.woocommerce-cart .gv-woo > .woocommerce,
.woocommerce-checkout .gv-woo > .woocommerce,
.woocommerce-order-pay .gv-woo > .woocommerce,
.woocommerce-order-received .gv-woo > .woocommerce,
.woocommerce-account .gv-woo > .woocommerce {
    padding: 0;
    margin: 0;
}

/* Notices wrapper rỗng vẫn chiếm 1 grid row + gap → ẩn khi không có nội dung. */
.woocommerce-cart .gv-woo .woocommerce-notices-wrapper:empty,
.woocommerce-checkout .gv-woo .woocommerce-notices-wrapper:empty,
.woocommerce-order-pay .gv-woo .woocommerce-notices-wrapper:empty,
.woocommerce-order-received .gv-woo .woocommerce-notices-wrapper:empty,
.woocommerce-account .gv-woo .woocommerce-notices-wrapper:empty {
    display: none;
}

.woocommerce-cart .gv-woo *,
.woocommerce-checkout .gv-woo *,
.woocommerce-order-pay .gv-woo *,
.woocommerce-order-received .gv-woo *,
.woocommerce-cart .gv-woo *::before,
.woocommerce-checkout .gv-woo *::before,
.woocommerce-order-pay .gv-woo *::before,
.woocommerce-order-received .gv-woo *::before,
.woocommerce-cart .gv-woo *::after,
.woocommerce-checkout .gv-woo *::after,
.woocommerce-order-pay .gv-woo *::after,
.woocommerce-order-received .gv-woo *::after {
    box-sizing: border-box;
}

@media (min-width: 1024px) {
    .woocommerce-cart .gv-woo,
    .woocommerce-checkout .gv-woo,
    .woocommerce-order-pay .gv-woo,
    .woocommerce-order-received .gv-woo,
    .woocommerce-account .gv-woo {
        padding: 2rem 2.5rem 4rem;
    }
}

/* --- Page heading (H1) — Cormorant display ------------------------------- */
/* Woo hay output title qua `<h1 class="entry-title">` (page wrapper) hoặc
   `.woocommerce-order-received` heading. Đảm bảo thống nhất nhịp serif. */

.woocommerce-cart .entry-title,
.woocommerce-checkout .entry-title,
.woocommerce-order-pay .entry-title,
.woocommerce-order-received .entry-title,
.woocommerce-cart .gv-woo h1,
.woocommerce-checkout .gv-woo h1,
.woocommerce-order-pay .gv-woo h1,
.woocommerce-order-received .gv-woo h1 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2rem, 6vw, 3.75rem);
    line-height: 1;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 0 0 0.75rem;
}

/* H2/H3 trong order-review, customer details, shipping, … */
.woocommerce-cart .gv-woo h2,
.woocommerce-checkout .gv-woo h2,
.woocommerce-order-pay .gv-woo h2,
.woocommerce-order-received .gv-woo h2 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.5rem, 3vw, 2rem);
    line-height: 1.1;
    letter-spacing: -0.015em;
    color: var(--ink);
    margin: 0 0 1.25rem;
}

.woocommerce-cart .gv-woo h3,
.woocommerce-checkout .gv-woo h3,
.woocommerce-order-pay .gv-woo h3,
.woocommerce-order-received .gv-woo h3 {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin: 0 0 1rem;
}

/* --- Body copy ------------------------------------------------------------ */

.woocommerce-cart .gv-woo p,
.woocommerce-checkout .gv-woo p,
.woocommerce-order-pay .gv-woo p,
.woocommerce-order-received .gv-woo p {
    font-size: 0.75rem;
    line-height: 1.65;
    color: var(--ink-soft);
    margin: 0 0 1rem;
}

.woocommerce-cart .gv-woo a,
.woocommerce-checkout .gv-woo a,
.woocommerce-order-pay .gv-woo a,
.woocommerce-order-received .gv-woo a {
    color: var(--ink);
    text-decoration: underline;
    text-underline-offset: 0.25em;
    text-decoration-thickness: 1px;
}

.woocommerce-cart .gv-woo a:hover,
.woocommerce-checkout .gv-woo a:hover,
.woocommerce-order-pay .gv-woo a:hover,
.woocommerce-order-received .gv-woo a:hover {
    color: var(--ink-soft);
}

/* --- Notices ------------------------------------------------------------- */
/* Toàn bộ style notice (info/message/error/warning + coupon-error-notice
   inline) đã chuyển sang `partials/notices.css` — single source of truth. */

/* --- Tables: cart + order-review + order-details
       Base style đã chuyển sang `partials/data-tables.css` (SSOT). Phần dưới
       chỉ giữ override layout đặc thù cart/checkout (cột width, thumbnail). */

/* Product image cell trong cart table */
.woocommerce-cart table.shop_table .product-thumbnail a {
    display: block;
    width: 64px;
    text-decoration: none;
}

.woocommerce-cart table.shop_table .product-thumbnail img {
    width: 64px;
    height: 64px;
    object-fit: cover;
    display: block;
    border: 1px solid var(--ink-line);
}

/* Cart table column widths — table-layout: fixed để browser tôn trọng width
   từng cột (auto-distribute mặc định không tin cậy với th rỗng).

   Budget hiện tại: remove 32 + thumb 76 + qty 150 + price 110 + subtotal 132
                  = 500px fixed; product-name set 55% để chủ động co (-10%
                  so với baseline auto, theo brief Rom). Stepper UI
                  (gv-qty-stepper) rộng 134px → product-quantity ≥ 140px. */
.woocommerce-cart table.shop_table.cart {
    table-layout: fixed;
}

.woocommerce-cart table.shop_table.cart .product-remove,
.woocommerce-cart table.shop_table.cart th.product-remove {
    width: 32px;
    padding: 20px 4px;
    text-align: center;
}

.woocommerce-cart table.shop_table.cart .product-thumbnail,
.woocommerce-cart table.shop_table.cart th.product-thumbnail {
    width: 76px;
}

.woocommerce-cart table.shop_table.cart .product-name,
.woocommerce-cart table.shop_table.cart th.product-name {
    width: 55%;
}

.woocommerce-cart table.shop_table.cart .product-price {
    width: 110px;
    white-space: nowrap;
}

.woocommerce-cart table.shop_table.cart .product-subtotal {
    width: 132px;
    white-space: nowrap;
}

.woocommerce-cart table.shop_table.cart .product-quantity {
    width: 150px;
}

/* product-name không set width → auto-fill remaining; line-height nén nhỏ và
   word-break để tên dài graceful nếu vẫn vượt khả năng cột. */
.woocommerce-cart table.shop_table.cart .product-name {
    line-height: 1.35;
    word-break: break-word;
}

.woocommerce-cart table.shop_table .product-name a,
.woocommerce-checkout table.shop_table .product-name a,
.woocommerce-order-pay table.shop_table .product-name a,
.woocommerce-order-received table.shop_table .product-name a {
    color: var(--ink);
    text-decoration: none;
    font-weight: 500;
}

.woocommerce-cart table.shop_table .product-name a:hover,
.woocommerce-checkout table.shop_table .product-name a:hover,
.woocommerce-order-pay table.shop_table .product-name a:hover,
.woocommerce-order-received table.shop_table .product-name a:hover {
    text-decoration: underline;
    text-underline-offset: 0.3em;
}

/* Cart item excerpt — short_description hiển thị dưới title (cart + checkout
   review). Render bởi `gv_render_cart_item_excerpt()` (xem includes/cart-item-
   excerpt.php). Clamp 2 dòng để row không phình; muted tone để title vẫn là
   anchor. */
.gv-cart-item__excerpt {
    margin: 0.25rem 0 0;
    color: var(--ink-muted);
    font-size: 0.8125rem;
    line-height: 1.45;
    font-weight: 400;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* Remove icon — minimal × */
.woocommerce-cart table.shop_table .product-remove a.remove {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    color: var(--ink-muted);
    background: transparent;
    border: 1px solid var(--ink-line);
    border-radius: 0;
    font-size: 16px;
    line-height: 1;
    text-decoration: none;
    transition: color 0.2s ease-out, border-color 0.2s ease-out, background 0.2s ease-out;
}

.woocommerce-cart table.shop_table .product-remove a.remove:hover {
    color: var(--ink);
    border-color: var(--ink);
    background: var(--paper-warm);
}

/* Subtotal / total row trong cart_totals + tfoot */
.woocommerce-cart .cart_totals .order-total td,
.woocommerce-cart .cart_totals .order-total th,
.woocommerce-checkout #order_review .order-total td,
.woocommerce-checkout #order_review .order-total th,
.woocommerce-order-pay .order-total td,
.woocommerce-order-pay .order-total th,
.woocommerce-order-received .order-total td,
.woocommerce-order-received .order-total th {
    border-top: 1px solid var(--ink);
    padding-top: 24px;
    padding-bottom: 24px;
}

.woocommerce-cart .cart_totals .order-total .woocommerce-Price-amount,
.woocommerce-cart table.shop_table .order-total .woocommerce-Price-amount,
.woocommerce-checkout #order_review .order-total .woocommerce-Price-amount,
.woocommerce-order-pay .order-total .woocommerce-Price-amount,
.woocommerce-order-received .order-total .woocommerce-Price-amount {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.75rem;
    font-weight: 600;
    color: var(--ink);
    line-height: 1;
}

.woocommerce-cart table.shop_table .woocommerce-Price-amount,
.woocommerce-checkout table.shop_table .woocommerce-Price-amount,
.woocommerce-order-pay table.shop_table .woocommerce-Price-amount,
.woocommerce-order-received table.shop_table .woocommerce-Price-amount {
    font-variant-numeric: tabular-nums;
}

/* --- Quantity input ------------------------------------------------------- */
/* Woo render quantity bằng `.quantity > input.qty`. Một số plugin thêm +/-
   button — chúng ta KHÔNG can thiệp markup, chỉ style input. */

.woocommerce-cart .quantity input.qty,
.woocommerce-checkout .quantity input.qty,
.woocommerce-order-pay .quantity input.qty {
    width: 80px;
    height: 44px;
    padding: 0 12px;
    border: 1px solid var(--ink-line);
    border-radius: 0;
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    color: var(--ink);
    text-align: center;
    box-shadow: none;
    -moz-appearance: textfield;
}

.woocommerce-cart .quantity input.qty::-webkit-outer-spin-button,
.woocommerce-cart .quantity input.qty::-webkit-inner-spin-button,
.woocommerce-checkout .quantity input.qty::-webkit-outer-spin-button,
.woocommerce-checkout .quantity input.qty::-webkit-inner-spin-button,
.woocommerce-order-pay .quantity input.qty::-webkit-outer-spin-button,
.woocommerce-order-pay .quantity input.qty::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.woocommerce-cart .quantity input.qty:focus,
.woocommerce-checkout .quantity input.qty:focus,
.woocommerce-order-pay .quantity input.qty:focus {
    outline: 0;
    border-color: var(--ink);
}

/* --- Cart-only quantity stepper (gv-qty-stepper) ------------------------- */
/* Variant của SSOT forms.css cho inline quantity ở cart page (rule VII —
   inline single-field minimal được phép scope hẹp trong partial của trang).
   Markup do filter `woocommerce_cart_item_quantity` SSR ở includes/cart-page.php.
   Tương tác debounce + auto-submit ở assets/js/modules/cart-stepper.js.
   Scope: chỉ `.woocommerce-cart .quantity.gv-qty-stepper`, không leak checkout/PDP. */

.woocommerce-cart .quantity.gv-qty-stepper {
    display: inline-flex;
    align-items: stretch;
    gap: 0;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    height: 44px;
    width: max-content;
    margin: 0 auto;
}

.woocommerce-cart .quantity.gv-qty-stepper > .gv-qty-btn {
    width: 44px;
    flex: 0 0 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: 0;
    color: var(--ink);
    font-size: 1.125rem;
    line-height: 1;
    cursor: pointer;
    padding: 0;
    transition: background 0.15s ease-out, color 0.15s ease-out;
}

.woocommerce-cart .quantity.gv-qty-stepper > .gv-qty-btn:hover:not(:disabled) {
    background: var(--paper-warm);
}

.woocommerce-cart .quantity.gv-qty-stepper > .gv-qty-btn:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: -2px;
}

.woocommerce-cart .quantity.gv-qty-stepper > .gv-qty-btn:disabled {
    color: var(--ink-muted);
    cursor: not-allowed;
}

.woocommerce-cart .quantity.gv-qty-stepper > input.qty.gv-qty-input {
    width: 44px;
    height: auto;
    flex: 0 0 44px;
    border: 0;
    border-left: 1px solid var(--ink-line);
    border-right: 1px solid var(--ink-line);
    background: transparent;
    text-align: center;
    font-variant-numeric: tabular-nums;
    color: var(--ink);
    -moz-appearance: textfield;
    padding: 0;
    border-radius: 0;
}

.woocommerce-cart .quantity.gv-qty-stepper > input.qty.gv-qty-input::-webkit-outer-spin-button,
.woocommerce-cart .quantity.gv-qty-stepper > input.qty.gv-qty-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.woocommerce-cart .quantity.gv-qty-stepper > input.qty.gv-qty-input:focus {
    outline: 0;
    background: var(--paper-warm);
}

/* sold-individually variant: hiển thị "1" tĩnh, ẩn input khỏi visual layer */
.woocommerce-cart .quantity.gv-qty-stepper--static {
    padding: 0 18px;
    align-items: center;
    justify-content: center;
}

.woocommerce-cart .quantity.gv-qty-stepper--static > .gv-qty-static {
    font-size: 0.9375rem;
    color: var(--ink);
    font-variant-numeric: tabular-nums;
}

.woocommerce-cart .quantity.gv-qty-stepper--static > input.qty.gv-qty-input {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
    padding: 0;
    pointer-events: none;
}

/* AJAX in-flight: nhẹ blur tương tác để báo hiệu đang cập nhật */
form.woocommerce-cart-form[data-gv-updating] {
    opacity: 0.65;
    pointer-events: none;
    transition: opacity 0.15s ease-out;
}

/* --- Coupon row (cart) --------------------------------------------------- */
/* td.actions colspan=6 → row chiếm full width bảng. Cho coupon block compact
   (input + button inline, không grow), update cart đẩy sang phải bằng
   `space-between` ở td.actions — tránh khoảng trống lớn ở giữa. */

.woocommerce-cart .coupon {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: flex-end;
    flex: 0 0 auto;
}

.woocommerce-cart .coupon label[for="coupon_code"] {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

.woocommerce-cart #coupon_code {
    flex: 1 1 200px;
    min-width: 0;
    height: 40px;
    padding: 0 12px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    border-radius: 0;
    font-family: inherit;
    font-size: 0.875rem;
    color: var(--ink);
}

.woocommerce-cart #coupon_code:focus {
    outline: 0;
    border-color: var(--ink);
}

/* "Apply coupon" — secondary editorial link, not solid button */
.woocommerce-cart .coupon .button[name="apply_coupon"],
.woocommerce-checkout .checkout_coupon .button {
    background: transparent;
    color: var(--ink);
    border: 0;
    border-bottom: 1px solid var(--ink);
    border-radius: 0;
    padding: 0 0 4px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: none;
    align-self: center;
    box-shadow: none;
    cursor: pointer;
    transition: color 0.2s ease-out;
}

.woocommerce-cart .coupon .button[name="apply_coupon"]:hover,
.woocommerce-checkout .checkout_coupon .button:hover {
    /* Override forms.css hover (background→ink-soft) — variant này phải giữ
       bg transparent để chữ không tệp với background cùng tone ink. */
    background: transparent;
    color: var(--ink);
    border-bottom-color: var(--ink-soft);
    transform: none;
}

@media (min-width: 640px) {
    .woocommerce-cart .coupon {
        flex-wrap: nowrap;
        align-items: center;
    }

    .woocommerce-cart #coupon_code {
        flex: 0 0 220px;
    }
}

/* "Update cart" — same secondary editorial style */
.woocommerce-cart .actions .button[name="update_cart"] {
    background: transparent;
    color: var(--ink);
    border: 0;
    border-bottom: 1px solid var(--ink-line);
    border-radius: 0;
    padding: 0 0 4px;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    box-shadow: none;
}

.woocommerce-cart .actions .button[name="update_cart"]:hover {
    border-bottom-color: var(--ink);
}

.woocommerce-cart .actions .button[name="update_cart"][disabled],
.woocommerce-cart .actions .button[name="update_cart"]:disabled {
    color: var(--ink-muted);
    border-bottom-color: var(--ink-line);
    cursor: not-allowed;
}

.woocommerce-cart .cart-collaterals .woocommerce-form-coupon-toggle {
    margin-bottom: 1.5rem;
}

/* --- Coupon collapsible (cart.php template wrap) ------------------------ */
/* Best practice 2024+ (Stripe, Shopify, Klarna): coupon hide-by-default,
   expand on tap. Lý do: ~5-10% khách dùng mã, không nên chiếm vertical space
   với 90% khách còn lại. <details>/<summary> là native HTML, no JS required;
   form submit POST `apply_coupon` vẫn chạy bình thường vì input nằm trong
   form Woo cart. Pattern đồng bộ với gv-checkout-coupon trong order_review. */

.woocommerce-cart .gv-cart-coupon {
    display: block;
    width: 100%;
}

.woocommerce-cart .gv-cart-coupon .gv-cart-coupon__toggle {
    display: flex;
    align-items: center;
    justify-content: space-between;
    cursor: pointer;
    list-style: none;
    padding: 0.625rem 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    color: var(--ink);
    user-select: none;
}

.woocommerce-cart .gv-cart-coupon .gv-cart-coupon__toggle::-webkit-details-marker {
    display: none;
}

.woocommerce-cart .gv-cart-coupon .gv-cart-coupon__chevron {
    font-size: 1rem;
    line-height: 1;
    transition: transform 0.2s ease-out;
    color: var(--ink-muted);
    margin-left: 0.5rem;
}

.woocommerce-cart .gv-cart-coupon[open] .gv-cart-coupon__chevron {
    transform: rotate(45deg);
    color: var(--ink);
}

.woocommerce-cart .gv-cart-coupon[open] > .coupon {
    margin-top: 0.625rem;
    padding-bottom: 0.5rem;
}

/* Checkout coupon collapsible ".checkout_coupon" panel */
.woocommerce-checkout .checkout_coupon {
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    border-radius: 0;
    padding: 24px;
    margin: 0 0 2rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 16px;
}

.woocommerce-checkout .checkout_coupon .form-row {
    margin: 0;
}

.woocommerce-checkout .checkout_coupon .form-row.form-row-first {
    flex: 1 1 220px;
    width: auto;
}

.woocommerce-checkout .checkout_coupon .form-row.form-row-last {
    flex: 0 0 auto;
    width: auto;
}

.woocommerce-checkout .checkout_coupon .clear {
    display: none;
}

/* input[type="text"] coupon style đã ở SSOT `partials/forms.css`. */

/* --- Cart actions row (top-level) ---------------------------------------- */
/* `td.actions` colspan=6 trong table-layout: fixed → display: flex/grid trên
   td khiến nó mất table-cell layout và width thu về cột đầu tiên. Giữ td là
   table-cell, dùng float để đẩy update-cart sang phải, coupon inline-flex
   bên trái. */

.woocommerce-cart table.shop_table.cart tbody td.actions {
    padding: 16px 20px;
}

.woocommerce-cart .actions::after {
    content: '';
    display: block;
    clear: both;
}

.woocommerce-cart .actions .gv-cart-coupon {
    float: left;
    max-width: 320px;
}

.woocommerce-cart .actions .button[name="update_cart"] {
    float: right;
}

.woocommerce-cart .cart-collaterals {
    display: grid;
    gap: 2.5rem;
    margin-top: 0;
}

.woocommerce-cart .cart_totals {
    background: var(--paper-warm);
    padding: 24px 28px;
}

.woocommerce-cart .cart_totals h2 {
    margin: 0 0 1rem;
}

.woocommerce-cart .cart_totals table.shop_table {
    background: transparent;
    border: 0;
    margin: 0 0 1rem;
}

.woocommerce-cart .cart_totals table.shop_table th,
.woocommerce-cart .cart_totals table.shop_table td {
    padding: 10px 0;
    border-bottom: 1px solid var(--ink-line);
    background: transparent;
    vertical-align: top;
}

/* Shipment row: ul shipping_method + paragraph hint + Calculate shipping link
   nén lại để row không cao 150px. */
.woocommerce-cart .cart_totals .shipping ul#shipping_method {
    margin: 0;
    padding: 0;
    list-style: none;
}

.woocommerce-cart .cart_totals .shipping ul#shipping_method li {
    margin: 0 0 0.25rem;
}

/* Single-method (vd "Free shipping" auto-selected) plain inline text — đồng
   bộ với checkout-flow.css §8 (Rom chốt 2026-05-01: "Free shipping không thêm
   background và border"). Detect bằng `:not(:has(input[type="radio"]))` —
   Woo render hidden input thay radio khi chỉ 1 method. */
.woocommerce-cart .cart_totals .shipping ul#shipping_method li:not(:has(input[type="radio"])) label {
    display: inline;
    padding: 0;
    border: 0;
    background: transparent;
    margin: 0;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
    cursor: default;
}

.woocommerce-cart .cart_totals .shipping p {
    margin: 0.25rem 0 0;
    font-size: 0.8125rem;
    line-height: 1.45;
    color: var(--ink-muted);
}

.woocommerce-cart .cart_totals .shipping .shipping-calculator-button {
    font-size: 0.8125rem;
    margin-top: 0.25rem;
    display: inline-block;
}

.woocommerce-cart .cart_totals table.shop_table th {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    font-weight: 500;
    width: 40%;
    text-align: left;
}

.woocommerce-cart .cart_totals .wc-proceed-to-checkout {
    padding: 0;
    margin-top: 1.5rem;
}

@media (min-width: 960px) {
    /* Cart 2-cột: form line-items bên trái, cart-collaterals (totals + cross-sells)
       bên phải, sticky. .woocommerce wrapper bao cả notices, form và collaterals
       — notices span full width, hai khối còn lại split 1.6fr / 1fr. */
    .woocommerce-cart .gv-woo .woocommerce {
        display: grid;
        grid-template-columns: 1.6fr 1fr;
        gap: 3rem;
        align-items: start;
    }

    .woocommerce-cart .gv-woo .woocommerce-notices-wrapper {
        grid-column: 1 / -1;
    }

    .woocommerce-cart .gv-woo .woocommerce-cart-form {
        margin: 0;
    }

    .woocommerce-cart .gv-woo .gv-cart-main {
        grid-column: 1;
        margin: 0;
    }

    .woocommerce-cart .gv-woo .cart-collaterals {
        grid-column: 2;
        position: sticky;
        top: 5.5rem;
    }

    /* cart-collaterals chỉ stack vertical (totals + cross-sells nếu có). */
    .woocommerce-cart .cart-collaterals {
        grid-template-columns: 1fr;
    }
}

/* --- Empty cart state ---------------------------------------------------- */

.woocommerce-cart .cart-empty {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(2rem, 5vw, 3rem);
    font-weight: 500;
    line-height: 1.1;
    color: var(--ink);
    text-align: left;
    margin: 0 0 1.5rem;
    padding: 0;
    background: transparent;
    border: 0;
}

.woocommerce-cart .cart-empty.woocommerce-info {
    background: transparent;
    border: 0;
    border-left: 0;
    padding: 0;
}

.woocommerce-cart .cart-empty.woocommerce-info::before {
    display: none;
}

.woocommerce-cart .return-to-shop {
    margin-top: 0;
}

.woocommerce-cart .return-to-shop .button.wc-backward {
    background: transparent;
    color: var(--ink);
    border: 0;
    border-bottom: 1px solid var(--ink);
    border-radius: 0;
    padding: 0 0 4px;
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 1.25rem;
    letter-spacing: normal;
    text-transform: none;
    box-shadow: none;
}

.woocommerce-cart .return-to-shop .button.wc-backward:hover {
    color: var(--ink-soft);
}

/* --- Checkout: form layout ----------------------------------------------- */

.woocommerce-checkout form.checkout {
    display: grid;
    gap: 2.5rem;
}

.woocommerce-checkout .col2-set {
    display: grid;
    gap: 2rem;
    width: 100%;
}

.woocommerce-checkout .col2-set .col-1,
.woocommerce-checkout .col2-set .col-2 {
    width: 100%;
    float: none;
    max-width: none;
    padding: 0;
}

.woocommerce-checkout #customer_details {
    width: 100%;
}

@media (min-width: 960px) {
    /* col2-set giữ single column: shipping + order_notes (.col-2) stack DƯỚI
       billing (.col-1). Trước đó chia 1fr 1fr → shipping/notes nằm cạnh billing
       làm cột phía trái (.col-1) bị nén & form-row sub-grid vỡ. */
    .woocommerce-checkout .col2-set {
        grid-template-columns: 1fr;
    }

    /* form.checkout có 3 children theo thứ tự DOM:
       #customer_details, h3#order_review_heading, #order_review.
       Set explicit grid-row để heading + review stack trong col 2,
       còn customer_details span cả 2 rows ở col 1 — nếu không, auto-flow
       đẩy #order_review xuống row 2 col 2 cách xa khỏi heading. */
    .woocommerce-checkout form.checkout {
        grid-template-columns: 1.4fr 1fr;
        grid-template-rows: auto 1fr;
        gap: 3rem 3rem;
        align-items: start;
    }

    .woocommerce-checkout #customer_details {
        grid-column: 1;
        grid-row: 1 / span 2;
    }

    .woocommerce-checkout h3#order_review_heading {
        grid-column: 2;
        grid-row: 1;
        margin: 0;
    }

    .woocommerce-checkout #order_review {
        grid-column: 2;
        grid-row: 2;
        position: sticky;
        top: 5.5rem;
        align-self: start;
    }
}

/* Form fields ------------------------------------------------------------- */
/* ⚠ Form control (input/select/textarea/label/validation/select2) đã chuyển
       sang `partials/forms.css` (SSOT). Chỉ giữ layout grid 2-cột đặc thù
       checkout ở đây. */

.woocommerce-checkout .form-row.form-row-first,
.woocommerce-checkout .form-row.form-row-last {
    width: 100%;
    float: none;
}

@media (min-width: 600px) {
    .woocommerce-checkout .woocommerce-billing-fields__field-wrapper,
    .woocommerce-checkout .woocommerce-shipping-fields__field-wrapper {
        display: grid;
        grid-template-columns: 1fr 1fr;
        column-gap: 1rem;
    }

    .woocommerce-checkout .form-row-wide,
    .woocommerce-checkout .form-row#order_comments_field {
        grid-column: 1 / -1;
    }
}

/* Login / coupon toggle (top of checkout) */
.woocommerce-checkout .woocommerce-form-login-toggle,
.woocommerce-checkout .woocommerce-form-coupon-toggle {
    margin-bottom: 1.25rem;
}

.woocommerce-checkout .woocommerce-form-login-toggle .woocommerce-info,
.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info {
    margin-bottom: 0;
}

.woocommerce-checkout .woocommerce-form-login,
.woocommerce-checkout form.login {
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    padding: 24px;
    margin: 0 0 2rem;
}

/* --- Order review (right column) ---------------------------------------- */

.woocommerce-checkout #order_review_heading {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.5rem, 3vw, 2rem);
    letter-spacing: -0.015em;
    color: var(--ink);
    margin: 0 0 1.25rem;
}

.woocommerce-checkout #order_review {
    background: var(--paper-warm);
    padding: 32px;
}

.woocommerce-checkout #order_review table.shop_table {
    background: transparent;
    border: 0;
    margin: 0 0 1.5rem;
}

.woocommerce-checkout #order_review table.shop_table th,
.woocommerce-checkout #order_review table.shop_table td {
    padding: 14px 0;
    border-bottom: 1px solid var(--ink-line);
    background: transparent;
    text-align: left;
}

.woocommerce-checkout #order_review table.shop_table thead th {
    background: transparent;
}

/* Shipping methods list trong order-review row "Shipping" — bỏ bullet UA
   default để khớp tone editorial, label radio thẳng hàng với cột giá. */
.woocommerce-checkout ul.woocommerce-shipping-methods {
    list-style: none;
    margin: 0;
    padding: 0;
}

@media (min-width: 1024px) {
    .woocommerce-checkout #order_review {
        padding: 40px;
    }
}

/* --- Payment methods box ------------------------------------------------- */

.woocommerce-checkout #payment,
.woocommerce-order-pay #payment {
    background: transparent;
    border-radius: 0;
}

.woocommerce-checkout #payment ul.payment_methods,
.woocommerce-order-pay #payment ul.payment_methods {
    list-style: none;
    margin: 0 0 1.5rem;
    padding: 0;
    border: 0;
}

.woocommerce-checkout #payment ul.payment_methods li,
.woocommerce-order-pay #payment ul.payment_methods li {
    padding: 16px 0;
    border-bottom: 1px solid var(--ink-line);
    list-style: none;
}

.woocommerce-checkout #payment ul.payment_methods li:last-child,
.woocommerce-order-pay #payment ul.payment_methods li:last-child {
    border-bottom: 0;
}

.woocommerce-checkout #payment ul.payment_methods label,
.woocommerce-order-pay #payment ul.payment_methods label {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.9375rem;
    font-weight: 500;
    color: var(--ink);
    cursor: pointer;
}

.woocommerce-checkout #payment ul.payment_methods img,
.woocommerce-order-pay #payment ul.payment_methods img {
    max-height: 24px;
    width: auto;
    margin-left: 0.5rem;
}

.woocommerce-checkout #payment .payment_box,
.woocommerce-order-pay #payment .payment_box {
    background: var(--paper);
    border: 1px solid var(--ink-line);
    border-radius: 0;
    padding: 16px 16px;
    margin: 12px 0 0;
    font-size: 0.875rem;
    line-height: 1.6;
    color: var(--ink-soft);
}

.woocommerce-checkout #payment .payment_box::before,
.woocommerce-order-pay #payment .payment_box::before {
    border: 8px solid transparent;
    border-bottom-color: var(--ink-line);
    content: '';
    display: block;
    position: absolute;
    margin-top: -32px;
    margin-left: 8px;
    height: 0;
    width: 0;
}

.woocommerce-checkout #payment .form-row.place-order,
.woocommerce-order-pay #payment .form-row.place-order {
    /* padding: 1.5rem 0 0; */
    margin: 0;
}

.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper {
    margin: 0 0 1rem;
    font-size: 0.8125rem;
    line-height: 1.6;
    color: var(--ink-soft);
}

.woocommerce-checkout .woocommerce-terms-and-conditions {
    background: var(--paper);
    border: 1px solid var(--ink-line);
    padding: 16px;
    max-height: 200px;
    overflow-y: auto;
    font-size: 0.8125rem;
}

.woocommerce-checkout .form-row.validate-required input[type="checkbox"],
.woocommerce-checkout .woocommerce-form__input-checkbox {
    margin-right: 0.5em;
    accent-color: var(--ink);
}

/* --- Primary CTA: ink solid --------------------------------------------- */
/* Áp cho: "Tiến hành thanh toán" (.checkout-button), "Đặt hàng"
   (#place_order), "Pay for order", "Quay lại cửa hàng".
   Loại trừ các button đã có rule riêng (apply_coupon, update_cart). */

.woocommerce-cart .wc-proceed-to-checkout .checkout-button,
.woocommerce-cart .wc-proceed-to-checkout a.button.alt,
.woocommerce-checkout #place_order,
.woocommerce-order-pay #place_order,
.woocommerce-order-pay .button#place_order,
.woocommerce-order-received .button.wc-forward,
.woocommerce-cart .button.wc-forward,
.woocommerce-checkout .button.wc-forward {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    width: auto;
    padding: 18px 40px;
    background: var(--ink);
    color: var(--paper);
    border: 0;
    border-radius: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    text-decoration: none;
    line-height: 1;
    cursor: pointer;
    box-shadow: none;
    transition: background 0.2s ease-out, transform 0.2s ease-out;
}

.woocommerce-cart .wc-proceed-to-checkout .checkout-button:hover,
.woocommerce-cart .wc-proceed-to-checkout a.button.alt:hover,
.woocommerce-checkout #place_order:hover,
.woocommerce-order-pay #place_order:hover,
.woocommerce-order-received .button.wc-forward:hover,
.woocommerce-cart .button.wc-forward:hover,
.woocommerce-checkout .button.wc-forward:hover {
    background: var(--ink-soft);
    color: var(--paper);
    transform: translateY(-1px);
}

.woocommerce-cart .wc-proceed-to-checkout .checkout-button:focus-visible,
.woocommerce-checkout #place_order:focus-visible,
.woocommerce-order-pay #place_order:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 3px;
}

.woocommerce-cart .wc-proceed-to-checkout .checkout-button {
    width: 100%;
}

.woocommerce-cart .wc-proceed-to-checkout .gv-checkout-blocked {
    width: 100%;
    cursor: not-allowed;
    opacity: 0.48;
    pointer-events: none;
}

.woocommerce-cart .gv-cart-checkout-blocked {
    display: grid;
    gap: 0.875rem;
}

.woocommerce-cart .gv-cart-checkout-blocked__notice {
    margin: 0;
    font-size: 0.875rem;
    line-height: 1.6;
    color: var(--ink-muted);
}

/* `.button` chung (Woo phát ra cho action không xác định) — ink solid mềm
   nhưng để không đè coupon/update đã override trên kia, ta nhắm đúng selector
   nằm trong context không khoá khác. */
.woocommerce-cart .gv-woo .return-to-shop .button:not(.wc-backward),
.woocommerce-checkout .gv-woo .return-to-shop .button,
.woocommerce-order-received .gv-woo .return-to-shop .button {
    display: inline-flex;
    align-items: center;
    padding: 16px 32px;
    background: var(--ink);
    color: var(--paper);
    border: 0;
    border-radius: 0;
    font-size: 0.8125rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    text-decoration: none;
}

/* --- Order received (thank-you) ----------------------------------------- */

.woocommerce-order-received .woocommerce-order {
    text-align: left;
}

.woocommerce-order-received .woocommerce-thankyou-order-received {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.25rem, 6vw, 3.75rem);
    line-height: 1;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin: 0 0 2rem;
}

/* Ul of order details (số đơn / ngày / tổng / phương thức) */
.woocommerce-order-received .woocommerce-order-overview,
.woocommerce-order-received ul.order_details {
    list-style: none;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 1.5rem 2rem;
    padding: 24px 0;
    margin: 0 0 2.5rem;
    border-top: 1px solid var(--ink-line);
    border-bottom: 1px solid var(--ink-line);
}

.woocommerce-order-received ul.order_details li {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    font-weight: 500;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-muted);
    border: 0;
    padding: 0;
}

.woocommerce-order-received ul.order_details li strong {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 1rem;
    font-weight: 500;
    letter-spacing: 0;
    text-transform: none;
    color: var(--ink);
}

.woocommerce-order-received ul.order_details li.total strong .woocommerce-Price-amount {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.5rem;
    font-weight: 600;
    color: var(--ink);
}

.woocommerce-order-received .woocommerce-order-details,
.woocommerce-order-received .woocommerce-customer-details {
    margin: 0 0 2.5rem;
}

.woocommerce-order-received .woocommerce-order-details h2,
.woocommerce-order-received .woocommerce-customer-details h2 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.5rem, 3vw, 2rem);
    margin: 0 0 1.25rem;
    color: var(--ink);
}

.woocommerce-order-received .woocommerce-customer-details address {
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    padding: 20px 24px;
    font-style: normal;
    line-height: 1.6;
    color: var(--ink);
    font-size: 0.9375rem;
}

.woocommerce-order-received .woocommerce-columns--addresses {
    display: grid;
    gap: 1.5rem;
}

@media (min-width: 768px) {
    .woocommerce-order-received .woocommerce-columns--addresses {
        grid-template-columns: 1fr 1fr;
    }
}

/* --- Cart cross-sells ---------------------------------------------------- */

.woocommerce-cart .gv-cart-cross-sells {
    margin-top: 1.25rem;
    background: var(--paper-warm);
    padding: 14px 16px;
}

.woocommerce-cart .gv-cart-cross-sells > h2 {
    margin: 0 0 0.5rem;
}

.woocommerce-cart .gv-cart-cross-sells__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: 1fr;
    gap: 6px;
}

.woocommerce-cart .gv-cart-cross-sells__item {
    margin: 0;
    display: grid;
    grid-template-columns: 56px minmax(0, 1fr);
    gap: 8px;
    align-items: center;
    padding: 6px 8px;
    background: rgba(255, 255, 255, 0.7);
    border: 1px solid rgba(10, 10, 10, 0.08);
    box-sizing: border-box;
}

.woocommerce-cart .gv-cart-cross-sells__item:hover {
    border-color: rgba(10, 10, 10, 0.18);
}

.woocommerce-cart .gv-cart-cross-sells__media-link {
    display: block;
    text-decoration: none;
}

.woocommerce-cart .gv-cart-cross-sells__media {
    aspect-ratio: 1 / 1;
    background: rgba(255, 255, 255, 0.92);
    overflow: hidden;
}

.woocommerce-cart .gv-cart-cross-sells__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.woocommerce-cart .gv-woo .gv-cart-cross-sells__link {
    display: block;
    color: inherit;
    text-decoration: none;
}

.woocommerce-cart .gv-woo .gv-cart-cross-sells__link:hover,
.woocommerce-cart .gv-woo .gv-cart-cross-sells__link:focus-visible {
    text-decoration: none;
}

.woocommerce-cart .gv-cart-cross-sells__info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.woocommerce-cart .gv-cart-cross-sells__kicker {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin: 0;
}

.woocommerce-cart .gv-cart-cross-sells__title {
    margin: 0;
    font-size: 0.75rem;
    line-height: 1.2;
    color: var(--ink);
    font-weight: 500;
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.woocommerce-cart .gv-cart-cross-sells__price {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    color: var(--ink);
}

.woocommerce-cart .gv-cart-cross-sells__footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 8px;
    margin-top: 4px;
}

.woocommerce-cart .gv-cart-cross-sells__add-btn {
    align-self: flex-start;
    padding: 6px 10px;
    font-size: 0.625rem;
    letter-spacing: 0.12em;
}

.woocommerce-cart .gv-cart-cross-sells__view-link {
    font-size: 0.6875rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-decoration: none;
}

.woocommerce-cart .gv-cart-cross-sells__view-link:hover {
    color: var(--ink);
    text-decoration: none;
}

.woocommerce-cart .gv-cart-cross-sells__price del {
    color: var(--ink-muted);
    margin-right: 0.375rem;
}

.woocommerce-cart .gv-cart-cross-sells__price ins {
    background: transparent;
    text-decoration: none;
    color: var(--ink);
}

@media (min-width: 960px) {
    .woocommerce-cart .gv-woo .gv-cart-cross-sells {
        margin-top: 0;
    }

    .woocommerce-cart .gv-cart-cross-sells__list {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .woocommerce-cart .gv-cart-cross-sells__item {
        grid-template-columns: 70px minmax(0, 1fr);
    }
}

/* --- Mobile + tablet: cart item cards (<= 1024px) ------------------------ */
/* Pattern compact (refactor 2026-05-02): grid 88px thumbnail trái + content
   col phải gồm name → meta line (qty stepper · subtotal) stack 2 row. Remove
   × overlay top-right thumbnail. Mục tiêu: 1 item ~140px (giảm ~70% so với
   pattern cũ 465px ảnh full-width). Đồng nhất với mobile cart industry
   standard (Shopify, Tiki, Lazada): thumb-aside list, không card-stack 5 row.
   Markup giữ nguyên Woo `.shop_table.cart` — khác chỉ ở CSS breakpoint.

   Breakpoint extended 767 → 1024 (2026-05-09): tablet portrait/landscape
   không fit fixed-table layout của desktop (cần ~1100px) → force responsive
   stack toàn bộ <=1024px. Pair với data-tables.css §200 cũng extend đến
   1024. */

@media (max-width: 1024px) {
    /* Container: giảm vertical padding, giữ ngang 16px cho tight mobile */
    .woocommerce-cart .gv-woo,
    .woocommerce-checkout .gv-woo,
    .woocommerce-order-pay .gv-woo,
    .woocommerce-order-received .gv-woo,
    .woocommerce-account .gv-woo {
        padding: 24px 1rem 80px;
    }

    /* Table: bỏ border card, override table-layout fixed của desktop để grid
       cell tự co theo nội dung. */
    .woocommerce-cart table.shop_table.cart {
        border: 0;
        table-layout: auto;
    }

    .woocommerce-cart table.shop_table.cart thead {
        display: none;
    }

    /* Reset desktop column-width rules trên td/th — chúng leak xuống mobile
       và ép grid columns sai size khi tr chuyển sang display:grid. Ví dụ
       desktop set `.product-quantity { width: 150px }` → grid col 2 fixed
       128px; product-name spanning cols 2+3 chỉ chiếm 1 col vì layout
       compute từ width của content cell, không từ template. */
    .woocommerce-cart table.shop_table.cart td.product-thumbnail,
    .woocommerce-cart table.shop_table.cart td.product-name,
    .woocommerce-cart table.shop_table.cart td.product-price,
    .woocommerce-cart table.shop_table.cart td.product-quantity,
    .woocommerce-cart table.shop_table.cart td.product-subtotal,
    .woocommerce-cart table.shop_table.cart td.product-remove {
        width: auto;
    }

    /* Mỗi line-item tr thành CSS Grid card compact.
       Cột 1 = thumbnail 88px fixed; cột 2 = name + qty stepper; cột 3 = auto
       cho subtotal price. Name span cols 2+3 row 1. Qty col 2 / subtotal
       col 3 ở row 2. Tách meta thành 2 cột tránh quantity + subtotal đè
       lên nhau khi cùng grid-area. */
    .woocommerce-cart table.shop_table.cart tbody tr.cart_item {
        display: grid;
        grid-template-columns: 88px minmax(0, 1fr) auto;
        grid-template-rows: auto auto;
        grid-template-areas:
            "thumb name name"
            "thumb meta total";
        column-gap: 1rem;
        row-gap: 0.625rem;
        align-items: start;
        padding: 1rem 0;
        margin: 0;
        border: 0;
        border-bottom: 1px solid var(--ink-line);
        background: transparent;
        position: relative;
    }

    .woocommerce-cart table.shop_table.cart tbody tr.cart_item:last-of-type {
        border-bottom: 0;
    }

    /* Thumbnail: 88×88 fixed, span 2 row để align với name+meta. */
    .woocommerce-cart table.shop_table.cart tbody td.product-thumbnail {
        grid-area: thumb;
        align-self: start;
        padding: 0;
        border: 0;
    }

    .woocommerce-cart table.shop_table.cart tbody td.product-thumbnail::before {
        display: none;
    }

    .woocommerce-cart table.shop_table .product-thumbnail a {
        display: block;
        width: 88px;
    }

    .woocommerce-cart table.shop_table .product-thumbnail img {
        width: 88px;
        height: 88px;
        max-height: none;
        object-fit: cover;
        border: 1px solid var(--ink-line);
    }

    /* Remove × overlay top-right cell — out of grid flow. */
    .woocommerce-cart table.shop_table.cart tbody td.product-remove {
        position: absolute;
        top: 0.5rem;
        right: 0;
        padding: 0;
        border: 0;
        z-index: 1;
    }

    .woocommerce-cart table.shop_table.cart tbody td.product-remove::before {
        display: none;
    }

    .woocommerce-cart table.shop_table .product-remove a.remove {
        width: 28px;
        height: 28px;
        background: var(--paper);
    }

    /* Product name — span row 1 cols 2-3 (grid-area: name). Reset desktop block
       style. Override `display: flex` của SSOT shop_table_responsive (data-
       tables.css §200) — flex + space-between đẩy title sang trái, excerpt
       (`<p class="gv-cart-item__excerpt">`) sang phải thành 2 cột narrow.
       Yêu cầu: title trên, excerpt dưới, cả 2 full width. */
    .woocommerce-cart table.shop_table.cart tbody td.product-name {
        grid-area: name;
        display: block;
        padding: 0;
        margin: 0;
        border: 0;
        text-align: left;
        line-height: 1.35;
        font-size: 0.9375rem;
        /* Để remove × không đè title. */
        padding-right: 36px;
    }

    .woocommerce-cart table.shop_table.cart tbody td.product-name::before {
        display: none;
    }

    /* Unit price ẩn ở mobile — hiển thị duplicate với subtotal khi qty=1 và
       không bổ sung gì khi qty>1 (vì stepper trực tiếp ngay cạnh subtotal,
       user nhân nhẩm dễ). Best practice industry: 1 giá / row trên mobile. */
    .woocommerce-cart table.shop_table.cart tbody td.product-price {
        display: none;
    }

    /* Qty stepper + subtotal cùng row 2 col 2, space-between. */
    .woocommerce-cart table.shop_table.cart tbody td.product-quantity {
        grid-area: meta;
        padding: 0;
        margin: 0;
        border: 0;
        display: flex;
        align-items: center;
        gap: 0.875rem;
    }

    .woocommerce-cart table.shop_table.cart tbody td.product-quantity::before {
        display: none;
    }

    /* Subtotal — col 3 row 2 (grid area `total`). Cormorant editorial tone. */
    .woocommerce-cart table.shop_table.cart tbody td.product-subtotal {
        grid-area: total;
        align-self: center;
        justify-self: end;
        padding: 0;
        margin: 0;
        border: 0;
        font-family: 'Cormorant Garamond', Georgia, serif;
        font-size: 1.125rem;
        font-weight: 500;
        font-variant-numeric: tabular-nums;
        color: var(--ink);
        line-height: 1;
        white-space: nowrap;
    }

    .woocommerce-cart table.shop_table.cart tbody td.product-subtotal::before {
        display: none;
    }

    /* Reset qty stepper margin auto của desktop, scope mobile. */
    .woocommerce-cart table.shop_table .quantity.gv-qty-stepper {
        margin: 0;
    }

    /* --- Actions row (coupon) --- */
    /* td.actions là cell duy nhất hiển thị độc lập như card (shop_table_responsive
       wrap tr thành block bordered). Cần padding ngang + dưới để nội dung không
       dính sát border card; gap giữa coupon block và update_cart button đã đủ
       tách section khi coupon mở. Khi coupon đóng (chỉ summary), thêm divider
       1px để toggle không trông như sub-action của "Cập nhật giỏ". */
    .woocommerce-cart table.shop_table.cart tbody td.actions {
        flex: 0 0 100%;
        width: 100%;
        display: flex;
        flex-direction: column;
        gap: 0.75rem;
        padding: 16px;
        border: 0;
    }

    .woocommerce-cart table.shop_table.cart tbody td.actions::before {
        display: none;
    }

    .woocommerce-cart .actions .gv-cart-coupon {
        float: none;
        width: 100%;
        max-width: none;
        flex: 0 0 100%;
    }

    .woocommerce-cart .actions .gv-cart-coupon:not([open]) {
        border-bottom: 1px solid var(--ink-line);
        padding-bottom: 0.625rem;
    }

    .woocommerce-cart .actions .gv-cart-coupon .coupon {
        gap: 0.625rem;
    }

    .woocommerce-cart #coupon_code {
        flex: 1 1 100%;
        width: 100%;
        min-width: 0;
        height: 48px;
    }

    .woocommerce-cart .actions .coupon .button[name="apply_coupon"] {
        align-self: flex-start;
    }

    .woocommerce-cart .actions .button[name="update_cart"] {
        float: none;
        align-self: flex-end;
    }

    /* --- Cart totals: giữ paper-warm box, tune padding mobile --- */
    .woocommerce-cart .cart_totals {
        padding: 20px 16px;
    }

    /* Hide <th> trong cart_totals mobile — duplicate với td::before pseudo
       (data-title) của shop_table_responsive. Mỗi tr-card chỉ còn 1 row
       label-value (td::before label trái, value phải). */
    .woocommerce-cart .cart_totals table.shop_table tbody tr > th {
        display: none;
    }

    /* Order-total: bỏ border-top: 1px var(--ink) (line ~317) — trên mobile
       mỗi tr là card bordered, thick black line trên đầu card thành layered
       border ugly. Card border + price font 1.75rem Cormorant đã đủ emphasize
       total. Padding theo responsive default (14px 16px). */
    .woocommerce-cart .cart_totals table.shop_table tr.order-total td {
        border-top: 0;
        padding-top: 14px;
        padding-bottom: 14px;
    }

    /* Shipping row có nội dung nhiều dòng (ul#shipping_method + paragraph
       hint). Default flex space-between đẩy 3 child sang 3 cột chen chúc.
       Force column-stack: label trái (::before) → free-shipping label →
       hint paragraph, mỗi item full width. */
    .woocommerce-cart .cart_totals table.shop_table tr.shipping td {
        flex-direction: column;
        align-items: flex-start;
        text-align: left;
        gap: 6px;
    }

    /* --- Checkout button full width mobile.
       `.checkout-button` rule chung (line ~1078) là `display: inline-flex` →
       `width: 100%` không stretch (inline-flex shrink-to-content mặc định).
       Force `display: flex` ở mobile để width 100% có hiệu lực; parent
       `.wc-proceed-to-checkout` dùng negative horizontal margin để stretch
       button edge-to-edge của cart_totals card (bù lại padding 16px của
       cart_totals). Đo Playwright 2026-05-02: trước fix CTA = 259px / box
       380px; sau bù margin: CTA stretch full 380px viewport-width. */
    .woocommerce-cart .cart_totals .wc-proceed-to-checkout {
        display: flex;
        margin-left: -16px;
        margin-right: -16px;
        margin-bottom: -20px;
    }

    .woocommerce-cart .wc-proceed-to-checkout .checkout-button,
    .woocommerce-cart .wc-proceed-to-checkout a.button.alt {
        display: flex;
        flex: 1 1 auto;
        width: 100%;
        box-sizing: border-box;
    }

    /* Checkout reorder trên mobile (không cart) */
    .woocommerce-checkout #order_review_heading,
    .woocommerce-checkout #order_review {
        position: static;
        order: -1;
    }
}

/* --- Tablet: full-width table + horizontal cart totals (768px - 959px) ----- */
/* Cart-collaterals nằm dưới table (grid 2-cột chỉ active từ 960px).
   Ở tablet, cart_totals chuyển sang layout ngang: breakdown trái, CTA phải. */

@media (min-width: 768px) and (max-width: 959px) {
    .woocommerce-cart .cart_totals {
        display: grid;
        grid-template-columns: 1fr auto;
        align-items: center;
        gap: 1.5rem 2.5rem;
    }

    .woocommerce-cart .cart_totals h2 {
        grid-column: 1 / -1;
        margin: 0 0 0.25rem;
    }

    .woocommerce-cart .cart_totals table.shop_table {
        grid-column: 1;
        margin: 0;
    }

    .woocommerce-cart .cart_totals .wc-proceed-to-checkout {
        grid-column: 2;
        margin: 0;
    }

    .woocommerce-cart .cart_totals .wc-proceed-to-checkout .checkout-button {
        width: auto;
        min-width: 200px;
    }
}

/* --- Sticky checkout CTA (mobile + tablet) --------------------------------- */

.gv-cart-sticky-checkout {
    display: none;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 50;
    background: var(--paper);
    border-top: 1px solid var(--ink-line);
    padding: 12px 1rem;
}

body.gv-cart--past-table .gv-cart-sticky-checkout {
    display: block;
    text-align: center;
}

.gv-cart-sticky-checkout .checkout-button {
    width: 100%;
}

/* --- Reduced motion ------------------------------------------------------ */

@media (prefers-reduced-motion: reduce) {
    .woocommerce-cart .wc-proceed-to-checkout .checkout-button,
    .woocommerce-cart .wc-proceed-to-checkout a.button.alt,
    .woocommerce-checkout #place_order,
    .woocommerce-order-pay #place_order,
    .woocommerce-order-received .button.wc-forward,
    .woocommerce-cart .button.wc-forward,
    .woocommerce-checkout .button.wc-forward,
    .woocommerce-cart table.shop_table .product-remove a.remove {
        transition: none;
    }

    .woocommerce-cart .wc-proceed-to-checkout .checkout-button:hover,
    .woocommerce-cart .wc-proceed-to-checkout a.button.alt:hover,
    .woocommerce-checkout #place_order:hover,
    .woocommerce-order-pay #place_order:hover,
    .woocommerce-order-received .button.wc-forward:hover,
    .woocommerce-cart .button.wc-forward:hover,
    .woocommerce-checkout .button.wc-forward:hover {
        transform: none;
    }
}

/**
 * AJAX add-to-cart (cart-add.js) — UI residue cleanup.
 *
 * Trên các page có entry point ATC AJAX (shop/category/PDP), drawer mini-cart
 * là feedback chính. Ẩn link "View cart" cũ (Woo `<a class="added_to_cart">`
 * inject sau non-AJAX add) và `.woocommerce-message` notice top-of-page —
 * cả hai đều dư thừa khi mini-cart đã mở. Scope bằng body class để không
 * ảnh hưởng /cart, /checkout, /my-account.
 */
body.woocommerce-shop .added_to_cart,
body.tax-product_cat .added_to_cart,
body.tax-product_tag .added_to_cart,
body.single-product .added_to_cart {
    display: none !important;
}

body.woocommerce-shop .woocommerce-notices-wrapper .woocommerce-message,
body.tax-product_cat .woocommerce-notices-wrapper .woocommerce-message,
body.tax-product_tag .woocommerce-notices-wrapper .woocommerce-message,
body.single-product .woocommerce-notices-wrapper .woocommerce-message {
    display: none !important;
}

/**
 * Inline error span — `cart-add.js` inject sau button khi POST fail
 * (sản phẩm hết hàng, network 5xx, variation chưa chọn).
 * Tự dismiss sau 4s; tiêu chuẩn editorial: eyebrow tone, không glaring.
 */
.gv-cart-add-error {
    display: inline-block;
    margin-top: 8px;
    font-family: var(--font-eyebrow, 'Inter', sans-serif);
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--ink-warn, #b00020);
}

/**
 * Loop button + PDP submit — busy / success states.
 */
[data-gv-add-to-cart].is-loading,
form.cart[data-gv-ajax-cart="1"] button[type="submit"].is-loading {
    opacity: 0.65;
    pointer-events: none;
}

[data-gv-add-to-cart].is-added,
form.cart[data-gv-ajax-cart="1"] button[type="submit"].is-added {
    background-color: var(--ink-success, #2d7a3a);
    color: #fff;
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/checkout-flow.css */
/* ==========================================================================
   checkout-flow.css — B2C best-practice layer cho `[woocommerce_checkout]`.

   Áp ở scope `body.gv-checkout-tunnel` (set bởi includes/checkout.php → body_class
   filter). Mọi rule trong file này KHÔNG được leak sang cart / order-pay /
   order-received — đó là phận sự của commerce-flow.css.

   Tổ chức:
   1. Tunnel chrome      — ẩn nav/footer/breadcrumb, header tối giản.
   2. Layout overrides   — section card, vertical rhythm.
   3. Floating label     — animation co lên khi focus / has-value.
   4. Inline validation  — error message dưới field, không alert top.
   5. Address 2-cấp VN   — Tỉnh + Phường/Xã, gating theo body.gv-country-vn.
   6. Gift message       — first-class field với icon + counter.
   7. Coupon panel       — collapsible details trong order summary.
   8. Radio cards        — shipping + payment unified style.
   9. Mobile sticky bar  — bottom CTA xuất hiện khi scroll xa #place_order.
  10. Order summary mobile — accordion collapsible.
  11. Trust line        — "Bảo mật · 24/7 · Hoàn 7 ngày" dưới CTA.

   Tokens: kế thừa --ink, --paper, --paper-warm từ commerce-flow.css.
   ========================================================================== */

/* ==========================================================================
   1. Tunnel chrome — checkout là đường hầm, không phải trang
   ========================================================================== */

/* Header: ẩn nav primary, search button, account link, hamburger.
   Giữ logo (link về /cart/) + cart count dạng compact. */
body.gv-checkout-tunnel .gv-home-nav,
body.gv-checkout-tunnel #gv-search-toggle,
body.gv-checkout-tunnel .gv-home-header__link--desktop,
body.gv-checkout-tunnel .gv-menu-toggle,
body.gv-checkout-tunnel #gv-mobile-menu {
    display: none !important;
}

body.gv-checkout-tunnel .gv-home-header {
    border-bottom: 1px solid var(--ink-line);
    background: var(--paper);
}

body.gv-checkout-tunnel .gv-home-header__inner {
    padding-top: 0.875rem;
    padding-bottom: 0.875rem;
}

body.gv-checkout-tunnel .gv-home-header__actions {
    gap: 1rem;
    align-items: center;
}

/* Secure-checkout badge — SVG lock (stroke 1.8 match search-icon) + eyebrow Inter
   uppercase tracking 0.18em đồng nhất với header eyebrow toàn theme. Tránh emoji
   🔒 vì render OS-specific (Apple emoji vàng/kim → toy-feel).

   ⚠ COLOR COUPLING: SVG stroke hardcode `#5c5c5c` = giá trị `--ink-muted`. Background
   SVG là external doc → không kế thừa currentColor. Nếu đổi `--ink-muted` (xem
   `partials/account.css` v.v.) PHẢI đổi cả `stroke='%235c5c5c'` trong url() bên
   dưới. Mask-image fix (currentColor-friendly) requires tách icon + text thành 2
   pseudo + flex order — complexity không xứng cho 1 badge tĩnh; chấp nhận coupling
   với comment guard. */
body.gv-checkout-tunnel .gv-home-header__actions::before {
    content: 'Thanh toán bảo mật';
    display: inline-flex;
    align-items: center;
    padding-left: 22px;
    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c5c5c' stroke-width='1.8' stroke-linecap='square' stroke-linejoin='miter'%3E%3Crect x='5' y='11' width='14' height='10'/%3E%3Cpath d='M8 11V7a4 4 0 0 1 8 0v4'/%3E%3C/svg%3E") no-repeat left center / 14px 14px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin-right: auto;
    margin-left: 1.5rem;
    line-height: 1;
}

@media (max-width: 599px) {
    body.gv-checkout-tunnel .gv-home-header__actions::before {
        display: none;
    }
}

/* Cart link → bag icon + "Giỏ hàng" eyebrow. Trong tunnel ẩn count "(N)" vì
   khách đang chốt — chỉ cần affordance về cart. Native text "Giỏ hàng " trong
   header.php giữ làm accessible name (không dùng pseudo-content). Icon dùng
   mask + currentColor để tự sync màu khi hover/focus (sạch hơn 2 SVG variants). */
body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger] {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    line-height: 1;
    padding-bottom: 3px;
    border-bottom: 1px solid transparent;
    text-decoration: none;
    white-space: nowrap;
    transition: color 0.18s ease-out, border-color 0.18s ease-out;
}

body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger] .gv-cart-count {
    display: none;
}

body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger]::before {
    content: '';
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    background-color: currentColor;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='square' stroke-linejoin='miter'%3E%3Cpath d='M5.5 8h13l-1 12h-11z'/%3E%3Cpath d='M9 8V6a3 3 0 0 1 6 0v2'/%3E%3C/svg%3E") no-repeat center / contain;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='square' stroke-linejoin='miter'%3E%3Cpath d='M5.5 8h13l-1 12h-11z'/%3E%3Cpath d='M9 8V6a3 3 0 0 1 6 0v2'/%3E%3C/svg%3E") no-repeat center / contain;
}

body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger]:hover,
body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger]:focus-visible {
    color: var(--ink);
    border-bottom-color: var(--ink);
    text-decoration: none;
}

/* Footer: ẩn dài, giữ chỉ sub-line copyright + address. */
body.gv-checkout-tunnel .gv-home-footer__main {
    display: none;
}

body.gv-checkout-tunnel .gv-home-footer {
    background: var(--paper);
    border-top: 1px solid var(--ink-line);
}

body.gv-checkout-tunnel .gv-home-footer__sub {
    padding: 1rem 0;
}

body.gv-checkout-tunnel .gv-home-footer__sub-inner {
    font-size: 0.75rem;
    color: var(--ink-muted);
    letter-spacing: 0.02em;
}

/* Breadcrumb GIỮ trong tunnel (Rom chốt 2026-05-01: trợ giúp định vị, không
   phải distraction). Render bởi `gv_render_default_breadcrumbs()` ở header.php
   với wrapper `.gv-post-breadcrumb`; style chung từ `partials/archive-blog.css`
   (Inter 0.75rem ink-muted). */

/* ==========================================================================
   2. Layout overrides — vertical rhythm, section card framing
   ========================================================================== */

body.gv-checkout-tunnel .gv-woo {
    padding-top: 2.5rem;
}

@media (min-width: 1024px) {
    body.gv-checkout-tunnel .gv-woo {
        padding-top: 4rem;
    }
}

/* Page heading H1 "Thanh toán" được render bởi gv-page-header (the_title()).
   KHÔNG có rule riêng — kế thừa style chung từ partials/page-content.css. */

/* Tunnel grid alignment — `commerce-flow.css` mặc định grid 2 row (row 1 cho
   `#order_review_heading`, row 2 cho `#order_review`) + `row-gap: 3rem`. Khi
   tunnel hide heading (display:none ở §2 dưới, hoặc media query ≥768px), row 1
   collapse về 0 nhưng row-gap 3rem vẫn chen giữa → `#order_review` start cách
   top 3rem, lệch xuống so với input first_name/last_name. Fix: gộp về 1 row,
   row-gap 0. */
@media (min-width: 960px) {
    body.gv-checkout-tunnel form.checkout {
        grid-template-rows: auto;
        row-gap: 0;
    }

    body.gv-checkout-tunnel #customer_details {
        grid-row: 1;
    }

    body.gv-checkout-tunnel #order_review {
        grid-row: 1;
        /* Tunnel header KHÔNG sticky → 5.5rem (default từ commerce-flow.css) tạo
           khoảng trống thừa khi panel pin. Tighten về 1.5rem. Sticky tự unstick
           khi #customer_details bottom scroll qua → panel đi cùng content (best
           practice Stripe/Shopify). */
        top: 1.5rem;
    }
}

/* Row tổng — tunnel-specific tone exception cho rule VIII (data-tables SSOT).
   SSOT pattern là "totals row tô đen làm anchor"; tunnel chốt 2026-05-01 đảo
   chiều: bỏ block đen nặng, chuyển anchor sang top-border 2px ink + price bold
   Cormorant + label eyebrow muted. Lý do giữ trong checkout-flow.css thay vì
   data-tables.css: tunnel là page-of-its-own scope, đặt cosmetic của route
   riêng vào partial của route ấy (đúng tinh thần exception "trong partial của
   trang đó" ở rule VIII).

   Padding ngang giữ 20px khớp SSOT để cột "Tổng"/amount align dọc với rows
   subtotal/shipping/fee phía trên. */
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total th,
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td {
    background: transparent;
    color: var(--ink);
    padding: 18px 20px 12px;
    border-top: 2px solid var(--ink);
    border-bottom: 0;
}

body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total th {
    text-align: left;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    vertical-align: middle;
}

body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td {
    text-align: right;
}

/* Price amount: bold + Cormorant lớn để nổi bật mà không cần background. */
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td,
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td .amount,
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td .woocommerce-Price-amount,
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td strong,
body.gv-checkout-tunnel #order_review table.shop_table tfoot tr.order-total td bdi {
    color: var(--ink);
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-weight: 600;
    font-size: 1.5rem;
    letter-spacing: -0.01em;
}

/* Wrap mỗi section của customer_details thành "card framing" vô hình bằng
   spacing rhythm — không box thật, chỉ vertical breathing. */
body.gv-checkout-tunnel .woocommerce-billing-fields,
body.gv-checkout-tunnel .woocommerce-shipping-fields,
body.gv-checkout-tunnel .woocommerce-additional-fields {
    margin: 0 0 2.5rem;
}

/* Bỏ tất cả h3 sub-heading trong checkout. Page heading H1 "Thanh toán" đã
   set context cho cả trang; left/right không cần section title riêng (Rom chốt
   2026-05-01: layout đồng nhất với /cart).
   EXCEPTION: `#order_review_heading` phải VISIBLE trên mobile — nó đảm nhiệm
   accordion toggle cho summary. Desktop: ẩn. */
body.gv-checkout-tunnel form.checkout h3,
body.gv-checkout-tunnel .woocommerce-billing-fields h3,
body.gv-checkout-tunnel .woocommerce-shipping-fields h3,
body.gv-checkout-tunnel .woocommerce-additional-fields h3 {
    display: none;
}

@media (min-width: 768px) {
    body.gv-checkout-tunnel #order_review_heading {
        display: none;
    }
}

/* ==========================================================================
   3. Floating label — Inter eyebrow vẫn giữ identity, animate co lên khi focus
   ========================================================================== */

/* Floating label chỉ áp với form-row có label + input (không áp checkbox/radio).
   Cần layer lên SSOT forms.css — selector specific hơn để override. */

body.gv-checkout-tunnel form.checkout .form-row {
    position: relative;
    padding-top: 0; /* reset SSOT, label sẽ float qua position absolute */
    margin-bottom: 1.125rem;
}

body.gv-checkout-tunnel form.checkout .form-row > label:not(.checkbox):not(.gv-checkout-gift__label) {
    position: absolute;
    top: 50%;
    left: 14px;
    transform: translateY(-50%);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
    color: var(--ink-muted);
    background: transparent;
    padding: 0 4px;
    pointer-events: none;
    transition: top 0.18s ease-out, font-size 0.18s ease-out, letter-spacing 0.18s ease-out, color 0.18s ease-out, transform 0.18s ease-out;
    z-index: 1;
    line-height: 1;
    margin: 0;
    max-width: calc(100% - 28px);
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

/* State float-up: focus, has-value (CSS-only via :placeholder-shown), JS class
   fallback, validation. Multi-trigger để cover edge case (autofill, paste,
   programmatic value set, browser quirk). PHP filter set placeholder=" " cho
   mọi field để `:placeholder-shown` selector match đúng. */
body.gv-checkout-tunnel form.checkout .form-row:has(input.input-text:focus) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row:has(textarea:focus) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row:has(input.input-text:not(:placeholder-shown)) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row:has(textarea:not(:placeholder-shown)) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row.gv-form-row-focused > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row.gv-form-row-filled > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-validated > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid.gv-form-row-touched > label:not(.checkbox):not(.gv-checkout-gift__label) {
    top: 0;
    transform: translateY(-50%);
    font-size: 0.625rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    background: var(--paper);
}

body.gv-checkout-tunnel form.checkout .form-row:has(input.input-text:focus) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row:has(textarea:focus) > label:not(.checkbox):not(.gv-checkout-gift__label),
body.gv-checkout-tunnel form.checkout .form-row.gv-form-row-focused > label:not(.checkbox):not(.gv-checkout-gift__label) {
    color: var(--ink);
}

/* Required marker tinh tế — chấm tròn nhỏ thay vì asterisk to. */
body.gv-checkout-tunnel form.checkout .form-row label .required {
    color: var(--ink);
    text-decoration: none;
    font-size: 0.7em;
    margin-left: 0.4em;
    vertical-align: middle;
    opacity: 0.6;
}

/* Optional marker explicit. */
body.gv-checkout-tunnel form.checkout .form-row label .optional {
    color: var(--ink-muted);
    font-style: italic;
    text-transform: lowercase;
    letter-spacing: 0;
    font-size: 0.7em;
    margin-left: 0.4em;
}

/* Textarea trong checkout: nén min-height vì notes/gift đã có field riêng.
   Visual base (border, padding ngang, font) ở SSOT `partials/forms.css` (rule VII). */
body.gv-checkout-tunnel form.checkout .form-row textarea {
    min-height: 96px;
}

/* Select chevron + select2 cosmetic: đặt ở SSOT `partials/forms.css` (rule VII).
   Floating-label-only override dưới đây — placeholder ẩn (label đảm nhiệm). */
body.gv-checkout-tunnel form.checkout .select2-container--default .select2-selection--single .select2-selection__placeholder {
    color: transparent;
}

/* ==========================================================================
   4. Inline validation — error message dưới field
   ========================================================================== */

/* Red border chỉ apply khi user đã touch (blur ít nhất 1 lần). Initial render
   Woo có thể stamp `.woocommerce-invalid` cho empty required fields → không
   nên show error trước khi user thực sự tương tác. */
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid.gv-form-row-touched input.input-text,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid.gv-form-row-touched select,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid.gv-form-row-touched textarea {
    border-color: #8a1f1f;
}

body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid.gv-form-row-touched > label:not(.checkbox):not(.gv-checkout-gift__label) {
    color: #8a1f1f;
}

/* Reset SSOT forms.css red border cho initial untouched state. */
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid:not(.gv-form-row-touched) input.input-text,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid:not(.gv-form-row-touched) select,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-invalid:not(.gv-form-row-touched) textarea {
    border-color: var(--ink-line);
}

body.gv-checkout-tunnel form.checkout .form-row .gv-field-error {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    margin: 0.4rem 0 0;
    font-size: 0.75rem;
    color: #8a1f1f;
    line-height: 1.4;
}

body.gv-checkout-tunnel form.checkout .form-row .gv-field-error::before {
    content: '⚠';
    font-size: 0.875rem;
    line-height: 1;
    flex-shrink: 0;
}

body.gv-checkout-tunnel form.checkout .form-row.woocommerce-validated input.input-text,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-validated select,
body.gv-checkout-tunnel form.checkout .form-row.woocommerce-validated textarea {
    border-color: var(--ink);
}

/* ==========================================================================
   5. Address 2-cấp VN post-reform 2025 — Tỉnh + Phường/Xã (ward dropdown lazy AJAX)

   Gating: chỉ render khi body.gv-country-vn (set bởi PHP body_class initial +
   JS syncCountryUI sau country_to_state_changed). Khi country ≠ VN, ward row
   ẩn — Woo render state/city/postcode default theo locale country đã chọn.
   ========================================================================== */

/* sr-only: country-hidden chỉ khi shop bật single-country VN (PHP gắn class).
   city-hidden chỉ active khi country=VN (JS auto-fill từ province name). */
body.gv-checkout-tunnel form.checkout .form-row.gv-checkout-country-hidden,
body.gv-checkout-tunnel.gv-country-vn form.checkout .form-row.gv-checkout-city-hidden {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* Ward row chỉ hiện khi country=VN. Country khác → ẩn hoàn toàn. */
body.gv-checkout-tunnel:not(.gv-country-vn) form.checkout .form-row.gv-checkout-ward {
    display: none !important;
}

/* Woo wc-country-select.js set `style="display: none"` inline trên state row
   khi country=VN không có state list stock. Mình rewrite select với 34 tỉnh
   từ inline config → row phải visible. Override scope-tight chỉ khi country=VN
   để không ép-hiện state row khi user chọn country khác. */
body.gv-checkout-tunnel.gv-country-vn form.checkout #billing_state_field,
body.gv-checkout-tunnel.gv-country-vn form.checkout #shipping_state_field {
    display: flex !important;
}

/* Select rows: ẩn floating label vì placeholder option đã đảm nhiệm "Chọn Tỉnh
   / Thành phố", "Chọn Phường / Xã". Khi user chọn 1 tỉnh, option đã chọn hiển
   thị tên tỉnh — label thừa. Dùng `:has(select)` modern selector. */
body.gv-checkout-tunnel form.checkout .form-row:has(select) > label:not(.checkbox):not(.gv-checkout-gift__label) {
    display: none;
}

/* Placeholder Woo đè floating label khi field empty + unfocused → ẩn placeholder
   khi label đang chiếm vị trí. Hiện placeholder chỉ khi user focus (label co lên,
   placeholder mô tả format). */
body.gv-checkout-tunnel form.checkout .form-row input.input-text:not(:focus)::placeholder,
body.gv-checkout-tunnel form.checkout .form-row textarea:not(:focus)::placeholder {
    color: transparent;
    opacity: 0;
}

body.gv-checkout-tunnel form.checkout .form-row input.input-text:focus::placeholder,
body.gv-checkout-tunnel form.checkout .form-row textarea:focus::placeholder {
    color: var(--ink-muted);
    opacity: 0.6;
}

/* Loading state for dependent dropdown — JS sẽ add class `gv-loading`. */
body.gv-checkout-tunnel form.checkout .form-row.gv-loading select {
    opacity: 0.55;
    pointer-events: none;
    background-color: var(--paper-warm);
}

body.gv-checkout-tunnel form.checkout .form-row.gv-loading::after {
    content: '';
    position: absolute;
    right: 40px;
    top: 50%;
    transform: translateY(-50%);
    width: 14px;
    height: 14px;
    border: 1.5px solid var(--ink-line);
    border-top-color: var(--ink);
    border-radius: 50%;
    animation: gv-checkout-spin 0.7s linear infinite;
}

@keyframes gv-checkout-spin {
    to { transform: translateY(-50%) rotate(360deg); }
}

/* ==========================================================================
   6. Gift message — first-class field với icon + counter

   Variant SSOT-forms.css (rule VII): textarea ở đây được render BÊN TRONG
   `<form class="checkout">` nên kế thừa visual base từ `.woocommerce form
   textarea`. Override editorial duy nhất: font Cormorant italic — vì copy
   này là "lời gửi tay" của khách, in literally trên thiệp gấp đính kèm,
   không phải textarea operational. Scope chặt qua class `.gv-checkout-gift__field`
   chỉ tồn tại ở 1 nơi này.
   ========================================================================== */

.gv-checkout-gift {
    display: block;
    margin: 1.5rem 0 0;
    padding: 1.25rem;
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
    border-left: 3px solid var(--ink);
}

.gv-checkout-gift__label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: none;
    color: var(--ink);
    margin: 0 0 0.625rem;
    line-height: 1.3;
    cursor: pointer;
}

.gv-checkout-gift__icon {
    display: inline-flex;
    align-items: center;
    width: 18px;
    height: 18px;
    color: var(--ink);
}

.gv-checkout-gift__icon svg {
    width: 100%;
    height: 100%;
}

.gv-checkout-gift__optional {
    font-size: 0.7em;
    color: var(--ink-muted);
    font-style: italic;
    text-transform: lowercase;
    letter-spacing: 0;
    margin-left: 0.25rem;
}

.gv-checkout-gift__field {
    width: 100%;
    min-height: 88px;
    padding: 12px 14px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    border-radius: 0;
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-size: 1.125rem;
    line-height: 1.5;
    color: var(--ink);
    box-shadow: none;
    resize: vertical;
    transition: border-color 0.2s ease-out;
    font-style: italic;
}

.gv-checkout-gift__field:focus {
    outline: 0;
    border-color: var(--ink);
}

.gv-checkout-gift__field::placeholder {
    color: var(--ink-muted);
    font-style: italic;
    opacity: 0.7;
}

.gv-checkout-gift__meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    margin-top: 0.5rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.08em;
    color: var(--ink-muted);
}

.gv-checkout-gift__hint {
    text-transform: uppercase;
    letter-spacing: 0.18em;
}

.gv-checkout-gift__counter {
    font-variant-numeric: tabular-nums;
}

.gv-checkout-gift__counter[data-state="warn"] {
    color: var(--ink);
    font-weight: 500;
}

.gv-checkout-gift__counter[data-state="full"] {
    color: #8a1f1f;
    font-weight: 500;
}

/* ==========================================================================
   7. Coupon panel — collapsible details trong order review
   ========================================================================== */

.gv-checkout-coupon-row {
    background: transparent !important;
}

.gv-checkout-coupon-row td {
    padding: 8px 0 !important;
    border-bottom: 1px solid var(--ink-line) !important;
}

.gv-checkout-coupon {
    display: block;
    width: 100%;
}

.gv-checkout-coupon__toggle {
    display: flex;
    align-items: center;
    justify-content: space-between;
    cursor: pointer;
    list-style: none;
    padding: 0.625rem 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    color: var(--ink);
    user-select: none;
}

.gv-checkout-coupon__toggle::-webkit-details-marker {
    display: none;
}

.gv-checkout-coupon__chevron {
    font-size: 1rem;
    line-height: 1;
    transition: transform 0.2s ease-out;
    color: var(--ink-muted);
}

.gv-checkout-coupon[open] .gv-checkout-coupon__chevron {
    transform: rotate(45deg);
}

.gv-checkout-coupon__panel {
    display: flex;
    gap: 0.5rem;
    margin-top: 0.625rem;
    padding-bottom: 0.5rem;
}

.gv-checkout-coupon__input {
    flex: 1 1 auto;
    height: 40px;
    padding: 0 12px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    border-radius: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    color: var(--ink);
    box-shadow: none;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.gv-checkout-coupon__input:focus {
    outline: 0;
    border-color: var(--ink);
}

.gv-checkout-coupon__apply {
    flex: 0 0 auto;
    padding: 0 18px;
    height: 40px;
    background: var(--ink);
    color: var(--paper);
    border: 0;
    border-radius: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    cursor: pointer;
    box-shadow: none;
    transition: background 0.2s ease-out;
}

.gv-checkout-coupon__apply:hover {
    background: var(--ink-soft);
}

.gv-checkout-coupon__apply[disabled] {
    opacity: 0.6;
    cursor: not-allowed;
}

.gv-checkout-coupon__feedback {
    margin: 0.25rem 0 0;
    min-height: 1em;
    font-size: 0.75rem;
    color: var(--ink-muted);
    line-height: 1.4;
}

.gv-checkout-coupon__feedback[data-state="success"] {
    color: var(--ink);
}

.gv-checkout-coupon__feedback[data-state="error"] {
    color: #8a1f1f;
}

/* ==========================================================================
   8. Radio cards — shipping methods + payment methods
   ========================================================================== */

/* Shipping methods (trong #order_review row Shipping).
   Logic 2 case:
   - Multi-method (≥2): radio card với border + selected state.
   - Single-method (vd "Free shipping" auto-selected): plain inline text, KHÔNG
     border/bg. Khách không cần "chọn", chỉ là info "miễn phí".
   Detect single-method: `:has(input[type="hidden"])` — Woo render hidden input
   thay radio khi chỉ 1 method available. */
body.gv-checkout-tunnel ul#shipping_method {
    list-style: none !important;
    margin: 0 !important;
    padding: 0 !important;
    display: grid;
    gap: 0.625rem;
}

body.gv-checkout-tunnel ul#shipping_method li {
    margin: 0;
    padding: 0;
    list-style: none;
}

/* --- Multi-method: radio card --- */
body.gv-checkout-tunnel ul#shipping_method li:has(input[type="radio"]) label {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    padding: 0.875rem 1rem;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    cursor: pointer;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--ink);
    text-transform: none;
    letter-spacing: 0;
    line-height: 1.4;
    margin: 0;
    transition: border-color 0.18s ease-out, background 0.18s ease-out;
}

body.gv-checkout-tunnel ul#shipping_method li:has(input[type="radio"]) label:hover {
    background: var(--paper-warm);
}

body.gv-checkout-tunnel ul#shipping_method li input[type="radio"] {
    accent-color: var(--ink);
    width: 16px;
    height: 16px;
    flex-shrink: 0;
    margin: 0;
}

body.gv-checkout-tunnel ul#shipping_method li:has(input[type="radio"]:checked) label {
    border-color: var(--ink);
    border-width: 1.5px;
    background: var(--paper-warm);
}

/* Price aligned right in multi-method shipping label */
body.gv-checkout-tunnel ul#shipping_method li:has(input[type="radio"]) label .woocommerce-Price-amount {
    margin-left: auto;
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-size: 1.125rem;
    font-weight: 500;
    color: var(--ink);
    font-variant-numeric: tabular-nums;
}

/* --- Single-method: plain inline text (Rom chốt 2026-05-01: "Free shipping
   không thêm background và border, đó chỉ là thông tin bình thường"). --- */
body.gv-checkout-tunnel ul#shipping_method li:not(:has(input[type="radio"])) label {
    display: inline;
    padding: 0;
    border: 0;
    background: transparent;
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    font-weight: 400;
    color: var(--ink);
    text-transform: none;
    letter-spacing: 0;
    line-height: 1.4;
    cursor: default;
}

/* Payment methods — radio circle ẩn (sr-only), label + border card thành click
   target. Selected state highlight bằng border-width + paper-warm bg. */
body.gv-checkout-tunnel #payment ul.payment_methods {
    display: grid;
    gap: 0.625rem;
}

body.gv-checkout-tunnel #payment ul.payment_methods li {
    padding: 0 !important;
    border-bottom: 0 !important;
    list-style: none;
}

body.gv-checkout-tunnel #payment ul.payment_methods li > label,
body.gv-checkout-tunnel #payment ul.payment_methods li > input + label {
    display: flex;
    align-items: center;
    padding: 1rem 1.125rem;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    cursor: pointer;
    margin: 0 !important;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    font-weight: 500;
    color: var(--ink);
    line-height: 1.4;
    text-transform: none;
    letter-spacing: 0;
    transition: border-color 0.18s ease-out, background 0.18s ease-out;
}

body.gv-checkout-tunnel #payment ul.payment_methods li > label:hover {
    background: var(--paper-warm);
}

body.gv-checkout-tunnel #payment ul.payment_methods li:has(input[type="radio"]:checked) > label {
    border-color: var(--ink);
    border-width: 1.5px;
    background: var(--paper-warm);
}

/* Hide native radio circle — label làm click target purely. clip-rect
   + position absolute = sr-only pattern, vẫn focusable khi tab keyboard. */
body.gv-checkout-tunnel #payment ul.payment_methods li input[type="radio"] {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

body.gv-checkout-tunnel #payment ul.payment_methods .payment_box {
    margin: 0;
    padding: 1rem 1.125rem 0.5rem 1.125rem;
    background: var(--paper);
    /* border: 1px solid var(--ink-line); */
    /* border-top: 0; */
    color: var(--ink-soft);
    font-size: 0.875rem;
    line-height: 1.5;
}

body.gv-checkout-tunnel #payment ul.payment_methods .payment_box::before {
    display: none;
}

/* ==========================================================================
   9. Mobile sticky bottom bar
   ========================================================================== */

.gv-checkout-stickybar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 60;
    display: none;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    width: 100%;
    height: 64px;
    padding: 0 1.25rem;
    background: var(--ink);
    color: var(--paper);
    border: 0;
    box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.08), 0 -8px 24px rgba(10, 10, 10, 0.18);
    cursor: pointer;
    font-family: 'Inter', system-ui, sans-serif;
    transform: translateY(100%);
    transition: transform 0.24s ease-out;
}

.gv-checkout-stickybar[data-visible="true"] {
    display: flex;
    transform: translateY(0);
}

.gv-checkout-stickybar__total {
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-size: 1.375rem;
    font-weight: 600;
    line-height: 1;
    font-variant-numeric: tabular-nums;
}

.gv-checkout-stickybar__cta {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

@media (min-width: 768px) {
    .gv-checkout-stickybar {
        display: none !important;
    }
}

/* Pad bottom on mobile khi sticky bar visible — tránh che #place_order area. */
@media (max-width: 767px) {
    body.gv-checkout-tunnel.gv-checkout-stickybar-on .gv-woo {
        padding-bottom: 96px;
    }
}

/* ==========================================================================
  10. Order summary mobile collapsible
   ========================================================================== */

/* Preview total chỉ hiện ở mobile (tunnel summary heading có total inline).
   Trên desktop, heading "Đơn hàng" + total mặc định trong table → preview thừa. */
body.gv-checkout-tunnel #order_review_heading .gv-summary-preview-total {
    display: none;
}

@media (max-width: 767px) {
    body.gv-checkout-tunnel #order_review_heading .gv-summary-preview-total {
        display: inline-block;
    }

    /* Reset commerce-flow.css rule: order_review không còn order: -1 fixed expand. */
    body.gv-checkout-tunnel #order_review_heading,
    body.gv-checkout-tunnel #order_review {
        order: 0;
    }

    /* Heading thành accordion summary clickable.
       Bleed-edge align với mobile container padding (commerce-flow.css mobile
       block set `.gv-woo { padding: 24px 1rem 80px }` → margin -1rem khớp,
       không tạo overflow horizontal scroll như -1.25rem cũ (đo Playwright
       2026-05-02: x=-4 trên viewport 412 = +8px overflow). */
    body.gv-checkout-tunnel #order_review_heading {
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 0.75rem;
        padding: 1rem;
        margin: 0 -1rem 0.75rem;
        background: var(--paper-warm);
        border: 1px solid var(--ink-line);
        border-bottom: 0;
        font-size: 0.75rem;
        text-transform: uppercase;
        letter-spacing: 0.18em;
    }

    body.gv-checkout-tunnel #order_review_heading::after {
        content: '+';
        font-size: 1.25rem;
        line-height: 1;
        color: var(--ink-muted);
        transition: transform 0.2s ease-out;
        flex-shrink: 0;
    }

    body.gv-checkout-tunnel.gv-checkout-summary-open #order_review_heading::after {
        transform: rotate(45deg);
        color: var(--ink);
    }

    /* Mobile total preview trong heading — JS inject `<span data-gv-summary-total>`. */
    body.gv-checkout-tunnel #order_review_heading .gv-summary-preview-total {
        margin-left: auto;
        margin-right: 0.5rem;
        font-family: 'Cormorant Garamond', Georgia, serif;
        font-size: 1.25rem;
        font-weight: 600;
        text-transform: none;
        letter-spacing: 0;
        color: var(--ink);
        font-variant-numeric: tabular-nums;
    }

    /* Default collapsed mobile. Bleed-edge -1rem khớp container padding mobile
       (commerce-flow.css `.gv-woo { padding: 24px 1rem … }`) — tránh overflow
       horizontal scroll khi width = container + 2.5rem > viewport. */
    body.gv-checkout-tunnel #order_review {
        max-height: 0;
        overflow: hidden;
        padding: 0 1rem;
        margin: 0 -1rem 1.5rem;
        border-left: 1px solid var(--ink-line);
        border-right: 1px solid var(--ink-line);
        border-bottom: 1px solid var(--ink-line);
        background: var(--paper-warm);
        transition: max-height 0.28s ease-out, padding 0.28s ease-out;
    }

    body.gv-checkout-tunnel.gv-checkout-summary-open #order_review {
        max-height: 9999px;
        padding: 1rem;
    }

    /* Payment methods + place_order phải LUÔN visible — chúng nằm trong #order_review
       trong markup Woo classic. Tách chúng ra logic display: pull ra khỏi accordion
       bằng cách nhân đôi vị trí — payment + place_order render bên ngoài thông qua
       `woocommerce_checkout_after_order_review` hoặc giữ trong nhưng force visible. */
}

/* ==========================================================================
  11. Trust line dưới CTA
   ========================================================================== */

.gv-checkout-trust {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    margin: 1rem 0 0;
    padding: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.04em;
    color: var(--ink-muted);
    line-height: 1.4;
    text-align: center;
}

.gv-checkout-trust__item {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}

.gv-checkout-trust__item svg {
    width: 13px;
    height: 13px;
    stroke: currentColor;
}

.gv-checkout-trust__sep {
    color: var(--ink-line);
    user-select: none;
}

@media (max-width: 559px) {
    .gv-checkout-trust {
        gap: 0.5rem;
        font-size: 0.6875rem;
    }
    .gv-checkout-trust__sep {
        display: none;
    }
}

/* ==========================================================================
  12. Place order CTA — text-only "ĐẶT HÀNG", total hiển thị trong order summary.
   ========================================================================== */

body.gv-checkout-tunnel #place_order {
    width: 100%;
    padding: 1.125rem 1.5rem;
    font-size: 0.9375rem;
    font-weight: 500;
    letter-spacing: 0.08em;
}

/* ==========================================================================
  13. Login + coupon top toggles — ẩn trong tunnel (login nén thành text link compact)
   ========================================================================== */

/* Login toggle giữ nhưng đặt compact ở vùng "Liên hệ" — Woo render bằng
   action `woocommerce_before_checkout_form` priority 10. Không gỡ vì có flow
   khách returning, chỉ restyle. */

body.gv-checkout-tunnel .woocommerce-form-login-toggle {
    margin: 0 0 1.5rem;
    padding: 0;
    width: 100%;
    display: block;
}

body.gv-checkout-tunnel .woocommerce-form-login-toggle .woocommerce-info {
    background: transparent;
    border: 0;
    border-left: 0;
    padding: 0;
    margin: 0;
    color: var(--ink-muted);
    font-size: 0.8125rem;
    text-align: left;
    width: 100%;
    display: block;
    line-height: 1.5;
    white-space: normal;
}

body.gv-checkout-tunnel .woocommerce-form-login-toggle .woocommerce-info::before {
    display: none;
}

body.gv-checkout-tunnel .woocommerce-form-login-toggle .woocommerce-info a {
    color: var(--ink);
    text-decoration: underline;
    text-underline-offset: 0.25em;
    font-weight: 500;
}

/* ==========================================================================
  14. Reduced motion
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
    body.gv-checkout-tunnel form.checkout .form-row > label,
    .gv-checkout-stickybar,
    body.gv-checkout-tunnel #order_review,
    body.gv-checkout-tunnel #order_review_heading::after,
    .gv-checkout-coupon__chevron,
    body.gv-checkout-tunnel .gv-home-header__link[data-gv-cart-trigger] {
        transition: none;
    }

    body.gv-checkout-tunnel form.checkout .form-row.gv-loading::after {
        animation: none;
    }
}

/* ==========================================================================
  15. Mobile chrome compaction — bỏ sticky header + nén gap giữa section

   Trên màn nhỏ tunnel ưu tiên focus: header KHÔNG sticky (cuộn ra khỏi viewport
   theo content), và space giữa form fields → "ĐƠN HÀNG" accordion được nén lại
   vì grid `gap: 2.5rem` (commerce-flow) chồng với `margin-bottom: 2.5rem` của
   .woocommerce-{billing,shipping,additional}-fields → cộng 80px gap thừa mobile.
   ========================================================================== */

@media (max-width: 767px) {
    body.gv-checkout-tunnel .gv-home-header {
        position: static;
    }

    /* Header.js scroll handler vẫn toggle .is-hidden / .is-scrolled trên mọi
       page → khi static, .is-hidden translateY(-100%) sẽ kéo header ra khỏi
       flow (gây nháy + đẩy content). Reset 2 class này trong scope tunnel mobile. */
    body.gv-checkout-tunnel .gv-home-header.is-hidden {
        transform: none;
    }

    body.gv-checkout-tunnel .gv-home-header.is-scrolled {
        background: var(--paper);
        backdrop-filter: none;
    }

    /* Header không còn fixed → bỏ padding-top compensation từ header.css. */
    body.gv-checkout-tunnel:not(.home) {
        padding-top: 0;
    }

    /* Nén gap giữa #customer_details, #order_review_heading, #order_review.
       Section margin (2.5rem) đã đủ nhịp; không cần grid gap thêm. */
    body.gv-checkout-tunnel form.checkout {
        gap: 1.25rem;
    }

    body.gv-checkout-tunnel .woocommerce-billing-fields,
    body.gv-checkout-tunnel .woocommerce-shipping-fields,
    body.gv-checkout-tunnel .woocommerce-additional-fields {
        margin-bottom: 0;
    }

    /* Hide accordion heading "ĐƠN HÀNG 469.000 đ" trên mobile — summary đã
       luôn mở mặc định (body class `gv-checkout-summary-open` set ở
       includes/checkout.php:957) và total đã có ở table tfoot bên trong
       #order_review nên row preview thừa. */
    body.gv-checkout-tunnel #order_review_heading {
        display: none;
    }

    /* Border-top fallback cho #order_review — top edge gốc của card thuộc
       về heading; khi heading hidden, panel cần border-top để khép viền. */
    body.gv-checkout-tunnel #order_review {
        border-top: 1px solid var(--ink-line);
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/account.css */
/* ==========================================================================
   account.css — Group H (My Account: dashboard, orders, view-order, downloads,
   addresses, payment-methods, edit-account, lost-password).
   Áp lên `.woocommerce-account`. Editorial vertical menu trái + content phải.

   ⚠ Form control + data table KHÔNG định nghĩa ở đây nữa — đã gom về SSOT
   `partials/forms.css` (input/select/textarea/label/submit) và
   `partials/data-tables.css` (shop_table/orders-table). Partial này CHỈ giữ
   layout 2-cột, vertical nav, dashboard greeting/cards, view-order detail
   sections, address card. Khi cần đổi style input hoặc table → sửa SSOT.
   ========================================================================== */

/* --- Tokens local. */
.woocommerce-account,
.gv-woo .woocommerce-account,
.gv-woo {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
}

/* --- box-sizing: border-box trong scope myaccount.
       Lý do: wrapper `.gv-woo` ở commerce-flow chỉ áp box-sizing cho
       cart/checkout/order-pay/order-received body class — KHÔNG cover
       woocommerce-account. Nếu thiếu, padding/border của card (vd
       `.woocommerce-Address` border 1px + padding 32px) cộng thêm width →
       tràn grid cell. */
.woocommerce-account .gv-woo,
.woocommerce-account .gv-woo *,
.woocommerce-account .gv-woo *::before,
.woocommerce-account .gv-woo *::after {
    box-sizing: border-box;
}

/* Wrapper container — `.woocommerce-account .gv-woo` đã có trong selector list
   của `commerce-flow.css` (cùng padding/max-width với cart/checkout/order-*).
   KHÔNG re-define ở đây để tránh divergence. */

/* --- 2-col layout: nav trái 240px / content phải flex --------------------- */
.woocommerce-account .woocommerce {
    display: block;
}

.woocommerce-account .woocommerce > .woocommerce-notices-wrapper {
    grid-column: 1 / -1;
}

@media (min-width: 1024px) {
    .woocommerce-account .woocommerce {
        display: grid;
        grid-template-columns: 240px 1fr;
        gap: 56px;
        align-items: start;
    }
}

/* --- Vertical editorial nav ---------------------------------------------- */
.woocommerce-MyAccount-navigation {
    margin-bottom: 32px;
    border-top: 1px solid var(--ink-line);
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    .woocommerce-MyAccount-navigation {
        position: sticky;
        top: 80px;
        margin-bottom: 0;
        border: 0;
        padding: 8px 0;
    }
}

.woocommerce-MyAccount-navigation ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}

.woocommerce-MyAccount-navigation li {
    margin: 0;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 1024px) {
    .woocommerce-MyAccount-navigation li {
        border-bottom: 0;
    }
}

.woocommerce-MyAccount-navigation li a {
    display: block;
    padding: 14px 16px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-decoration: none;
    border-left: 2px solid transparent;
    transition: color 0.15s ease-out, border-color 0.15s ease-out, background 0.15s ease-out;
}

.woocommerce-MyAccount-navigation li a:hover {
    color: var(--ink);
    background: var(--paper-warm);
}

.woocommerce-MyAccount-navigation li.is-active a,
.woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a {
    /* ưu tiên active state, logout style như link mặc định */
}

.woocommerce-MyAccount-navigation li.is-active a {
    color: var(--ink);
    border-left-color: var(--ink);
    background: var(--paper-warm);
}

.woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout {
    margin-top: 8px;
}

/* --- Content area --------------------------------------------------------- */
.woocommerce-MyAccount-content {
    min-width: 0;
}

.woocommerce-MyAccount-content > h2,
.woocommerce-MyAccount-content > h3 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.75rem, 3vw, 2.5rem);
    line-height: 1.05;
    letter-spacing: -0.015em;
    margin: 0 0 24px;
    color: var(--ink);
}

.woocommerce-MyAccount-content > p {
    font-size: 1rem;
    line-height: 1.7;
    color: var(--ink-soft);
    margin: 0 0 16px;
}

/* --- Dashboard greeting + 3 shortcut card (gv override dashboard.php) ----- */
.gv-account-dashboard__greeting {
    margin-bottom: 40px;
    border-bottom: 1px solid var(--ink-line);
    padding-bottom: 32px;
}

.gv-account-dashboard__eyebrow {
    margin: 0 0 12px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-account-dashboard__hello {
    margin: 0 0 12px;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.5rem, 6vw, 4.5rem);
    line-height: 0.95;
    letter-spacing: -0.025em;
    color: var(--ink);
}

.gv-account-dashboard__hello span {
    font-style: italic;
    color: var(--ink-soft);
}

.gv-account-dashboard__intro {
    margin: 0 0 16px;
    max-width: 56ch;
    font-size: 1rem;
    line-height: 1.6;
    color: var(--ink-soft);
}

.gv-account-dashboard__logout {
    margin: 0;
    font-size: 0.875rem;
    color: var(--ink-muted);
}

.gv-account-dashboard__logout a {
    color: var(--ink);
    text-decoration: underline;
    text-underline-offset: 4px;
}

.gv-account-dashboard__cards {
    display: grid;
    gap: 16px;
    grid-template-columns: 1fr;
    list-style: none;
    margin: 0;
    padding: 0;
}

@media (min-width: 768px) {
    .gv-account-dashboard__cards {
        grid-template-columns: repeat(3, 1fr);
        gap: 20px;
    }
}

.gv-account-card {
    margin: 0;
}

.gv-account-card__link {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 24px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
    color: var(--ink);
    text-decoration: none;
    height: 100%;
    transition: border-color 0.2s ease-out, transform 0.2s ease-out, background 0.2s ease-out;
}

.gv-account-card__link:hover {
    border-color: var(--ink);
    background: var(--paper-warm);
    transform: translateY(-3px);
}

.gv-account-card__kicker {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-account-card__title {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.5rem;
    line-height: 1.1;
    letter-spacing: -0.01em;
    color: var(--ink);
}

.gv-account-card__desc {
    font-size: 0.875rem;
    line-height: 1.55;
    color: var(--ink-muted);
}

.gv-account-card__arrow {
    position: absolute;
    top: 24px;
    right: 24px;
    color: var(--ink-muted);
    font-size: 1rem;
    transition: transform 0.2s ease-out, color 0.2s ease-out;
}

.gv-account-card__link:hover .gv-account-card__arrow {
    color: var(--ink);
    transform: translateX(4px);
}

/* --- Orders table style đã chuyển sang `partials/data-tables.css` (SSOT).
       Notice/empty-state style đã chuyển sang `partials/notices.css`.
       Phần này intentionally empty để giữ thứ tự section của partial. */

/* --- Pagination ----------------------------------------------------------- */
.woocommerce-pagination {
    display: flex;
    justify-content: center;
    margin: 32px 0;
}

.woocommerce-pagination ul {
    display: inline-flex;
    list-style: none;
    margin: 0;
    padding: 0;
    border: 1px solid var(--ink-line);
}

.woocommerce-pagination li {
    margin: 0;
}

.woocommerce-pagination a,
.woocommerce-pagination span {
    display: inline-block;
    padding: 10px 16px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.1em;
    color: var(--ink-muted);
    text-decoration: none;
    border-right: 1px solid var(--ink-line);
}

.woocommerce-pagination li:last-child a,
.woocommerce-pagination li:last-child span {
    border-right: 0;
}

.woocommerce-pagination .current {
    color: var(--paper);
    background: var(--ink);
}

/* --- View-order: editorial header (override `woocommerce/myaccount/view-order.php`) */
.gv-view-order__header {
    display: grid;
    gap: 12px;
    padding-bottom: 32px;
    border-bottom: 1px solid var(--ink-line);
    margin-bottom: 32px;
}

.gv-view-order__eyebrow {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-view-order__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.5rem, 5vw, 4rem);
    line-height: 0.95;
    letter-spacing: -0.025em;
    color: var(--ink);
}

.gv-view-order__title span {
    font-style: italic;
    color: var(--ink-soft);
}

.gv-view-order__status {
    justify-self: start;
    display: inline-flex;
    align-items: center;
    padding: 6px 14px;
    border: 1px solid var(--ink);
    background: var(--paper);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink);
}

/* Status pill biến thể theo trạng thái Woo. */
.gv-view-order__status--processing,
.gv-view-order__status--on-hold {
    background: var(--paper-warm);
}

.gv-view-order__status--completed {
    background: var(--ink);
    color: var(--paper);
    border-color: var(--ink);
}

.gv-view-order__status--cancelled,
.gv-view-order__status--failed,
.gv-view-order__status--refunded {
    border-color: #8a1f1f;
    color: #8a1f1f;
}

/* Summary 3-col: Mã đơn / Ngày đặt / Tổng cộng. */
.gv-view-order__summary {
    display: grid;
    gap: 0;
    grid-template-columns: 1fr;
    margin: 0 0 40px;
    border: 1px solid var(--ink-line);
    background: var(--paper);
}

@media (min-width: 600px) {
    .gv-view-order__summary {
        grid-template-columns: repeat(3, 1fr);
    }
}

.gv-view-order__summary-item {
    padding: 20px 24px;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 600px) {
    .gv-view-order__summary-item {
        border-bottom: 0;
        border-right: 1px solid var(--ink-line);
    }

    .gv-view-order__summary-item:last-child {
        border-right: 0;
    }
}

.gv-view-order__summary-item:last-child {
    border-bottom: 0;
}

.gv-view-order__summary-item dt {
    margin: 0 0 8px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-view-order__summary-item dd {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 1.0625rem;
    color: var(--ink);
}

.gv-view-order__summary-total {
    font-family: 'Cormorant Garamond', serif !important;
    font-weight: 500;
    font-size: 1.5rem !important;
    letter-spacing: -0.01em;
}

.gv-view-order__summary-total .woocommerce-Price-amount {
    font-family: inherit;
}

/* Section title chung cho notes / order updates. */
.gv-view-order__section-title {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.5rem;
    letter-spacing: -0.01em;
    margin: 0 0 16px;
    color: var(--ink);
}

/* Order notes (timeline-ish). */
.gv-view-order__notes {
    margin: 0 0 40px;
}

.gv-view-order__notes ol.woocommerce-OrderUpdates {
    list-style: none;
    margin: 0;
    padding: 0;
    border-left: 1px solid var(--ink-line);
}

.gv-view-order__notes .woocommerce-OrderUpdate {
    position: relative;
    padding: 0 0 24px 24px;
}

.gv-view-order__notes .woocommerce-OrderUpdate::before {
    content: '';
    position: absolute;
    left: -5px;
    top: 6px;
    width: 9px;
    height: 9px;
    background: var(--ink);
    border-radius: 50%;
}

.gv-view-order__notes .woocommerce-OrderUpdate-meta {
    margin: 0 0 4px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-view-order__notes .woocommerce-OrderUpdate-description p {
    margin: 0 0 6px;
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--ink-soft);
}

/* --- Order details + customer details vẫn dùng template Woo gốc.
       SSOT data-tables.css đã lo bảng items. Phần này chỉ tweak khoảng cách
       và ẩn h2 default Woo "Order details" vì editorial title trên đã thay. */
.woocommerce-order-details,
.woocommerce-customer-details {
    margin: 0 0 40px;
}

.woocommerce-order-details__title {
    /* Ẩn default Woo H2 vì view-order.php đã có editorial title. */
    position: absolute !important;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* --- Address card phương án DL key-value (view-order + edit-address list).
       Markup được render bởi 2 template override trong `woocommerce/order/
       order-details-customer.php` và `woocommerce/myaccount/my-address.php`.
       Pattern: paper-warm bg, no border accent, kicker eyebrow + heading
       Cormorant + DL row chia label trái / value phải, divider giữa rows,
       action button outline ở đáy.

       Khác hoàn toàn pattern view-order header (border-top ink) — tránh trùng
       visual identity giữa 2 vùng cùng trang. */

.gv-address-intro {
    margin: 0 0 24px;
    font-size: 0.9375rem;
    line-height: 1.6;
    color: var(--ink-muted);
}

.woocommerce-customer-details .col2-set,
.woocommerce-account .u-columns,
.woocommerce-account .woocommerce-Addresses {
    display: grid;
    gap: 20px;
    grid-template-columns: 1fr;
    margin: 0 0 32px;
}

@media (min-width: 768px) {
    .woocommerce-customer-details .col2-set,
    .woocommerce-account .u-columns,
    .woocommerce-account .woocommerce-Addresses {
        grid-template-columns: 1fr 1fr;
        gap: 24px;
    }
}

/* --- Card shell. Áp cho cả `.gv-address-card` (markup mới của template
       override) và `.woocommerce-Address` (legacy, fallback nếu Woo update
       template không tương thích). */
.gv-address-card,
.woocommerce-Address {
    position: relative;
    width: 100%;
    margin: 0;
    float: none;
    padding: 28px;
    border: 1px solid var(--ink-line);
    background: var(--paper-warm);
    display: flex;
    flex-direction: column;
    gap: 0;
}

@media (min-width: 768px) {
    .gv-address-card,
    .woocommerce-Address {
        padding: 32px;
    }
}

/* --- Header: kicker label nhỏ + tên người Cormorant + công ty optional. */
.gv-address-card__head {
    margin: 0 0 20px;
    padding: 0 0 18px;
    border-bottom: 1px solid var(--ink-line);
}

.gv-address-card__kicker {
    display: block;
    margin: 0 0 8px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-address-card__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.625rem;
    line-height: 1.05;
    letter-spacing: -0.015em;
    color: var(--ink);
    border-bottom: 0;
    padding-bottom: 0;
}

.gv-address-card__company {
    display: block;
    margin-top: 6px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    font-weight: 500;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-soft);
}

/* --- Body DL: rows chia label/value. Mobile stack, desktop 2-col grid. */
.gv-address-card__list {
    display: flex;
    flex-direction: column;
    gap: 0;
    margin: 0;
    padding: 0;
}

.gv-address-card__row {
    display: grid;
    grid-template-columns: 1fr;
    gap: 4px;
    padding: 14px 0;
    border-bottom: 1px solid var(--ink-line);
}

.gv-address-card__row:last-child {
    border-bottom: 0;
}

@media (min-width: 480px) {
    .gv-address-card__row {
        grid-template-columns: 110px 1fr;
        gap: 16px;
        align-items: baseline;
    }
}

.gv-address-card__row dt {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-address-card__row dd {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.9375rem;
    line-height: 1.6;
    color: var(--ink);
    word-break: break-word;
}

/* Empty state — chưa thiết lập địa chỉ. */
.gv-address-card__empty {
    margin: 0;
    padding: 14px 0;
    font-size: 0.9375rem;
    color: var(--ink-muted);
    font-style: italic;
}

/* --- Edit button: outline ở đáy card. Áp cho cả markup mới và legacy. */
.gv-address-card__edit,
.woocommerce-Address .edit {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    align-self: flex-start;
    margin-top: 20px;
    padding: 10px 18px;
    background: transparent;
    border: 1px solid var(--ink);
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0;
    transition: background 0.15s ease-out, color 0.15s ease-out, gap 0.15s ease-out;
}

.gv-address-card__edit:hover,
.woocommerce-Address .edit:hover {
    background: var(--ink);
    color: var(--paper);
    gap: 12px;
}

.gv-address-card__edit span,
.woocommerce-Address .edit span {
    line-height: 1;
}

/* --- Customer-details overrides cho legacy markup (nếu template không
       được override): style address blob fallback gọn. Nếu override OK, các
       rule dưới sẽ inert vì markup mới không có `<address>`. */
.woocommerce-customer-details address {
    font-style: normal;
    font-size: 0.9375rem;
    line-height: 1.7;
    color: var(--ink);
    margin: 0;
}

.woocommerce-customer-details--phone,
.woocommerce-customer-details--email {
    margin: 10px 0 0;
    font-size: 0.875rem;
    color: var(--ink-soft);
}

/* Spacing các phần sub trong /tai-khoan/edit-address/ */
.woocommerce-MyAccount-content > p:first-of-type + .u-columns,
.woocommerce-MyAccount-content > .woocommerce-Addresses {
    margin-top: 24px;
}

/* --- Forms (edit-account, edit-address form, lost-password, reset-password)
       chuyển sang `partials/forms.css` (SSOT). Phần dưới CHỈ giữ
       layout/spacing đặc thù của my-account. */

/* Edit-address form (sub-page /tai-khoan/edit-address/billing|shipping/):
   wrap form trong card pattern same family. Form `.edit-account` + `address`
   (Woo class) đều có chung pattern edit. */
.woocommerce-MyAccount-content form.woocommerce-address-fields,
.woocommerce-MyAccount-content form.edit-account,
.woocommerce-MyAccount-content form.woocommerce-EditAccountForm,
.woocommerce-MyAccount-content form.lost_reset_password {
    margin-top: 24px;
}

/* --- Edit-account layout: 2 section dọc, mỗi section tự chia 2 cột bên trong.
   Template Woo `form-edit-account.php` render flat:
     p.form-row-first   (First name)
     p.form-row-last    (Last name)
     p.form-row-wide    (Display name)
     p.form-row-wide    (Email)
     fieldset           (Password change: 3 form-row-wide)
     p                  (Nonce + Submit)

   Target visual:
     [Personal info — 2 col grid: First|Last / Display|Email]
     ─────────────
     [Password fieldset — 2 col grid: Current full / New|Confirm]
     ─────────────
     [Submit full]

   Tất cả ≥768px thay vì chỉ 1024px — để tablet cũng compact. */

@media (min-width: 768px) {
    .woocommerce-EditAccountForm.edit-account {
        display: grid;
        grid-template-columns: 1fr 1fr;
        column-gap: 24px;
        row-gap: 20px;
    }

    .woocommerce-EditAccountForm.edit-account > p,
    .woocommerce-EditAccountForm.edit-account > fieldset {
        margin: 0;
    }

    /* Override SSOT `.form-row-first/-last 50% inline-flex` — khi nằm trong
       grid 2-col, mỗi row chiếm full-width của cell mình. */
    .woocommerce-EditAccountForm.edit-account > .form-row-first,
    .woocommerce-EditAccountForm.edit-account > .form-row-last,
    .woocommerce-EditAccountForm.edit-account > .form-row-wide {
        width: 100%;
        margin-right: 0;
        display: flex;
    }

    /* Section 1 — personal info row 1 + row 2 */
    .woocommerce-EditAccountForm.edit-account > .form-row-first { grid-column: 1; }
    .woocommerce-EditAccountForm.edit-account > .form-row-last  { grid-column: 2; }
    /* Display name = p element thứ 3, Email = p element thứ 4. */
    .woocommerce-EditAccountForm.edit-account > p:nth-of-type(3) { grid-column: 1; }
    .woocommerce-EditAccountForm.edit-account > p:nth-of-type(4) { grid-column: 2; }

    /* Hide Woo .clear divs (legacy float helper) trong grid context. */
    .woocommerce-EditAccountForm.edit-account > .clear {
        display: none;
    }

    /* Section 2 — password fieldset span full + chia 2 col bên trong. */
    .woocommerce-EditAccountForm.edit-account > fieldset {
        grid-column: 1 / -1;
        margin-top: 8px;
        padding: 28px 32px;
        display: grid;
        grid-template-columns: 1fr 1fr;
        column-gap: 24px;
        row-gap: 20px;
    }

    .woocommerce-EditAccountForm.edit-account > fieldset legend {
        grid-column: 1 / -1;
        margin-bottom: 4px;
    }

    .woocommerce-EditAccountForm.edit-account > fieldset .form-row-wide {
        margin: 0;
        width: 100%;
        display: flex;
    }

    /* fieldset children: legend (1) | current (2) full | new (3) col1 | confirm (4) col2 */
    .woocommerce-EditAccountForm.edit-account > fieldset > p.form-row-wide:nth-of-type(1) {
        grid-column: 1 / -1;
    }
    .woocommerce-EditAccountForm.edit-account > fieldset > p.form-row-wide:nth-of-type(2) {
        grid-column: 1;
    }
    .woocommerce-EditAccountForm.edit-account > fieldset > p.form-row-wide:nth-of-type(3) {
        grid-column: 2;
    }

    /* Submit row + nonce: span full width ở dưới. p:last-of-type theo
       template form-edit-account.php là `<p>{nonce}{submit}</p>` — không
       có class form-row* nên distinct với 4 p phía trên. */
    .woocommerce-EditAccountForm.edit-account > p:last-of-type {
        grid-column: 1 / -1;
        margin-top: 8px;
    }

    /* Display name help text (em) — wrap xuống dòng dưới input. */
    .woocommerce-EditAccountForm.edit-account #account_display_name_description {
        display: block;
        margin-top: 6px;
        font-size: 0.8125rem;
        color: var(--ink-muted);
    }

    .woocommerce-EditAccountForm.edit-account #account_display_name_description em {
        font-style: normal;
    }
}

/* --- Reduced motion fallback. */
@media (prefers-reduced-motion: reduce) {
    .gv-account-card__link:hover {
        transform: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/auth.css */
/* ==========================================================================
   auth.css — Group I (/dang-nhap/ + auth quick-login modal).
   Áp lên:
     - main.gv-auth (page-dang-nhap.php) — editorial centered stack.
     - #gv-auth-modal (header.php) — quick login overlay.
   Token màu / typography theo brand-guideline §4 + §5.

   ⚠ Form control + submit button KHÔNG định nghĩa ở đây — đã gom vào SSOT
   `partials/forms.css` (rule VII). Cả `.gv-auth__form` (page) và
   `.auth-modal__form` (modal) cùng dùng pattern boxed 48px của checkout, nhằm
   đồng bộ trải nghiệm input giữa quick-login modal, /dang-nhap/, edit-account
   và checkout. Phần dưới CHỈ giữ layout 2-cột page, modal overlay/panel/tabs
   /toast/footer, và label `<span class="auth-modal__label">` (span — không
   phải `<label>` element nên SSOT không can thiệp).
   ========================================================================== */

/* --- Tokens local (selector ngoài .gv-home không thấy CSS vars trong base.css). */
.gv-auth,
.auth-modal {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
}

/* ==========================================================================
   /dang-nhap/ — editorial 1-col centered stack.
   Notice top → hero center (eyebrow + Cormorant headline + lead) → form center.
   Refactor từ 2-col (hero left | form right) sang 1-col vì 2-col làm mắt phải
   scan ngang; centered stack ổn định hơn cho cả desktop + mobile.
   ========================================================================== */

.gv-auth {
    background: var(--paper);
}

.gv-auth__container {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 56px 20px;
    /* box-sizing border-box: padding nằm TRONG width — cùng pattern với
       `.gv-blog-header__inner` / `.gv-page-header__inner`. Thiếu nó, total
       border-box = 1400 + 2×40 = 1480 → trên viewport 1440 sẽ tràn full
       1440 và `margin: auto` mất tác dụng (lệch 20px so với breadcrumb). */
    box-sizing: border-box;
}

/* Notice slot ở top container — `wc_print_notices()` echo vào đây TRƯỚC
   hero/form để toast `.woocommerce-error/.message/.info` hiện span full
   container 1400px, không bị nhét trong form col. Wrapper `.woocommerce` cần
   thiết để selector trong `notices.css` (scope `.woocommerce …`) ăn vào. */
.gv-auth__notices {
    display: block;
    width: 100%;
    margin-bottom: 32px;
}

@media (min-width: 1024px) {
    .gv-auth__notices {
        margin-bottom: 48px;
    }
}

/* Notice list/item ép full container width (override default Woo `max-width`
   và `margin: 0 auto` từ legacy stylesheet). */
.gv-auth__notices > .woocommerce-error,
.gv-auth__notices > .woocommerce-message,
.gv-auth__notices > .woocommerce-info,
.gv-auth__notices > .woocommerce-warning {
    width: 100%;
    max-width: none;
    margin: 0;
}

/* Header section dùng `gv-page-header` standard (xem `partials/page-content.css`)
   — left-aligned eyebrow + serif headline + lead, không centered. Custom hero
   class cũ (`gv-auth__hero` + `gv-auth__eyebrow` + `gv-auth__headline` +
   `gv-auth__lead`) đã bỏ; markup hiện ở `page-dang-nhap.php` dùng class chuẩn. */

/* Form section: left-align dưới header, max-width vừa để 2 cột login/register
   không bị stretch quá rộng trên ultra-wide. */
.gv-auth__form {
    margin: 40px 0 0;
    max-width: 1080px;
}

@media (min-width: 1024px) {
    .gv-auth__container {
        padding: 32px 40px 96px;
    }

    .gv-auth__form {
        margin-top: 56px;
    }
}

/* --- WC form login + register inside .gv-auth__form ---------------------- */
/* Style notice đã chuyển sang `partials/notices.css` (scope
   `body.woocommerce-account` đã cover trang `/dang-nhap/` vì WC tự thêm
   class này khi page chứa shortcode `[woocommerce_my_account]`). */
.gv-auth__form .woocommerce-notices-wrapper {
    margin-bottom: 16px;
}

/* Override account.css `.woocommerce-account .woocommerce { display: grid;
   grid-template-columns: 240px 1fr }` (dashboard 2-col nav rule) — không phù
   hợp cho login/register page vì shortcode `[woocommerce_my_account]` cũng
   wrap trong `<div class="woocommerce">`. Ép back về block để `.col2-set`
   bên trong fill full parent width. Specificity (0,3,0) > (0,2,0). */
.gv-auth .gv-auth__form .woocommerce {
    display: block;
    grid-template-columns: none;
}

/* Login + Register layout: stack 1-col mobile → 2-col side-by-side desktop. */
.gv-auth__form .u-columns,
.gv-auth__form .woocommerce > .u-columns,
.gv-auth__form .col2-set {
    display: grid;
    gap: 48px;
    grid-template-columns: 1fr;
    margin: 0;
}

@media (min-width: 1024px) {
    .gv-auth__form .u-columns,
    .gv-auth__form .woocommerce > .u-columns,
    .gv-auth__form .col2-set {
        grid-template-columns: 1fr 1fr;
        gap: 64px;
        align-items: start;
    }
}

/* Register form — flex-wrap để cho phép password + password_confirm 2-col side-by-side.
   Source order Woo: FN, LN, Email, Password, Phone, ConfirmPassword, [privacy/nonce/submit].
   Visual order mong muốn: FN | LN, Email, Phone, Password | ConfirmPassword, [privacy/submit]. */
.gv-auth__form form.woocommerce-form-register {
    display: flex;
    flex-flow: row wrap;
}

.gv-auth__form form.woocommerce-form-register > * {
    width: 100%;
}

/* Đẩy Password + ConfirmPassword xuống dưới Phone (DOM: Password trước Phone). */
.gv-auth__form form.woocommerce-form-register > p.form-row:has(input#reg_password) {
    order: 1;
}

.gv-auth__form form.woocommerce-form-register > p.form-row:has(input#reg_password_confirm) {
    order: 2;
}

/* Privacy / nonce / submit luôn cuối. */
.gv-auth__form form.woocommerce-form-register > .woocommerce-privacy-policy-text,
.gv-auth__form form.woocommerce-form-register > p.woocommerce-FormRow,
.gv-auth__form form.woocommerce-form-register > p.form-row:last-child {
    order: 3;
}

/* Tablet+ : Password | ConfirmPassword side-by-side (matching FN | LN pattern). */
@media (min-width: 768px) {
    .gv-auth__form form.woocommerce-form-register > p.form-row:has(input#reg_password) {
        width: calc(50% - 8px);
        margin-right: 16px;
    }

    .gv-auth__form form.woocommerce-form-register > p.form-row:has(input#reg_password_confirm) {
        width: calc(50% - 8px);
    }
}

/* Login col card — background mờ để chia rõ hai section "Đăng nhập" / "Đăng ký".
   Register col giữ nền paper để tạo contrast 2 cột rõ ràng. */
.gv-auth__form .col-1,
.gv-auth__form .col-2 {
    width: 100%;
    float: none;
    padding: 28px 28px 32px;
    box-sizing: border-box;
}

.gv-auth__form .col-1 {
    background: var(--paper-warm);
    border: 1px solid var(--ink-line);
}

.gv-auth__form .col-2 {
    background: var(--paper);
    border: 1px solid var(--ink-line);
    border-color: rgba(10, 10, 10, 0.06);
}

@media (min-width: 1024px) {
    .gv-auth__form .col-1,
    .gv-auth__form .col-2 {
        padding: 36px 36px 40px;
    }
}

.gv-auth__form h2 {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.75rem;
    line-height: 1.05;
    letter-spacing: -0.015em;
    margin: 0 0 18px;
    color: var(--ink);
}

/* ⚠ Form-row + label + input + checkbox-label + submit button đã chuyển
       sang SSOT `partials/forms.css` (`.gv-auth__form` selector). Phần dưới
       chỉ giữ link "lost password" + privacy text đặc thù auth. */

.gv-auth__form .lost_password,
.gv-auth__form .woocommerce-LostPassword {
    margin-top: 12px;
    font-size: 0.8125rem;
}

.gv-auth__form .lost_password a,
.gv-auth__form .woocommerce-LostPassword a {
    color: var(--ink-muted);
    text-decoration: underline;
    text-underline-offset: 4px;
}

.gv-auth__form .lost_password a:hover,
.gv-auth__form .woocommerce-LostPassword a:hover {
    color: var(--ink);
}

.gv-auth__form .woocommerce-privacy-policy-text {
    font-size: 0.75rem;
    line-height: 1.6;
    color: var(--ink-muted);
    margin-bottom: 16px;
}

/* Woo render thêm `<wc-order-attribution-inputs>` (Web Component vô hình) +
   privacy-policy-text rỗng (admin chưa cấu hình privacy text) → vẫn chiếm
   `display: block` row → tạo gap thừa giữa các input. Ẩn để form gọn. */
.gv-auth__form .woocommerce-privacy-policy-text:empty,
.gv-auth__form wc-order-attribution-inputs {
    display: none;
}

/* ==========================================================================
   #gv-auth-modal — header quick-login overlay.
   ========================================================================== */

.auth-modal {
    position: fixed;
    inset: 0;
    z-index: 70;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 18px 16px;
    background: rgba(10, 10, 10, 0.22);
    backdrop-filter: blur(14px);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.25s ease-out;
}

.auth-modal.is-open {
    opacity: 1;
    pointer-events: auto;
}

.auth-modal__panel {
    position: relative;
    width: min(480px, 100%);
    max-height: calc(100vh - 36px);
    overflow-y: auto;
    background: var(--paper-warm);
    border: 1px solid rgba(10, 10, 10, 0.08);
    box-shadow: 0 24px 80px -24px rgba(10, 10, 10, 0.35);
    padding: 40px 32px;
    outline: none;
}

.auth-modal__header {
    margin-bottom: 24px;
    position: relative;
}

.auth-modal__eyebrow {
    margin: 0 0 8px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.auth-modal__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 2.25rem;
    line-height: 1;
    letter-spacing: -0.02em;
    color: var(--ink);
}

.auth-modal__close {
    position: absolute;
    top: -8px;
    right: -8px;
    width: 36px;
    height: 36px;
    border: 0;
    background: transparent;
    color: var(--ink-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: color 0.2s ease-out;
}

.auth-modal__close:hover {
    color: var(--ink);
}

.auth-modal__close svg {
    width: 18px;
    height: 18px;
}

.auth-modal__form {
    display: flex;
    flex-direction: column;
    gap: 18px;
}

/* Hidden form (inactive tab) — `[hidden]` HTML attr cần override flex display. */
.auth-modal__form[hidden] {
    display: none;
}

/* Compact 2-col row (FN | LN trong register modal). */
.auth-modal__row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px;
}

/* --- Tabs (login / register switch) ----------------------------------- */
.auth-modal__tabs {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
    margin-bottom: 24px;
    border-bottom: 1px solid var(--ink-line);
}

.auth-modal__tab {
    border: 0;
    background: transparent;
    padding: 12px 4px 14px;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
    cursor: pointer;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: color 0.2s ease-out, border-color 0.2s ease-out;
}

.auth-modal__tab:hover {
    color: var(--ink);
}

.auth-modal__tab.is-active {
    color: var(--ink);
    border-bottom-color: var(--ink);
}

.auth-modal__tab:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 2px;
}

/* --- Toast (form-level error/info banner inside modal) ---------------- */
.auth-modal__toast {
    margin-bottom: 16px;
    padding: 12px 14px;
    background: var(--paper-cream);
    border-left: 3px solid var(--ink-line);
    color: var(--ink);
    font-size: 0.8125rem;
    line-height: 1.5;
}

.auth-modal__toast.is-error {
    background: #fbeceb;
    border-left-color: #b13a2c;
    color: #4a1612;
}

/* --- Submit busy state during AJAX request ---------------------------- */
.auth-modal__submit[aria-busy="true"] {
    opacity: 0.6;
    cursor: wait;
}

.auth-modal__field {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.auth-modal__label {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

/* --- Woo-injected `<p class="form-row">` (Phone, Confirm Password) ----------
   `auth-register.php` hook `do_action('woocommerce_register_form')` inject
   field này vào modal register form (cùng filter chain với /dang-nhap/).
   Visual của input + label đã do SSOT `partials/forms.css` xử lý
   (`.auth-modal__form input[type=...]` + `.auth-modal__form label` không có
   nên label dùng default — Woo `<p class="form-row"> <label>` được
   `.auth-modal__form > p.form-row label` style ở dưới). Phần dưới CHỈ giữ
   layout row riêng cho modal (gap 6px thay vì margin-bottom 18px như SSOT row,
   vì `.auth-modal__form` đã có flex-gap 18px ngoài).
   ----------------------------------------------------------------------- */
.auth-modal__form > p.form-row {
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.auth-modal__form > p.form-row label {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-muted);
    line-height: 1.2;
    margin: 0;
}

.auth-modal__form > p.form-row label .required,
.auth-modal__form > p.form-row label .optional {
    color: var(--ink-muted);
    text-decoration: none;
    margin-left: 0.25em;
}

/* Woo render `<wc-order-attribution-inputs>` (Web Component vô hình) +
   `<div class="woocommerce-privacy-policy-text">` (rỗng nếu admin không cấu
   hình privacy text). Cả 2 không có nội dung visual nhưng vẫn chiếm gap →
   ẩn để form không có khoảng trống lạ. */
.auth-modal__form .woocommerce-privacy-policy-text:empty,
.auth-modal__form wc-order-attribution-inputs {
    display: none;
}

/* --- Register form: 2-col cho Password + Password_confirm (>=480px) ----
   Mobile: stack mọi field. Tablet+: visual order = FN | LN, Email, Phone,
   Password | ConfirmPassword, Submit. */
@media (min-width: 480px) {
    .auth-modal__form[data-auth-form="register"] {
        flex-flow: row wrap;
        gap: 18px;
    }

    .auth-modal__form[data-auth-form="register"] > * {
        width: 100%;
        margin: 0;
    }

    .auth-modal__form[data-auth-form="register"] > .auth-modal__field:has(input[name="password"]) {
        order: 5;
        width: calc(50% - 9px);
    }

    .auth-modal__form[data-auth-form="register"] > p.form-row:has(input#reg_password_confirm) {
        order: 6;
        width: calc(50% - 9px);
    }

    .auth-modal__form[data-auth-form="register"] > p.form-row:has(input#reg_phone) {
        order: 7;
    }

    .auth-modal__form[data-auth-form="register"] > button[type="submit"] {
        order: 8;
    }

    .auth-modal__form[data-auth-form="register"] > .auth-modal__footer {
        order: 9;
    }
}

.auth-modal__remember {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 0.8125rem;
    color: var(--ink-muted);
}

/* Submit button visual: SSOT (`.auth-modal__form button[type="submit"]`).
   Chỉ giữ busy state ở trên (line ~410) — riêng modal AJAX. */

.auth-modal__footer {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin-top: 8px;
    font-size: 0.8125rem;
    color: var(--ink-muted);
}

.auth-modal__footer a {
    color: var(--ink-muted);
    text-decoration: underline;
    text-underline-offset: 4px;
}

.auth-modal__footer a:hover {
    color: var(--ink);
}

@media (max-width: 480px) {
    .auth-modal__panel {
        padding: 28px 20px;
    }

    .auth-modal__title {
        font-size: 1.875rem;
    }
}

/* Reduced motion fallback. Submit-button hover transform reset đã cover ở
   SSOT `partials/forms.css`. */
@media (prefers-reduced-motion: reduce) {
    .auth-modal {
        transition: none;
    }
}



/* Source: wp-content/themes/gocvuong/assets/css/partials/page-error-404.css */
/* ==========================================================================
   page-error-404.css — Group 5 (cross-page templates)
   Áp lên `.gv-page--error` (404.php). Kế thừa token + typography của
   `.gv-page` ở page-content.css; partial này chỉ thêm layout editorial
   bold cho landing 404 (code 404 oversize, headline serif, search inline,
   CTA hairline grid, featured tiles).
   Bám brand-guideline:
   - Mục 5 — Typography: Cormorant Garamond display, Inter body.
   - Mục 6 — Layout/Spacing: container 1400px, padding 56px / 112px.
   - Memory feedback "visual boldness": editorial có gan, không grid an toàn.
   ========================================================================== */

.gv-page--error {
    background: var(--paper);
    min-height: 70vh;
    display: flex;
    flex-direction: column;
}

.gv-error {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 3.5rem 1.25rem 4.5rem;
    display: flex;
    flex-direction: column;
    gap: 3rem;
    flex: 1;
}

@media (min-width: 1024px) {
    .gv-error {
        padding: 7rem 2.5rem 9rem;
        gap: 5rem;
    }
}

/* --- Head: code 404 layered + headline + lead --------------------------- */

.gv-error__head {
    position: relative;
    padding-top: 2rem;
    overflow: clip;
}

.gv-error__eyebrow {
    margin: 0 0 1.5rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
    position: relative;
    z-index: 2;
}

.gv-error__code {
    display: block;
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-weight: 500;
    font-size: clamp(8rem, 18vw, 16rem);
    line-height: 0.85;
    letter-spacing: -0.04em;
    color: var(--ink);
    opacity: 0.08;
    user-select: none;
    pointer-events: none;
    margin: 0;
}

.gv-error__title {
    margin: -0.25em 0 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(2.5rem, 6vw, 4.5rem);
    line-height: 0.98;
    letter-spacing: -0.015em;
    color: var(--ink);
    max-width: 18ch;
    position: relative;
    z-index: 2;
}

.gv-error__lead {
    margin: 1.5rem 0 0;
    max-width: 38em;
    font-size: 1.125rem;
    line-height: 1.55;
    color: var(--ink-muted);
    position: relative;
    z-index: 2;
}

@media (min-width: 1024px) {
    .gv-error__head {
        padding-top: 3rem;
    }

    .gv-error__code {
        position: absolute;
        top: -2rem;
        left: -1.5rem;
        opacity: 0.07;
    }

    .gv-error__title {
        margin-top: 0;
        font-size: clamp(3.5rem, 7vw, 5.5rem);
        max-width: 16ch;
    }

    .gv-error__lead {
        font-size: 1.25rem;
    }
}

/* --- Search inline ------------------------------------------------------ */

.gv-error__search {
    display: flex;
    align-items: stretch;
    gap: 0;
    border-top: 1px solid var(--ink-line);
    border-bottom: 1px solid var(--ink);
    max-width: 38rem;
}

.gv-error__search-input {
    flex: 1;
    min-width: 0;
    border: 0;
    background: transparent;
    padding: 1.125rem 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.5rem;
    line-height: 1.2;
    color: var(--ink);
    -webkit-appearance: none;
    appearance: none;
    border-radius: 0;
}

.gv-error__search-input::placeholder {
    color: var(--ink-muted);
    opacity: 0.7;
    font-style: italic;
}

.gv-error__search-input:focus {
    outline: none;
}

.gv-error__search-input::-webkit-search-cancel-button {
    -webkit-appearance: none;
    appearance: none;
}

.gv-error__search-submit {
    flex-shrink: 0;
    padding: 0 1.25rem;
    border: 0;
    background: transparent;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    cursor: pointer;
    transition: opacity 0.2s ease-out;
}

.gv-error__search-submit:hover {
    opacity: 0.6;
}

@media (min-width: 1024px) {
    .gv-error__search-input {
        font-size: 1.875rem;
    }
}

/* --- CTA grid hairline ------------------------------------------------- */

.gv-error__cta {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
    border-top: 1px solid var(--ink-line);
    border-left: 1px solid var(--ink-line);
}

.gv-error__cta-item {
    display: flex;
    flex-direction: column;
    gap: 0.875rem;
    padding: 1.5rem 1.25rem;
    border-right: 1px solid var(--ink-line);
    border-bottom: 1px solid var(--ink-line);
    color: var(--ink);
    text-decoration: none;
    transition: background 0.2s ease-out;
    min-height: 7rem;
}

.gv-error__cta-item:hover {
    background: var(--paper-warm);
}

.gv-error__cta-num {
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    letter-spacing: 0.25em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-error__cta-label {
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.625rem;
    line-height: 1.05;
    color: var(--ink);
}

@media (min-width: 640px) {
    .gv-error__cta {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1024px) {
    .gv-error__cta {
        grid-template-columns: repeat(4, 1fr);
    }

    .gv-error__cta-item {
        padding: 2rem 1.5rem;
        min-height: 9rem;
    }

    .gv-error__cta-label {
        font-size: 1.875rem;
    }
}

/* --- Featured picks ----------------------------------------------------- */

/* Section "Có thể bạn đang tìm" — reuse gv-category-scroller + gv-category-card
   của block Categories ở Home (template-parts/blocks/categories.php). Card
   layout, aspect-ratio, scroll hint đã định nghĩa ở partials/block-categories.css
   và partials/components.css. Partial này chỉ thêm spacing wrapper section. */

.gv-error__picks {
    padding-top: 2.5rem;
    border-top: 1px solid var(--ink-line);
}

.gv-error__picks-title {
    margin: 0 0 2rem;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: clamp(1.75rem, 3.5vw, 2.5rem);
    line-height: 1.05;
    letter-spacing: -0.01em;
    color: var(--ink);
}

@media (min-width: 1024px) {
    .gv-error__picks {
        padding-top: 4rem;
    }

    .gv-error__picks-title {
        margin-bottom: 3rem;
    }
}



/* 6. Gutenberg blocks (frontend) — block tĩnh + block động đăng ký qua
      includes/blocks.php; mỗi UI section là 1 dynamic block dạng position
      marker. block-placeholder.css chỉ load ở Editor (admin). */

/* Source: wp-content/themes/gocvuong/assets/css/partials/blocks-extra.css */
/* ==========================================================================
   blocks-extra.css — frontend rules cho 2 block động.

   Block động (2):    blog-list, template-library

   2026-05-01: gỡ rules của 5 block content tĩnh (about-intro, pricing-table,
   legal-content, contact-info, cta-band) — info pages giờ dùng core
   Gutenberg + content-page.php cho editorial header. Typography editorial
   của core block (heading/paragraph/list/table/columns/buttons) đã có sẵn
   trong partials/page-content.css scope `.gv-page .entry-content`.

   Token color (--ink, --paper, …) declare ở base.css scope `body.home, .gv-home`.
   Block render trong page chung → cần re-scope tokens trên `.gv-block-*` để
   self-contained (giống pattern .gv-page, .gv-shop, .gv-blog đã làm).
   ========================================================================== */


/* ==========================================================================
   stories-feed (gv/blog-list block) — α "Editorial Index"
   3-col featured strip thumb 70px + TOC vertical list (no thumbnail).
   FacetWP-aware via main query trên Posts page.
   ========================================================================== */

.gv-stories-feed,
.gv-template-library-block {
    --ink: #0a0a0a;
    --ink-soft: #1f1f1f;
    --ink-muted: #5c5c5c;
    --ink-line: #e5e5e5;
    --paper: #ffffff;
    --paper-warm: #fafaf7;
    --paper-cream: #f5f2ec;
    --paper-sand: #ede7da;
    color: var(--ink);
    font-family: 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
}

.gv-stories-feed__inner,
.gv-template-library-block__inner {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 1.5rem 1.25rem 3rem;
}

@media (min-width: 1024px) {

    .gv-stories-feed__inner,
    .gv-template-library-block__inner {
        padding: 1.75rem 2.5rem 4rem;
    }
}

/* ── Featured strip (3-col thumb 70px) ─────────────────────────────── */

.gv-stories-featured {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1rem 1.5rem;
    padding-bottom: 1.25rem;
    margin-bottom: 1.5rem;
    border-bottom: 1px solid var(--ink-line);
}

@media (min-width: 768px) {
    .gv-stories-featured {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .gv-stories-featured {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: 1.5rem;
        padding-bottom: 1.75rem;
        margin-bottom: 2rem;
    }
}

.gv-stories-featured__item {
    margin: 0;
}

.gv-stories-featured__link {
    display: grid;
    grid-template-columns: 70px 1fr;
    gap: 0.875rem;
    align-items: start;
    color: inherit;
    text-decoration: none;
    transition: opacity 0.15s ease-out;
}

.gv-stories-featured__link:hover {
    opacity: 0.78;
}

.gv-stories-featured__thumb {
    margin: 0;
    width: 70px;
    height: 70px;
    overflow: hidden;
    background: var(--paper-warm);
    flex-shrink: 0;
}

.gv-stories-featured__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.gv-stories-featured__thumb--empty {
    background: var(--paper-cream);
}

.gv-stories-featured__body {
    min-width: 0;
}

.gv-stories-featured__kicker {
    margin: 0 0 0.25rem;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.59375rem; /* 9.5px */
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

.gv-stories-featured__title {
    margin: 0 0 0.25rem;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.05rem;
    line-height: 1.2;
    letter-spacing: -0.005em;
    color: var(--ink);
}

.gv-stories-featured__date {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.65625rem; /* 10.5px */
    color: var(--ink-muted);
}

/* ── TOC list (no thumbnail, vertical) ──────────────────────────────── */

.gv-stories-grid__list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.gv-stories-grid__item {
    margin: 0;
}

.gv-stories-grid__row {
    /* Mobile: 3 columns × 2 rows.
       Row 1: num | title (title spans cols 2-3).
       Row 2: (empty) | cat | date.
       Desktop: 4 columns × 1 row — num | title | cat | date. */
    display: grid;
    grid-template-columns: 32px 1fr auto;
    grid-template-rows: auto auto;
    column-gap: 1rem;
    row-gap: 0.375rem;
    align-items: start;
    padding: 1rem 0;
    border-bottom: 1px solid var(--ink-line);
    color: inherit;
    text-decoration: none;
    transition: background 0.15s ease-out, padding 0.15s ease-out, margin 0.15s ease-out;
}

@media (min-width: 1024px) {
    .gv-stories-grid__row {
        grid-template-columns: 32px 1fr 140px 100px;
        grid-template-rows: auto;
        column-gap: 1.5rem;
        row-gap: 0;
        align-items: center;
        padding: 1.125rem 0;
    }
}

@media (hover: hover) {
    .gv-stories-grid__row:hover {
        background: var(--paper-warm);
        margin: 0 -0.75rem;
        padding-left: 0.75rem;
        padding-right: 0.75rem;
    }
}

@media (hover: hover) and (min-width: 1024px) {
    .gv-stories-grid__row:hover {
        margin: 0 -1rem;
        padding-left: 1rem;
        padding-right: 1rem;
    }
}

.gv-stories-grid__num {
    grid-column: 1;
    grid-row: 1;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.75rem;
    color: var(--ink-muted);
    align-self: start;
    padding-top: 0.25rem;
}

.gv-stories-grid__title {
    grid-column: 2 / -1;
    grid-row: 1;
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.125rem;
    line-height: 1.18;
    letter-spacing: -0.005em;
    color: var(--ink);
}

@media (min-width: 1024px) {
    .gv-stories-grid__title {
        grid-column: 2;
        grid-row: 1;
        font-size: 1.25rem;
    }
}

.gv-stories-grid__title em {
    font-style: italic;
    font-weight: 400;
    color: var(--ink-muted);
}

.gv-stories-grid__cat {
    margin: 0;
    grid-column: 2;
    grid-row: 2;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.625rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

@media (min-width: 1024px) {
    .gv-stories-grid__cat {
        grid-column: 3;
        grid-row: 1;
        text-align: left;
    }
}

.gv-stories-grid__date {
    margin: 0;
    grid-column: 3;
    grid-row: 2;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    color: var(--ink-muted);
    text-align: right;
    justify-self: end;
}

@media (min-width: 1024px) {
    .gv-stories-grid__date {
        grid-column: 4;
        grid-row: 1;
    }
}

/* gv-stories-filter aside removed — superseded by .gv-stories-mast in
   page-stories-mast.css (B4 editorial mast). */

.gv-stories-grid__empty {
    margin: 0;
    padding: 4rem 1rem;
    text-align: center;
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.25rem, 2vw, 1.6rem);
    color: var(--ink-muted);
    border: 1px dashed var(--ink-line);
}

/* ── FacetWP pager (page_number facet) ────────────────────────────── */

.gv-stories-pager {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.25rem 56px;
}

@media (min-width: 1024px) {
    .gv-stories-pager {
        padding: 0 2.5rem 96px;
    }
}

.gv-stories-pager .facetwp-facet {
    margin: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    justify-content: center;
}

.gv-stories-pager .facetwp-page {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.5rem;
    height: 2.5rem;
    padding: 0 0.875rem;
    background: transparent;
    border: 1px solid var(--ink-line, #e5e5e5);
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.8125rem;
    letter-spacing: 0.04em;
    color: var(--ink-soft, #1f1f1f);
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
}

.gv-stories-pager .facetwp-page:hover {
    border-color: var(--ink, #0a0a0a);
}

.gv-stories-pager .facetwp-page.active {
    background: var(--ink, #0a0a0a);
    color: var(--paper, #fff);
    border-color: var(--ink, #0a0a0a);
}

.gv-stories-pager .facetwp-page.dots {
    border: 0;
    cursor: default;
}

.gv-template-library-block__grid {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.5rem;
}

@media (min-width: 768px) {
    .gv-template-library-block__grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .gv-template-library-block__grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 2rem;
    }
}

.gv-template-library-block__item {
    margin: 0;
}

/* Markup mới Wave 4 dùng .gv-template-card__body/__kicker/__title — partial
   block-template-gallery.css gốc chỉ có .gv-template-card__meta. Bổ sung
   tối thiểu để card body align brand: kicker mono / title serif chặt. */

.gv-template-card__body {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding-top: 0.875rem;
}

.gv-template-card__kicker {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    font-size: 0.6875rem;
    line-height: 1;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-muted, #5c5c5c);
}

.gv-template-card__title {
    margin: 0;
    font-family: 'Cormorant Garamond', serif;
    font-weight: 500;
    font-size: 1.125rem;
    line-height: 1.15;
    letter-spacing: -0.005em;
    color: var(--ink, #0a0a0a);
}
