@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap');

/*
 * faithful-en.css — Latin-text adjustments for the ported live (CJK-tuned) hima.auto UI.
 * Linked AFTER the live CSS on every faithful page.
 *   1. EN type ~12–18% smaller than the CN px values (visual balance).
 *   2. HIMA beveled buttons preserved but content-fitting (clip-path / scalable SVG outline).
 *   3. Experience tiles (category-s1) laid out like the live page (banner + 3-tile row).
 */

/* body overflow-x: hidden (scraped from model pages) breaks position:sticky on all descendants.
   Replace with clip — same paint behaviour, no scroll container, sticky works. */
body { overflow-x: clip !important; }

/* Responsive clause breaks: br.xs = mobile-only, br.lg = desktop-only.
   Without these rules both show everywhere, chopping EN sentences mid-word on mobile. */
br.xs { display: none; }
br.lg { display: none; }
@media (max-aspect-ratio: 7/10) {
  br.xs { display: block; }
}

/* h5: every clause on this page was authored as CN's own mobile line-wrap point (br.xs/br.lg/br.pad
   pairs). English clauses don't reflow at the same spot, so once translated these breaks chop
   sentences mid-word/mid-clause (reported repeatedly). i18n-apply.mjs regenerates shangjie-h5-body.html
   from the frozen CN snapshot on every run, so per-instance <br> removal in body.html always reverted
   on the next unrelated content fix. Suppressing at the CSS layer instead — this survives every
   apply run since apply never touches this file. */
#h5 .xs-intro br,
#h5 .intro br,
#h5 .stack-item br,
#h5 .headline br.xs,
#h5 .headline br.lg,
#h5 .headline br.pad,
#h5 .headline br.pad-hidden,
#h5 br.force-hidden {
  display: none !important;
}

/* ── 1. English type scale ───────────────────────────────────────────────────── */
.category-s2 .txt-64-48-32 { font-size: 52px; }
.category-s2 .txt-48-40-24 { font-size: 40px; }
.category-s2 .txt-28-24-16 { font-size: 22px; }
.category-s2 .txt-32-20 { font-size: 27px; }
.category-s2 .txt-20-12 { font-size: 16px; }
.category-s2 .txt-20-16 { font-size: 17px; }
.x2-category .category-kv .kv-title1 { font-size: 42px; }
.x2-category .category-kv .kv-title2 { font-size: 22px; }
.x2-category .category-kv .kv-title3 { font-size: 14px; }
.category-s1 .txt-48-40-24 { font-size: 40px; }
.category-s1 .txt-32-24-14 { font-size: 26px; }

.hima-home-banner .headline { font-size: 42px; }
.hima-home-banner .intro { font-size: 18px; }
.hima-home-member .member-header .intro { font-size: 16px; }
.hima-home-solution .headline { font-size: 42px; }
.hima-home-solution .card-headline { font-size: 24px; }
.hima-home-solution .card-intro { font-size: 17px; }
.hima-support-card .headline { font-size: 40px; }
.hima-support-card .intro { font-size: 16px; }
.hima-home-app .headline { font-size: 40px; }
.avoid-collision-card-top-title p { font-size: 60px; }
.avoid-collision-card-mid-title { font-size: 30px; }

@media screen and (max-width: 1199px) {
  .category-s2 .txt-64-48-32 { font-size: 40px; }
  .hima-home-banner .headline,
  .hima-home-solution .headline,
  .hima-support-card .headline,
  .hima-home-app .headline { font-size: 34px; }
}

/* ── 2. HIMA beveled buttons, content-fitting ────────────────────────────────── */
/* The live hima-btn uses fixed-width SVG masks tuned for short CJK labels. We drop the
   masks and recreate the same hexagon bevel with clip-path (solid) / a non-scaling SVG
   stroke (outline) so the shape is preserved AND the button grows to fit English text. */
.category-s2-txt-wrap .category-s2-txt-btn-wrap,
.x2-category .category-kv .kv-btn {
  width: fit-content !important;
  display: flex;
  justify-content: flex-start !important;
  gap: 10px;
  flex-wrap: wrap;
}
.hima-btn.btn-solid-white,
.hima-btn.btn-outline-white {
  width: auto;
  min-width: 0;
  height: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 12px 32px;
  font-size: 13px;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color 0.3s ease, color 0.3s ease, background-image 0.3s ease;
}
.hima-btn.btn-solid-white::before,
.hima-btn.btn-solid-white::after,
.hima-btn.btn-outline-white::before,
.hima-btn.btn-outline-white::after { display: none !important; }
/* Solid: filled hexagon via clip-path (shape) */
.hima-btn.btn-solid-white {
  background: #fff !important;
  color: #000 !important;
  clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 50%, calc(100% - 14px) 100%, 14px 100%, 0 50%);
}
.hima-btn.btn-solid-white:hover {
  background: rgba(255, 255, 255, 0.82) !important;
}
/* Outline: full hexagon stroke via SVG bg (NO clip-path, so all edges show). Hover swaps to a filled SVG. */
.hima-btn.btn-outline-white {
  background-color: transparent !important;
  color: #fff !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='none' stroke='%23ffffff' stroke-opacity='0.6' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
  background-size: 100% 100% !important;
  background-repeat: no-repeat !important;
}
.hima-btn.btn-outline-white:hover {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='%23ffffff' fill-opacity='0.16' stroke='%23ffffff' stroke-opacity='0.85' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
}

/* ── 3. Experience tiles (category-s1): banner on top + 3-tile row ───────────── */
.x2-category .category-s1 {
  width: calc(77.78vw + 107px);
  max-width: 1600px;
  margin: 80px auto;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.x2-category .category-s1 .s1-con {
  position: relative;
  overflow: hidden;
  border-radius: 4px;
}
.x2-category .category-s1 .s1-img { width: 100%; height: 100%; }
.x2-category .category-s1 .s1-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.x2-category .category-s1 .s1-con1 .s1-img { aspect-ratio: 2 / 1; }
/* Experience banner title is centred */
.x2-category .category-s1 .s1-con1 .s1-title {
  position: absolute;
  top: 56px;
  left: 0;
  right: 0;
  transform: none !important;
  text-align: center;
  color: #fff;
  z-index: 2;
}
.x2-category .category-s1 .flex-none { display: flex; gap: 16px; }
.x2-category .category-s1 .flex-none .s1-con { flex: 1; }
.x2-category .category-s1 .flex-none .s1-con .s1-img { aspect-ratio: 1 / 1; }
.x2-category .category-s1 .flex-none .s1-title {
  position: absolute;
  top: 32px;
  left: 0;
  right: 0;
  transform: none !important;
  text-align: center;
  color: #fff;
  z-index: 2;
}
.x2-category .category-s1 .s1-title .txt-16-14,
.x2-category .category-s1 .s1-title .txt-20-14 { margin-top: 10px; }
.x2-category .category-s1 .s1-title .flex-cen { display: inline-flex; align-items: center; gap: 6px; color: #fff; font-size: 14px; }
.x2-category .category-s1 .s1-arrow { font-size: 1.3em; line-height: 1; }
@media screen and (max-width: 767.9px) {
  .x2-category .category-s1 { width: calc(100vw - 32px); }
  .x2-category .category-s1 .flex-none { flex-direction: column; }
  /* Hero CTAs: trim padding/font on phones so the two English labels sit side-by-side on
     one row (matching the CN source), instead of wrapping to a stacked pair. */
  .hima-btn.btn-solid-white,
  .hima-btn.btn-outline-white,
  .hima-btn.btn-solid-black,
  .hima-btn.btn-outline-black { padding: 11px 18px; font-size: 12px; }
  .x2-category .category-kv .kv-btn { flex-wrap: nowrap; justify-content: center !important; }
  /* M5 is white-bodied: the endurance spec values/captions/describe carry the original
     light "over-image" colour, but on phones they drop below the image onto the white
     section and vanish. Flip them to the page ink so they read. */
  #m5-new .endurance-value, #m5-new .endurance-value span,
  #m5-new .endurance-caption,
  #m5-new .endurance-describe { color: #1d1d1f !important; }
  /* Long EN tab headings (e.g. "Drive anywhere nationwide — as long as there's a road")
     are sized for short CN labels and clip at the viewport edge on phones. Shrink and
     allow wrapping so the full heading shows. Applies to all faithful model pages. */
  .tabnav { font-size: 19px !important; line-height: 1.25 !important; white-space: normal !important; }
  /* M5–M9 hero (phones): EN SVG wordmarks sized for desktop are too small on phones vs
     the large CN CJK characters. Bump to a weight that matches the CN visual prominence. */
  #m5-new .section-hero .hero-wordmark { width: 65vw !important; }
  #m6 .section-hero .hero-wordmark,
  #m7 .section-hero .hero-wordmark,
  #m8 .section-hero .hero-wordmark,
  #f2n .section-hero .hero-wordmark { height: 14vw !important; }
  /* z7 (#shb): desktop wordmark is 19vw; too small on phones next to the large CN-scale
     hero. Bump to 35vw for mobile prominence. */
  #shb .section-hero .hero-wordmark { width: 35vw !important; }
  /* s800 (#s800): desktop wordmark is 30vw; bump to 45vw for mobile prominence. */
  #s800 .section-hero .hero-wordmark { width: 45vw !important; }
  /* s9t (#x4w) + s9 (#x4a): bump the hero wordmark to 45vw for mobile prominence. */
  #x4w .section-hero .hero-wordmark,
  #x4a .section-hero .hero-wordmark { width: 45vw !important; }
  /* s800 tabnav copy: all 8 .stack-lists carry the CN xs:ml-80, which overrides their mx-auto
     with a ~43px left margin — so the longer EN paragraphs sit indented past the tab labels and
     crowd/cut against the right edge on phones. Replace with symmetric 16px margins so the copy
     aligns left with the tabs and keeps right-edge breathing room. */
  #s800 .stack-list { margin-left: 16px; margin-right: 16px; }
  /* space-6 is a swiper tabnav (tabnav-layout-1); its base CN rule forces width:100% plus an
     11vw left margin at phone aspect, so it overflows the right edge and the general .stack-list
     rule above can't win (base selector is more specific). Match that specificity to apply the
     same symmetric margins + auto width. */
  #s800 .subsection-space-6 .tabnav-layout-1 .tabnav-content .stack-list {
    margin-left: 16px; margin-right: 16px; width: auto;
  }
  /* space-13 ("Huawei YueZhang Signature Series"): section has no side padding, the full-bleed
     video runs edge-to-edge, and the intro (width:100% + the CN xs:ml-80 indent) overflows the
     right edge. Add symmetric 16px section padding and zero the CN left indent so headline, intro
     and video all sit within a balanced gutter. */
  #s800 .subsection-space-13 { padding-left: 16px; padding-right: 16px; }
  #s800 .subsection-space-13 .headline-container .gradient-headline,
  #s800 .subsection-space-13 .intro-container .intro { margin-left: 0; }
  /* s800 "Plucking the Celestial Stars" headline runs flush to the right edge on phones too. */
  #s800 .gradient-headline.headline-2 { width: 98%; }
  /* Hero subtitles: vw values sized for desktop (1.15–1.35vw ≈ 4–5px on phones) are
     unreadable. Set a legible size and allow wrapping where nowrap was set for desktop. */
  #m5-new .section-hero .hero-headline { font-size: 4vw !important; }
  #m7 .section-hero .hero-content > p { font-size: 4vw !important; }
  #m8 .section-hero .hero-slogan,
  #f2n .section-hero .hero-slogan { font-size: 4vw !important; white-space: normal !important; letter-spacing: 0.08em !important; }
  #m6 .section-hero .hero-content > span {
    flex-wrap: wrap !important;
    gap: 0.2em 0.5em !important;
    font-size: 5vw !important;
    letter-spacing: 0.06em !important;
    max-width: 92vw;
  }
  /* M6 dimension stats: the odometer's digit window (.stat-value) is locked to ~26px while
     the digits render taller, clipping them top and bottom (and the "0.239" decimal). Let
     the value box grow to its line so the numbers aren't cut. */
  #m6 .stat-value { height: auto !important; min-height: 0 !important; overflow: visible !important; line-height: 1.1 !important; align-items: baseline !important; }
  #m6 .stat-value .stat-number,
  #m6 .stat-value .stat-number span { height: auto !important; line-height: 1.1 !important; }
}

