/* ============================================================
   YUXIA — Custom Silk Satin Pajamas & Sleepwear Manufacturer
   Brand override layer built on top of the Crafto HTML template.
   Loaded AFTER css/style.css, css/responsive.css and
   demos/fashion-store/fashion-store.css — it re-skins the Crafto
   variables/classes and adds the section components the YUXIA
   page designs need.

   Palette: red-brown #903030 · deep red-brown #6e2424 ·
            warm ink #1f1a18 (text only) · cream #faf8f6 · sand #f3eeea
   Type:    Playfair Display (display serif) + Jost (body sans),
            self-hosted from fonts/ — see the section 0 note below
   ============================================================ */

/* ---------- 0. self-hosted webfonts ----------
   Playfair Display (display serif) and Jost (body sans) are the two families the
   reference design uses. They are self-hosted instead of linked from
   fonts.googleapis.com for a practical reason: this site is served from mainland
   China, where the Google Fonts CDN is not reliably reachable, so a CDN link
   would silently degrade to system fonts for most visitors. Ship the fonts.

   Only the latin subset is included (the site is English-only) and both are
   variable fonts, so a single file per family+style covers every weight the CSS
   asks for — including the framework layer, which goes up to 900.

   Caveat, the reference's handwritten accent face, is deliberately NOT shipped:
   no element on these pages uses a script face, so it would be 73 KB that no
   visitor ever downloads. Add it here if a handwritten note is ever introduced. */
@font-face {
    font-family: "Playfair Display";
    font-style: normal;
    font-weight: 400 900;
    font-display: swap;
    src: url("fonts/playfair-display.woff2") format("woff2");
}
@font-face {
    font-family: "Playfair Display";
    font-style: italic;
    font-weight: 400 900;
    font-display: swap;
    src: url("fonts/playfair-display-italic.woff2") format("woff2");
}
@font-face {
    font-family: "Jost";
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url("fonts/jost.woff2") format("woff2");
}

/* ---------- 1. brand variables ---------- */
:root {
    /* ---------- typography ----------
       Reference pairing: a high-contrast display serif for headings, a geometric
       sans for everything else. Both are loaded in section 0 above; the old stack
       asked for "Inter" without ever loading it, so the site was really rendering
       in the system UI font. */
    --alt-font: "Jost", "Helvetica Neue", Arial, sans-serif;
    --primary-font: "Jost", "Helvetica Neue", Arial, sans-serif;
    --yuxia-serif: "Playfair Display", Georgia, "Times New Roman", serif;

    /* ---------- Crafto accent tokens ----------
       --base-color is read by 64 framework declarations (buttons, links, hovers),
       so re-pointing it re-tints the whole template in one move. */
    --base-color: #903030;
    --dark-base-color: #6e2424;

    /* ---------- YUXIA palette: red-brown on warm off-white ----------
       Two ideas are separated here that used to share one token. --yuxia-ink is
       TEXT ONLY now (headings and body inside light bands) and the new --yuxia-deep
       pair carries every dark SURFACE (utility bar, dark value band, CTA, footer,
       inner-page hero). Previously --yuxia-ink did both jobs, which is exactly why
       "remove the black" could not be done by changing one value: the surfaces
       inherited the text colour.

       --yuxia-accent* is the decorative brand red (rules, borders, list markers)
       and --yuxia-accent-dark its text-safe twin, used wherever the colour has to
       carry meaning on a light background.                                             */
    --yuxia-ink: #1f1a18;
    --yuxia-ink-soft: #5d544f;
    --yuxia-accent: #903030;
    --yuxia-accent-dark: #6e2424;
    --yuxia-accent-tint: #f7ecec;
    --yuxia-deep: #903030;
    --yuxia-deep-2: #6e2424;
    --yuxia-surface: #faf8f6;
    --yuxia-surface-2: #f3eeea;
    --yuxia-border: #e8e1db;
    /* --yuxia-muted carries real body copy (hero paragraph, section copy, card
       blurbs), not just decoration, so it has to clear WCAG AA 4.5:1 on the
       lightest surfaces. The reference design's own --ink-mute (#8a8078) only
       reaches 3.86:1 on white and 3.35:1 on the sand band — it was too light to
       reuse verbatim. This warm grey keeps the muted look at 5.3:1 on white and
       4.6:1 on sand. */
    --yuxia-muted: #736a64;

    /* Reading measure — keeps body copy inside a comfortable 45–90 characters. */
    --yuxia-measure: 68ch;
    --yuxia-measure-wide: 76ch;

    /* keep Crafto greys in step with the YUXIA ink */
    --dark-gray: #1f1a18;
    --medium-gray: #736a64;
    --very-light-gray: #faf8f6;
}

body {
    font-size: 16px;
    line-height: 28px;
}