/* ── 4. Flagship scroll-wipe neutralizer ─────────────────────────────────────────
 * Model pages (m5/m7/m8/s800/s9…) use .img-scroll-bg-left/right overlay panels that
 * index.js scrubs open/closed during a GSAP ScrollTrigger pin. In our static port the
 * pin throws ("target null not found") and the panels initialize stuck at width:40vw,
 * covering the section content with white/black blocks for every visitor. Their CSS
 * rest state is width:0; force it so the real imagery underneath shows through. We lose
 * only the (already-broken) wipe transition. Inline width is set by JS → needs !important. */
.img-scroll-bg-left,
.img-scroll-bg-right { width: 0 !important; }

/* ── 5. Hide the mobile-menu toggle checkbox (checkbox-hack) ──────────────────────
 * Model pages carry <input id="menu-slide-switch"> for the live header's slide-out menu.
 * Its hiding rule lives in the unavailable common.css, so the raw 13px checkbox renders
 * at the top-left. Take it out of flow (off-screen) — the <label> hamburger still toggles
 * it and CSS :checked sibling selectors still fire, so the menu hack stays functional. */
#menu-slide-switch { position: absolute !important; left: -9999px !important; top: auto !important; width: 0 !important; height: 0 !important; opacity: 0 !important; pointer-events: none; }

/* UAE: remove China-only ported footer (WeChat/Weibo/app QR + Huawei copyright)
   and the CN "HIMA official website" cookie banner. Replace with an Allied
   Motors UAE footer later. */
.hima-global-footer,
.hima-global-cookie { display: none !important; }

/* Scraped HIMA global header + its open mobile menu (the HIMA logo and the raw
   AITO/Luxeed/…/Schedule Test Drive/Back list). We navigate with our own SiteHeader,
   so this markup is redundant — but its hiding styles lived in the CN common.css that
   404s, so it flashed on every load before other CSS/JS took over. Kill it from first
   paint (render-blocking sheet). Applies to all faithful pages. */
.header-component { display: none !important; }

/* secondary nav (model section-anchor bar) — REPLACES the global header on scroll, faithful
   to hima.auto: at the hero the global SiteHeader shows; once scrolled past the hero the
   section-anchor bar slides into the top slot and the global header fades out. Scroll back to
   the top to restore the global header. Two mechanisms share this:
     • model pages — the scraped `#localnav` (fixed, top:0, z-999, translateY(-100%)) is
       revealed by adding `.localnav-show` to <html>; its own transform transition slides it in.
     • hub pages — the `.nav-secondary-wrapper` bar uses the `.secnav` classes below.
   faithful-en.css loads after the scraped manifest CSS, so equal-specificity rules win here. */
.secnav { position: fixed; top: 0; left: 0; right: 0; z-index: 350; height: auto; min-height: 56px; background: rgba(10, 10, 10, 0.92); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); transition: opacity .3s, transform .3s; }
.secnav.hidden-at-hero { opacity: 0; transform: translateY(-100%); pointer-events: none; }
.secnav.revealed { opacity: 1; transform: translateY(0); pointer-events: auto; }

/* clean swap: fade the global header out while a secondary nav is showing */
.site-hd { transition: background .3s, backdrop-filter .3s, opacity .3s, transform .3s; }
body.secnav-active .site-hd { opacity: 0; transform: translateY(-100%); pointer-events: none; }

/* ════════════════════════════════════════════════════════════════════════════
 * V9 (Luxeed) — EN review corrections (v9.pen, 2026-06-19). Scoped to the page
 * container so nothing leaks to other models. Loaded after the scraped mainv1.css,
 * so equal-specificity rules win on source order.
 * ════════════════════════════════════════════════════════════════════════════ */

/* 1 — Hero subtitle: one weight bolder, tighter tracking for Latin text.
   (The CN rule is 0.35em / 400, way too loose for EN. The big "MPV-exclusive"
   gradient section titles keep their own spacing — untouched.) */
#zhijie-v9-container .section-hero .hero-content .hero-subtitle {
  letter-spacing: 0.04em;
  font-weight: 500;
  margin-top: 0;
}
/* English KV wordmark sizing (overrides the CN logo's fixed 14.58vw width box). */
#zhijie-v9-container .section-hero .hero-content .hero-logo { width: auto; }
#zhijie-v9-container .hero-wordmark { display: block; height: 6.8vw; width: auto; }

/* 2+3 — Big gradient section titles ("Summit Grandeur", "Spacious Cabin"…):
   reduce the 0.1em tracking that reads too wide at txt-80. */
#zhijie-v9-container .section-title .gradient-text {
  letter-spacing: 0.02em;
}

/* 5 — Appearance ("Elegance born of nature…") slider: align the heading + body
   copy to the left edge of the image (drop the 2vw indent) and cap the body width
   so slide-one text no longer bleeds under the right-hand image. */
#zhijie-v9-container .swiper-style-2 .text-content .headline { margin-left: 0; }
#zhijie-v9-container .swiper-style-2 .stacklist {
  padding-left: 0;
  width: 50vw;
}
/* The EN titles are longer than the CN originals, so on desktop they ran past the
   image into the right-hand peek slide. Reveal the authored line-break (br.xs is
   display:none on desktop) so they wrap to two lines as designed. */
#zhijie-v9-container .swiper-style-2 .text-content .headline br.xs { display: block; }

/* 6 — Posture tab labels: long EN strings were clipped at 1.25vw nowrap. */
#zhijie-v9-container .tabnav-item { font-size: 0.9vw; }

/* 7 + 10 — Stat lists rendered default <li> disc bullets (scraped CSS never reset
   list-style). Drop the bullets, keep the figures. */
#zhijie-v9-container .info-list,
#zhijie-v9-container .info-list > li,
#zhijie-v9-container .params-list,
#zhijie-v9-container .params-list > li {
  list-style: none;
}

/* 8 + 9 — Stack sliders (cockpit "Tri-screen / Ultra-HD cinema", oxygen cabin…):
   add breathing room under the title and normalise the body copy to one slightly
   smaller size across these slides. */
#zhijie-v9-container .stack-item .intro,
#zhijie-v9-container .swiper-style .slide-intro {
  margin-top: 1.9vw;
  font-size: 0.9375vw;
}
@media (max-aspect-ratio: 11/10) {
  #zhijie-v9-container .stack-item .intro,
  #zhijie-v9-container .swiper-style .slide-intro {
    font-size: 3.5vw;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
 * S7 (Luxeed) — EN review corrections (s7.pen, 2026-06-21). Scoped to #s7.
 * ════════════════════════════════════════════════════════════════════════════ */

/* 3 + 5 + 6 — Light sections (design, battery, drive, security) rendered dark.
   The scraped page is white-bodied: only .theme-dark sections set their own #161826,
   the rest rely on a white page background (with dark #000 text). Our [model].astro
   forces body{background:#0a0a0a}, so the light sections inherited dark and their black
   text/dividers vanished. Restore the white page bg — .theme-dark sections keep their own. */
#s7 { background: #fff; }

/* 1 — Hero slogan "Stability-Driven Speed" wrapped to 2 lines: scraped CSS pins
   width:19.17vw + height:2.5vw + text-align:justify (tuned for the shorter CN string).
   margin-top pulls it up into the wordmark SVG's baseline whitespace (kills the top gap). */
#s7 .section-hero .slogan { width: auto; height: auto; text-align: center; margin-top: -0.8vw; }
#s7 .section-hero .slogan::after { display: none; }

/* 2 — English KV wordmark sizing (replaces the CN 智界 S7 logo <img> in the body).
   Negative bottom margin trims the SVG's whitespace below the text. */
#s7 .section-hero .hero-wordmark { display: block; width: auto; height: 5vw; margin: 0 auto -0.4vw; }
@media (max-aspect-ratio: 11/10) { #s7 .section-hero .hero-wordmark { height: 14vw; } }

/* 4 — "Sport Package" button: gray pill + black text (drop the CN SVG bg so the
   pill shows a flat gray; the wrapper already clips to a 999px radius). */
#s7 .modal-button-container .modal-button-wrapper { background: #e8e8ea; }
#s7 .modal-button-container .modal-button-wrapper picture { display: none; }
#s7 .modal-button-container .button-copy { color: #000; }
#s7 .modal-button-container .button-icon { filter: brightness(0); }

/* 7 — "Detailed Configurations" button: scraped width:8.75vw clipped the longer EN
   label, and stretching the fixed CN hexagon SVG bg gave uneven internal spacing. Drop the
   SVG and draw the bevel with clip-path (gray fill, black text), sized to content with
   balanced padding so the label is centred with even space on both sides. */
#s7 .section-configuration .button-cta {
  width: auto;
  height: auto;
  padding: 0.85vw 2.6vw;
  overflow: visible;
  background: #e8e8ea;
  clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 50%, calc(100% - 14px) 100%, 14px 100%, 0 50%);
}
#s7 .section-configuration .button-cta picture { display: none; }
#s7 .section-configuration .button-cta p { white-space: nowrap; color: #000; }
@media (max-aspect-ratio: 11/10) {
  #s7 .intro { font-size: 3.5vw; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * R7 (Luxeed) — EN review corrections (2026-06-21). Scoped to #r7.
 * ════════════════════════════════════════════════════════════════════════════ */

/* Hero: English KV wordmark sizing (replaces the CN 智界 R7 logo <img> in the body).
   Original .logo was 18.125vw wide; size the wordmark to a matching height. */
#r7 .section-hero .hero-wordmark { display: block; width: auto; height: 5vw; margin: 0 auto; }
@media (max-aspect-ratio: 11/10) { #r7 .section-hero .hero-wordmark { height: 13vw; } }

/* Stat odometer digits: each <span> is height:1em but the scraped line-height:1.25 made the
   glyph taller than its slot, so the digit above bled into the overflow:hidden window as a
   thin white line on top of every number. line-height:1 fits the glyph to its 1em slot. */
#r7 .subsection-exterior-1 .stat-number span { line-height: 1; }

/* Appearance/design gallery slide copy (Streamlined Silhouette, Dynamic Front Fascia, etc.):
   trimmed 2px off the shared 1.041667vw (20px @ 1920px) .intro size — user feedback. */
#r7 .section-appearance .stack-item .intro { font-size: 0.9375vw; }

/* Same gallery: shrink the footnote/disclaimer note text and add breathing room above the
   slide headline (was flush against the "01 —— 03" pagination indicator) — user feedback. */
#r7 .section-appearance .stack-item .note { font-size: 0.729vw; line-height: 1.3; }
#r7 .section-appearance .stack-item .headline { padding-top: 0.833vw; }

/* Carousel tab labels (interior "Silk Cloud Seats" etc.): shrink the long EN strings so they
   don't clip/overflow — matches the V9 tabnav-item treatment. Selectors mirror the scraped
   rules' specificity (#r7 .tabnav-swiper / .section-design-swiper) so the override wins. */
#r7 .tabnav-swiper .tabnav-item,
#r7 .section-design-swiper .tabnav-item { font-size: 0.9vw; }

/* m8 tab navs desktop: the long EN feature labels (up to 6 per row) run past the centred
   row and get clipped at both ends by overflow:hidden .tabnav-content. Shrink type + trim
   gap/padding so even the longest row fits; scroll is the fallback if a row still can't. */
#m8 .tabnav-item { font-size: 0.8vw; }
#m8 .tabnav-item + .tabnav-item { margin-left: 1vw; }
#m8 .tabnav-wrapper { padding-left: 2vw; padding-right: 2vw; }
#m8 .tabnav-content { overflow-x: auto; overflow-y: hidden; }
#m8 .tabnav-content::-webkit-scrollbar { display: none; }

/* m9 (#f2n) tab-navs are the newer swipeable track design (Swiper + edge-fade mask), unlike
   m8's centred fit — they initialise fine on our build, so over-wide rows are reachable by
   swipe/drag exactly as on hima.auto. No fit fix needed (shrinking/extra margin only hurt it). */

/* m9 color-selection .tabnav-item (Exterior/Interior Colors): upstream xs rule renders 26px —
   oversized vs the .tabnav-label tabs in other sections (4.4444vw = 17.33px at 390px). Match it. */
@media (max-aspect-ratio: 11/10) {
  #f2n .color-selection .tabnav-item { font-size: 4.4444vw; }
}

/* m9 (#f2n) is a fully BLACK-bodied page (every CN section #000); our dark body already
   matches. The hero credit (.kv-note, was the CN wenjie-kv.svg) becomes EN text — white over
   the dark canyon KV, bottom-right like the other pages. */
#f2n { background: #000; }
#f2n .section-hero .kv-note .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(255,255,255,0.85); }
#f2n .section-hero .kv-note .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
#f2n .section-hero .kv-note .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(255,255,255,0.6); }

/* AITO hub hero credit — was the CN disclaimer-white.svg image; now EN text, bottom-right
   over the canyon KV, matching the M9 model page (#f2n) treatment. The scraped .kv-note pins
   height:32px for the single-line image, so free it to auto for the 2-line text block. Scoped
   to .category-kv .kv-note, which only the AITO hub has. */
.x2-category .category-kv .kv-note { height: auto; }
.x2-category .category-kv .kv-note .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(255,255,255,0.85); }
.x2-category .category-kv .kv-note .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
.x2-category .category-kv .kv-note .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(255,255,255,0.6); }
@media (max-aspect-ratio: 11/10) {
  /* phones/tablets — vw shrinks with the narrow viewport, so bump both lines up to stay legible
     and give the container room; keep it pinned bottom-right. */
  .x2-category .category-kv .kv-note { right: 4vw; bottom: 3vw; }
  .x2-category .category-kv .kv-note .hero-note { gap: 0.8vw; }
  .x2-category .category-kv .kv-note .hero-note .hero-note-credit { font-size: 2.6vw; }
  .x2-category .category-kv .kv-note .hero-note .hero-note-disc { font-size: 1.9vw; }
}

/* m9 hero slogan (added, EN of 领世而上) under the wordmark — white, thin and spaced over the
   dark canyon KV, stacked beneath AITO M9. */
#f2n .section-hero .hero-content { flex-direction: column; gap: 0.6vw; }
#f2n .section-hero .hero-slogan { color: #fff; font-size: 1.35vw; font-weight: 300; letter-spacing: 0.2em; white-space: nowrap; }

/* m9 .section-start headlines: the scraped width:max-content (tuned for the short CN slogan
   领世而上) makes the longer EN heading overflow its centred box and sit off-page-centre.
   Constrain the width so text-align:center actually centres it. */
#f2n .section-start .start-headline { width: auto; max-width: 100%; justify-items: center; }

/* m9 .slide-intro: the .highlight-text span is inline so the highlighted sentence runs directly
   into the body copy with no break. Make it block so it sits on its own line above the body text,
   then let the paragraph breathe with a line-height that matches the CN 1.6 body rhythm. */
#f2n .slide-intro { line-height: 1.6; }
#f2n .slide-intro .highlight-text { display: block; margin-bottom: 0.4em; }

/* "Multi-Color Paint / So Enchanting" (and sibling swiper-color sections): the scraped
   .content-flex centres the headline block against the body copy (align-items:center) and
   pushes them apart (space-between), which staggers the longer EN body oddly. Top-align them
   so the body copy starts level with the eyebrow, like the original CN balance. */
#r7 .swiper-color .content-flex { align-items: flex-start; }
/* The big "So Enchanting" headline wraps to two lines in EN (the CN original was one short
   line), exposing a loose line-height:1.25 that left a large gap between the words. Tighten it. */
#r7 .intro-headline { line-height: 1.08; }

/* Swiper-style-1 stack cards (smart section "Voice-Activated Vehicle Control" etc.): the
   fixed CN panel clipped the longer EN headline. Let it wrap within the panel. */
#r7 .swiper-style-1 .stack-item .headline { white-space: normal; word-break: normal; overflow-wrap: break-word; }

/* content-flex copy (drive-1 "Effortless Command", smart-1 "Swiftly to Distant Horizons",
   smart-4 "Commanding Presence"): the two columns are sized with justify-content:space-between
   and zero gap, so a wide EN headline word (e.g. "Commanding") butts directly against the
   body copy with no breathing room. Add a real gap between them. */
#r7 .content-flex.copy { column-gap: 40px; }

@media (max-aspect-ratio: 11/10) {
  #r7 .intro { font-size: 3.5vw; }
}

/* ── Generic: banner-switch-side / swiper-style-1 sliders (interior, appearance, smart —
 *    used on every model page) ──────────────────────────────────────────────────────────
 * Original layout: the gallery image fills the left and a text panel (.content-container) sits
 * BESIDE it in the remaining width. The panel had no width set, so our port let it take its
 * content width (longer in EN) — the image + panel then overflowed the container and
 * .gallery-container{overflow:hidden} clipped the copy. Pin the panel to the leftover flex
 * space (min-width:0 lets the EN copy wrap inside it). NOTE: panel BACKGROUND is per-page (some
 * are dark like R7's #1c1c1c, some light like m7's #f5f6f7) — do NOT force a colour here. */
@media (min-aspect-ratio: 11/10) {
  .swiper-style-1 .gallery-container > .content-container {
    flex: 1 1 0;
    min-width: 0;            /* let the panel hold the leftover width, not grow to text */
    align-self: stretch;
  }
  /* R7's panel is semi-transparent in the scrape; make it the solid dark panel the user wants. */
  #r7 .swiper-style-1 .gallery-container > .content-container { background-color: #1c1c1c !important; }
  /* The inner wrapper/stack must fill the panel (not grow to the text's max-content), so the
     EN copy wraps inside the panel instead of overflowing + being clipped. */
  .swiper-style-1 .gallery-container > .content-container .content-wrapper,
  .swiper-style-1 .gallery-container > .content-container .stack-list,
  .swiper-style-1 .gallery-container > .content-container .stack-item {
    width: 100% !important;
    min-width: 0;
    max-width: 100%;
  }
}

/* ── Generic: section-configuration "Detailed …" CTA + disclaimer (every model page) ───────
 * The CTA used a fixed-width CN SVG hexagon (width ~9.5vw) that the longer EN label overflowed
 * into a full-width white blob, and the disclaimer .note is absolutely pinned bottom-right where
 * it collides with the centred button. Rebuild the CTA as a content-fitting white clip-path
 * bevel; the disclaimer is moved (in the body HTML) to after the button and forced back into
 * normal flow here, centred below it. !important beats the id-scoped #<page> .note{absolute}. */
.section-configuration .button-cta {
  width: fit-content !important; height: auto; padding: 0.9vw 3.2vw !important; /* !important beats scraped #<page>{padding:0} so the label clears the bevel */
  margin: 2.4vw auto 0 !important;
  background: #fff; overflow: visible;
  clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 50%, calc(100% - 14px) 100%, 14px 100%, 0 50%);
}
.section-configuration .button-cta picture { display: none !important; } /* beats id-scoped #<page> picture{display:block} */
.section-configuration .button-cta span,
.section-configuration .button-cta p { position: static !important; white-space: nowrap; color: #000; }
.section-configuration .configuration_note {
  position: static !important; right: auto !important; bottom: auto !important;
  width: auto !important; max-width: 80vw; margin: 1.8vw auto 0 !important;
  justify-content: center; text-align: center;
}

/* ════════════════════════════════════════════════════════════════════════════
 * M5 (AITO) — page is white-bodied in the original: only section.theme-dark sets its
 * own #000; the rest (section-endurance onward) rely on a white page background. Our
 * [model].astro forces body{background:#0a0a0a}, turning those light sections black.
 * Restore the white page bg AND a dark default text colour (the original relies on the
 * white-body default ink, but [model].astro forces body{color:#fff}, which leaves light-
 * section titles like "Outstanding Range" white-on-white). theme-dark sections
 * (.theme-dark{color:#fff}) and the explicitly-white over-image labels both override this,
 * so only the light-section default text flips back to dark. (Mirror of #s7.) */
#m5-new { background: #fff; color: #1d1d1f; }

/* Interior colour picker (m5 etc.): the active swatch expands to a fixed-width pill (~4.9vw)
   tuned for short CN colour names, so longer EN names ("Terracotta Orange") overflow/clip.
   Let the active pill grow to fit its label, keeping the original min-width for short names. */
.interior-color .colornav.active { width: auto !important; min-width: 4.895833vw; padding: 0 1.2vw; }

/* m5 config section (section-configuration over the dark KV): the CTA is a white pill but its
   label inherits the section's white ink (invisible) and width:7.5vw clips "Detailed
   Specifications"; the disclaimer .note runs flush to the viewport edge. */
#m5-new .section-configuration .button { color: #000 !important; width: fit-content !important; padding: 0 1.4vw !important; margin-top: 1.6vw !important; }
/* Tighten the gaps so the longer EN disclaimer still fits inside the dark KV (it was
   overflowing ~48px onto the white section below, where white text vanishes). */
#m5-new .section-configuration .note { padding-right: 2.5vw; margin-top: 1.2vw !important; }

/* The "Detailed Specifications / Detailed Configurations" config-section CTA links to a
   per-variant comparison page. lib-localize.mjs strips its href to inert for every model
   EXCEPT the allowlisted few whose configuration page has been ported (Task 1) — so hiding
   on ":not([href])" tracks that allowlist automatically as more models are added. Covers
   both class variants (.pdp-cta and .button-cta). */
.pdp-cta:not([href]),
.section-configuration .button-cta:not([href]) { display: none !important; }

/* m6 hero: scraped top:5.9375vw = ~61px at 1024px, which sits behind our 64px fixed nav.
   Clamp to a minimum of 4.5rem (72px) so the wordmark always clears the header. */
#m6 .section-hero .hero-content { top: max(5.9375vw, 4.5rem); }

/* m6 hero slogan: the outer span is width:21.9vw + justify-content:space-between, which evenly
   distributes every child word-span across a fixed width (tuned for the compact CN string),
   spreading the EN words apart. Let them flow centred at natural width with a small word gap. */
#m6 .section-hero .hero-content > span { width: auto; justify-content: center; gap: 0.4em; }

/* AITO m6–m9 hero: English KV wordmark sizing (replaces the CN 问界 MX <img> in each body).
   White to match the original logo; height tuned to sit at a similar scale to the CN logo. */
#m6 .section-hero .hero-wordmark,
#m7 .section-hero .hero-wordmark,
#m8 .section-hero .hero-wordmark,
#f2n .section-hero .hero-wordmark { display: block; width: auto; height: 5.5vw; margin: 0 auto; }

/* m5 hero: English KV wordmark "AITO New M5 Ultra" (replaces the CN 问界 新M5 Ultra
   <img class="hero-logo">). Sized by WIDTH to the original logo footprint (27.5vw) since the
   longer name would be oversized if sized by height; keeps the original gap to "Born Exceptional". */
#m5-new .section-hero .hero-wordmark { display: block; width: 27.5vw; height: auto; margin: 0 auto 1.041667vw; }

/* m5 sport section copy: a CN <br> after "...across the body," forces a break that leaves an
   orphaned short "the body," line before "delivering..." in the EN text (the phrase already wraps
   on its own). Hide the br so the paragraph flows naturally. CSS-only — the br is a segment
   boundary for i18n-apply, so deleting it from the snapshot would drop the two halves to CN. */
#m5-new .section-sport .sport-text p br { display: none; }

/* m5 hero note: replaces the CN baked-path SVG (赛力斯汽车 | 华为 联合设计 + image disclaimer)
   with real English text. Position (bottom-right, 20.8vw) comes from the scraped .hero-note;
   supply type + colour here (light, muted — it sits over the dark lower hero). */
#m5-new .section-hero .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(255,255,255,0.72); }
#m5-new .section-hero .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
#m5-new .section-hero .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(255,255,255,0.55); }

/* m6 hero note: replaces the CN credit SVG (赛力斯汽车 | 华为 联合设计). Original was credit-only,
   but matched to m5 with a 2nd disclaimer line for consistency. */
#m6 .section-hero .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(255,255,255,0.85); }
#m6 .section-hero .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
#m6 .section-hero .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(255,255,255,0.6); }

/* m6 subsection-design-1 "Cool, Not Following Trends" headline */
#m6 .subsection-design-1 h2.headline { font-size: 5vw; overflow-wrap: break-word; word-break: break-word; }
#m6 .subsection-design-1 { overflow-wrap: break-word; }

/* m6 mobile overrides */
@media (max-aspect-ratio: 11/10) {
  /* "New Edge Style" / "Choose from…" h3 — CN default is 8.88vw, too large */
  #m6 .section-common h3 { font-size: 5vw; overflow-wrap: break-word; word-break: break-word; }

  /* "Watch Full Video" CTA — CSS hexagon replicates the SVG octagon shape.
     Polygon derived from SVG path: left/right tips at x≈0.6% spanning y 41.8%–58.2%,
     flat top/bottom sections, chamfered corners at ~10%/90%. */
  #m6 .subsection-design-1 .video-container a.modal-player-cta {
    display: block;
    position: relative;
    width: 62vw;
    height: 11vw;
    left: auto;
    transform: none;
    margin: 5.555556vw auto 0;
    background: #1d1d1f;
    clip-path: polygon(
      10% 0%, 90% 0%,
      100% 42%, 100% 58%,
      90% 100%, 10% 100%,
      0% 58%, 0% 42%
    );
    font-size: 3.8vw;
    color: #fff;
  }
  #m6 .subsection-design-1 .video-container a.modal-player-cta .showmob {
    display: none !important;
  }
  #m6 .subsection-design-1 .video-container a.modal-player-cta span.button-copy {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    white-space: nowrap;
    display: flex;
    align-items: center;
  }

  /* Swiper headline h2.w-max-content — "Thousand-Facet Crystal Matrix…" overflows on mobile */
  #m6 h2.headline.w-max-content { width: auto !important; white-space: normal; overflow-wrap: break-word; word-break: break-word; }
}