/* ---------- 2. legacy green-energy helpers -> YUXIA colours ---------- */
.bg-very-light-green {
    background-color: var(--yuxia-surface);
}
.bg-light-green {
    background-color: var(--yuxia-surface-2);
}
.bg-gradient-green-transparent {
    background: linear-gradient(to top, rgba(255, 255, 255, 0) 0%, var(--yuxia-surface-2) 100%);
}
.text-gradient-light-green-white {
    background: linear-gradient(to top, rgba(255, 255, 255, 0) 0%, var(--yuxia-surface-2) 90%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
}
.border-color-dark-green {
    border-color: var(--yuxia-ink);
}

/* ---------- 3. header ---------- */
header .navbar-brand img {
    max-height: 42px;
}
.yuxia-navbar {
    box-shadow: 0 1px 0 0 var(--yuxia-border);
}
.yuxia-navbar .navbar-nav .nav-link {
    font-size: 16px;
    font-weight: 600;
    color: var(--yuxia-ink);
}
.yuxia-navbar .navbar-nav .nav-link:hover,
.yuxia-navbar .navbar-nav .nav-item.active .nav-link {
    color: var(--yuxia-accent-dark);
}
/* Two template layers style this menu, and both out-rank a plain .yuxia-navbar
   rule: css/style.css pins the box at border-radius 5px / width 260px and the
   icon at 19px, then demos/green-energy/green-energy.css - loaded before this
   file but sitting at (0,5,n) - widens the box to 300px and forces the icons to
   40px with a 40px icon column. A 3-class .yuxia-navbar prefix only reaches
   (0,3,n) and loses every one of those duels, which is why the brand skin was
   silently ignored: the icons kept rendering at 40px (the oversized mega-menu
   icon) and the panel kept the template's 5px box. The compound
   .yuxia-navbar.navbar .navbar-nav prefix lands at (0,6,n) and is what makes
   this layer authoritative - keep it when editing.
   The panel cosmetics sit inside a min-width query on purpose: at <=991px
   css/responsive.css re-tunes this same menu (border-radius: 0, padding: 0 30px,
   width: 100% !important) at (0,5,0), and a raised selector outside the query
   would override that and break the collapsed navigation. */
@media (min-width: 992px) {
    .yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu {
        width: 320px;
        border-radius: 12px;
        border: 1px solid var(--yuxia-border);
        box-shadow: 0 18px 40px rgba(111, 36, 36, .10);
        padding: 8px;
    }
    .yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a {
        /* css/style.css gives every row a border-bottom separator, and this skin
           gives every row an 8px radius. Together the straight separator curves
           around the rounded corners and the menu reads as a stack of loose
           tiles instead of a list. Dropping the border and insetting the rows
           turns each one into a pill that only shows up on hover, which is what
           the tinted hover state below was already drawing. */
        border-bottom: 0;
        padding: 12px 14px;
    }
}
.yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a {
    font-size: 15px;
    font-weight: 600;
    color: var(--yuxia-ink);
    border-radius: 8px;
}
.yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a i {
    /* 40px -> 18px. The item label is 15px, so the glyph now sits at label scale
       and the product names lead the row instead of the icon shouting over them. */
    font-size: 18px;
    width: 24px;
    margin-right: 10px;
    color: var(--yuxia-accent-dark);
    text-align: center;
}
.yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a:hover {
    background-color: var(--yuxia-accent-tint);
    color: var(--yuxia-ink);
}
.yuxia-navbar.navbar .navbar-nav .dropdown.dropdown-with-icon-style02 .dropdown-menu li a:hover i {
    color: var(--yuxia-accent-dark);
}

/* ---------- 4. buttons ---------- */
.btn {
    font-weight: 600;
    text-transform: none;
    letter-spacing: 0;
    border-radius: 8px;
}
.btn.btn-switch-text.btn-extra-large > span {
    padding: 16px 34px;
    font-size: 16px;
}
.btn.btn-switch-text.btn-large > span {
    padding: 13px 30px;
    font-size: 15px;
}
.btn.btn-switch-text.btn-medium > span {
    padding: 11px 24px;
    font-size: 14px;
}
.btn.yuxia-btn-outline {
    background: transparent;
    border: 1px solid var(--yuxia-ink);
    color: var(--yuxia-ink);
}
.btn.yuxia-btn-outline:hover {
    background: var(--yuxia-deep);
    color: var(--white);
}
.btn.yuxia-btn-ghost-light {
    background: transparent;
    border: 1px solid rgba(255, 255, 255, .55);
    color: var(--white);
}
.btn.yuxia-btn-ghost-light:hover {
    background: var(--white);
    color: var(--yuxia-ink);
}
/* The header's "Request a Quote" uses the template's `btn-dark-gray`, which paints
   itself with --dark-gray. That token also sets headings and body text, so it
   cannot simply be re-pointed at the brand red — the button is overridden directly
   instead. The reference design does the same thing: its nav CTA is solid red.
   Specificity matches the framework's own `.btn.btn-dark-gray`, and this layer
   loads last, so it wins without needing an !important. */
.btn.btn-dark-gray {
    background-color: var(--yuxia-accent);
    border-color: var(--yuxia-accent);
    color: var(--white);
}
.btn.btn-dark-gray:hover,
.btn.btn-dark-gray:active,
.btn.btn-dark-gray:focus {
    /* the framework's hover empties the background and outlines in --dark-gray,
       which would put a near-black outline and label on the white navbar */
    background-color: var(--yuxia-accent-dark);
    border-color: var(--yuxia-accent-dark);
    color: var(--white);
}

/* ---------- 5. utility bar (板块 1) ---------- */
.yuxia-utility-bar {
    background-color: var(--yuxia-deep);
    color: rgba(255, 255, 255, .80);
    font-size: 13px;
    line-height: 20px;
    /* Crafto assumes a 40px top bar: `header .header-top-bar + .navbar { top: 40px }`.
       main.js reads the real height at runtime, so keep 20px line + 10px padding = 40px. */
    padding-top: 10px;
    padding-bottom: 10px;
}
.yuxia-utility-bar a {
    color: rgba(255, 255, 255, .80);
}
.yuxia-utility-bar a:hover {
    color: var(--white);
}
.yuxia-utility-bar .yuxia-utility-item + .yuxia-utility-item::before {
    content: "";
    display: inline-block;
    width: 1px;
    height: 11px;
    background: rgba(255, 255, 255, .28);
    margin: 0 14px;
    vertical-align: -1px;
}
.yuxia-utility-flag {
    width: 16px;
    height: 12px;
    border-radius: 2px;
    object-fit: cover;
}

/* ---------- 6. hero (板块 3) ---------- */
/* The hero was pure white and its content sat flush against the section edges,
   so the product panel had nothing to lift off and `overflow-hidden` clipped
   its shadow. It is now a tinted band with breathing room: the panel reads as a
   card, and the band separates cleanly from the white navbar above and the
   white trust bar below. Everything stays inside the existing YUXIA palette —
   --yuxia-surface-2 for the base and the same rgba(144, 48, 48,..) accent used
   by the dark value section — and the warm radial sits behind the product card
   because that is where the visual weight is. */
.yuxia-hero {
    background-color: var(--yuxia-surface-2);
    background-image:
        radial-gradient(760px 560px at 76% 40%, rgba(144, 48, 48, .12) 0%, rgba(144, 48, 48, 0) 70%),
        linear-gradient(180deg, var(--yuxia-accent-tint) 0%, var(--yuxia-surface-2) 54%, var(--yuxia-surface) 100%);
    /* the markup carries Bootstrap's `.p-0` (padding: 0 !important); a band this
       visible needs vertical room or the card sits flush with both edges */
    padding: 70px 0 78px !important;
}
.yuxia-hero-badge {
    display: inline-block;
    background: var(--yuxia-accent-tint);
    color: var(--yuxia-accent-dark);
    font-size: 13px;
    font-weight: 700;
    letter-spacing: .6px;
    text-transform: uppercase;
    padding: 7px 14px;
    border-radius: 6px;
}
.yuxia-hero h1 {
    font-size: 54px;
    line-height: 60px;
    font-weight: 700;
    letter-spacing: -1.5px;
    color: var(--yuxia-ink);
    margin-bottom: 16px;
}
.yuxia-hero-sub {
    font-size: 20px;
    line-height: 30px;
    font-weight: 700;
    /*/* --yuxia-accent-dark, not --yuxia-accent: on the tinted band the brighter
       accent only reaches ~2.8:1 against the background, this one clears 3:1
       for large text and matches the hero badge */
    color: var(--yuxia-accent-dark);
    margin-bottom: 18px;
}
.yuxia-hero-copy {
    font-size: 16px;
    line-height: 28px;
    color: var(--yuxia-muted);
    max-width: 560px;
}
.yuxia-hero-points {
    list-style: none;
    padding: 0;
    margin: 0;
}
.yuxia-hero-points li {
    display: inline-flex;
    align-items: center;
    font-size: 14px;
    font-weight: 600;
    color: var(--yuxia-ink);
    margin-right: 26px;
    margin-bottom: 10px;
}
.yuxia-hero-points li i {
    color: var(--yuxia-accent-dark);
    font-size: 15px;
    margin-right: 8px;
}
.yuxia-hero-panel {
    /* Framed product photograph. The asset library has no transparent cut-out, so
       the product sits inside a rounded white frame with a real photo filling it -
       a floating silhouette would have needed an alpha PNG we do not have.
       Markup stays identical, so demo-green-energy.html and the generated
       front-page.php keep matching. */
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 14px;
    padding: 14px;
    box-shadow: 0 24px 48px rgba(111, 36, 36, .10);
    height: 100%;
    display: flex;
    flex-direction: column;
}
.yuxia-hero-panel-tag {
    align-self: flex-start;
    background: var(--yuxia-deep);
    border: 1px solid var(--yuxia-deep);
    color: var(--white);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .5px;
    text-transform: uppercase;
    padding: 6px 12px;
    border-radius: 6px;
}
/* the two colour chips in the hero panel footer. Crafto's width scale has no
   `w-16px`/`h-16px` (it jumps 15px -> 20px) and no `me-8px`, so the previous
   utility-class only version collapsed to 0x0 with no gap and rendered as a
   stray 2px border dot. */
.yuxia-swatch {
    display: inline-block;
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    border: 1px solid var(--yuxia-border);
}
.yuxia-swatch + .yuxia-swatch {
    margin-left: 8px;
}
.yuxia-hero-media {
    /* 5:6 portrait frame. The source photograph is 611x719 (.850) so a 5:6 frame
       (.833) crops almost nothing, and `object-fit: cover` keeps the garment
       centred instead of letter-boxing it inside the card. */
    flex: 1 1 auto;
    position: relative;
    aspect-ratio: 5 / 6;
    min-height: 0;
    padding: 0;
    margin-bottom: 14px;
    border-radius: 10px;
    overflow: hidden;
    background: var(--yuxia-surface-2);
    display: block;
}
.yuxia-hero-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center top;
    display: block;
    filter: none;
}
.yuxia-hero-model {
    border-top: 1px solid var(--yuxia-border);
    padding-top: 16px;
}
.yuxia-hero-model strong {
    display: block;
    font-size: 20px;
    font-weight: 700;
    color: var(--yuxia-ink);
    letter-spacing: -.4px;
    margin-bottom: 2px;
}
.yuxia-hero-model span {
    font-size: 13.5px;
    line-height: 22px;
    color: var(--yuxia-muted);
}

/* ---------- 7. company definition + trust bar (板块 4) ---------- */
.yuxia-define-bar {
    background: var(--yuxia-surface);
    border-left: 4px solid var(--yuxia-accent);
    border-radius: 0 10px 10px 0;
    padding: 22px 26px;
    font-size: 16px;
    line-height: 28px;
    color: var(--yuxia-ink-soft);
}
.yuxia-stat {
    display: flex;
    align-items: center;
    gap: 14px;
}
.yuxia-stat-icon {
    flex: 0 0 auto;
    /* The glyph is exactly 2x the old 19px. The badge grows with it (52 -> 64px)
       because a 38px square glyph has a corner radius of ~26.9px against a 26px
       circle - at 52px the corners would touch, if not clip, the border. */
    width: 64px;
    height: 64px;
    border-radius: 50%;
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--yuxia-accent-dark);
    font-size: 38px;
}
.yuxia-stat-icon i {
    line-height: 1;
}
.yuxia-stat-num {
    font-size: 32px;
    line-height: 34px;
    font-weight: 700;
    letter-spacing: -1px;
    color: var(--yuxia-ink);
}
.yuxia-stat-num small {
    font-size: 20px;
    font-weight: 700;
}
.yuxia-stat-label {
    font-size: 13.5px;
    line-height: 20px;
    color: var(--yuxia-muted);
    display: block;
}

/* ---------- 8. section heading helper ---------- */
.yuxia-kicker {
    display: inline-flex;
    align-items: center;
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--yuxia-accent-dark);
    margin-bottom: 10px;
}
.yuxia-kicker::before {
    content: "";
    width: 26px;
    height: 3px;
    border-radius: 2px;
    background: var(--yuxia-accent);
    margin-right: 10px;
}
.yuxia-h2 {
    font-size: 38px;
    line-height: 46px;
    font-weight: 700;
    letter-spacing: -1px;
    color: var(--yuxia-ink);
    margin-bottom: 14px;
}
.yuxia-section-copy {
    font-size: 16px;
    line-height: 28px;
    color: var(--yuxia-muted);
    margin-bottom: 0;
}
.yuxia-title-rule {
    display: block;
    width: 56px;
    height: 3px;
    border-radius: 2px;
    background: var(--yuxia-accent);
    margin-top: 20px;
}

/* ---------- 9. category / product cards (板块 5 & 6) ---------- */
.yuxia-card {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 12px;
    overflow: hidden;
    height: 100%;
    display: flex;
    flex-direction: column;
    transition: all .3s ease;
}
.yuxia-card:hover {
    border-color: #dcc6c6;
    box-shadow: 0 16px 36px rgba(111, 36, 36, .10);
    transform: translateY(-3px);
}
.yuxia-card-media {
    position: relative;
    background: var(--yuxia-surface);
    padding: 18px 18px 0;
}
.yuxia-card-thumb {
    position: relative;
    width: 100%;
    padding-top: 100%;
    border-radius: 8px;
    overflow: hidden;
    background: var(--yuxia-surface-2);
    background-size: cover;
    background-position: center;
}
/* real <img> inside a ratio box: keeps the cover crop, gains alt text for SEO/a11y */
.yuxia-card-thumb > img,
.yuxia-factory-tile > img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.yuxia-card-market {
    position: absolute;
    top: 12px;
    left: 12px;
    z-index: 2;
    background: var(--yuxia-deep);
    color: var(--white);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .8px;
    text-transform: uppercase;
    padding: 5px 10px;
    border-radius: 4px;
}
.yuxia-card-body {
    padding: 22px 22px 24px;
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
}
.yuxia-card h3 {
    font-size: 19px;
    line-height: 26px;
    font-weight: 700;
    letter-spacing: -.4px;
    color: var(--yuxia-ink);
    margin-bottom: 8px;
}
.yuxia-card p {
    font-size: 14.5px;
    line-height: 24px;
    color: var(--yuxia-muted);
    margin-bottom: 14px;
}
.yuxia-card-spec {
    font-size: 13px;
    line-height: 21px;
    color: var(--yuxia-muted);
    border-top: 1px dashed var(--yuxia-border);
    padding-top: 12px;
    margin-bottom: 14px;
}
.yuxia-card-spec strong {
    color: var(--yuxia-ink);
    font-weight: 600;
}
.yuxia-card-link {
    margin-top: auto;
    display: inline-flex;
    align-items: center;
    font-size: 14px;
    font-weight: 700;
    color: var(--yuxia-accent-dark);
}
.yuxia-card-link i {
    margin-left: 6px;
    transition: transform .3s ease;
}
.yuxia-card:hover .yuxia-card-link i {
    transform: translateX(4px);
}
.yuxia-chip-row {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 14px;
}
.yuxia-chip {
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: .3px;
    color: var(--yuxia-ink);
    background: var(--yuxia-surface);
    border: 1px solid var(--yuxia-border);
    border-radius: 4px;
    padding: 3px 9px;
}
.yuxia-chip.is-accent {
    color: var(--yuxia-accent-dark);
    background: var(--yuxia-accent-tint);
    border-color: #e5cfcf;
}

/* ---------- 10. dark value section (板块 7) ---------- */
.yuxia-dark-section {
    background: var(--yuxia-deep);
    color: rgba(255, 255, 255, .80);
}
.yuxia-dark-section .yuxia-h2,
.yuxia-dark-section h2,
.yuxia-dark-section h3 {
    color: var(--white);
}
.yuxia-dark-section .yuxia-section-copy,
.yuxia-dark-section p {
    color: rgba(255, 255, 255, .74);
}
.yuxia-value-card {
    background: rgba(255, 255, 255, .055);
    border: 1px solid rgba(255, 255, 255, .12);
    border-radius: 12px;
    padding: 28px 24px 26px;
    height: 100%;
    transition: all .3s ease;
}
.yuxia-value-card:hover {
    background: rgba(255, 255, 255, .09);
    border-color: rgba(255, 255, 255, .55);
}
.yuxia-value-icon {
    width: 50px;
    height: 50px;
    border-radius: 10px;
    background: rgba(255, 255, 255, .16);
    color: var(--yuxia-accent-dark);
    font-size: 38px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 18px;
}
.yuxia-value-card h3 {
    font-size: 18px;
    line-height: 25px;
    font-weight: 700;
    letter-spacing: -.3px;
    margin-bottom: 10px;
}
.yuxia-value-card p {
    font-size: 14.5px;
    line-height: 24px;
    margin-bottom: 0;
}

/* ---------- 11. factory / capability (板块 8) ---------- */
.yuxia-factory-tile {
    position: relative;
    border-radius: 10px;
    overflow: hidden;
    background: var(--yuxia-surface-2);
    height: 100%;
    min-height: 320px;
    background-size: cover;
    background-position: center;
}
.yuxia-factory-tile::after {
    content: "";
    position: absolute;
    inset: auto 0 0 0;
    height: 62%;
    background: linear-gradient(to top, rgba(111, 36, 36, .82) 0%, rgba(111, 36, 36, 0) 100%);
}
.yuxia-factory-tile span {
    position: absolute;
    top: 14px;
    left: 14px;
    z-index: 3;
    color: var(--white);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .5px;
    text-transform: uppercase;
}
/* The stage caption sits in the bottom third, where `::after` already lays a
   gradient down. Without this rule the `<h3>`/`<p>` stayed in normal flow at the
   top of the tile and inherited the dark section's translucent white text, so
   every caption was white-on-photo and unreadable. */
.yuxia-factory-tile-body {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    padding: 22px 18px 18px;
}
.yuxia-factory-tile-body h3 {
    color: var(--white);
    font-size: 20px;
    line-height: 26px;
    font-weight: 700;
    letter-spacing: -.3px;
    margin-bottom: 6px;
}
.yuxia-factory-tile-body p {
    color: rgba(255, 255, 255, .88);
    font-size: 14px;
    line-height: 22px;
    margin: 0;
}
.yuxia-fact-box {
    background: var(--yuxia-surface);
    border-radius: 10px;
    padding: 18px 20px;
}
/* The markup renders `<h3>` + `<p>`, so the `small`/`strong` rules below never
   matched. Inside `.yuxia-dark-section` the heading inherited the section's
   translucent-white colour and painted white-on-cream, i.e. a contrast ratio of
   1.07 - invisible. These two rules are what actually style the component; the
   small/strong pair is kept for the WordPress template that uses that markup. */