/* ── m7 hero ──────────────────────────────────────────────────────────────────────
 * The CN hero sits on a LIGHT sky and is entirely BLACK (logo, slogan, KSP, play icon).
 * Keep it dark (the wordmark SVG fill is #1d1d1f; the play icon's scraped stroke is already
 * #000). The KSP <span> was width:32vw + justify-content:space-between, spreading its 5 child
 * spans (text | text | text) into columns with "|" stuck to the next word ("IHuawei") — let it
 * flow on one centred line with gaps instead. */
#m7 .section-hero .hero-content,
#m7 .section-hero .hero-content > a { color: #1d1d1f; }
#m7 .section-hero .hero-content > span { width: auto; justify-content: center; gap: 0.55em; flex-wrap: wrap; }

/* m7 hero note: English credit + image disclaimer (replaces the CN SVG). Dark text — the whole
   m7 hero is dark over the light sky/hay. */
#m7 .section-hero .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(0,0,0,0.62); }
#m7 .section-hero .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
#m7 .section-hero .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(0,0,0,0.5); }

/* m8 hero note: English credit + image disclaimer (replaces CN wenjie-m8-note.svg).
   Light text — the note sits over the scenic KV image. */
#m8 .section-hero .hero-note { display: flex; flex-direction: column; gap: 0.35vw; text-align: right; color: rgba(255,255,255,0.85); }
#m8 .section-hero .hero-note .hero-note-credit { font-size: 0.95vw; letter-spacing: 0.04em; }
#m8 .section-hero .hero-note .hero-note-disc { font-size: 0.6vw; line-height: 1.4; color: rgba(255,255,255,0.6); }

/* M8 is a fully WHITE-bodied page in CN (every section bg #fff); our port inherited the dark
   body, so the whole page read dark. Flip #m8 to white. Body/intro text is grey (#797c80, from
   the scraped #m8 base) and over-image captions are white (scraped) — both already correct.
   The headlines that sit on the white text-blocks need their near-black colour restored (CN
   gets it from the common.css we don't mirror); the headlines that overlay the four full-bleed
   image sections stay white. */
#m8 { background: #fff; }
#m8 .headline,
#m8 .stat-value,
#m8 .swiper-style-3 .stack-item h3.headline { color: #18191a; }
#m8 .section-turing .headline,
#m8 .subsection-space-1 .headline,
#m8 .section-driving .headline,
#m8 .section-harmonyos .headline { color: #fff; }

/* m8 hero slogan (新增 "Family Smart Flagship SUV", under the wordmark) — stack below the
   AITO M8 mark and keep it light over the scenic KV image. */
#m8 .section-hero .hero-content { flex-direction: column; gap: 0.6vw; }
#m8 .section-hero .hero-content .hero-slogan { display: flex; justify-content: center; gap: 0.5em; color: rgba(255,255,255,0.88); font-size: 1.15vw; letter-spacing: 0.18em; font-weight: 500; }

/* M8 light-language slider (Sky Mirror Nebula, Intelligent Welcome Light Language, etc.):
   .content-wrapper.xs:w-520 sets 520px on mobile; .stack-item inherits a separate wide
   rule — both overflow a 390px phone and get clipped. Cap the whole chain. */
@media (max-aspect-ratio: 11/10) {
  #m8 .content-container .content-wrapper,
  #m8 .content-container .stack-list,
  #m8 .content-container .stack-item,
  #m8 .content-container .intro {
    width: auto !important;
    max-width: calc(100vw - 48px) !important;
    min-width: 0 !important;
  }
}

/* m7 colour-options disclaimer (.m7-common-dis1): scraped as position:absolute; bottom:9.32vw;
   right:0 with no width — the longer EN copy ran left over the gallery image, and when wrapped it
   still overlaid the right image. Drop it into normal flow (below the gallery), right-aligned and
   width-capped, so it sits under the image. */
#m7 .m7-common-dis.m7-common-dis1 { position: static; bottom: auto; right: auto; max-width: 38vw; margin: 1.2vw 0 0 auto; text-align: right; }
@media (max-aspect-ratio: 7/10) {
  #m7 .m7-common-dis.m7-common-dis1 { max-width: 90vw; margin: 4vw auto 0; text-align: center; }
}

/* m7 swiper-style-1 slider body copy: the longer EN text fills the light panel edge-to-edge.
   Trim it a touch for breathing room. */
#m7 .swiper-style-1 .stack-item .intro { line-height: 1.6; }

/* m7 .section-guard: the EN safety copy (intro + 4 sub-blocks) runs long;
   tighten line-spacing so the list reads as denser paragraphs. */
#m7 .section-guard .guard-1-showpc { line-height: 1.45; }
#m7 .section-guard .guard-1-txt-sub p { line-height: 1.3; }
#m7 .section-guard .guard-1-txt-sub span { line-height: 1.4; }

/* Stray <li> bullets (the list-style reset lived in the unavailable common.css) — kill
   them at every width, desktop and the mobile collapsed/expanded bar alike. */
#localnav .ln-menu-list { list-style: none; }
#localnav .ln-menu-item { list-style: none; }
#localnav .ln-menu-item::marker { content: none; }

/* #localnav DESKTOP layout for EN: the scraped bar reserves 80–160px side gutters for the
   live site's fixed logo (we have none) and lets .ln-title flex-grow, which on the wider EN
   labels pushes the menu+CTA onto a clipped second line. Drop the grow, trim the gutters,
   tighten the links, keep everything on one centred no-wrap line.
   Gated on html:not(.localnav-collapse): on mobile the page toggles `.localnav-collapse`
   on <html>, and the scraped collapse rules take over (title+chevron+CTA row, section links
   on a 2nd horizontal-scroll row when the chevron is tapped). Without this gate, nowrap +
   the inline menu fight the collapse layout and the expanded links overlap the CTA. */
html:not(.localnav-collapse) #localnav .ln-content { flex-wrap: nowrap; }
html:not(.localnav-collapse) #localnav .ln-title { flex-grow: 0; padding-left: 22px; white-space: nowrap; }
html:not(.localnav-collapse) #localnav .ln-menu { flex: 1 1 auto; min-width: 0; justify-content: center; overflow-x: auto; }
html:not(.localnav-collapse) #localnav .ln-menu::-webkit-scrollbar { display: none; }
html:not(.localnav-collapse) #localnav .ln-menu-list { width: auto; }
html:not(.localnav-collapse) #localnav .ln-link { padding: 0 10px; font-size: 12.5px; }
html:not(.localnav-collapse) #localnav .ln-action { margin-left: 10px; padding-right: 22px; }

/* s800 (#s800) — page is black in CN (our wrapper already renders #000); headlines white over
   dark, tabnav fits, config CTA hidden — only the hero needed an EN wordmark (was zunjie-s800.svg). */
#s800 .section-hero .hero-wordmark { display: block; width: 30vw; height: auto; margin: 0 auto; }
/* s800 intro slogan ("A Masterpiece for the Era"): the flex .slogan-container centres the box,
   but the CN CSS leaves the slogan text-align:start. On one line (desktop) it fills the box so it
   looks centred; on mobile/portrait the longer EN wraps to 2 lines and the left-aligned lines
   read off-centre. Centre the text (and drop the scraped ~5px left margin) so it centres on every
   viewport. */
#s800 .slogan-container .slogan { text-align: center; margin-left: 0; }
/* s800 body copy: the CN template peppers .intro, .stack-item and .slide-copy paragraphs with mobile-only
   <br class="xs"> breaks tuned for short CJK text. On phones the longer EN wraps naturally AND
   takes these forced breaks, splitting phrases mid-line ("170 Processes / Crafted", "ultra-wide
   front / visibility", etc.) into ragged copy. Hide them page-wide so EN prose wraps naturally.
   Scoped to body-copy classes only — heading breaks (.gradient-headline / .slide-title) are left
   intact, and the desktop <br class="lg"> variants are untouched. CSS-only: these brs are
   load-bearing for i18n-apply's tag anchoring, so they can't be deleted from the snapshot. */
#s800 .intro br.xs,
#s800 .stack-item br.xs,
#s800 .slide-copy br.xs { display: none; }

/* s9t (#x4w) — CN page is uniform light grey (#f6f6f8); footnote section dark. All section
   headings are white over full-bleed images (our default white text already matches), so only
   the page bg + the hero wordmark needed fixing. */
#x4w { background: #f6f6f8; }
#x4w .section-hero .hero-title .hero-wordmark { display: block; width: 26vw; height: auto; margin: 0 auto 1vw; }

/* s9 (#x4a) — scraped already sets the wrapper white (#FFF) and headlines near-black, but the
   wrapper has no base text colour so inheriting body text fell back to white (invisible on
   white). Restore a dark base; over-image text keeps its explicit white. Hero wordmark added. */
#x4a { color: #1d1d1f; }
#x4a .section-hero .hero-title .hero-wordmark { display: block; width: 26vw; height: auto; margin: 0 auto 1vw; }

/* h5 (#h5) — CN page is white-bodied (one dark section: section-space); base text grey #8E8E8E
   from scraped. Flip wrapper white; headlines near-black on the white text-blocks (driving,
   safety), white over the image/dark sections (hero, design, highlights, space). Hero wordmark. */
#h5 { background: #fff; }
#h5 .headline { color: #18191a; }
#h5 .section-hero .headline,
#h5 .section-design .headline,
#h5 .section-highlights .headline,
#h5 .section-space .headline { color: #fff; }
#h5 .section-hero .kv-title .hero-wordmark { display: block; width: 26vw; height: auto; margin: 0 auto 1vw; }


/* z7 (#shb) — newer template like m9: wrapper already white with grey base text and black
   sections from scraped; tabnav is the swipeable line-x track (leave alone). Two fixes:
   the .section-start .start-headline uses width:max-content (tuned for short CN slogans) and
   sits off-centre with longer EN text; and the hero needed an EN wordmark. */