.yuxia-fact-box h3 {
    font-size: 17px;
    line-height: 24px;
    font-weight: 700;
    color: var(--yuxia-ink);
    margin-bottom: 6px;
}
.yuxia-fact-box p {
    font-size: 14.5px;
    line-height: 23px;
    color: var(--yuxia-muted);
    margin: 0;
}
/* Dark-band variant: the cream card would glare against the ink background. */
.yuxia-dark-section .yuxia-fact-box {
    background: rgba(255, 255, 255, .07);
    border: 1px solid rgba(255, 255, 255, .14);
}
.yuxia-dark-section .yuxia-fact-box h3 {
    color: var(--white);
}
.yuxia-dark-section .yuxia-fact-box p {
    color: rgba(255, 255, 255, .78);
}
.yuxia-fact-box small {
    display: block;
    font-size: 12.5px;
    font-weight: 600;
    letter-spacing: .4px;
    text-transform: uppercase;
    color: var(--yuxia-muted);
    margin-bottom: 6px;
}
.yuxia-fact-box strong {
    font-size: 17px;
    line-height: 24px;
    font-weight: 700;
    color: var(--yuxia-ink);
    letter-spacing: -.3px;
}
.yuxia-cert-chip {
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--yuxia-border);
    background: var(--white);
    border-radius: 8px;
    padding: 9px 16px;
    font-size: 14px;
    font-weight: 700;
    letter-spacing: .5px;
    color: var(--yuxia-ink);
}
.yuxia-list-check {
    list-style: none;
    padding: 0;
    margin: 0;
}
.yuxia-list-check li {
    position: relative;
    padding-left: 24px;
    font-size: 15px;
    line-height: 26px;
    color: var(--yuxia-muted);
    margin-bottom: 6px;
}
.yuxia-list-check li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 8px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--yuxia-accent);
}

/* ---------- 12. applications (板块 9) ---------- */
.yuxia-app-card {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px;
    padding: 20px 18px;
    height: 100%;
    display: flex;
    align-items: center;
    gap: 14px;
    transition: all .3s ease;
}
.yuxia-app-card:hover {
    border-color: #dcc6c6;
    box-shadow: 0 12px 28px rgba(111, 36, 36, .08);
}
.yuxia-app-icon {
    flex: 0 0 auto;
    width: 46px;
    height: 46px;
    border-radius: 9px;
    background: var(--yuxia-surface);
    color: var(--yuxia-accent-dark);
    font-size: 32px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.yuxia-app-card h3 {
    font-size: 15.5px;
    line-height: 22px;
    font-weight: 700;
    color: var(--yuxia-ink);
    margin-bottom: 2px;
    letter-spacing: -.2px;
}
.yuxia-app-card p {
    font-size: 13px;
    line-height: 20px;
    color: var(--yuxia-muted);
    margin-bottom: 0;
}
.yuxia-app-group-title {
    font-size: 15px;
    font-weight: 700;
    line-height: 1.45;
    letter-spacing: .3px;
    color: var(--yuxia-ink);
    display: flex;
    align-items: center;
    /* applied to both <p> (home page) and <h2> (applications page),
       so neutralise the default heading margins either way */
    margin-top: 0;
    margin-bottom: 18px;
}
.yuxia-app-group-title i {
    color: var(--yuxia-accent-dark);
    margin-right: 9px;
    font-size: 16px;
}

/* ---------- 13. OEM / ODM process (板块 10 replacement) ---------- */
.yuxia-step {
    position: relative;
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px;
    padding: 24px 22px;
    height: 100%;
}
.yuxia-step-num {
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--yuxia-deep);
    color: var(--white);
    font-size: 15px;
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 16px;
}
.yuxia-step h3 {
    font-size: 17px;
    line-height: 24px;
    font-weight: 700;
    letter-spacing: -.3px;
    color: var(--yuxia-ink);
    margin-bottom: 8px;
}
.yuxia-step p {
    font-size: 14px;
    line-height: 23px;
    color: var(--yuxia-muted);
    margin-bottom: 0;
}
.yuxia-video-panel {
    position: relative;
    border-radius: 12px;
    overflow: hidden;
    min-height: 260px;
    background-size: cover;
    background-position: center;
    height: 100%;
}

/* ---------- 14. resources (板块 11) ---------- */
.yuxia-resource-card {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px;
    padding: 26px 24px;
    height: 100%;
    display: flex;
    flex-direction: column;
    transition: all .3s ease;
}
.yuxia-resource-card:hover {
    border-color: #dcc6c6;
    box-shadow: 0 14px 32px rgba(111, 36, 36, .09);
    transform: translateY(-3px);
}
.yuxia-resource-icon {
    width: 46px;
    height: 46px;
    border-radius: 9px;
    background: var(--yuxia-surface);
    color: var(--yuxia-accent-dark);
    font-size: 38px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 18px;
}
.yuxia-resource-card h3 {
    font-size: 17px;
    line-height: 24px;
    font-weight: 700;
    letter-spacing: -.3px;
    color: var(--yuxia-ink);
    margin-bottom: 8px;
}
.yuxia-resource-card p {
    font-size: 14px;
    line-height: 23px;
    color: var(--yuxia-muted);
    margin-bottom: 16px;
}

/* ---------- 15. FAQ (板块 12) ---------- */
.yuxia-faq .accordion-item {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px !important;
    margin-bottom: 12px;
    overflow: hidden;
}
.yuxia-faq .accordion-item.active-accordion {
    background: var(--yuxia-surface);
}
.yuxia-faq .accordion-header {
    border-bottom: 0 !important;
}
.yuxia-faq .accordion-title {
    padding: 20px 24px;
}
.yuxia-faq .accordion-title span {
    font-size: 16.5px !important;
    font-weight: 700 !important;
    color: var(--yuxia-ink);
    line-height: 26px;
}
.yuxia-faq .accordion-title i {
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    color: var(--yuxia-accent-dark);
    font-size: 18px;
}
.yuxia-faq .accordion-body {
    border-bottom: 0 !important;
    padding: 0 24px 22px;
}
.yuxia-faq .accordion-body p {
    font-size: 15px;
    line-height: 26px;
    color: var(--yuxia-muted);
    margin-bottom: 0;
}

/* ---------- 16. bottom CTA + footer (板块 13) ---------- */
.yuxia-cta {
    background: var(--yuxia-deep);
    color: var(--white);
}
.yuxia-cta h2 {
    font-size: 40px;
    line-height: 48px;
    font-weight: 700;
    letter-spacing: -1.2px;
    color: var(--white);
    margin-bottom: 12px;
}
.yuxia-cta p {
    color: rgba(255, 255, 255, .76);
    font-size: 16.5px;
    line-height: 28px;
    margin-bottom: 0;
}
.yuxia-footer {
    background: var(--yuxia-deep-2);
    color: rgba(255, 255, 255, .70);
}
.yuxia-footer h3,
.yuxia-footer h4 {
    color: var(--white);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: .4px;
    text-transform: uppercase;
    margin-bottom: 18px;
}
.yuxia-footer a {
    color: rgba(255, 255, 255, .70);
}
.yuxia-footer a:hover {
    color: var(--white);
}
.yuxia-footer ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.yuxia-footer ul li {
    font-size: 14px;
    line-height: 24px;
    margin-bottom: 5px;
}
.yuxia-footer .yuxia-footer-about {
    font-size: 14px;
    line-height: 24px;
    color: rgba(255, 255, 255, .66);
}
.yuxia-footer-bottom {
    border-top: 1px solid rgba(255, 255, 255, .12);
}
.yuxia-footer-bottom p,
.yuxia-footer-bottom a {
    font-size: 13.5px;
    color: rgba(255, 255, 255, .60);
}
.yuxia-footer-bottom a:hover {
    color: var(--white);
}
.yuxia-footer-logo img {
    max-height: 46px;
    width: auto;
}

/* ---------- 17. responsive ---------- */
@media (max-width: 1399px) {
    .yuxia-hero h1 {
        font-size: 46px;
        line-height: 52px;
    }
}
@media (max-width: 1199px) {
    .yuxia-hero {
        padding: 62px 0 68px !important;
    }
    .yuxia-hero h1 {
        font-size: 40px;
        line-height: 46px;
    }
    .yuxia-h2 {
        font-size: 32px;
        line-height: 40px;
    }
    .yuxia-cta h2 {
        font-size: 33px;
        line-height: 41px;
    }
    .yuxia-navbar .navbar-nav .nav-link {
        font-size: 15px;
        padding: 10px 10px;
    }
}
@media (max-width: 991px) {
    .yuxia-hero {
        padding: 52px 0 58px !important;
        /* below 992px the two hero columns stack, so the product card ends up in
           the lower half - move the warm radial down with it */
        background-image:
            radial-gradient(560px 500px at 68% 76%, rgba(144, 48, 48, .12) 0%, rgba(144, 48, 48, 0) 70%),
            linear-gradient(180deg, var(--yuxia-accent-tint) 0%, var(--yuxia-surface-2) 54%, var(--yuxia-surface) 100%);
    }
    .yuxia-hero h1 {
        font-size: 34px;
        line-height: 40px;
        letter-spacing: -1px;
    }
    .yuxia-hero-sub {
        font-size: 17px;
        line-height: 26px;
    }
    .yuxia-hero-media {
        /* Below 992px the two hero columns stack, so the frame gets the full
           container width. Cap it so the photo cannot eat the whole fold. */
        max-width: 420px;
        aspect-ratio: 4 / 5;
    }
    .yuxia-utility-bar {
        font-size: 12px;
    }
    .yuxia-utility-bar .yuxia-utility-item + .yuxia-utility-item::before {
        margin: 0 8px;
    }
    .yuxia-faq .accordion-title {
        padding: 16px 18px;
    }
    .yuxia-faq .accordion-body {
        padding: 0 18px 18px;
    }
}
@media (max-width: 767px) {
    body {
        font-size: 15px;
        line-height: 26px;
    }
    .yuxia-hero {
        padding: 40px 0 46px !important;
    }
    .yuxia-hero-media {
        /* Phones: keep the frame from dominating the fold. */
        max-width: 320px;
    }
    .yuxia-hero h1 {
        font-size: 30px;
        line-height: 36px;
    }
    .yuxia-h2 {
        font-size: 26px;
        line-height: 34px;
    }
    .yuxia-cta h2 {
        font-size: 27px;
        line-height: 35px;
    }
    .yuxia-define-bar {
        padding: 18px;
        font-size: 15px;
        line-height: 26px;
    }
    .yuxia-stat {
        flex-direction: column;
        text-align: center;
        gap: 8px;
    }
    .yuxia-factory-tile {
        min-height: 170px;
    }
}

/* ============================================================
   17. sub pages (about / products / contact)
   ============================================================ */
.yuxia-page-hero {
    background: var(--yuxia-deep-2);
    /* Inner padding only - the header clearance comes from Crafto's
       `top-space-margin` class on the same element (see page_hero() in the
       generator for why the framework class is required). */
    padding: 48px 0 58px;
}
.yuxia-page-hero h1 {
    color: var(--white);
    font-size: 40px;
    line-height: 1.18;
    margin-bottom: 14px;
}
.yuxia-page-hero .yuxia-page-lead {
    color: rgba(255, 255, 255, .78);
    font-size: 17px;
    line-height: 28px;
    max-width: 780px;
}
.yuxia-crumbs {
    list-style: none;
    padding: 0;
    margin: 0 0 18px;
    font-size: 13px;
    color: rgba(255, 255, 255, .60);
}
.yuxia-crumbs li {
    display: inline-block;
}
.yuxia-crumbs li + li::before {
    content: "/";
    margin: 0 8px;
    color: rgba(255, 255, 255, .35);
}
.yuxia-crumbs a {
    color: rgba(255, 255, 255, .70);
}
.yuxia-crumbs a:hover {
    color: var(--yuxia-accent-dark);
}

.yuxia-spec-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 15px;
}
.yuxia-spec-table th,
.yuxia-spec-table td {
    border-bottom: 1px solid var(--yuxia-border);
    padding: 12px 14px;
    text-align: left;
    vertical-align: top;
}
.yuxia-spec-table th {
    width: 210px;
    color: var(--yuxia-ink);
    font-weight: 600;
    background: var(--yuxia-surface);
}
.yuxia-spec-table tr:last-child th,
.yuxia-spec-table tr:last-child td {
    border-bottom: none;
}

.yuxia-contact-card {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px;
    padding: 26px 26px 22px;
    height: 100%;
}
.yuxia-contact-card h2,
.yuxia-contact-card h3 {
    font-size: 19px;
    margin-bottom: 10px;
}
.yuxia-contact-card p {
    color: var(--yuxia-muted);
    font-size: 15px;
    line-height: 25px;
}
.yuxia-contact-value {
    font-size: 17px;
    font-weight: 600;
    color: var(--yuxia-ink);
    word-break: break-word;
}

.yuxia-checklist {
    list-style: none;
    padding: 0;
    margin: 0;
}
.yuxia-checklist li {
    position: relative;
    padding-left: 28px;
    margin-bottom: 12px;
    line-height: 25px;
    color: var(--yuxia-muted);
}
.yuxia-checklist li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 6px;
    width: 14px;
    height: 8px;
    border-left: 2px solid var(--yuxia-accent);
    border-bottom: 2px solid var(--yuxia-accent);
    transform: rotate(-45deg);
}

.yuxia-note {
    background: var(--yuxia-surface);
    border-left: 3px solid var(--yuxia-accent);
    border-radius: 0 8px 8px 0;
    padding: 16px 20px;
    font-size: 14px;
    line-height: 24px;
    color: var(--yuxia-muted);
}
@media (max-width: 767px) {
    .yuxia-page-hero {
        padding: 50px 0 40px;
    }
    .yuxia-page-hero h1 {
        font-size: 28px;
    }
    .yuxia-spec-table th {
        width: 130px;
    }
}

/* ============================================================
   18. blog list / post detail / sidebar / pagination
   ============================================================ */
.yuxia-post-meta {
    font-size: 13px;
    color: var(--yuxia-muted);
    letter-spacing: .2px;
}
.yuxia-post-meta a {
    color: var(--yuxia-muted);
    border-bottom: 1px solid var(--yuxia-border);
}
.yuxia-post-meta a:hover {
    color: var(--yuxia-accent-dark);
    border-color: var(--yuxia-accent);
}
.yuxia-post-cat {
    display: inline-block;
    background: var(--yuxia-accent-tint);
    color: var(--yuxia-accent-dark);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .4px;
    text-transform: uppercase;
    border-radius: 3px;
    padding: 3px 9px;
}
.yuxia-post-card {
    background: var(--white);
    border: 1px solid var(--yuxia-border);
    border-radius: 10px;
    overflow: hidden;
    height: 100%;
    transition: box-shadow .3s ease, transform .3s ease;
}
.yuxia-post-card:hover {
    box-shadow: 0 14px 34px rgba(111, 36, 36, .10);
    transform: translateY(-3px);
}
.yuxia-post-card .yuxia-post-thumb {
    position: relative;
    display: block;
    width: 100%;
    /* 4:3 rather than the library's 16:9: the blog thumbnails reuse product
       photography, which is portrait, so a cinematic crop cut the garment off at
       both ends. */
    padding-top: 75%;
    overflow: hidden;
    background: var(--yuxia-surface-2);
}
.yuxia-post-card .yuxia-post-thumb img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.yuxia-post-card .yuxia-post-body {
    padding: 22px 24px 24px;
}
.yuxia-post-card h3 {
    font-size: 19px;
    line-height: 27px;
    margin: 10px 0 10px;
}
.yuxia-post-card h3 a {
    color: var(--yuxia-ink);
}
.yuxia-post-card h3 a:hover {
    color: var(--yuxia-accent-dark);
}
.yuxia-post-card p {
    font-size: 15px;
    line-height: 25px;
    color: var(--yuxia-muted);
}
.yuxia-post-wide {
    display: flex;
    flex-wrap: wrap;
}
.yuxia-post-wide .yuxia-post-thumb {
    padding-top: 0;
    min-height: 240px;
    width: 42%;
}
.yuxia-post-wide .yuxia-post-body {
    width: 58%;
}
@media (max-width: 767px) {
    .yuxia-post-wide .yuxia-post-thumb,
    .yuxia-post-wide .yuxia-post-body {
        width: 100%;
        padding-top: 56.25%;
    }
    .yuxia-post-wide .yuxia-post-body {
        padding-top: 22px;
    }
}

/* ---- article typography ---- */
.yuxia-article {
    font-size: 17px;
    line-height: 30px;
    color: var(--yuxia-ink-soft);
}
.yuxia-article > p:first-of-type {
    font-size: 19px;
    line-height: 32px;
    color: var(--yuxia-ink);
}
.yuxia-article h2 {
    font-size: 27px;
    line-height: 36px;
    color: var(--yuxia-ink);
    margin: 44px 0 16px;
}
.yuxia-article h3 {
    font-size: 21px;
    line-height: 30px;
    color: var(--yuxia-ink);
    margin: 32px 0 12px;
}
.yuxia-article p {
    margin-bottom: 20px;
}
.yuxia-article ul,
.yuxia-article ol {
    margin: 0 0 22px;
    padding-left: 22px;
}
.yuxia-article li {
    margin-bottom: 10px;
}
.yuxia-article ul li::marker {
    color: var(--yuxia-accent-dark);
}
.yuxia-article img {
    border-radius: 10px;
    margin: 10px 0 8px;
}
.yuxia-article figure {
    margin: 26px 0;
}
.yuxia-article figcaption {
    font-size: 13px;
    color: var(--yuxia-muted);
    margin-top: 8px;
}
.yuxia-article blockquote {
    border-left: 3px solid var(--yuxia-accent);
    background: var(--yuxia-surface);
    border-radius: 0 8px 8px 0;
    padding: 20px 24px;
    margin: 26px 0;
    font-size: 18px;
    line-height: 29px;
    color: var(--yuxia-ink);
}
.yuxia-article blockquote p:last-child {
    margin-bottom: 0;
}
.yuxia-article .yuxia-spec-table {
    margin: 8px 0 26px;
}
.yuxia-article a {
    color: var(--yuxia-accent-dark);
    border-bottom: 1px solid rgba(144, 48, 48, .35);
}
.yuxia-article a:hover {
    border-color: var(--yuxia-accent);
}