#shb .section-start .start-headline { width: auto; max-width: 100%; justify-items: center; opacity: 1 !important; transform: none !important; }
/* z7 hero: left-align the logo + slogan (matches CN top-left layout). */
#shb .section-hero .hero-content { align-items: flex-start; text-align: left; }
#shb .section-hero .hero-wordmark { display: block; width: 19vw; height: auto; margin: 0; }
#shb .section-hero .hero-slogn { text-align: left; margin-left: 0; }
/* z7 nowrap spans: the CN template wraps short CJK clauses in .nowrap to keep them on one
   line. Every one on this page now holds a multi-word EN phrase (e.g. "Sit Back and Enjoy
   Comfort", "steady all the way."), so forcing no-wrap only risks overflow on narrow viewports
   with zero benefit. None wrap a number+unit or indivisible token. Let them wrap naturally. */
#shb .nowrap { white-space: normal; }

/* ══ s9 (#x4a) — manual-QA corrections ══════════════════════════════════════════ */
/* Hero foot disclaimer: EN text (replaces CN xiangjie-s9-key-vision-foot.svg). */
#x4a .section-hero .hero-notes { text-align: center; }
#x4a .section-hero .hero-notes p { font-size: 0.6vw; line-height: 1.5; color: rgba(255,255,255,0.62); max-width: 62vw; margin: 0 auto; }
/* "The Galaxy Unfolds, A Glittering Vista" — long EN heading overran its narrow panel and
   clipped; let it wrap and trim a touch so it fits the div. */
#x4a .h3.h3-40 { white-space: normal !important; width: auto !important; max-width: 100% !important; font-size: 1.55vw; line-height: 1.2; }
/* the 1.55vw above is a desktop fix for a narrow panel; it collapses to ~6px on phones, so
   restore readable heading sizes on tablet/phone (CN used ~4.5vw at these breakpoints). */
@media (max-aspect-ratio: 11/10) { #x4a .h3.h3-40 { font-size: 4.5vw !important; } }
@media (max-aspect-ratio: 7/10)  { #x4a .h3.h3-40 { font-size: 6.8vw !important; } }
/* HUAWEI SOUND body copy: ~2px smaller + tighter line-height per QA. */
#x4a .section-comfortable .text-content p { font-size: 0.86vw; line-height: 1.45; }
/* tabnav rail top padding per QA. */
#x4a .tabnav-content { padding-top: 4.166vw; }

/* ══ s9t (#x4w) — manual-QA corrections ══════════════════════════════════════════ */
/* The wrapper set bg #f6f6f8 but no base text colour, so section headings inherited white
   and vanished on the light page. Restore a dark base (over-image captions keep explicit
   white) — fixes "Obsidian Presence", "Versatile Space", etc. all at once. */
#x4w { color: #1d1d1f; }
/* Hero KSP line: centre it under the wordmark (was left), and let it wrap (the scraped
   white-space:nowrap forced one long line). */
#x4a .section-hero .hero-desc,
#x4w .section-hero .hero-desc { text-align: center; margin-left: auto; margin-right: auto; white-space: normal; }
/* Config variant pills: the .title pill was too narrow for the long EN variant names
   ("Stelato S9T Extended-Range Max") and clipped — hug the text + trim font. */
#x4w .section-configuration .text-content .title { width: -moz-fit-content; width: fit-content; max-width: 100%; margin-left: auto; margin-right: auto; padding: 0.25em 0.9em; }
#x4w .section-configuration .text-content .title p { position: static; transform: none; width: auto; font-size: 0.8vw; white-space: nowrap; }
/* 0.8vw above is desktop-only; on mobile the pill label was ~5px. Bump to a readable size and
   let the long EN labels wrap inside the pill instead of overflowing/colliding between columns. */
@media (max-aspect-ratio: 11/10) {
  #x4w .section-configuration .text-content .title p { font-size: 2.4vw; white-space: normal; text-align: center; }
  /* auto height so the white pill wraps the full 2-line label (CN gives it a fixed height that
     clipped the wrap), plus a gap so it doesn't collide with the range below. */
  #x4w .section-configuration .text-content .title { max-width: 44vw; height: auto !important; margin-bottom: 3vw; padding: 1.2vw 2vw; }
}
@media (max-aspect-ratio: 7/10) { #x4w .section-configuration .text-content .title p { font-size: 3vw; } }
/* Audio stat row (Image #46): the big EN numbers (≈3.3vw) made the row span edge-to-edge and
   feel cramped. Trim the value (2nd <p> in each item) so the row breathes. DESKTOP ONLY — on
   mobile this shrank the value NUMBER below its unit; let the CN mobile sizes apply there. */
@media (min-aspect-ratio: 11/10) {
  #x4w .section-comfortable .desc > div > p:last-child { font-size: 2.6vw; }
}
/* Performance stat row (Image #47): same big-number trim (the value is the <span>). */
#x4w .section-drive .right p span { font-size: 2.6vw !important; }
/* the 2.6vw above is a desktop trim; with no mobile override it shrank the stat NUMBERS to
   ~10px on phones — smaller than their units. Restore the CN mobile number scale. */
@media (max-aspect-ratio: 11/10) {
  #x4w .section-drive .right p span,
  #x4w .section-drive-2 .desc .right p span { font-size: 4vw !important; }
}
@media (max-aspect-ratio: 7/10) {
  #x4w .section-drive .right p span,
  #x4w .section-drive-2 .desc .right p span { font-size: 8.888889vw !important; }
}
/* Performance stat row: right-align the three stat blocks on desktop (CN source sets no
   text-align; mobile overrides to left — guard here so we don't fight those rules). */
@media (min-aspect-ratio: 11/10) {
  #x4w .section-drive-2 .desc .right-1,
  #x4w .section-drive-2 .desc .right-2,
  #x4w .section-drive-2 .desc .right-3 { text-align: right; }
}
/* S9 chassis stat row (Image #1): same right-align fix as S9T above, plus the CN source's
   3.33vw divider margin was tuned for short CN labels — with the longer EN paragraph on the
   left crowding the first stat, tighten the dividers so the three stats cluster together. */
@media (min-aspect-ratio: 11/10) {
  #x4a .section-drive-2 .desc .right-1,
  #x4a .section-drive-2 .desc .right-2,
  #x4a .section-drive-2 .desc .right-3 { text-align: right; }
  #x4a .section-drive-2 .desc .right .line { margin: 0.208333vw 1.666667vw 0; }
}
/* Hero tagline: 1em letter-spacing (tuned for short CN) wrapped the EN tagline to 3 awkward
   lines — ease it so "Life is a journey, follow your heart" reads cleanly. */
#x4w .section-hero .hero-title-desc { letter-spacing: 0.14em; }
/* Audio stat row (Image #49): the full-width row overlapped the left speaker image — pad it
   in evenly so the Subwoofer item clears the image. */
#x4w .section-comfortable-5 .desc { padding-left: 8vw; }
/* S9 audio stat row (Image #2): same overlap as S9T above — the row starts flush left and
   "Subwoofer" sits under the leather-seat image edge. */
#x4a .section-comfortable-5 .desc { padding-left: 8vw; }
#x4a .section-comfortable-5 .desc .line { margin: 0 0.9vw; }
/* "The Galaxy Unfolds" taillight panel: CN's 12.5vw top/bottom padding was tuned for a
   shorter CN paragraph — the longer EN copy leaves the box looking top-heavy with a lot of
   dead space below. Tighten it. */
#x4a .section-appearance-new .content .right { padding: 8.5vw 4.375vw; }
/* Audio section intro copy: CN's 21.875vw width wrapped the longer EN "SUPERIOR sound
   system..." intro paragraph awkwardly — widen slightly. */
#x4a .section-comfortable-5 .copy { width: 22.875vw; }
/* desktop 22.875vw above has no mobile override, leaving the copy ~89px wide on phones;
   widen it for tablet/phone. */
@media (max-aspect-ratio: 11/10) { #x4a .section-comfortable-5 .copy { width: 72.875vw; } }
/* tabnav-swiper-1 content panel: CN's 8.33vw vertical padding was tuned for short CJK tab
   labels — the longer EN labels made the panel too tall. Tighten. */
#x4a .tabnav-swiper-1 .tabnav-content { padding: 3.333333vw 4.166667vw; }
/* section-safety-3 heading: CN's 3.125vw margin-top left too big a gap above the wrapped
   (longer) EN heading text. Tighten. */
#x4a .section-safety-3 .h3 { font-size: 1.354167vw; margin-top: 0.125vw; }
/* the 1.354vw above is desktop-only; on phones it collapsed the heading to ~5px (smaller than
   its own description). Restore the CN mobile heading scale so it reads as a heading. */
@media (max-aspect-ratio: 11/10) { #x4a .section-safety-3 .h3 { font-size: 2.285714vw; margin-top: 3vw; } }
@media (max-aspect-ratio: 7/10)  { #x4a .section-safety-3 .h3 { font-size: 5.555556vw; margin-top: 6vw; } }
/* Safety gallery (Image #50): the content panel (heading + tabnav items) sat right against
   the image edge — add left padding so the text clears it. */
#x4w .section-safety-1 .tabnav-content { padding-left: 2.5vw; }
/* s9t section-comfortable-1 .title: drop the fixed 36.5vw width (let it size to content). */
#x4w .section-comfortable-1 .content .title { width: auto; }
/* section-comfortable-2 gallery labels: CN used white-space:nowrap (short CJK labels fit
   within the 19.375vw slide). EN labels ("Storage Compartment Behind Center Screen") overflow
   and get clipped by overflow:hidden on the slide. Allow wrapping and pin both edges so the
   text box stays within the slide at any width. */
#x4w .section-comfortable-2 .text-content { white-space: normal; }
#x4w .section-comfortable-2 .gallery-slide .text-content { right: 1.666667vw; }
@media (max-aspect-ratio: 7/10) {
  #x4w .section-comfortable-2 .gallery-slide .text-content { right: auto; max-width: 70vw; }
}

/* Stat odometers (Length/Width/… counters): the count-up digit columns leave faint
   adjacent-digit slivers above the number on our static build (no live count-up JS to settle
   them). Show the final data-value statically and hide the rolling columns — clean everywhere. */
.stat-value[data-value]::before { content: attr(data-value); }
.stat-value[data-value] > .stat-number { display: none !important; }
/* Decimal stats (e.g. Drag Coefficient) carry the "." in a separate .stat-value-point span the
   odometer JS would position mid-number. Statically that span floated to the end → "0239.".
   Hide it and fold the decimal into data-value (e.g. "0.239") so ::before renders it correctly. */
.stat-value[data-value] > .stat-value-point { display: none !important; }

/* m6 Intelligent-Driving tab-nav: the 5 long EN labels overflow the centred nowrap row (clipped
   both ends). Shrink type + gaps, left-align, and let the rail scroll so every tab is reachable. */
#m6 .tabnav-item { font-size: 0.85vw; }
#m6 .tabnav-item + .tabnav-item { margin-left: 1.6vw; }
#m6 .tabnav-container { overflow-x: auto; overflow-y: hidden; }
#m6 .tabnav-container::-webkit-scrollbar { display: none; }
#m6 .tabnav-list { justify-content: flex-start; width: -moz-max-content; width: max-content; min-width: 100%; }
/* Audio stat dividers: the 2vw side-margins spread the columns too far — tighten. */
#x4w .section-comfortable-5 .desc .line { margin: 0 0.9vw; }

/* Black HIMA button variants (e.g. Maextro hub "Reserve Now" btn-outline-black). The section-2
   fix only covered the white variants, so the black ones kept the scraped fixed-width SVG mask
   (sized for short CJK) and only snapped to the correct content-fit size on hover. Mirror the
   content-fitting hexagon with a dark stroke/fill. */
.hima-btn.btn-solid-black,
.hima-btn.btn-outline-black {
  width: auto; min-width: 0; height: auto;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 12px 32px; font-size: 13px; line-height: 1; white-space: nowrap; cursor: pointer;
  transition: background-color 0.3s ease, color 0.3s ease, background-image 0.3s ease;
}
.hima-btn.btn-solid-black::before, .hima-btn.btn-solid-black::after,
.hima-btn.btn-outline-black::before, .hima-btn.btn-outline-black::after { display: none !important; }
.hima-btn.btn-solid-black {
  background: #1d1d1f !important; color: #fff !important;
  clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 50%, calc(100% - 14px) 100%, 14px 100%, 0 50%);
}
.hima-btn.btn-solid-black:hover { background: rgba(29,29,31,0.82) !important; }
.hima-btn.btn-outline-black {
  background-color: transparent !important; color: #1d1d1f !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='none' stroke='%231d1d1f' stroke-opacity='0.65' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
  background-size: 100% 100% !important; background-repeat: no-repeat !important;
}
.hima-btn.btn-outline-black:hover {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='%231d1d1f' fill-opacity='0.08' stroke='%231d1d1f' stroke-opacity='0.9' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
}

/* s800 picture-buttons (.picture-button-container.button-normal/.button-wide — "Discover
   Zero-Gravity Seats", "Storage with Elegance", "Detailed Specifications", etc.): the hexagon is
   a fixed-size PNG/width (~10.2vw or ~14vw, sized for short CN), so longer EN labels overflow.
   .button-content is absolutely positioned with a nowrap .button-copy, so the overflow isn't
   clipped by the container — it spills past the visible border, and .button-arrow (laid out
   after the text in the same flex row) ends up rendered outside the button entirely, floating
   next to it instead of inside it. Applies to both the modal-trigger variant (.modal-open-button)
   and plain link-button variant (e.g. the "Detailed Specifications" .pdp-cta), since both share
   the identical fixed-width/absolute-content structure. Hide the PNG layers and recreate the
   gold hexagon outline as a content-fitting SVG stroke (matches the #fcecd5 label tone). */
#s800 .picture-button-container.button-normal,
#s800 .picture-button-container.button-wide {
  width: -moz-fit-content; width: fit-content !important;
  height: auto !important;
  padding: 11px 32px;
  display: inline-flex; align-items: center; justify-content: center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='none' stroke='%23fcecd5' stroke-opacity='0.55' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
  background-size: 100% 100% !important; background-repeat: no-repeat !important;
}
#s800 .picture-button-container.button-normal .button-border,
#s800 .picture-button-container.button-wide .button-border,
#s800 .picture-button-container.button-normal .button-picture,
#s800 .picture-button-container.button-wide .button-picture,
#s800 .picture-button-container.button-normal .button-xs,
#s800 .picture-button-container.button-wide .button-xs { display: none !important; }
#s800 .picture-button-container.button-normal .button-content,
#s800 .picture-button-container.button-wide .button-content { position: static !important; display: inline-flex; align-items: center; gap: 0.5em; }

/* s800 safety-4 carousel captions (LiDAR, Collision Avoidance, Angel Seat, etc.): the CN
   captions were short enough to sit at full slide width; the longer EN translations run the
   full width of the carousel and collide with the absolutely-positioned arrownav buttons on the
   right (arrownav-list is 5.42vw wide, pinned to right:0). Symmetric width+margin:auto still let
   the wrapped line's right edge touch the arrows at some viewport widths (90% wasn't enough
   clearance and wasted matching space on the left, where there's no button to clear). Reserve
   the space with padding-right instead, sized past the arrow footprint — this also nudges the
   centered text slightly left of true-center, away from the controls, rather than centering
   blind to them. */
#s800 .subsection-safety-4 .slide-copy { padding-right: 8vw; box-sizing: border-box; }

/* s800 CLTC range row: 6 EN trim names are far longer than the CN originals and, kept on one
   nowrap line each (scraped `.stat-list{white-space:nowrap}`), the row overflows the viewport
   and clips at both edges. Fix (desktop only): let captions WRAP with a capped width, reserve a
   fixed caption height so the big km values stay on one baseline, and tighten the dividers so
   all six columns fit one centred row. Only .list-style-1 in the config section (the CLTC row). */
#s800 .section-configuration .stat-caption { font-size: 0.8vw; }
@media (min-aspect-ratio: 11/10) {
  #s800 .section-configuration .stat-list.list-style-1 { align-items: flex-start; }
  #s800 .section-configuration .stat-list.list-style-1 .stat-caption {
    white-space: normal;
    max-width: 9.5vw;
    min-height: 2.6vw;
    line-height: 1.3;
  }
  #s800 .section-configuration .stat-list.list-style-1 .stat-line {
    margin-left: 1vw;
    margin-right: 1vw;
  }
}

/* s800 modal detail cards (slide-style-1 — "Cosmos Orbit Sound Mesh", "Star Ring Scattering
   Body", etc.): text column is whatever remains after the fixed-width video pane; longer EN
   copy can run flush against the modal edge. Pull in 10% for breathing room.
   s800-grand-design (#x6sh) shares the identical layout proportions — same fix. */
#s800 .modal-swiper .slide-style-1 .slide-content .slide-intro,
#x6sh .modal-swiper .slide-style-1 .slide-content .slide-intro { width: 90%; }

/* s800-grand-design (#x6sh) intro poem (.section-introduction .text-item): the CN sizes this at
   3.33vw in a 50vw column — tuned for three short CJK lines. The longer EN sentences render at
   ~55px in an 830px column on desktop, wrapping into a huge, narrow ~10-line block. Shrink the
   font (clamped so pad stays legible) and widen the column so it reads as an elegant centered
   intro. Desktop/pad only — mobile keeps its own 6.7vw / full-width sizing. */
@media (min-width: 768px) {
  #x6sh .section-introduction .h3 { width: 64vw !important; max-width: 64vw !important; }
  #x6sh .section-introduction .text-item {
    font-size: clamp(22px, 1.9vw, 36px) !important;
    line-height: 1.5 !important;
  }
  /* s800-grand-design colour-name captions run vertically (CN vertical-lr) on desktop. Add a
     little letter-spacing so the vertical Latin glyphs breathe instead of stacking tightly.
     Desktop only — mobile lays these out horizontally (with a comma separator), untouched. */
  #x6sh .section-color .color-desc-list span { letter-spacing: 0.1em; }
}

/* s800-grand-design appearance slider (#x6sh .section-appearance): the caption sits absolute
   between the media (bottom ~417) and the section's overflow:hidden clip (~507) — a ~90px zone.
   The 4-line EN caption (~100px) doesn't fit: bottom-anchored, its top line tucks under the image;
   nudging it down instead clips the bottom. Fix by making the caption *shorter* — widen the
   column so it wraps to 3 lines and drop the font a touch, so it fits the zone with clearance top
   and bottom. Scoped to landscape aspect; portrait/mobile stacks the caption below the image
   normally and is untouched. */
@media (min-aspect-ratio: 11/10) {
  #x6sh .section-appearance .stack-list { width: 63vw; max-width: 63vw; }
  #x6sh .section-appearance .stack-item { font-size: 14px; line-height: 1.45; }
}

/* s800-grand-design tuling tabnav (#x6sh .section-tuling): 7 long EN tab labels in a nowrap flex
   row overflow the viewport (2215px wide) and get cut at both edges. Let each label wrap to two
   lines within a max-width and shrink the font a touch so all seven fit the row. Landscape-scoped;
   mobile has its own tabnav sizing. */
@media (min-aspect-ratio: 11/10) {
  #x6sh .section-tuling .tabnav-list { max-width: 98vw; column-gap: 1vw; align-items: flex-start; }
  #x6sh .section-tuling .tabnav-item {
    white-space: normal !important;
    max-width: 13vw;
    font-size: 0.9vw !important;
    line-height: 1.3;
    text-align: center;
  }
}