.yuxia-author-box {
    background: var(--yuxia-surface);
    border-radius: 10px;
    padding: 24px 26px;
}
.yuxia-author-box .yuxia-author-name {
    font-size: 17px;
    font-weight: 600;
    color: var(--yuxia-ink);
}
.yuxia-author-box p {
    font-size: 15px;
    line-height: 25px;
    color: var(--yuxia-muted);
}

/* ---- sidebar ---- */
.yuxia-widget + .yuxia-widget {
    margin-top: 34px;
}
.yuxia-widget-title {
    font-size: 17px;
    color: var(--yuxia-ink);
    padding-bottom: 12px;
    margin-bottom: 16px;
    border-bottom: 1px solid var(--yuxia-border);
}
.yuxia-widget ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.yuxia-widget ul li {
    padding: 9px 0;
    border-bottom: 1px dashed var(--yuxia-border);
    font-size: 15px;
    line-height: 23px;
}
.yuxia-widget ul li:last-child {
    border-bottom: none;
}
.yuxia-widget ul li a {
    color: var(--yuxia-muted);
}
.yuxia-widget ul li a:hover {
    color: var(--yuxia-accent-dark);
}
.yuxia-widget .yuxia-widget-count {
    float: right;
    color: var(--yuxia-muted);
    font-size: 13px;
}
.yuxia-filter-chip {
    display: inline-block;
    border: 1px solid var(--yuxia-border);
    background: var(--white);
    color: var(--yuxia-muted);
    font-size: 13px;
    border-radius: 20px;
    padding: 6px 15px;
    margin: 0 8px 8px 0;
}
.yuxia-filter-chip:hover,
.yuxia-filter-chip.is-active {
    background: var(--yuxia-deep);
    border-color: var(--yuxia-deep);
    color: var(--white);
}
.yuxia-tag-cloud a {
    display: inline-block;
    font-size: 13px;
    color: var(--yuxia-muted);
    background: var(--yuxia-surface);
    border-radius: 4px;
    padding: 4px 10px;
    margin: 0 6px 8px 0;
}
.yuxia-tag-cloud a:hover {
    background: var(--yuxia-deep);
    color: var(--white);
}

/* ---- pagination ---- */
.yuxia-pagination {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.yuxia-pagination li a,
.yuxia-pagination li span {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 44px;
    height: 44px;
    padding: 0 14px;
    border: 1px solid var(--yuxia-border);
    border-radius: 6px;
    background: var(--white);
    color: var(--yuxia-ink);
    font-size: 15px;
}
.yuxia-pagination li a:hover {
    border-color: var(--yuxia-accent);
    color: var(--yuxia-accent-dark);
}
.yuxia-pagination li.is-active span {
    background: var(--yuxia-deep);
    border-color: var(--yuxia-deep);
    color: var(--white);
}
.yuxia-pagination li.is-disabled span {
    color: #b3a9a4;
    background: var(--yuxia-surface);
}

/* ---------- 19. inline meta helpers (blog cards, posts, sidebars) ---------- */
/* A middot placed between two inline meta items (date / author / read time).
   Kept as a class so the blog markup does not depend on the template's
   mx-* spacing utilities, which change between Crafto builds. */
.yuxia-meta-sep {
    display: inline-block;
    line-height: 1;
    color: #c6bab6;
    margin-left: 3px;
    margin-right: 3px;
}

/* Hairline under a meta row (article header, card footer, widget heading). */
.yuxia-meta-rule {
    border-bottom: 1px solid var(--yuxia-border);
}

/* Sidebar widget heading written as an <h3> inside .yuxia-widget, so the
   document outline stays valid without restyling the Crafto defaults. */
.yuxia-widget-title {
    font-size: 16px;
    font-weight: 700;
    line-height: 1.4;
    color: var(--yuxia-ink);
    margin-top: 0;
    margin-bottom: 16px;
}
.yuxia-widget-title i {
    color: var(--yuxia-accent-dark);
    margin-right: 8px;
}

/* Chips row under a list heading; flex so the pills wrap cleanly on mobile. */
.yuxia-filter-chips {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
}

/* ---------- 20. blog categories (real pages, not a JS filter) ---------- */
/* .yuxia-post-cat is now an <a> pointing at the category landing page, so it
   needs link affordances the old <span> badge did not have. */
a.yuxia-post-cat:hover {
    background: var(--yuxia-accent);
    color: var(--white);
}
.yuxia-widget ul li a.is-active {
    color: var(--yuxia-ink);
    font-weight: 600;
}

/* ---------- 21. product detail — image gallery (Swiper) ---------- */
/* The markup is the Crafto product-demo gallery, so the slider, the round nav
   arrows and the active-thumbnail border all come from css/vendors.min.css +
   css/style.css — files every YUXIA page already loads. Nothing new is
   downloaded for this feature. Only two things need adding here:

   1. Frame shape. The demo ships slides that all share one aspect ratio; the
      YUXIA S39 gallery mixes 800x800 studio shots with 800x560 / 800x592
      scenes. Left alone, the main slider jumps height between slides and the
      thumb strip comes out ragged, so every frame is squared up and the photo
      covers it. The crop lands on the horizontal margin of the two landscape
      files, which is empty space in both.
   2. The gap between the main image and the thumb strip (the demo gets this
      from Bootstrap row gutters, which do not apply to our stacked columns). */
.yuxia-gallery .product-image-slider .swiper-slide img,
.yuxia-gallery .product-image-thumb .swiper-slide img {
    aspect-ratio: 1 / 1;
    height: auto;
    object-fit: cover;
    -o-object-fit: cover;
}
.yuxia-gallery .product-image-thumb {
    margin-top: 15px;
}

/* ---------- 22. WordPress 菜单（wp_nav_menu）映射到品牌皮肤 ---------- */

/* header.php 的导航由 wp_nav_menu() 输出，WordPress 打印的是它自己的类名
   （li.menu-item > a + ul.sub-menu），与模板原本手写的
   li.nav-item > a.nav-link + ul.dropdown-menu 完全不是一个名字。
   模板的导航样式（css/style.css、demos/green-energy/green-energy.css）全部挂在
   手写那套类名上，所以 WordPress 输出的项渲染出来是无色、无字重、无内边距的
   —— 截图里 "ApplicationsBlogAbout YUXIAContact Us" 糊成一串就是这个原因。
   二级更麻烦：ul.sub-menu 不是 ul.dropdown-menu（面板样式不生效），而
   li.menu-item-has-children 又没有定位，绝对定位的面板只能去挂 nearest
   positioned ancestor（.navbar），于是横向跑到了别处 —— 这就是"二级导航走位"。
   本节把 WordPress 的类名映射到与 .nav-link / .dropdown-menu 同一套视觉语言，
   不改 header.php。复合前缀 .yuxia-navbar.navbar 是刻意写的，原因见第 3 节注释。 */

/* 一级链接与 .nav-link 同档：基础 16px / padding 10px 20px，
   ≤1199px 收到 15px / 10px 10px（见下方单独一段），
   这样"手写项"和"后台菜单项"看起来才是一个菜单，而不是两种字号。 */
.yuxia-navbar.navbar .navbar-nav > .menu-item > a {
    display: flex;
    align-items: center;
    align-self: stretch;
    position: relative;
    font-size: 16px;
    line-height: 20px;
    font-weight: 600;
    padding: 10px 20px;
    color: var(--yuxia-ink);
    transition: .3s;
}
.yuxia-navbar.navbar .navbar-nav > .menu-item > a:hover,
.yuxia-navbar.navbar .navbar-nav > .menu-item.current-menu-item > a,
.yuxia-navbar.navbar .navbar-nav > .menu-item.current-menu-ancestor > a {
    color: var(--yuxia-accent-dark);
}

@media (max-width: 1199px) {
    /* 收窄节奏跟第 17 节里 .nav-link 那条保持一致，别掉队 */
    .yuxia-navbar.navbar .navbar-nav > .menu-item > a {
        font-size: 15px;
        padding: 10px 10px;
    }
}

/* 子项图标列。模板原来靠 `.dropdown-menu a i` 给图标一个固定 25px 列宽，
   换成 WordPress 的 ul.sub-menu 之后那条规则不再命中，图标就按各自自然宽度排，
   同一面板里几行文字的左边缘会参差（fan 比 wind 窄）。
   补回等宽图标列；color 显式写品牌橙，免得离开 .text-base-color 工具类后变黑。 */
.yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li a i {
    display: inline-block;
    width: 25px;
    margin-right: 7px;
    text-align: center;
    color: var(--yuxia-accent-dark);
}

@media (min-width: 992px) {
    /* 一级项：把 li.menu-item 当 li.nav-item 用（撑满导航高度 + 建立定位上下文） */
    .yuxia-navbar.navbar .navbar-nav > .menu-item {
        display: flex;
        align-items: center;
        align-self: stretch;
        /* 二级面板的定位锚点。少了它，sub-menu 的绝对定位会去挂到 .navbar 上，
           这就是走位的根因，不是间距问题。 */
        position: relative;
    }

    /* 二级：ul.sub-menu 复刻第 3 节那块 .dropdown-menu 面板 */
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu {
        position: absolute;
        left: 0;
        top: 100%;
        z-index: 9;
        display: none;
        width: 320px;
        margin: 0;
        padding: 8px;
        list-style: none;
        border: 1px solid var(--yuxia-border);
        border-radius: 12px;
        background-color: var(--white);
        box-shadow: 0 18px 40px rgba(111, 36, 36, .10);
    }
    /* hover 之外给 :focus-within 也开一条路，键盘 Tab 进得来 */
    .yuxia-navbar.navbar .navbar-nav > .menu-item:hover > .sub-menu,
    .yuxia-navbar.navbar .navbar-nav > .menu-item:focus-within > .sub-menu {
        display: block;
        animation: show-animation .5s;
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li {
        padding: 0;
        position: relative;
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li a {
        display: block;
        padding: 12px 14px;
        border-radius: 8px;
        font-size: 15px;
        line-height: 26px;
        font-weight: 600;
        color: var(--yuxia-ink);
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li a:hover {
        background-color: var(--yuxia-accent-tint);
        color: var(--yuxia-accent-dark);
    }

    /* 三级（wp_nav_menu 的 depth=3 才可能出现）：向右展开，别压住二级 */
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu > .menu-item-has-children > .sub-menu {
        left: 100%;
        top: -9px;
    }
}

@media (max-width: 991px) {
    /* 折叠导航里 :hover 不成立，二级若仍留在 absolute + hover 里，
       触摸设备上子项永远点不到。这里摊平成缩进列表。 */
    .yuxia-navbar.navbar .navbar-nav > .menu-item > a {
        font-size: 15px;
        padding: 10px 0;
        color: var(--yuxia-ink);
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu {
        position: static;
        display: block;
        width: auto;
        margin: 0;
        padding: 0 0 6px 15px;
        list-style: none;
        border: 0;
        border-radius: 0;
        background-color: transparent;
        box-shadow: none;
        animation: none;
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li a {
        display: block;
        padding: 8px 0;
        font-size: 15px;
        line-height: 22px;
        font-weight: 500;
        color: var(--yuxia-muted);
    }
    .yuxia-navbar.navbar .navbar-nav > .menu-item > .sub-menu li a:hover {
        color: var(--yuxia-accent-dark);
    }
}

/* ============================================================
   YUXIA — additions on top of the ported component library
   (serif display headings, logo, forms, media helpers)
   ============================================================ */

/* ---------- A1. elegant serif display headings (silk brand voice) ---------- */
.yuxia-hero-copy h1,
.yuxia-page-hero h1,
.yuxia-h2,
h1, h2 { font-family: var(--yuxia-serif); }
.yuxia-hero-copy h1 { letter-spacing: -.5px; }
.yuxia-page-hero h1 { letter-spacing: -.5px; }
.yuxia-h2 { letter-spacing: -.3px; font-weight: 700; }

/* ---------- A2. logo ---------- */
header .navbar-brand img,
.yuxia-footer-logo img { height: 34px; width: auto; }

/* ---------- A3. quote / enquiry form ---------- */
.yuxia-form label {
    display: block; font-weight: 600; font-size: 14px;
    margin-bottom: 6px; color: var(--yuxia-ink);
}
.yuxia-form .form-control,
.yuxia-form input, .yuxia-form textarea, .yuxia-form select {
    width: 100%; background: var(--white); color: var(--yuxia-ink);
    border: 1px solid var(--yuxia-border); border-radius: 8px;
    padding: 12px 16px; font-size: 15px; line-height: 22px;
}
.yuxia-form .form-control:focus,
.yuxia-form input:focus, .yuxia-form textarea:focus, .yuxia-form select:focus {
    outline: none; border-color: var(--yuxia-accent);
    box-shadow: 0 0 0 3px var(--yuxia-accent-tint);
}
.yuxia-form .form-hint { font-size: 13px; color: var(--yuxia-muted); }

/* ---------- A4. product card (grid) ---------- */
/* ---------- A4. product / post card thumb ----------
   `padding-top: 100%` (square) is replaced by an explicit 3:4 frame. The
   container keeps no top padding, so the absolutely positioned `> img` fills the
   whole frame instead of being pushed into a strip along the bottom. */
.yuxia-card-thumb {
    width: 100%;
    padding-top: 0;
    aspect-ratio: 3 / 4;
    border-radius: 8px;
    overflow: hidden;
    background: var(--yuxia-surface-2);
    display: block;
}
.yuxia-card-thumb > img { object-position: center top; }
.yuxia-card:hover { box-shadow: 0 16px 36px rgba(111, 36, 36, .10); transform: translateY(-3px); }

/* ---------- A5. home category card ---------- */
.yuxia-cat-card {
    position: relative;
    display: block;
    overflow: hidden;
    border-radius: 12px;
    background: var(--white);
    border: 1px solid var(--yuxia-border);
}
.yuxia-cat-media { display: block; overflow: hidden; background: var(--yuxia-surface-2); }
.yuxia-cat-card img {
    width: 100%;
    /* 4:5 portrait - the garment shots are portrait, so a 4:3 landscape frame was
       cropping heads and hems. 4:5 also keeps the upscale factor on the small
       source files as low as a full-width tile allows. */
    aspect-ratio: 4 / 5;
    object-fit: cover;
    object-position: center top;
    display: block;
    transition: transform .6s ease;
}
.yuxia-cat-card:hover img { transform: scale(1.05); }
.yuxia-cat-body { display: block; padding: 18px 18px 20px; }
.yuxia-cat-name {
    display: block;
    font-family: var(--yuxia-serif);
    font-size: 19px;
    line-height: 26px;
    font-weight: 700;
    color: var(--yuxia-ink);
    margin-bottom: 7px;
}
.yuxia-cat-blurb {
    display: block;
    font-size: 14px;
    line-height: 22px;
    color: var(--yuxia-muted);
    margin-bottom: 14px;
}
.yuxia-cat-link {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .6px;
    text-transform: uppercase;
    color: var(--yuxia-accent-dark);
}
.yuxia-cat-link i { transition: transform .3s ease; }
.yuxia-cat-card:hover .yuxia-cat-link i { transform: translateX(3px); }

/* ---------- A6. capability photo grid ---------- */
.yuxia-cap-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
.yuxia-cap-grid img { width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: 10px; }
@media (max-width: 991px) { .yuxia-cap-grid { grid-template-columns: repeat(2, 1fr); } }

/* ---------- A7. video panel media ---------- */
.yuxia-video-panel video { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 12px; }

/* ---------- A8. honest placeholder block (never fake data) ---------- */
.yuxia-placeholder {
    border: 1px dashed var(--yuxia-accent); background: var(--yuxia-accent-tint);
    border-radius: 10px; padding: 32px 28px; text-align: center;
}
.yuxia-placeholder h3 { font-family: var(--yuxia-serif); color: var(--yuxia-accent-dark); margin-bottom: 10px; }

/* ---------- A9. gallery ---------- */
.yuxia-gallery-main { width: 100%; border-radius: 12px; object-fit: cover; }
.yuxia-gallery-thumbs { display: flex; gap: 10px; margin-top: 12px; flex-wrap: wrap; }
.yuxia-gallery-thumbs img {
    width: 76px; height: 96px; object-fit: cover;
    border: 1px solid var(--yuxia-border); border-radius: 8px; cursor: pointer;
}

/* ---------- A10. swatch row ---------- */
.yuxia-swatch-row { display: flex; gap: 10px; flex-wrap: wrap; }

/* ---------- A11. trust bar ----------
   The four figure cells are `.yuxia-stat`; the band itself only carries the
   section rhythm (the reference site sits this block flush under the hero). */
.yuxia-trustbar {
    padding: 56px 0 46px;
    background: var(--white);
}

/* ---------- A12. navbar fit guard ----------
   At 1264px the three navbar children (brand 149px + menu 901px + quote button
   211px) added up to 1261px inside a 1249px content box, so the quote button
   hung 28px past the right edge. Trimming the menu to the seven items the
   reference site uses removed most of that, and this query keeps the remainder
   shrinking rather than overflowing on the 992-1439px band. `nowrap` has to
   travel with `white-space` on the links, otherwise a long item like
   "Applications" wraps onto two lines instead of the row tightening. */
@media (min-width: 992px) {
    .yuxia-navbar .navbar-nav { flex-wrap: nowrap; }
    .yuxia-navbar .navbar-nav .nav-link { white-space: nowrap; }
    .yuxia-navbar .navbar-nav > .nav-item > .dropdown-toggle { margin-left: 2px; }
}
@media (min-width: 992px) and (max-width: 1439px) {
    .yuxia-navbar .navbar-nav .nav-link {
        font-size: 16px;
        padding-left: 20px;
        padding-right: 20px;
    }
}

/* ---------- A13. product gallery carousel ----------
   Markup comes from `gallery_carousel()`. The framework's main.js does the
   work: it scans `.swiper`, reads `data-slider-options`, builds the Swiper
   instance, links the thumbnail strip through `thumbs.swiper.el` and binds the
   two nav buttons through `navigation.nextEl/prevEl`. So there is deliberately
   no JavaScript here - only presentation. The only thing the framework leaves
   unstyled is the frame around the photo and the circle behind each arrow
   (its own `.product-image-thumb .swiper-slide` rule supplies the active
   thumbnail border, which we recolour below). */
.yuxia-product-image {
    background: var(--yuxia-surface-2);
    border: 1px solid var(--yuxia-border);
    border-radius: 14px;
    overflow: hidden;
}
.yuxia-product-image .swiper,
.yuxia-product-image .swiper-wrapper,
.yuxia-product-image .swiper-slide { height: auto; }
.yuxia-product-image .swiper-slide img {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 5;
    object-fit: cover;
    object-position: center top;
}
/* The framework sets `cursor: crosshair` on the slide image because its own
   demo links each slide to a lightbox. This theme ships no lightbox library,
   and the slides here are plain images, so the crosshair would promise a
   zoom that never opens. */
.yuxia-product-image .swiper-slide img { cursor: default; }

.yuxia-slider-nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 44px;
    height: 44px;
    margin: 0;
    padding: 0;
    border: 1px solid var(--yuxia-border);
    border-radius: 50%;
    background: rgba(255, 255, 255, .94);
    color: var(--yuxia-ink);
    box-shadow: 0 8px 20px rgba(111, 36, 36, .14);
    cursor: pointer;
    z-index: 5;
    transition: background .25s ease, border-color .25s ease, color .25s ease;
}
.yuxia-slider-nav i { font-size: 14px; line-height: 1; }
.yuxia-slider-nav::after { display: none; }
.yuxia-slider-nav:hover,
.yuxia-slider-nav:focus-visible {
    background: var(--yuxia-accent-dark);
    border-color: var(--yuxia-accent-dark);
    color: var(--white);
    opacity: 1;
}
.yuxia-slider-nav.swiper-button-prev { left: 14px; right: auto; }
.yuxia-slider-nav.swiper-button-next { right: 14px; left: auto; }
.yuxia-slider-nav.swiper-button-disabled { opacity: .4; }

.product-image-thumb { margin-top: 16px; }
.product-image-thumb .swiper-slide {
    border: 1px solid var(--yuxia-border);
    border-radius: 8px;
    overflow: hidden;
    background: var(--yuxia-surface-2);
    opacity: .7;
    transition: opacity .25s ease, border-color .25s ease;
}
.product-image-thumb .swiper-slide img {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 5;
    object-fit: cover;
    object-position: center top;
}
.product-image-thumb .swiper-slide:hover { opacity: 1; }
/* Overrides the framework's `var(--light-gray)` so the active thumb picks up
   the brand red rather than a neutral grey. */
.product-image-thumb .swiper-slide.swiper-slide-thumb-active {
    border-color: var(--yuxia-accent-dark);
    opacity: 1;
}

@media (max-width: 575px) {
    .yuxia-slider-nav { width: 36px; height: 36px; }
    .yuxia-slider-nav.swiper-button-prev { left: 8px; }
    .yuxia-slider-nav.swiper-button-next { right: 8px; }
}

/* ---------- A14. CTA action row ----------
   `cta_section()` gives every page the same closing band with two buttons.
   Flex keeps them on one row and right-aligns them on desktop, so a longer
   second label wraps inside the row instead of dropping below it. */
.yuxia-cta-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    justify-content: flex-start;
}
.yuxia-cta-actions .btn { margin-bottom: 0; }
@media (min-width: 992px) {
    .yuxia-cta-actions { justify-content: flex-end; }
}

/* ---------- A15. the accent, re-tuned for the red-brown deep bands ----------
   The accent pair (--yuxia-accent #903030 for decoration, --yuxia-accent-dark
   #6e2424 for text) is calibrated against the light surfaces. Dropped onto a deep
   band it collapses into the background: a #903030 rule on #903030 shows nothing,
   and #6e2424 label text on #6e2424 is effectively invisible.

   This never showed up while the deep bands were espresso-black, because
   gold-on-black reads fine. It is a direct consequence of moving the dark
   surfaces from neutral to the brand hue, so every accent-bearing element that
   can land inside a band is re-pointed here.

   The pale tints are the reference design's own: it uses #e9c8c8 for a kicker on
   its red enquiry band and #dcc7c7 for footer links. Coverage was derived by
   parsing all 22 generated pages and listing the accent classes that actually
   occur inside a deep container — not by guessing:
     .yuxia-kicker      4 pages   .yuxia-value-icon  index (x4)
     .yuxia-title-rule  4 pages   .yuxia-crumbs      20 pages              */
.yuxia-dark-section .yuxia-kicker,
.yuxia-cta .yuxia-kicker,
.yuxia-page-hero .yuxia-kicker {
    color: #e9c8c8;
}
.yuxia-dark-section .yuxia-kicker::before,
.yuxia-cta .yuxia-kicker::before,
.yuxia-page-hero .yuxia-kicker::before,
.yuxia-dark-section .yuxia-title-rule,
.yuxia-cta .yuxia-title-rule,
.yuxia-page-hero .yuxia-title-rule {
    /* a white rule at 50% over the red band, rather than the accent, which would
       be the same colour as the surface behind it */
    background: rgba(255, 255, 255, .5);
}
.yuxia-dark-section .yuxia-value-icon {
    /* the icon sits on a translucent-white chip on the red band; the accent text
       colour would leave it nearly unreadable */
    color: #e9c8c8;
}
.yuxia-page-hero .yuxia-crumbs a:hover,
.yuxia-page-hero .yuxia-crumbs a:focus-visible {
    /* the generic hover is --yuxia-accent-dark, which is the same value the inner
       page hero is painted with — it would disappear on hover */
    color: var(--white);
}

/* A primary button filled with the accent vanishes when the band behind it is the
   same accent: the closing CTA is painted --yuxia-deep (#903030) and every one of
   the 22 pages puts a `btn-base-color` button on it, which is also #903030. The
   label stayed white so it read as loose text rather than a button. (With the old
   gold-on-espresso palette the two colours were far apart, so this only appeared
   after the re-colour.) Invert the button instead — solid white, brand-red label.
   The hover uses the pale tint so it stays distinguishable from the adjacent ghost
   button, which turns solid white on hover. */
.yuxia-cta .btn.btn-base-color {
    background-color: var(--white);
    border-color: var(--white);
    color: var(--yuxia-accent-dark);
}
.yuxia-cta .btn.btn-base-color:hover,
.yuxia-cta .btn.btn-base-color:focus,
.yuxia-cta .btn.btn-base-color:active {
    background-color: var(--yuxia-accent-tint);
    border-color: var(--yuxia-accent-tint);
    color: var(--yuxia-accent-dark);
}