/* s800-grand-design (#x6sh) mobile fixes. */
@media (max-width: 767.9px) {
  /* Header title "Maextro S800 Grand Design Signature Collection" is nowrap and overlaps the
     Book Test Drive button. Cap its width and ellipsis-truncate so it clears the CTA. */
  #x6sh #localnav .ln-link { max-width: 54vw; overflow: hidden; text-overflow: ellipsis; }
  /* Colour-name captions: the CN lays the two phrases + comma out as a rigid flex row, which on
     mobile splits the longer EN into two cramped edge-to-edge columns. Flow them as one centred,
     padded, comma-separated block. */
  #x6sh .section-color .color-desc-item { display: block !important; text-align: center; padding: 0 16px; }
  #x6sh .section-color .color-desc-item span { display: inline !important; }
  /* Section banner headings: .h2 base is width:max-content (one-line, sized for short CJK), so the
     longer EN titles ("With Gold as the Vein...", "Meticulously Carved Within...", etc.) overflow
     the viewport and get clipped by the section's overflow:hidden. Let every h2 wrap; centre and
     pad the animated banner titles so they sit tidily. */
  #x6sh .h2 { width: auto !important; max-width: 100%; white-space: normal; }
  #x6sh .h2.text-move { text-align: center; padding: 0 16px; box-sizing: border-box; }
}

/* z7 picture-buttons (.modal-button — "Diamond Crystal Cluster Taillights", "Urban Stream
   Headlights", etc.): fixed-size SVG hexagon bg (~142px) clips the longer EN labels (~169px).
   Hide the fixed hexagon and recreate a content-fitting outline (light stroke over the dark KV). */
#shb .modal-button {
  width: -moz-fit-content; width: fit-content !important;
  height: auto !important;
  padding: 10px 30px;
  display: inline-flex; align-items: center; justify-content: center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='none' stroke='%23ffffff' stroke-opacity='0.55' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") !important;
  background-size: 100% 100% !important; background-repeat: no-repeat !important;
}
#shb .modal-button .button-background { display: none !important; }
#shb .modal-button .button-content { position: static !important; display: inline-flex; align-items: center; gap: 0.5em; }

/* M7 headings: upstream CJK size (8.888889vw) renders too large for EN strings on phone. */
@media (max-aspect-ratio: 7/10) {
  #m7 .section-common h3 { font-size: 7vw; }
  #m7 h2.headline { font-size: 7.5vw; }
}

/* M7 + M8 dimension stats: static digit-column positions set in HTML (transforms on each
   .stat-number); overflow unlocked so scraped height:1em clip doesn't hide the digits.
   Fade-in stagger fires when IntersectionObserver adds .animated to .stat-list. */
#m7 .subsection-design-2 .stat-number,
#m8 .subsection-design-2 .stat-number { width: 1ch; }
#m7 .subsection-design-2 .stat-value .stat-value-point,
#m8 .subsection-design-2 .stat-value .stat-value-point { flex-shrink: 0; }
#m7 .subsection-design-2 .stat-value,
#m8 .subsection-design-2 .stat-value { height: auto !important; overflow: visible !important; }
#m7 .subsection-design-2 .stat-item,
#m8 .subsection-design-2 .stat-item { opacity: 0; transform: translateY(16px); transition: opacity 0.6s ease, transform 0.6s ease; }
#m7 .subsection-design-2 .stat-list.animated .stat-item,
#m8 .subsection-design-2 .stat-list.animated .stat-item { opacity: 1; transform: none; }
#m7 .subsection-design-2 .stat-list.animated .stat-item-2,
#m8 .subsection-design-2 .stat-list.animated .stat-item-2 { transition-delay: 0.1s; }
#m7 .subsection-design-2 .stat-list.animated .stat-item-3,
#m8 .subsection-design-2 .stat-list.animated .stat-item-3 { transition-delay: 0.2s; }
#m7 .subsection-design-2 .stat-list.animated .stat-item-4,
#m8 .subsection-design-2 .stat-list.animated .stat-item-4 { transition-delay: 0.3s; }
#m7 .subsection-design-2 .stat-list.animated .stat-item-5,
#m8 .subsection-design-2 .stat-list.animated .stat-item-5 { transition-delay: 0.4s; }

/* M5 colour-showcase sticky section: GSAP drives the clip-path wipe (design-1 clips upward
   to reveal design-2). Let it run on mobile too — don't cancel sticky or clip-path.
   Upstream hardcodes 1026px widths; force full-viewport layout on mobile.
   Hide desktop-only bg spacers (.is-pc) everywhere. */
#m5-new .is-pc { display: none !important; }
@media (max-aspect-ratio: 7/10) {
  #m5-new .sticky-content,
  #m5-new .sticky-content .wrapper,
  #m5-new .design-wrapper { width: 100% !important; }
  /* Anchor height to viewport so both designs fill the screen */
  #m5-new .sticky-content { height: 100svh !important; }
  /* wrapper must also carry the height so design-wrapper/design-1 can inherit 100% */
  #m5-new .sticky-content .wrapper { height: 100% !important; }
  #m5-new .design-wrapper { height: 100% !important; }
  /* design-1 fills container (z-index: 2 keeps it above design-2) */
  #m5-new .design-1 { position: relative !important; width: 100% !important; height: 100% !important; z-index: 2; }
  /* design-2 sits behind design-1, revealed as GSAP clips design-1 upward */
  #m5-new .design-2 { position: absolute !important; inset: 0 !important; z-index: 1; }
  /* Images fill their container */
  #m5-new .design-picture { position: absolute !important; inset: 0 !important; display: block !important; }
  #m5-new .design-picture img { width: 100% !important; height: 100% !important; object-fit: cover !important; }
  /* Describe text overlays the image at the bottom with proper side padding */
  #m5-new .design-describe { position: absolute !important; bottom: 80px !important; left: 0 !important; right: 0 !important; padding: 0 24px !important; z-index: 3; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * product-feature-banner (.tabnav-swiper) — GENERIC mobile fix (all 13 models)
 *
 * Desktop: each model's own vw-based font sizes keep the row centred and fitted.
 * Mobile (portrait): those vw values collapse to ~3px; the centred flex overflows
 * symmetrically so both ends are unreachable even with overflow:auto. Fix chain:
 *   1. Readable font size + left-aligned row (starts from left, scrolls right).
 *   2. Make .tabnav-container the scroll surface (the scraped .tabnav-wrapper uses
 *      a negative-margin/transform trick that escapes the parent's overflow context,
 *      so scrollWidth on the parent stays equal to its offsetWidth = unscrollable).
 *   3. Strip transforms/margins from .tabnav-wrapper so it lays out normally inside
 *      the now-scrollable container.
 * ════════════════════════════════════════════════════════════════════════════ */
@media (max-aspect-ratio: 11/10) {
  .product-feature-banner .tabnav-item { font-size: 14px !important; }
  .product-feature-banner .tabnav-item + .tabnav-item { margin-left: 20px !important; }
  .product-feature-banner .tabnav-content { overflow: visible !important; }
  .product-feature-banner .tabnav-container {
    overflow-x: auto !important;
    overflow-y: hidden !important;
    width: 100% !important;
  }
  .product-feature-banner .tabnav-container::-webkit-scrollbar { display: none; }
  .product-feature-banner .tabnav-wrapper {
    width: max-content !important;
    margin: 0 !important;
    padding: 0 !important;
    transform: none !important;
    overflow: visible !important;
  }
  .product-feature-banner .tabnav-list {
    justify-content: flex-start !important;
    padding-left: 16px !important;
    padding-right: 16px !important;
    width: max-content !important;
  }
  /* Hide the left-edge gradient fade (::before on tabnav-content). On desktop it
     signals "scroll left is available"; on mobile we always start at the beginning
     so the gradient bleaches the first character of the first tab. */
  .product-feature-banner .tabnav-content::before { display: none !important; }
}

/* M9 tabnavs with long EN labels — allow 2-line wrap. */
#f2n .subsection-space-04 .tabnav-item,
#f2n .subsection-safety-06 .tabnav-item { max-width: 220px; text-align: center; }
#f2n .subsection-space-04 .tabnav-label,
#f2n .subsection-safety-06 .tabnav-label { white-space: normal !important; line-height: 1.3; }
@media (max-aspect-ratio: 11/10) {
  #f2n .subsection-safety-06 .tabnav-item { max-width: 260px; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * section-title .txt-80 — mobile font scale (V9 + any future page)
 *
 * txt-80 computes to ~43px at mobile breakpoints in the scraped CSS. That fits
 * CJK titles ("巅峰气度") but EN equivalents ("Summit Grandeur") are ~16px wider
 * than the 390px viewport. Clamp to 9.5vw so long EN titles shrink proportionally.
 * ════════════════════════════════════════════════════════════════════════════ */
@media (max-aspect-ratio: 11/10) {
  .section-title .txt-80 { font-size: clamp(28px, 9.5vw, 43px) !important; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * xs-gallery .text-content — left/right padding (V9, S9T)
 *
 * The xs-gallery (mobile-only image gallery) has no horizontal padding: text
 * content starts at x≈1px, flush against the screen edge. Add 24px each side
 * and let headlines reflow naturally (strip w-max-content on mobile).
 * ════════════════════════════════════════════════════════════════════════════ */
@media (max-aspect-ratio: 11/10) {
  .xs-gallery .text-content {
    padding-left: 24px !important;
    padding-right: 24px !important;
  }
  .xs-gallery .text-content .headline {
    width: auto !important;
    max-width: 100% !important;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
 * Global: CN JS-animated visibility — make text visible without CN main.js
 *
 * CN model pages use IntersectionObserver (main.js) to add .animated when
 * elements scroll into view, transitioning them from opacity:0/translateY(40px)
 * to opacity:1/translate(0). Our scraped main.js either 404s or throws on our
 * domain, so every .fadeup element and every .start-headline stays permanently
 * invisible. Override the initial hidden state so content reads from first paint.
 * faithful-en.css loads AFTER the scraped manifest CSS, so equal-specificity
 * rules here win by source order — !important only where CN inline styles fight.
 * ════════════════════════════════════════════════════════════════════════════ */
.fadeup,
.lg-fadeup,
.fadeup-02,
.fadeup-03,
.xs-fadeup,
.xs-fadeup-02 {
  opacity: 1 !important;
  transform: none !important;
}
.section-start .start-headline {
  opacity: 1 !important;
  transform: none !important;
}

/* M5 stack sections: CN CSS has .stack-item-active { opacity:1 } at line 736 but
   .stack-item { opacity:0 } at line 874 — equal specificity (0,1,1,0), later rule wins,
   so inactive opacity always defeats active opacity. CN JS uses [data-active='N'] selectors
   (higher specificity) to work around this; we use a double-class selector instead. */
#m5-new .stack-item.stack-item-active {
  opacity: 1 !important;
  z-index: 1;
}

/* Z7 design-02: "More Colors" button has no .button-content wrapper — .button-copy is
   position:absolute from CN CSS. The global .modal-button rule (inline-flex) needs an
   in-flow child to size correctly; reset .button-copy to static flow. */
/* M7 swiper-style-1 intros (subsection design-3/space-3/space-6/safety-1). The prior override
   was 2.5vw !important with no breakpoint — ~36px on desktop (huge, one word per line at zoom).
   Split into readable desktop vs mobile sizes; keep wrapping. Covers all four swiper-style-1 blocks. */
#m7 .swiper-style-1 .stack-item .intro { white-space: normal !important; }
@media (min-aspect-ratio: 11/10) {
  #m7 .swiper-style-1 .stack-item .intro { font-size: 0.95vw !important; }
}
@media (max-aspect-ratio: 11/10) {
  #m7 .swiper-style-1 .stack-item .intro { font-size: 3.5vw !important; }
}

/* M8 swiper-style-2 mobile: content-wrapper uses space-between but arrownav touches the
   pagination number with no gap. Add a minimum gap so buttons don't crowd the counter. */
@media (max-aspect-ratio: 11/10) {
  #m8 .swiper-style-2 .content-wrapper {
    gap: 12px !important;
  }
}

/* M8 harmonyos-4 interior selector: CN vw font-size renders at ~3px — override to readable. */
#m8 .subsection-harmonyos-4 .tabnav-item {
  font-size: 14px !important;
  white-space: normal !important;
}

/* M8: several sections have light backgrounds but CN theme sets white text — override to dark. */
#m8 .subsection-driving-2 h2.headline,
#m8 .subsection-driving-2 h3.title,
#m8 .subsection-driving-3 h2.headline,
#m8 .subsection-driving-3 h3.title,
#m8 .subsection-turing-2 h2.headline,
#m8 .subsection-turing-3 h2.headline,
#m8 .subsection-harmonyos-2 h2.headline,
#m8 .subsection-harmonyos-3 h2.headline,
#m8 .subsection-harmonyos-4 h2.headline {
  color: #1d1d1f !important;
}

#shb .subsection-design-02 .modal-button .button-copy {
  position: static !important;
  top: auto;
  left: auto;
  transform: none;
  white-space: nowrap;
}

/* Stelato S9T (#x4w) "Detailed Specifications" pill in the configuration section: same fixed-
   width/absolutely-centered-content bug as s800's picture-buttons — .button-normal is a fixed
   10.2vw (sized for short CN), .button-content is centered via position:absolute + transform
   with nowrap text, so the longer EN label overflows past the pill on both sides. Recreate the
   filled white chevron-hexagon (modal-open-button-bg.svg: fill #fff, opacity 0.845) as a
   content-fitting SVG background instead of the fixed-size image. */
#x4w .section-configuration .button-container .button-normal {
  width: -moz-fit-content; width: fit-content !important;
  height: auto !important;
  padding: 11px 32px;
  display: inline-flex; align-items: center; justify-content: center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 44' preserveAspectRatio='none'%3E%3Cpolygon points='14,1 186,1 199,22 186,43 14,43 1,22' fill='%23ffffff' fill-opacity='0.845'/%3E%3C/svg%3E") !important;
  background-size: 100% 100% !important; background-repeat: no-repeat !important;
}
#x4w .section-configuration .button-container .button-bg { display: none !important; }
#x4w .section-configuration .button-container .button-content {
  position: static !important; top: auto; left: auto; transform: none;
  display: inline-flex; align-items: center; gap: 0.5em;
}

/* Shangjie H5 hero (kv-title .headline): CN letter-spacing (2vw desktop, up to 5vw at some
   mobile breakpoints) was tuned for a ~4-character CN headline; the longer EN translation
   ("All in One") fans that per-character spacing out across nearly the whole word and
   overflows on narrow viewports. The hero .intro line (Huawei Qiankun Intelligent
   Driving/HarmonyOS Cockpit/range spec) is explicitly white-space:nowrap at every
   breakpoint too, so on mobile it runs off-screen instead of wrapping. */
#h5 .section-hero .section-sticky .sticky-bg .kv-title .headline {
  letter-spacing: normal !important;
}
#h5 .section-hero .section-sticky .sticky-bg .intro {
  white-space: normal !important;
}

/* Shangjie H5 "Shangjie H5 / Your Everyday Companion / Embrace Comfort in Every Journey"
   page-content block: .page-title centers correctly, but .page-slogan relies on
   width:fit-content + margin:auto to center itself, and that shrink-to-fit calculation
   doesn't resolve correctly with the CN CSS's white-space:nowrap now that the EN text is
   longer and has a literal <br> mid-string — it renders full-width and flush left instead.
   Center via text-align directly, which doesn't depend on the box's own width. */
#h5 .section-hero .section-sticky .page-slogan {
  width: 100% !important;
  text-align: center !important;
}

/* Shangjie H5 "Urban Aesthetics / Style Supreme" exit wipe (.title-content h2.title1/.title2):
   the site's own bundled animation slides each word off-screen by a fixed 0.6x-viewport-width
   transform, tuned for CN's short glyphs. EN's longer strings ("Urban Aesthetics", "Style
   Supreme") don't fully clear that distance, leaving a permanent sliver of the tail end visible
   over every later panel in this scroll-jacked section for the rest of the scroll. Clip at the
   title's own box instead of fighting the third-party transform value. */
#h5 .subsection-design-1 .title-content {
  overflow: hidden;
}

/* Shangjie H5 .move-container-title ("Measured Simplicity...") and .clip-bottom-container
   (Vehicle Length/Width/Height/Wheelbase stats): both center themselves via left:50% +
   transform:translateX(-50%). The site's generic scroll-reveal utility (.pad-fadeup.animated /
   .xs-fadeup.animated) applies `transform: translate(0,0) !important` once revealed, which wins
   the cascade and wipes out that centering transform entirely — the box's left edge ends up
   sitting AT the 50% mark instead of being centered around it, pushing everything (including the
   Wheelbase value) off the right edge of the viewport. This bug exists in the original CN CSS
   too; it's invisible there because CN's compact text never reaches the clipped edge. Restore the
   centering transform with a more specific selector so it wins over the generic !important rule. */
#h5 .subsection-design-1 .move-container-title.animated,
#h5 .subsection-design-1 .clip-bottom-container.animated {
  transform: translateX(-50%) !important;
}

/* Shangjie H5 design-5 (.text-content: "Illuminating the road ahead..." headline + L-shaped
   headlights intro): same bug as design-1 above. This block is a flex row centered over the
   headlight image via position:absolute; left:50% + transform:translateX(-50%). The generic
   .pad-fadeup.animated reveal utility overwrites that with `transform: translate(0,0) !important`
   once scrolled into view, so the box's left edge lands AT the 50% mark and the whole block
   (headline + intro) spills to the right of centre. Re-assert the centering transform with a
   more specific selector so it wins the cascade. */
#h5 .subsection-design-5 .text-content.animated {
  transform: translateX(-50%) !important;
}

/* The CN box is 34.9vw wide with the headline + a 16.67vw intro laid out space-between. That
   width was tuned for CN's short 8-glyph headline; the longer EN headline (~28vw) eats the row
   and shrinks the intro to a ~7vw sliver that wraps one word per line. Widen the box so the
   intro can hold its intended 16.67vw, cap the headline so it keeps wrapping instead of
   consuming all the extra room, and keep a guaranteed gap between the two columns. */
#h5 .subsection-design-5 .text-content {
  width: 54vw;
  column-gap: 3vw;
}
#h5 .subsection-design-5 .text-content .headline {
  max-width: 32vw;
}
#h5 .subsection-design-5 .text-content p {
  flex: 0 0 auto;
}

/* Shangjie H5 driving-6 stats row (.mid-content: 655km / 1360km / 13.4kWh / 4.44L): same
   .pad-fadeup.animated transform-wipe bug as design-1/design-5. The row is position:absolute;
   left:50% + translateX(-50%), so once the transform is clobbered its left edge sits AT 50% and
   the 59.375vw row overflows the right edge, cutting off "4.44 L". And because the four longer EN
   labels fill that CN-tuned width edge-to-edge, space-between leaves no gap and the values collide
   ("1360 km13.4 kWh"). Re-assert the centering transform, widen the row so space-between yields
   real gaps, and cap each item so the long "...per 100 km" label keeps wrapping instead of
   blowing out to a single wide line. */
#h5 .subsection-driving-6 .mid-content.animated {
  transform: translateX(-50%) !important;
}
#h5 .subsection-driving-6 .mid-content {
  width: 72vw;
  column-gap: 2vw;
}
#h5 .subsection-driving-6 .mid-content .page-item {
  max-width: 16vw;
}

/* Stelato S9 (#x4a) configuration trim pills: the CN CSS sizes each white .title pill to a
   fixed width (tuned for the short Chinese trim names) and absolutely-centres the <p> at
   max-content — so the longer English names ("Stelato S9 Extended-Range Max") spill out of
   both ends of the pill on BOTH desktop and mobile. Let the pill grow to fit its text.
   padding scales per breakpoint (vw units differ hugely between layouts). */
#x4a .section-configuration .text-content .title {
  width: auto;
  height: auto;
  padding: 0.35vw 0.9vw;
  display: inline-block;
}
#x4a .section-configuration .text-content .title p {
  position: static;
  transform: none;
  width: auto;
  white-space: nowrap;
  text-align: center;
}
/* On tablet/phone the CN layout lays each .item out as a row (short pill | range) sized for
   the compact Chinese labels. The longer English pill eats the row and clips the range, so
   stack the pill above the range and let each item take the full column width. Applies to
   both the 11/10 (tablet) and 7/10 (phone) breakpoints. */
@media (max-aspect-ratio: 11/10) {
  #x4a .section-configuration .text-content > div.item {
    flex-direction: column;
    align-items: flex-start;
    width: 100%;
  }
  #x4a .section-configuration .text-content .title {
    padding: 1vw 2.5vw;
    margin: 0 0 1.2vw 0;
  }
  #x4a .section-configuration .text-content .desc { margin-left: 0; }
}
@media (max-aspect-ratio: 7/10) {
  #x4a .section-configuration .text-content .title { padding: 1.6vw 4vw; margin: 0 0 2vw 0; }
}

/* Stelato S9 (#x4a) "Detailed Configuration" CTA: same fixed-width CN SVG hexagon problem —
   .button-normal is a fixed 10.208vw and the <picture> hexagon fills it, but the longer EN
   label ("Detailed Configuration") is absolutely centred and overflows both bevel edges with
   the arrow spilling out the right. Reuse the proven pattern: hide the SVG, rebuild as a
   content-fitting white clip-path bevel, and put the label+arrow back into normal flow so the
   button sizes to its text. */
#x4a .section-configuration .button-container .button-normal {
  width: fit-content;
  padding: 0.7vw 2.6vw;
  background: #fff;
  clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 50%, calc(100% - 14px) 100%, 14px 100%, 0 50%);
}
#x4a .section-configuration .button-container .button-bg { display: none; }
#x4a .section-configuration .button-container .button-content {
  position: static;
  transform: none;
  justify-content: center;
  align-items: center;
}
@media (max-aspect-ratio: 11/10) {
  #x4a .section-configuration .button-container .button-normal { padding: 1.6vw 5vw; }
}

/* Stelato S9 (#x4a) comfortable-6 tabnav description: the CN copy fit the 41.67vw block, but
   the longer EN descriptions ("HarmonyOS ALPS Health Cockpit…") wrap to awkward short lines.
   Widen to 55vw on desktop. Mobile widths (66.9vw / 72.2vw) left as the CN CSS sets them. */
@media (min-aspect-ratio: 11/10) {
  #x4a .section-comfortable-6 .stack-list { width: 55vw; }
}

/* Stelato S9 (#x4a) section-header titles: .section-headline is width:max-content with no
   cap, so the longer EN subtitles ("Intelligent Response to Every Change, Effortless
   Control", "Omnidirectional Safety, Intelligent Escort", "Huawei Qiankun … ADS 4") stay on
   one line and overflow the viewport, getting clipped on both sides. Cap the width so they
   wrap and stay centred. */
#x4a .section-header .section-headline { max-width: 92vw; text-align: center; }

/* Stelato S9T (#x4w): same overflowing section-header titles as S9 (#x4a) — cap the
   max-content headline so long EN subtitles wrap and stay centred instead of clipping. */
#x4w .section-header .section-headline { max-width: 92vw; text-align: center; }

/* Stelato S9 (#x4a) hero disclaimer: the CN caption was a flattened SVG (key-vision-foot.svg);
   replaced with small English text. .hero-notes already positions it (bottom-right, opacity .5)
   and sets width per breakpoint, so only typography is needed. */
#x4a .section-hero .hero-content .hero-notes .hero-notes-en { color: #fff; font-size: 0.72vw; line-height: 1.4; text-align: right; margin: 0; }
@media (max-aspect-ratio: 11/10) { #x4a .section-hero .hero-content .hero-notes .hero-notes-en { font-size: 1.5vw; } }
@media (max-aspect-ratio: 7/10)  { #x4a .section-hero .hero-content .hero-notes .hero-notes-en { font-size: 2.6vw; } }

/* S9 (#x4a) comfortable-5 audio stats (.desc): on phones the padding-left:8vw pushes the 2x2
   grid off-centre and the long EN labels ("Independent Amplifier"/"Surround Sound Field")
   collide. Centre it, let items wrap, and reduce the left padding (per QA recommendation). */
@media (max-aspect-ratio: 7/10) {
  #x4a .section-comfortable-5 .desc {
    justify-content: space-between;
    transform: translateY(0);
    margin: 0 auto;
    flex-wrap: wrap;
    width: 78.222vw;
    padding-left: 3vw;
  }
  #x4a .section-comfortable-5 .desc > div:not(.line) { width: 47%; }
  #x4a .section-comfortable-5 .desc p { font-size: 3vw; }
}

/* S9 (#x4a) section-drive-4 range stats: the two long EN captions ("CLTC Pure Electric
   Range"/"CLTC Combined Range") collide across the 2 columns on phones — shrink to 3vw. */
@media (max-aspect-ratio: 7/10) {
  #x4a .section-drive-4 .stat-caption { font-size: 3vw; }
}

/* S9 (#x4a) config section on phones: (1) the h2 "Stelato S9 Configurations" is width:max-content
   so it clips — let it wrap; (2) the tall stacked EN trim pills (absolute) cover the cars — drop
   .text-content into normal flow (it's already the sibling after the image) so it sits BELOW the
   cars, and shrink the button's reserved padding accordingly. */
@media (max-aspect-ratio: 7/10) {
  #x4a .section-configuration .h2.text-move { top: 2.722222vw; width: auto; max-width: 90vw; left: 50%; transform: translateX(-50%); white-space: normal; text-align: center; }
  /* flow below the image on a dark panel (the trim pills/values are white, designed for the
     dark car image behind them; the section's own bg is white). */
  #x4a .section-configuration .text-content { position: static; transform: none; bottom: auto; left: auto; width: 100%; margin: 0; background: #151515; padding: 9vw 8vw 2vw; box-sizing: border-box; }
  /* crop the KV so it ends in the dark reflection under the cars (not the light floor), so it
     meets the dark trim panel cleanly — no visible gradient band. */
  #x4a .section-configuration .content { position: relative; overflow: hidden; }
  /* the KV has a large light reflective floor; a mostly-solid gradient turns the bottom of
     the image fully #151515 (fade sits over the cars' darker lower area, so no light band). */
  #x4a .section-configuration .box-shadow { display: block; position: absolute; left: 0; right: 0; bottom: 0; top: auto; height: 63%; background: linear-gradient(to bottom, rgba(21,21,21,0) 0%, #151515 55%); z-index: 1; }
  #x4a .section-configuration .button-container { padding-top: 6vw; }
  #x4a .section-configuration, #x4a .section-configuration .configuration-content { background: #151515; }
}

/* S9T (#x4w) appearance-1 "A Galaxy of Stars": the taillight photo's light top sits behind the
   white heading (illegible), and the .appearance-1-shadow's viewport-relative -52vw offset
   covers it inconsistently across devices. Fix applies to the whole 11/10 mobile+tablet range
   (NOT just narrow 7/10 phones — a ~0.8 aspect view failed before): give the section a dark
   base so any uncovered area is dark on any device, plus a scrim behind the copy. */
@media (max-aspect-ratio: 11/10) {
  #x4w .section-appearance-1 { background-color: #06182f; }
  /* CN reserves a big top margin here (28vw / 48vw) that just leaves dead space above the
     copy on mobile — trim it. */
  #x4w .section-appearance-1 .video-content { margin-top: 13vw; }
  #x4w .section-appearance-1 .video-content .copy {
    width: 90vw; margin-left: auto; margin-right: auto; box-sizing: border-box;
    padding: 5vw 6vw 8vw;
  }
  #x4w .section-appearance-1 .copy .h3-40 { font-size: 4vw; }
  #x4w .section-appearance-1 .copy p { font-size: 2.2vw; line-height: 1.45; }
}
/* narrow phones (<0.7 aspect): vw runs larger at these widths, so scale the copy up a touch. */
@media (max-aspect-ratio: 7/10) {
  #x4w .section-appearance-1 .copy .h3-40 { font-size: 6vw; }
  #x4w .section-appearance-1 .copy p { font-size: 3.4vw; }
  #x4w .section-appearance-1 .video-content .copy { padding: 8vw 8vw 12vw; }
}

/* Config CTA buttons ("Detailed Configuration"/"Detailed Specifications") never navigated:
   the .button-content text sits on top of the .pdp-cta <a> overlay and swallows the click.
   Let clicks pass through the visual layers to the link, and put the link on top. */
.section-configuration .button-container .button-content,
.section-configuration .button-container .button-bg { pointer-events: none; }
.section-configuration .button-container .pdp-cta { z-index: 5; }
