/* =====================================================================
   FLAW FOUNDATION — canonical design system for flaw.vn
   Loaded LAST, after every legacy layer (editorial / journal / lawyers /
   premium-refinement / luxury-upgrade / system).

   It deliberately REDEFINES the legacy custom properties rather than
   deleting the older files, so the historic layers inherit corrected
   values instead of being rewritten in place.

   Sections
     1  Tokens (colour, type, space, layout)
     2  Language-aware typography (VI / EN / zh-Hans)
     3  Base + Flatsome neutralisation
     4  Type scale
     5  Containers, gutters, overflow guards
     6  Header + navigation + language switcher
     7  Homepage editorial layer
     8  Interior pages (Flatsome / jpv page bodies)
     9  Article reading template
    10  Archive + cards
    11  People
    12  Buttons, forms, tables, media
    13  Footer
    14  Accessibility + motion
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. TOKENS
   ------------------------------------------------------------------ */
:root {
  /* =================================================================
     APPROVED CORPORATE IDENTITY PALETTE (FLAT LAW FIRM, CIP 2026)
     These six values are the brand authority. Everything below is
     derived from them; no competing burgundy is defined anywhere.
     ================================================================= */
  --flat-burgundy: #940C27;         /* FLAT Burgundy   148 / 12 / 39   */
  --flat-burgundy-dark: #6C081B;    /* Dark Burgundy   108 /  8 / 27   */
  --flat-crimson: #B51E3B;          /* Crimson Accent  181 / 30 / 59   */
  --flat-charcoal: #222222;         /* Charcoal         34 / 34 / 34   */
  --flat-ivory: #F7F4F0;            /* Warm Ivory      247 /244 /240   */
  --flat-gray: #D9D6D1;             /* Warm Gray       217 /214 /209   */

  /* --- Typefaces (CIP 2026: Noto Serif display / Inter body+UI) --- */
  --flaw-font-display: "Noto Serif", "Noto Serif SC", Georgia, "Times New Roman", serif;
  --flaw-font-body: Inter, "Noto Sans SC", system-ui, -apple-system, "Segoe UI", Arial, sans-serif;
  --flaw-font-ui: var(--flaw-font-body);
  --flaw-font-cjk-serif: "Noto Serif SC", "Songti SC", SimSun, serif;
  --flaw-font-cjk-sans: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
  /* legacy aliases */
  --flaw-font-heading: var(--flaw-font-display);

  /* --- Colour — all derived from the approved palette above ------- */
  /* Contrast measured against --flat-ivory (#F7F4F0):
     charcoal 14.5:1 · ink-soft 8.1:1 · muted 5.8:1 · burgundy 8.2:1
     · burgundy-dark 11.4:1 · crimson 6.0:1.  White on burgundy 9.0:1. */
  --flaw-ink: var(--flat-charcoal);  /* primary text,   14.5:1 on ivory */
  --flaw-ink-2: #2E2E2E;
  --flaw-ink-soft: #4A4A4A;          /* secondary text,  8.1:1 on ivory */
  --flaw-muted: #5F5F5F;             /* metadata,        5.8:1 on ivory */
  --flaw-paper: var(--flat-ivory);   /* page background                 */
  --flaw-ivory: var(--flat-ivory);
  --flaw-ivory-2: #EFECE7;           /* alternating section             */
  --flaw-ivory-3: var(--flat-gray);  /* borders on ivory                */
  --flaw-surface: #FDFCFA;           /* cards                           */
  --flaw-burgundy: var(--flat-burgundy);
  --flaw-burgundy-deep: var(--flat-burgundy-dark);
  --flaw-oxblood: var(--flat-burgundy);
  --flaw-oxblood-deep: var(--flat-burgundy-dark);
  --flaw-accent: var(--flat-burgundy);
  /* Wave F's gold is retired: it is not in the approved CIP palette.
     The two accent slots keep their light/dark split but now resolve to
     approved values — burgundy on light (8.2:1), warm gray on dark
     (6.2:1 on burgundy, 11.0:1 on charcoal). */
  --flaw-gold: var(--flat-burgundy);      /* accent on light            */
  --flaw-gold-light: var(--flat-gray);    /* accent on dark             */
  --flaw-line: rgba(34, 34, 34, .14);
  --flaw-line-strong: rgba(34, 34, 34, .26);
  --flaw-line-light: rgba(255, 255, 255, .24);
  --flaw-rule: var(--flaw-line);
  --flaw-focus: var(--flat-burgundy);
  --flaw-shadow: 0 1px 2px rgba(34, 34, 34, .04), 0 12px 32px rgba(34, 34, 34, .07);
  --flaw-radius: 2px;

  /* --- Type scale ------------------------------------------------ */
  --fs-hero:    clamp(2.375rem, 1.70rem + 3.00vw, 3.5rem);      /* 38 → 56 */
  --fs-h1:      clamp(2.125rem, 1.55rem + 2.55vw, 3.25rem);     /* 34 → 52 */
  --fs-h2:      clamp(1.5625rem, 1.29rem + 1.22vw, 2.25rem);    /* 25 → 36 */
  --fs-h3:      clamp(1.25rem, 1.11rem + 0.62vw, 1.625rem);     /* 20 → 26 */
  --fs-h4:      clamp(1.125rem, 1.06rem + 0.28vw, 1.3125rem);   /* 18 → 21 */
  --fs-h5: 1.0625rem;
  --fs-h6: .9375rem;
  --fs-lead:    clamp(1.125rem, 1.05rem + 0.35vw, 1.3125rem);   /* 18 → 21 */
  --fs-body:    clamp(1.03125rem, 1.01rem + 0.10vw, 1.09375rem);/* 16.5 → 17.5 */
  --fs-prose:   clamp(1.0625rem, 1.03rem + 0.16vw, 1.125rem);   /* 17 → 18 */
  --fs-small: .875rem;
  --fs-meta: .8125rem;
  --fs-nav: .8125rem;
  --fs-eyebrow: .75rem;

  --lh-display: 1.14;
  --lh-h2: 1.20;
  --lh-h3: 1.28;
  --lh-h4: 1.35;
  --lh-body: 1.65;
  --lh-prose: 1.75;

  --ls-display: -.012em;
  --ls-eyebrow: .14em;
  --ls-nav: .04em;

  /* --- Space scale (4 → 120) ------------------------------------- */
  --s-1: .25rem;  --s-2: .5rem;   --s-3: .75rem;  --s-4: 1rem;
  --s-5: 1.5rem;  --s-6: 2rem;    --s-7: 3rem;    --s-8: 4rem;
  --s-9: 5rem;    --s-10: 6rem;   --s-11: 7.5rem;
  --flaw-space-xs: var(--s-2);
  --flaw-space-sm: var(--s-3);
  --flaw-space-md: var(--s-4);
  --flaw-space-lg: var(--s-5);
  --flaw-space-xl: var(--s-6);
  --flaw-section-y: clamp(3.5rem, 2.2rem + 4.4vw, 6rem);        /* 56 → 96 */
  --flaw-section-y-lg: clamp(4.5rem, 2.9rem + 5.4vw, 7.5rem);   /* 72 → 120 */

  /* --- Layout ---------------------------------------------------- */
  --flaw-gutter: clamp(1.25rem, .8rem + 2vw, 2.5rem);          /* 20 → 40 */
  --flaw-container-wide: 1200px;
  --flaw-container-default: 1120px;
  --flaw-container-reading: 50rem;   /* 800px */
  --flaw-container-narrow: 42rem;    /* 672px */
  --flaw-measure: 66ch;
  --flaw-shell: min(100% - (2 * var(--flaw-gutter)), var(--flaw-container-wide));
  --flaw-article-shell: min(100% - (2 * var(--flaw-gutter)), var(--flaw-container-default));
  --flaw-reading-shell: min(100% - (2 * var(--flaw-gutter)), var(--flaw-container-reading));
  --flaw-content-max: var(--flaw-container-wide);
  --flaw-max: var(--flaw-container-wide);
}

/* ---------------------------------------------------------------------
   1b. FLATSOME SYSTEM TOKENS
   Flatsome ships its own token block inline (`--fs-color-primary: #446084`
   navy, `--fs-color-secondary: #C05530`, `--fs-color-alert: #b20000`). Wave F
   and Wave G overrode the individual components those tokens paint; the
   tokens themselves were left on Flatsome's defaults, so any component not
   yet overridden would still paint off-palette. Re-pointing the tokens at the
   approved palette fixes the class of problem instead of one instance of it.
   ------------------------------------------------------------------ */
body.flaw-legal-site {
  --primary-color: var(--flat-burgundy);
  --fs-color-primary: var(--flat-burgundy);
  --fs-color-secondary: var(--flat-burgundy-dark);
  --fs-color-success: var(--flat-charcoal);
  --fs-color-alert: var(--flat-crimson);
  --fs-color-base: var(--flaw-ink);
}

/* Flatsome styles every prose link from these two custom properties and
   ships a navy (#334862) default. Retuning the properties keeps the brand
   colour consistent everywhere Flatsome paints a link, without another
   layer of selector overrides. */
body.flaw-legal-site {
  --fs-experimental-link-color: var(--flaw-burgundy);
  --fs-experimental-link-color-hover: var(--flaw-burgundy-deep);
}

/* ---------------------------------------------------------------------
   2. LANGUAGE-AWARE TYPOGRAPHY
   CIP 2026 specifies Noto Serif CJK SC for Chinese headings and legal
   titles and Noto Sans CJK SC for Chinese body/UI. "Noto Serif SC" and
   "Noto Sans SC" are the web-font names of exactly those faces, and the
   subsetted woff2 files are already self-hosted in flaw-fonts.css.
   Noto Serif / Inter stay as the Latin companions so mixed CN/EN strings
   remain in one visual family.
   ------------------------------------------------------------------ */
html[lang^="zh"],
body.flaw-locale-cn {
  --flaw-font-display: "Noto Serif SC", "Noto Serif", Georgia, serif;
  --flaw-font-body: "Noto Sans SC", Inter, "PingFang SC", "Microsoft YaHei", sans-serif;
  --flaw-font-heading: var(--flaw-font-display);
  --lh-display: 1.30;
  --lh-h2: 1.34;
  --lh-h3: 1.40;
  --lh-body: 1.80;
  --lh-prose: 1.90;
  --ls-display: 0;
  --ls-eyebrow: .10em;
}

/* Chinese must break by character, never mid-token like Latin. */
html[lang^="zh"] body.flaw-legal-site,
body.flaw-locale-cn {
  line-break: normal;
  word-break: normal;
  overflow-wrap: break-word;
}

/* ---------------------------------------------------------------------
   3. BASE + FLATSOME NEUTRALISATION
   Flatsome injects `body{font-family:Lato}` and `h1..h6{font-family:Lato}`
   inline from theme mods (plus a Dancing Script alt face). Neither has
   usable Vietnamese coverage, so they are overridden here rather than
   left to fall back inconsistently.
   ------------------------------------------------------------------ */
body.flaw-legal-site,
body.flaw-legal-site .heading-font,
body.flaw-legal-site .alt-font,
body.flaw-legal-site button,
body.flaw-legal-site input,
body.flaw-legal-site select,
body.flaw-legal-site textarea,
body.flaw-legal-site .nav,
body.flaw-legal-site .widget,
body.flaw-legal-site .button {
  font-family: var(--flaw-font-body);
}

body.flaw-legal-site {
  background: var(--flaw-paper);
  color: var(--flaw-ink);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-synthesis-weight: none;
  text-rendering: optimizeLegibility;
}

body.flaw-legal-site h1,
body.flaw-legal-site h2,
body.flaw-legal-site h3,
body.flaw-legal-site h4,
body.flaw-legal-site h5,
body.flaw-legal-site h6,
body.flaw-legal-site .heading-font,
body.flaw-legal-site .entry-title,
body.flaw-legal-site .widget-title {
  font-family: var(--flaw-font-display);
  color: var(--flaw-ink);
  letter-spacing: var(--ls-display);
  text-wrap: balance;
}

/* Dark surfaces must win back the heading colour set above. */
body.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-section--dark,
  .flaw-editorial-final, .jpv-ml-hero, .jpv-ml-contact-section,
  .flaw-footer-contact) :is(h1, h2, h3, h4, h5, h6, .heading-font) {
  color: #fff;
}

/* Long headings must never balance themselves into a one-word last line. */
body.flaw-legal-site .entry-content h2,
body.flaw-legal-site .entry-content h3,
body.flaw-legal-site .flaw-article-content h2,
body.flaw-legal-site .flaw-article-content h3 {
  text-wrap: pretty;
}

/* ---------------------------------------------------------------------
   4. TYPE SCALE
   One hierarchy for every template. Previously H1 ranged from 27px on
   practice pages to 69px on the homepage at the same viewport.
   ------------------------------------------------------------------ */
body.flaw-legal-site h1,
body.flaw-legal-site .entry-title,
body.flaw-legal-site .page-title h1,
body.flaw-legal-site .flaw-article-header h1,
body.flaw-legal-site .flaw-journal-archive__header h1,
body.flaw-legal-site .flaw-lawyer-archive__header h1,
body.flaw-legal-site .flaw-lawyer-profile h1,
body.flaw-legal-site .jpv-ml-hero h1,
body.flaw-legal-site .jpv-page .jpv-hero__inner h1 {
  max-width: 20ch;
  font-size: var(--fs-h1);
  font-weight: 600;
  line-height: var(--lh-display);
  letter-spacing: var(--ls-display);
}

body.flaw-legal-site .flaw-editorial-hero h1 {
  max-width: 17ch;
  font-size: var(--fs-hero);
  font-weight: 600;
  line-height: var(--lh-display);
  letter-spacing: var(--ls-display);
}

body.flaw-legal-site h2,
body.flaw-legal-site .entry-content h2,
body.flaw-legal-site .flaw-article-content h2,
body.flaw-legal-site .flaw-editorial-section h2,
body.flaw-legal-site .flaw-editorial-final h2,
body.flaw-legal-site .jpv-ml-section-head h2,
body.flaw-legal-site .jpv-ml-section h2,
body.flaw-legal-site .flaw-dynamic-hub__header h2 {
  max-width: 28ch;
  font-size: var(--fs-h2);
  font-weight: 600;
  line-height: var(--lh-h2);
  letter-spacing: var(--ls-display);
}

body.flaw-legal-site h3,
body.flaw-legal-site .entry-content h3,
body.flaw-legal-site .flaw-article-content h3,
body.flaw-legal-site .flaw-editorial-practice h3,
body.flaw-legal-site .flaw-editorial-audience h3,
body.flaw-legal-site .flaw-editorial-story h3,
body.flaw-legal-site .flaw-journal-card__body h2,
body.flaw-legal-site .flaw-journal-card__body h3,
body.flaw-legal-site .flaw-lawyer-card h2,
body.flaw-legal-site .jpv-ml-card h3,
body.flaw-legal-site .jpv-ml-list-box h3 {
  font-size: var(--fs-h3);
  font-weight: 600;
  line-height: var(--lh-h3);
  letter-spacing: var(--ls-display);
}

body.flaw-legal-site h4,
body.flaw-legal-site .entry-content h4,
body.flaw-legal-site .flaw-article-content h4 {
  font-size: var(--fs-h4);
  font-weight: 600;
  line-height: var(--lh-h4);
}

body.flaw-legal-site h5,
body.flaw-legal-site .entry-content h5 { font-size: var(--fs-h5); font-weight: 600; line-height: 1.4; }
body.flaw-legal-site h6,
body.flaw-legal-site .entry-content h6 { font-size: var(--fs-h6); font-weight: 600; line-height: 1.4; }

/* Eyebrows / kickers / metadata — one treatment sitewide. */
body.flaw-legal-site .flaw-editorial-kicker,
body.flaw-legal-site .flaw-article-kicker,
body.flaw-legal-site .jpv-ml-eyebrow,
body.flaw-legal-site .flaw-journal-card__meta,
body.flaw-legal-site .flaw-lawyer-card__meta,
body.flaw-legal-site .flaw-footer-contact__label,
body.flaw-legal-site .flaw-article-aside__label {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  line-height: 1.5;
  text-transform: uppercase;
}

/* Eyebrow colour. --flaw-gold-light is the accent for DARK surfaces only
   (9.5:1 on ink). It was previously applied to every kicker, including those
   on paper, where it measures 1.6:1 — far below AA and visibly unreadable.
   --flaw-gold is no better on paper (3.0:1), so light surfaces use the brand
   burgundy at 9.7:1. The dark-surface rule further down restores gold-light
   on the hero, the dark section and the closing panel. */
body.flaw-legal-site .flaw-editorial-kicker,
body.flaw-legal-site .flaw-article-kicker,
body.flaw-legal-site .jpv-ml-eyebrow {
  color: var(--flaw-burgundy);
}

body.flaw-legal-site .flaw-article-meta,
body.flaw-legal-site .flaw-article-footer p,
body.flaw-legal-site figcaption,
body.flaw-legal-site .wp-caption-text {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  color: var(--flaw-muted);
  line-height: 1.55;
}

/* Leads. */
body.flaw-legal-site .flaw-editorial-hero__lead,
body.flaw-legal-site .jpv-ml-lead,
body.flaw-legal-site .flaw-journal-archive__description,
body.flaw-legal-site .jpv-page .jpv-hero__inner > p {
  max-width: 60ch;
  font-size: var(--fs-lead);
  line-height: 1.62;
  font-weight: 400;
}

/* ---------------------------------------------------------------------
   5. CONTAINERS, GUTTERS, OVERFLOW GUARDS
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-editorial-wrap,
body.flaw-legal-site .flaw-site-header__inner,
body.flaw-legal-site .jpv-ml-container,
body.flaw-legal-site .flaw-article-wrap,
body.flaw-legal-site .flaw-journal-archive > .flaw-editorial-wrap {
  width: var(--flaw-shell);
  max-width: none;
  margin-inline: auto;
}

body.flaw-legal-site .row,
body.flaw-legal-site .container {
  max-width: var(--flaw-container-wide);
  padding-inline: var(--flaw-gutter);
}

body.flaw-legal-site .flaw-editorial-home {
  width: 100%;
  max-width: none;
  margin-left: 0;
  overflow: clip;
}

/* Nothing may exceed its column; long legal URLs and IDs must reflow. */
body.flaw-legal-site :is(.flaw-journal-card, .flaw-lawyer-card, .flaw-dynamic-hub,
  .jpv-ml-card, .flaw-editorial-story, .flaw-editorial-practice,
  .flaw-editorial-audience, .col, .col-inner, .flex-col) { min-width: 0; }

body.flaw-legal-site :is(img, picture, video, iframe, svg, canvas, embed, object) {
  max-width: 100%;
  height: auto;
}

body.flaw-legal-site :is(.entry-content, .flaw-article-content) :is(a, code, pre) {
  overflow-wrap: anywhere;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content) {
  overflow-wrap: break-word;
}

/* ---------------------------------------------------------------------
   6. HEADER + NAVIGATION
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: rgba(247, 243, 237, .96);
  border-bottom: 1px solid var(--flaw-line);
  box-shadow: none;
  backdrop-filter: saturate(1.1) blur(12px);
}

body.flaw-legal-site .flaw-site-header__inner {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: clamp(1rem, 2.5vw, 2.5rem);
  min-height: 76px;
}

/* Approved MONOGRAM in the header (see flaw_child_render_custom_header for
   why the monogram and not the full lockup). Sized by height so it keys to
   the 76px header band; the artwork is square with its own clear space baked
   in, so the painted device sits ~1X clear of the header edges. Height is
   always well above the 32px monogram minimum. */
body.flaw-legal-site .flaw-site-header__brand img {
  width: auto;
  height: 46px;
  max-width: none;
}

body.flaw-legal-site .flaw-site-nav__list {
  justify-content: flex-end;
  gap: clamp(.85rem, 1.6vw, 1.75rem);
  flex-wrap: nowrap;
}

body.flaw-legal-site .flaw-site-nav__list > li > a {
  display: inline-flex;
  align-items: center;
  min-height: 2.75rem;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-nav);
  font-weight: 500;
  letter-spacing: var(--ls-nav);
  line-height: 1.3;
  text-transform: none;
  white-space: nowrap;
}

body.flaw-legal-site .flaw-site-nav__list > li > a::after {
  bottom: .45rem;
  height: 1px;
  background: var(--flaw-burgundy);
}

body.flaw-legal-site .flaw-site-nav__list > li.current-menu-item > a,
body.flaw-legal-site .flaw-site-nav__list > li.current-menu-ancestor > a,
body.flaw-legal-site .flaw-site-nav__list > li.current-menu-parent > a {
  color: var(--flaw-burgundy);
}
body.flaw-legal-site .flaw-site-nav__list > li.current-menu-item > a::after,
body.flaw-legal-site .flaw-site-nav__list > li.current-menu-ancestor > a::after {
  transform: scaleX(1);
}

/* Language switcher — legible, evenly spaced, real touch targets. */
body.flaw-legal-site .flaw-site-header__tools {
  display: flex;
  align-items: center;
  gap: clamp(.6rem, 1.4vw, 1.1rem);
}
body.flaw-legal-site .flaw-site-header__languages {
  display: flex;
  align-items: center;
  gap: 0;
}
body.flaw-legal-site .flaw-site-header__languages a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2.5rem;
  min-height: 2.5rem;
  padding-inline: .4rem;
  color: var(--flaw-ink-soft);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .03em;
}
body.flaw-legal-site .flaw-site-header__languages a + a {
  border-left: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-site-header__languages a:hover { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-site-header__languages a[aria-current="true"] {
  color: var(--flaw-burgundy);
  font-weight: 700;
}

body.flaw-legal-site .flaw-site-header__cta {
  min-height: 2.75rem;
  padding-inline: 1.1rem;
  border: 1px solid var(--flaw-burgundy);
  border-radius: var(--flaw-radius);
  background: var(--flaw-burgundy);
  color: #fff;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .06em;
  white-space: nowrap;
}
body.flaw-legal-site .flaw-site-header__cta:hover,
body.flaw-legal-site .flaw-site-header__cta:focus-visible {
  background: var(--flaw-burgundy-deep);
  border-color: var(--flaw-burgundy-deep);
  box-shadow: none;
}

/* --- Intermediate widths: nav shrinks before it wraps ------------- */
@media (max-width: 1180px) {
  body.flaw-legal-site .flaw-site-nav__list { gap: .8rem; }
  body.flaw-legal-site .flaw-site-nav__list > li > a { font-size: .75rem; }
  body.flaw-legal-site .flaw-site-header__cta { display: none; }
}

/* --- Collapsed navigation ---------------------------------------- */
@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-site-header { position: sticky; }
  body.flaw-legal-site .flaw-site-header__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    min-height: 68px;
  }
  body.flaw-legal-site .flaw-site-header__brand { order: 1; margin-right: auto; }
  /* The switcher stays in the bar: it is the only route between VI/EN/CN. */
  body.flaw-legal-site .flaw-site-header__tools { order: 2; display: flex; gap: .25rem; }
  body.flaw-legal-site .flaw-site-header__cta { display: none; }
  body.flaw-legal-site .flaw-site-header__toggle {
    order: 3;
    display: flex;
    width: 44px;
    height: 44px;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .35rem;
    margin-left: .25rem;
    cursor: pointer;
  }
  body.flaw-legal-site .flaw-site-header__toggle > span:not(.screen-reader-text) {
    display: block;
    width: 1.35rem;
    height: 1px;
    background: var(--flaw-ink);
    transition: transform .2s ease;
  }
  body.flaw-legal-site .flaw-site-nav {
    order: 4;
    position: absolute;
    top: 100%;
    right: 0;
    left: 0;
    display: none;
    max-height: calc(100dvh - 68px);
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: var(--s-2) 0 var(--s-5);
    border-bottom: 1px solid var(--flaw-line);
    background: var(--flaw-paper);
    box-shadow: var(--flaw-shadow);
  }
  body.flaw-legal-site .flaw-site-header.is-open .flaw-site-nav { display: block; }
  body.flaw-legal-site .flaw-site-nav__list {
    width: var(--flaw-shell);
    margin-inline: auto;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
  }
  body.flaw-legal-site .flaw-site-nav__list > li > a {
    display: flex;
    min-height: 48px;
    padding: .75rem 0;
    border-bottom: 1px solid var(--flaw-line);
    font-size: .9375rem;
    font-weight: 600;
    white-space: normal;
  }
  body.flaw-legal-site .flaw-site-nav__list > li > a::after { display: none; }
}

@media (max-width: 600px) {
  body.flaw-legal-site .flaw-site-header__inner { min-height: 62px; }
  body.flaw-legal-site .flaw-site-header__brand img { width: auto; height: 38px; }
  body.flaw-legal-site .flaw-site-header__languages a { min-width: 2.25rem; padding-inline: .25rem; }
  body.flaw-legal-site .flaw-site-nav { max-height: calc(100dvh - 62px); }
}

/* ---------------------------------------------------------------------
   7. HOMEPAGE EDITORIAL LAYER
   Restrained: the diagonal clip-path wash and oversized ghost mark are
   replaced by a straight-edged panel and a quiet rule.
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-editorial-hero {
  min-height: 0;
  background: var(--flaw-ink);
}
body.flaw-legal-site .flaw-editorial-hero__wash {
  inset: 0 0 0 62%;
  background: var(--flaw-burgundy);
  clip-path: none;
  opacity: .92;
}
body.flaw-legal-site .flaw-editorial-hero__grid {
  width: var(--flaw-shell);
  grid-template-columns: minmax(0, 1.15fr) minmax(16rem, .6fr);
  gap: clamp(2.5rem, 6vw, 6rem);
  align-items: end;
  padding: var(--flaw-section-y-lg) 0 var(--flaw-section-y);
}
body.flaw-legal-site .flaw-editorial-hero__copy { max-width: 44rem; }
body.flaw-legal-site .flaw-editorial-kicker {
  margin: 0 0 var(--s-4);
}
/* Owner decision D7: the corporate tagline as a secondary brand line beneath
   the locale headline. Matches nothing until the content phase supplies an
   approved `hero_h1`, at which point the tagline moves out of the <h1> and
   lands here — the style is in place so that switch needs no CSS work. */
body.flaw-legal-site .flaw-editorial-hero__tagline {
  margin-top: var(--s-3);
  color: rgba(255, 255, 255, .62);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-small);
  font-weight: 500;
  letter-spacing: .01em;
  line-height: 1.5;
}
body.flaw-legal-site .flaw-editorial-hero__lead {
  margin-top: var(--s-5);
  color: rgba(255, 255, 255, .8);
}
body.flaw-legal-site .flaw-editorial-actions { gap: var(--s-3); margin-top: var(--s-6); }

body.flaw-legal-site .flaw-editorial-hero__statement {
  max-width: 22rem;
  padding-left: var(--s-5);
  border-left: 1px solid rgba(255, 255, 255, .28);
}
body.flaw-legal-site .flaw-editorial-hero__statement > span {
  margin-bottom: var(--s-5);
  color: rgba(255, 255, 255, .28);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  line-height: 1.5;
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-editorial-hero__statement p {
  color: rgba(255, 255, 255, .84);
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h4);
  line-height: 1.5;
}

body.flaw-legal-site .flaw-editorial-intro { background: var(--flaw-ivory-2); }
body.flaw-legal-site .flaw-editorial-intro__text {
  max-width: 22ch;
  padding: var(--flaw-section-y) 0;
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h2);
  font-weight: 600;
  line-height: var(--lh-h2);
  letter-spacing: var(--ls-display);
}

body.flaw-legal-site .flaw-editorial-section { padding: var(--flaw-section-y) 0; }
body.flaw-legal-site .flaw-editorial-section__head {
  max-width: 46rem;
  margin-bottom: var(--s-7);
}
body.flaw-legal-site .flaw-editorial-section--dark { background: var(--flaw-ink); }
body.flaw-legal-site .flaw-editorial-section--dark h2,
body.flaw-legal-site .flaw-editorial-final h2 { color: #fff; }

/* Practice list: calm rows, no padding jump on hover. */
body.flaw-legal-site .flaw-editorial-practice {
  min-height: 0;
  grid-template-columns: 3rem minmax(0, 1fr) 1.5rem;
  gap: var(--s-5);
  align-items: baseline;
  padding: var(--s-5) var(--s-4);
  border-bottom-color: var(--flaw-line);
  transition: background .2s ease, color .2s ease;
}
body.flaw-legal-site .flaw-editorial-practice:hover,
body.flaw-legal-site .flaw-editorial-practice:focus-visible {
  padding-inline: var(--s-4);
  background: var(--flaw-ivory-2);
  color: var(--flaw-ink);
}
body.flaw-legal-site .flaw-editorial-practice:hover h3 { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-editorial-practice:hover p { color: var(--flaw-ink-soft); }
body.flaw-legal-site .flaw-editorial-practice:hover .flaw-editorial-practice__number,
body.flaw-legal-site .flaw-editorial-practice:hover .flaw-editorial-practice__arrow { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-editorial-practice h3 { margin-bottom: var(--s-2); }
body.flaw-legal-site .flaw-editorial-practice p {
  max-width: 58ch;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-small);
  line-height: 1.65;
}
body.flaw-legal-site .flaw-editorial-practice__number {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .1em;
}

body.flaw-legal-site .flaw-editorial-audience {
  min-height: 0;
  grid-template-columns: 2.5rem minmax(0, 1fr) 1.5rem;
  gap: var(--s-4);
  padding: var(--s-5);
  background: var(--flaw-surface);
  transition: background .2s ease;
}
body.flaw-legal-site .flaw-editorial-audience:hover,
body.flaw-legal-site .flaw-editorial-audience:focus-visible {
  background: var(--flaw-ivory-2);
  color: var(--flaw-ink);
  transform: none;
}
body.flaw-legal-site .flaw-editorial-audience:hover h3 { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-editorial-audience:hover p { color: var(--flaw-ink-soft); }
body.flaw-legal-site .flaw-editorial-audience p {
  color: var(--flaw-ink-soft);
  font-size: var(--fs-small);
  line-height: 1.65;
}

body.flaw-legal-site .flaw-editorial-industry-grid span {
  padding-block: var(--s-3) var(--s-4);
  border-top-color: var(--flaw-line-light);
  color: rgba(255, 255, 255, .88);
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h4);
  line-height: 1.4;
}

body.flaw-legal-site .flaw-editorial-story { background: var(--flaw-surface); padding: var(--s-6); }
body.flaw-legal-site .flaw-editorial-story--feature { padding: var(--s-7); }
body.flaw-legal-site .flaw-editorial-story h3 { margin: var(--s-4) 0 var(--s-3); }
body.flaw-legal-site .flaw-editorial-story p {
  color: var(--flaw-ink-soft);
  font-size: var(--fs-small);
  line-height: 1.7;
}
body.flaw-legal-site .flaw-editorial-story__meta,
body.flaw-legal-site .flaw-editorial-story__link {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .1em;
}

body.flaw-legal-site .flaw-editorial-final {
  background: var(--flaw-burgundy);
  padding: var(--flaw-section-y) 0;
}
body.flaw-legal-site .flaw-editorial-final__grid { gap: var(--s-7); }
body.flaw-legal-site .flaw-editorial-final p {
  max-width: 44ch;
  color: rgba(255, 255, 255, .84);
  font-size: var(--fs-lead);
  line-height: 1.62;
}

/* ---------------------------------------------------------------------
   8. INTERIOR PAGES
   Practice, about and contact pages previously fell through to a bare
   Flatsome page body with no container, no hierarchy and no hero. This
   gives them the same system as the rest of the site.
   ------------------------------------------------------------------ */
body.flaw-legal-site .page .entry-header,
body.flaw-legal-site .page-title {
  width: var(--flaw-shell);
  max-width: none;
  margin-inline: auto;
  padding-block: var(--flaw-section-y) var(--s-5);
  border-bottom: 1px solid var(--flaw-line);
}

body.flaw-legal-site .entry-content {
  width: var(--flaw-reading-shell);
  max-width: none;
  margin-inline: auto;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
}

body.flaw-legal-site .entry-content > :is(p, ul, ol, blockquote, dl) { max-width: var(--flaw-measure); }
body.flaw-legal-site .entry-content > * + * { margin-top: var(--s-5); }
body.flaw-legal-site .entry-content h2 { margin-top: var(--s-8); margin-bottom: var(--s-4); }
body.flaw-legal-site .entry-content h3 { margin-top: var(--s-6); margin-bottom: var(--s-3); }
body.flaw-legal-site .entry-content h4 { margin-top: var(--s-5); margin-bottom: var(--s-2); }
body.flaw-legal-site .entry-content h2 + *,
body.flaw-legal-site .entry-content h3 + *,
body.flaw-legal-site .entry-content h4 + * { margin-top: 0; }

/* --- Flatsome / UX Builder page bodies ---------------------------
   Practice, guide and hub pages are authored as Flatsome sections, not
   as `.entry-content`. Without this they inherit no measure (paragraphs
   were running to ~125 characters) and no vertical rhythm (two adjacent
   55px section paddings plus a 30px column pad = ~140px voids).
   ---------------------------------------------------------------- */
body.flaw-legal-site .content-area .section {
  padding-block: clamp(2.5rem, 1.6rem + 2.8vw, 3.75rem);
}
body.flaw-legal-site .content-area .section > .section-content > .row:last-child > .col:last-child {
  padding-bottom: 0;
}

body.flaw-legal-site .content-area .col.large-12 .col-inner :is(p, ul, ol, dl, blockquote) {
  max-width: var(--flaw-measure);
}
/* The editorial homepage is itself nested inside a Flatsome `.col-inner`,
   so this rule must not reach into it — its dark panels need light text. */
body.flaw-legal-site .content-area .col-inner :is(p, li):not(.flaw-editorial-home *) {
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site .content-area .col-inner :is(ul, ol) { padding-left: 1.35em; }
body.flaw-legal-site .content-area .col-inner li + li { margin-top: var(--s-2); }
body.flaw-legal-site .content-area .col-inner li::marker { color: var(--flaw-burgundy); }
/* The editorial homepage is nested inside a Flatsome `.col-inner`, so this
   rule outranked the dark-surface heading colour (3 classes vs 2) and made
   the dark section's H2 ink-on-ink — invisible. Excluded here rather than
   out-specified below, which is the same fix already applied to `p, li`. */
body.flaw-legal-site .content-area .col-inner :is(h2, h3, h4):not(.flaw-editorial-home *) { color: var(--flaw-ink); }
body.flaw-legal-site .content-area .col-inner h2 { margin-bottom: var(--s-4); }
body.flaw-legal-site .content-area .col-inner h3 { margin-bottom: var(--s-3); }

/* Legacy UX Builder page shells.

   `.jpv-content > section` was scoped to `.jpv-hub-page`, but the generator
   emits the identical `section.jpv-page > .jpv-hero + .jpv-content` shell for
   service pages under `.jpv-service-page`. Those 21 pages (9118-9126 VI,
   11895-11906 EN/ZH) therefore matched no container rule at all and rendered
   their body copy at `left:0; width:100vw`. Scoped to `.jpv-page` so both
   variants of the same shape are carried; the 9 hub pages are unaffected
   because they match either way. `> *` rather than `> section` because the
   VI service pages also place `section.jpv-cta-band` and `p.jpv-disclaimer`
   directly in `.jpv-content`, and those escaped too. This is the same class
   of mis-scoping already corrected for `.jpv-p1-page` in section 19 below. */
body.flaw-legal-site .jpv-page .jpv-hero__inner,
body.flaw-legal-site .jpv-page .jpv-content > *,
body.flaw-legal-site .jpv-hub-page .flaw-dynamic-hub {
  width: var(--flaw-shell);
  max-width: none;
  margin-inline: auto;
}

/* Two generator shells carry their body sections with no inner wrapper of any
   kind, so neither the rule above nor `.jpv-p1-page` reaches them.

   9209 is `article.jpv-page.jpv-hub-page` with its `<section>`s as direct
   children and no `.jpv-content` at all; its hero is a `<section>` too and
   must stay full bleed, so it is excluded and keeps carrying its measure on
   `.jpv-hero__inner`.

   9224 is `section.jpv-content-page` — the only page using that shell, with a
   bare `<header>` plus sections and no `.jpv-page` class, so it matched
   nothing sitewide. It has no hero, hence the block padding. */
body.flaw-legal-site .jpv-page > section:not(.jpv-hero),
body.flaw-legal-site .jpv-content-page > * {
  width: var(--flaw-shell);
  max-width: none;
  margin-inline: auto;
}
body.flaw-legal-site .jpv-content-page {
  padding-block: var(--flaw-section-y) var(--flaw-section-y-lg);
}
body.flaw-legal-site .jpv-hub-page .jpv-p1-page > p,
body.flaw-legal-site .jpv-hub-page .jpv-p1-page > section > :is(p, ul, ol) {
  max-width: var(--flaw-measure);
}
body.flaw-legal-site .jpv-ml-section { padding: var(--flaw-section-y) 0; }
body.flaw-legal-site .jpv-ml-section-head { margin-bottom: var(--s-6); }
body.flaw-legal-site .jpv-ml-section-head p,
body.flaw-legal-site .jpv-ml-section > .jpv-ml-container > p,
body.flaw-legal-site .jpv-ml-note {
  max-width: var(--flaw-measure);
  color: var(--flaw-ink-soft);
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
}
body.flaw-legal-site .jpv-ml-hero { padding: var(--flaw-section-y-lg) 0 var(--flaw-section-y); }
body.flaw-legal-site .jpv-ml-hero::before {
  inset: 0 0 0 58%;
  background: var(--flaw-burgundy);
  clip-path: none;
  opacity: .9;
}
body.flaw-legal-site .jpv-ml-hero-card h2 { font-size: var(--fs-h3); line-height: var(--lh-h3); }
body.flaw-legal-site .jpv-ml-card { padding: var(--s-6); background: var(--flaw-surface); }
body.flaw-legal-site .jpv-ml-card:hover { background: var(--flaw-ivory-2); color: var(--flaw-ink); }
body.flaw-legal-site .jpv-ml-card:hover h3 { color: var(--flaw-burgundy); }
body.flaw-legal-site .jpv-ml-card:hover p { color: var(--flaw-ink-soft); }
body.flaw-legal-site .jpv-ml-card h3 { margin-bottom: var(--s-3); }
body.flaw-legal-site .jpv-ml-card p { color: var(--flaw-ink-soft); font-size: var(--fs-small); line-height: 1.7; }
body.flaw-legal-site .jpv-ml-trust { margin-top: var(--s-7); font-size: var(--fs-meta); }

/* ---------------------------------------------------------------------
   9. ARTICLE READING TEMPLATE
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-article-shell,
body.flaw-legal-site .flaw-journal-archive {
  background: var(--flaw-paper);
  padding: var(--flaw-section-y) 0 var(--flaw-section-y-lg);
}

body.flaw-legal-site .flaw-article-breadcrumbs {
  margin-bottom: var(--s-6);
  color: var(--flaw-burgundy);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
}

body.flaw-legal-site .flaw-article-header,
body.flaw-legal-site .flaw-journal-archive__header {
  max-width: 46rem;
  margin-bottom: 0;
  padding-bottom: var(--s-5);
  border-bottom: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-article-header h1 { margin-top: var(--s-3); }
body.flaw-legal-site .flaw-article-meta { gap: var(--s-4); margin-top: var(--s-5); }

body.flaw-legal-site .flaw-article-featured {
  max-height: 30rem;
  margin: var(--s-7) 0;
  border-radius: var(--flaw-radius);
  box-shadow: none;
  border: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-article-featured img { max-height: 30rem; }

/* Sidebar rail + reading column, left-anchored so the page is balanced. */
body.flaw-legal-site .flaw-article-layout {
  grid-template-columns: minmax(0, var(--flaw-container-reading)) minmax(0, 13rem);
  gap: clamp(2rem, 5vw, 4.5rem);
  justify-content: start;
  margin-top: var(--s-7);
}
body.flaw-legal-site .flaw-article-aside {
  order: 2;
  align-self: start;
  position: sticky;
  top: 6rem;
  border-top: 2px solid var(--flaw-burgundy);
  padding-top: var(--s-3);
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site .flaw-article-aside__value {
  color: var(--flaw-ink);
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h5);
  line-height: 1.4;
}
body.flaw-legal-site .flaw-article-content { order: 1; }

body.flaw-legal-site .flaw-article-content {
  width: 100%;
  max-width: none;
  margin-inline: 0;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
}
body.flaw-legal-site .flaw-article-content > :is(p, ul, ol, blockquote, dl) { max-width: var(--flaw-measure); }
body.flaw-legal-site .flaw-article-content > * + * { margin-top: var(--s-5); }
body.flaw-legal-site .flaw-article-content :is(h2, h3, h4) { color: var(--flaw-ink); }
body.flaw-legal-site .flaw-article-content h2 { margin-top: var(--s-8); margin-bottom: var(--s-4); }
body.flaw-legal-site .flaw-article-content h3 { margin-top: var(--s-6); margin-bottom: var(--s-3); }
body.flaw-legal-site .flaw-article-content h4 { margin-top: var(--s-5); margin-bottom: var(--s-2); }
body.flaw-legal-site .flaw-article-content :is(h2, h3, h4) + * { margin-top: 0; }

/* Lists — legal articles are list-heavy. */
body.flaw-legal-site :is(.flaw-article-content, .entry-content) :is(ul, ol) {
  padding-left: 1.35em;
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content) li + li { margin-top: var(--s-2); }
body.flaw-legal-site :is(.flaw-article-content, .entry-content) li { line-height: var(--lh-prose); }
body.flaw-legal-site :is(.flaw-article-content, .entry-content) li::marker { color: var(--flaw-burgundy); }
body.flaw-legal-site :is(.flaw-article-content, .entry-content) :is(ul, ol) :is(ul, ol) {
  margin-top: var(--s-2);
}

body.flaw-legal-site :is(.flaw-article-content, .entry-content) blockquote {
  max-width: var(--flaw-measure);
  margin: var(--s-6) 0;
  padding: var(--s-4) var(--s-5);
  border-left: 2px solid var(--flaw-burgundy);
  background: var(--flaw-ivory-2);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h5);
  font-style: normal;
  line-height: 1.6;
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content) blockquote p:last-child { margin-bottom: 0; }

body.flaw-legal-site :is(.flaw-article-content, .entry-content) a {
  color: var(--flaw-burgundy);
  text-decoration: underline;
  text-decoration-thickness: .06em;
  text-underline-offset: .18em;
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content) a:hover { color: var(--flaw-burgundy-deep); }

body.flaw-legal-site :is(.flaw-article-content, .entry-content) :is(figure, img) {
  margin-block: var(--s-6);
}
body.flaw-legal-site .entry-content img {
  border-radius: var(--flaw-radius);
  box-shadow: none;
  border: 1px solid var(--flaw-line);
}

body.flaw-legal-site .flaw-article-footer {
  max-width: 46rem;
  margin-top: var(--flaw-section-y);
  padding-top: var(--s-5);
  border-top: 1px solid var(--flaw-line);
  gap: var(--s-5);
}
body.flaw-legal-site .flaw-related-content { margin-top: var(--flaw-section-y); }

/* ---------------------------------------------------------------------
   10. ARCHIVE + CARDS
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-journal-archive__header { margin-bottom: var(--flaw-section-y); }
body.flaw-legal-site .flaw-journal-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--flaw-line);
  border: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-journal-card {
  display: flex;
  flex-direction: column;
  background: var(--flaw-surface);
  border: 0;
  transition: background .2s ease;
}
body.flaw-legal-site .flaw-journal-card:hover,
body.flaw-legal-site .flaw-lawyer-card:hover {
  background: var(--flaw-ivory-2);
  transform: none;
}
/* Uniform thumbnails keep the grid from going ragged. */
body.flaw-legal-site .flaw-journal-card__media,
body.flaw-legal-site .flaw-journal-card--feature .flaw-journal-card__media {
  aspect-ratio: 16 / 10;
}
body.flaw-legal-site .flaw-journal-card:hover .flaw-journal-card__media img { transform: none; }
body.flaw-legal-site .flaw-journal-card__body {
  display: flex;
  flex: 1;
  flex-direction: column;
  padding: var(--s-5);
}
body.flaw-legal-site .flaw-journal-card__body h2,
body.flaw-legal-site .flaw-journal-card__body h3 {
  margin: var(--s-3) 0 var(--s-3);
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
body.flaw-legal-site .flaw-journal-card__body > p:not(.flaw-journal-card__meta) {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  margin-bottom: var(--s-4);
  color: var(--flaw-ink-soft);
  font-size: var(--fs-small);
  line-height: 1.65;
}
body.flaw-legal-site .flaw-journal-card__link {
  margin-top: auto;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .1em;
}
/* Standalone (non-inline) links need a 24x24 target under WCAG 2.2 SC 2.5.8.
   At the eyebrow size these measured 18-22px tall. Height only: the visual
   position of the label is unchanged because the extra space is centred. */
body.flaw-legal-site :is(.flaw-journal-card__link, .flaw-editorial-story__link,
  .flaw-lawyer-card__link, .flaw-article-breadcrumbs a, .flaw-topic-filters a,
  .footer-nav a, .flaw-footer-contact a) {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

body.flaw-legal-site .flaw-topic-filters { gap: var(--s-2); margin-bottom: var(--s-6); }
body.flaw-legal-site .flaw-topic-filters a {
  min-height: 2.5rem;
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--flaw-line-strong);
  border-radius: var(--flaw-radius);
  padding: .5rem .85rem;
  color: var(--flaw-ink-soft);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 500;
}
body.flaw-legal-site .flaw-topic-filters a[aria-current="page"] {
  border-color: var(--flaw-burgundy);
  background: var(--flaw-burgundy);
  color: #fff;
}
body.flaw-legal-site .flaw-dynamic-pagination .page-numbers,
body.flaw-legal-site .flaw-journal-archive .page-numbers {
  min-width: 2.75rem;
  min-height: 2.75rem;
  border-radius: var(--flaw-radius);
  border-color: var(--flaw-line-strong);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
}

@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-journal-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
  body.flaw-legal-site .flaw-journal-grid { grid-template-columns: 1fr; }
  body.flaw-legal-site .flaw-journal-card--feature { grid-row: auto; }
}

/* ---------------------------------------------------------------------
   11. PEOPLE
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-lawyer-archive,
body.flaw-legal-site .flaw-lawyer-profile { padding: var(--flaw-section-y) 0 var(--flaw-section-y-lg); }
body.flaw-legal-site .flaw-lawyer-archive__header { max-width: 46rem; margin-bottom: var(--flaw-section-y); }
body.flaw-legal-site .flaw-lawyer-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--flaw-line);
  border: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-lawyer-card { background: var(--flaw-surface); }
body.flaw-legal-site .flaw-lawyer-card__portrait { aspect-ratio: 3 / 4; }
body.flaw-legal-site .flaw-lawyer-card__portrait img { filter: none; }
body.flaw-legal-site .flaw-lawyer-card:hover .flaw-lawyer-card__portrait img { transform: none; filter: none; }
body.flaw-legal-site .flaw-lawyer-card__body { padding: var(--s-5); }
body.flaw-legal-site .flaw-lawyer-card h2 { margin: var(--s-2) 0 var(--s-3); }
body.flaw-legal-site .flaw-lawyer-card__body > p:not(.flaw-lawyer-card__meta) {
  color: var(--flaw-ink-soft);
  font-size: var(--fs-small);
  line-height: 1.65;
}
body.flaw-legal-site .flaw-lawyer-profile__grid {
  grid-template-columns: minmax(16rem, .55fr) minmax(0, 1fr);
  gap: clamp(2rem, 5vw, 4.5rem);
}
body.flaw-legal-site .flaw-lawyer-profile__portrait {
  top: 6rem;
  aspect-ratio: 3 / 4;
  border-radius: var(--flaw-radius);
  box-shadow: none;
  border: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-lawyer-profile__content { max-width: var(--flaw-container-reading); }
body.flaw-legal-site .flaw-lawyer-profile__body {
  margin: var(--s-6) 0;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
}
body.flaw-legal-site .flaw-lawyer-profile__body > :is(p, ul, ol) { max-width: var(--flaw-measure); }

@media (max-width: 900px) {
  body.flaw-legal-site .flaw-lawyer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  body.flaw-legal-site .flaw-lawyer-profile__grid { grid-template-columns: 1fr; }
  body.flaw-legal-site .flaw-lawyer-profile__portrait { position: static; max-width: 22rem; }
}
@media (max-width: 560px) {
  body.flaw-legal-site .flaw-lawyer-grid { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------------------------
   12. BUTTONS, FORMS, TABLES, MEDIA
   Flatsome's default primary/secondary colours were rendering navy and
   green CTAs on practice pages. Everything is brought onto the brand.
   ------------------------------------------------------------------ */
body.flaw-legal-site :is(.button, button, input[type="submit"], input[type="button"], .flaw-editorial-button, .jpv-ml-button) {
  border-radius: var(--flaw-radius);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .06em;
  line-height: 1.2;
  text-transform: uppercase;
  transition: background .2s ease, border-color .2s ease, color .2s ease;
}

/* Primary */
body.flaw-legal-site .button.primary,
body.flaw-legal-site .button.secondary,
body.flaw-legal-site input[type="submit"],
body.flaw-legal-site .jpv-ml-button,
body.flaw-legal-site .flaw-editorial-button--solid,
body.flaw-legal-site .flaw-editorial-button--light {
  min-height: 2.9rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: .75rem 1.35rem;
  border: 1px solid var(--flaw-burgundy);
  background: var(--flaw-burgundy);
  color: #fff;
  text-shadow: none;
  box-shadow: none;
}
body.flaw-legal-site :is(.button.primary, .button.secondary, input[type="submit"], .jpv-ml-button, .flaw-editorial-button--solid, .flaw-editorial-button--light):hover,
body.flaw-legal-site :is(.button.primary, .button.secondary, input[type="submit"], .jpv-ml-button, .flaw-editorial-button--solid, .flaw-editorial-button--light):focus-visible {
  border-color: var(--flaw-burgundy-deep);
  background: var(--flaw-burgundy-deep);
  color: #fff;
  transform: none;
  box-shadow: none;
}

/* Secondary / outline */
body.flaw-legal-site .button.is-outline,
body.flaw-legal-site .button.primary.is-outline,
body.flaw-legal-site .button.secondary.is-outline,
body.flaw-legal-site .jpv-ml-button-ghost {
  border: 1px solid var(--flaw-burgundy);
  background: transparent;
  color: var(--flaw-burgundy);
}
body.flaw-legal-site :is(.button.is-outline, .button.primary.is-outline, .button.secondary.is-outline, .jpv-ml-button-ghost):hover {
  background: var(--flaw-burgundy);
  color: #fff;
}

/* Text link button */
body.flaw-legal-site .button.is-underline,
body.flaw-legal-site .button.is-link,
body.flaw-legal-site .flaw-editorial-story__link,
body.flaw-legal-site .jpv-ml-link {
  padding-inline: 0;
  border: 0;
  background: transparent;
  color: var(--flaw-burgundy);
  text-decoration: none;
}
/* Flatsome's own underline decoration sits low and off-centre; replace it
   with a tight rule on the label itself. */
body.flaw-legal-site .button.is-underline {
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}
body.flaw-legal-site .button.is-underline > span {
  display: inline-block;
  padding-bottom: 2px;
  border-bottom: 1px solid currentColor;
}
body.flaw-legal-site .button.is-underline:hover > span { border-bottom-color: var(--flaw-burgundy-deep); }
body.flaw-legal-site :is(.button.is-underline, .button.is-link, .jpv-ml-link):hover { color: var(--flaw-burgundy-deep); }

/* On dark surfaces the accent button uses the approved Warm Gray so it
   reads against burgundy/charcoal without leaving the CIP palette
   (#222222 on #D9D6D1 = 11.0:1). Burgundy-on-burgundy would vanish. */
body.flaw-legal-site .flaw-editorial-hero .flaw-editorial-button--solid,
body.flaw-legal-site .flaw-editorial-section--dark .flaw-editorial-button--solid,
body.flaw-legal-site .flaw-editorial-final .flaw-editorial-button--light {
  border-color: var(--flaw-gold-light);
  background: var(--flaw-gold-light);
  color: var(--flaw-ink);
}
body.flaw-legal-site .flaw-editorial-hero .flaw-editorial-button--solid:hover,
body.flaw-legal-site .flaw-editorial-section--dark .flaw-editorial-button--solid:hover,
body.flaw-legal-site .flaw-editorial-final .flaw-editorial-button--light:hover {
  border-color: #fff;
  background: #fff;
  color: var(--flaw-ink);
}
/* The outline button only ever appeared on the dark hero, so it was styled
   white-on-transparent with no light-surface variant. On the 404 page it
   rendered white on ivory at 1.11:1. The default is now the light-surface
   treatment; the white variant is scoped to the dark surfaces that need it. */
body.flaw-legal-site .flaw-editorial-button--line {
  border: 1px solid var(--flaw-burgundy);
  background: transparent;
  color: var(--flaw-burgundy);
}
body.flaw-legal-site .flaw-editorial-button--line:hover {
  border-color: var(--flaw-burgundy-deep);
  background: var(--flaw-burgundy);
  color: #fff;
}
body.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-final,
  .flaw-editorial-section--dark, .jpv-ml-hero, .jpv-ml-contact-section)
  .flaw-editorial-button--line {
  border-color: rgba(255, 255, 255, .5);
  background: transparent;
  color: #fff;
}
body.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-final,
  .flaw-editorial-section--dark, .jpv-ml-hero, .jpv-ml-contact-section)
  .flaw-editorial-button--line:hover {
  border-color: #fff;
  background: rgba(255, 255, 255, .1);
  color: #fff;
}
body.flaw-legal-site .button.white { border-color: #fff; background: #fff; color: var(--flaw-ink); }

body.flaw-legal-site .flaw-editorial-button:hover { transform: none; }

/* Forms */
/* Checkboxes and radios are controls, not text fields: the shared input rule
   was stretching the consent checkbox to 13x46px. Square, 20px, and tinted to
   the brand so the checked state is legible. */
body.flaw-legal-site :is(input[type="checkbox"], input[type="radio"]) {
  width: 1.25rem;
  height: 1.25rem;
  min-height: 0;
  margin-inline-end: .5rem;
  padding: 0;
  accent-color: var(--flaw-burgundy);
  vertical-align: middle;
  flex: 0 0 auto;
}

body.flaw-legal-site :is(input:not([type="submit"]):not([type="button"]):not([type="checkbox"]):not([type="radio"]), select, textarea) {
  min-height: 2.9rem;
  padding: .7rem .85rem;
  border: 1px solid var(--flaw-line-strong);
  border-radius: var(--flaw-radius);
  background: #fff;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-body);
  font-size: 1rem;   /* keeps iOS from zooming the viewport on focus */
  line-height: 1.4;
  box-shadow: none;
}
body.flaw-legal-site textarea { min-height: 7rem; resize: vertical; }
body.flaw-legal-site :is(input, select, textarea):focus {
  border-color: var(--flaw-burgundy);
  outline: 0;
  box-shadow: 0 0 0 3px rgba(107, 35, 53, .16);
}
body.flaw-legal-site :is(input, select, textarea):disabled {
  background: var(--flaw-ivory-2);
  color: var(--flaw-muted);
  cursor: not-allowed;
}
body.flaw-legal-site label {
  display: block;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--flaw-ink-2);
}
body.flaw-legal-site ::placeholder { color: var(--flaw-muted); opacity: 1; }
body.flaw-legal-site .wpcf7-not-valid-tip { color: var(--flaw-burgundy); font-size: var(--fs-meta); }
body.flaw-legal-site .flaw-search-form input[type="search"] { flex: 1; min-width: 0; }
body.flaw-legal-site .flaw-search-form button {
  min-height: 2.9rem;
  padding-inline: 1.25rem;
  border: 1px solid var(--flaw-burgundy);
  background: var(--flaw-burgundy);
  color: #fff;
}

/* Tables — must stay usable on a phone. */
body.flaw-legal-site :is(.entry-content, .flaw-article-content) > table,
body.flaw-legal-site :is(.entry-content, .flaw-article-content) .wp-block-table {
  display: block;
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content) table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-small);
  line-height: 1.55;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content) :is(th, td) {
  padding: .7rem .85rem;
  border: 1px solid var(--flaw-line);
  text-align: left;
  vertical-align: top;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content) th {
  background: var(--flaw-ivory-2);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-weight: 600;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content) tbody tr:nth-child(even) {
  background: rgba(30, 27, 25, .025);
}

/* ---------------------------------------------------------------------
   13. FOOTER
   ------------------------------------------------------------------ */
body.flaw-legal-site .flaw-footer-contact {
  background: var(--flaw-ink);
  color: rgba(255, 255, 255, .82);
  padding: var(--flaw-section-y) 0 var(--s-5);
}
body.flaw-legal-site .flaw-footer-contact .container,
body.flaw-legal-site .footer-widgets .row {
  max-width: var(--flaw-container-wide);
  margin-inline: auto;
}
body.flaw-legal-site .flaw-footer-contact__grid { gap: var(--s-7); }
body.flaw-legal-site .flaw-footer-contact__label { color: var(--flaw-gold-light); }
/* Approved PRIMARY VERTICAL lockup (reverse) — 132px, above its 120px
   minimum. Square artwork with clear space baked in. */
/* Brand device (CIP §14): the geometric F used as a quiet background
   identity element on the burgundy hero panel. Reverse artwork at 14%,
   inside the approved 8-18% band for dark surfaces, and subordinate to
   the copy it sits behind. Geometry is untouched. */
/* SC 2.5.8: standalone jpv CTA links measured 21px high. Inline links inside
   a sentence stay exempt; these are block-level calls to action. */
body.flaw-legal-site .jpv-button,
body.flaw-legal-site .jpv-ml-button,
body.flaw-legal-site .jpv-ml-button-ghost,
body.flaw-legal-site .jpv-ml-link {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}
/* Checkboxes/radios were 20x20; 24x24 clears SC 2.5.8 without a spacing argument. */
body.flaw-legal-site input[type="checkbox"],
body.flaw-legal-site input[type="radio"] {
  width: 24px;
  height: 24px;
  min-height: 24px;
}

/* Portrait placeholder: approved brand device on a warm-gray field. */
body.flaw-legal-site .flaw-portrait-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  min-height: 12rem;
  background: var(--flat-gray);
}
body.flaw-legal-site .flaw-portrait-placeholder img {
  width: auto;
  height: 42%;
  min-height: 56px;
  opacity: .55;
}
/* Profile body rhythm for the published team pages. */
body.flaw-legal-site .flaw-lawyer-profile__lead {
  font-size: var(--fs-lead);
  line-height: 1.55;
  color: var(--flaw-ink);
}
/* The §15 representative-experience disclosure.
   It is a <footer> scoped to the profile <article>, not a trailing <p> of the
   last <h2> section. That is a semantic fix, but it is also what makes this
   rule work: as a <p> the element was outranked by
   `… :is(.jpv-p1-page, .flaw-article-content, .entry-content) :is(p, li, dd, dt)`
   (specificity 0,2,2 against this rule's 0,2,1), so the disclosure rendered at
   full prose size and read as one more body paragraph. The reading measure
   that same rule set is restored explicitly here. */
body.flaw-legal-site .flaw-lawyer-profile__disclosure {
  max-width: var(--flaw-measure);
  margin-top: var(--s-6);
  padding-top: var(--s-4);
  border-top: 1px solid var(--flaw-line);
  font-size: var(--fs-small);
  line-height: 1.75;
  color: var(--flaw-muted);
}

body.flaw-legal-site .flaw-editorial-hero__device {
  display: block;
  width: auto;
  height: clamp(88px, 11vw, 148px);
  margin: 0 0 var(--s-5);
  opacity: .14;
}
@media (prefers-reduced-motion: no-preference) {
  body.flaw-legal-site .flaw-editorial-hero__device { transition: opacity .3s ease; }
}

body.flaw-legal-site .flaw-footer-contact__logo {
  display: block;
  width: auto;
  height: 132px;
  max-width: 100%;
  margin: 0 0 var(--s-5);
}
body.flaw-legal-site .flaw-footer-contact__brandline {
  margin: 0 0 var(--s-3);
  color: var(--flat-gray);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-footer-contact__legalname {
  margin: 0 0 var(--s-2);
  color: #fff;
  font-weight: 600;
}
body.flaw-legal-site .flaw-footer-contact a { color: #fff; }
body.flaw-legal-site .flaw-footer-contact__bottom {
  margin-top: var(--s-7);
  padding-top: var(--s-4);
  border-top-color: rgba(255, 255, 255, .18);
  color: rgba(255, 255, 255, .68);
  font-size: var(--fs-meta);
}
body.flaw-legal-site .footer-widgets .widget-title,
body.flaw-legal-site .footer-widgets .widget_text#text-19 > .widget-title {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}

/* ---------------------------------------------------------------------
   14. ACCESSIBILITY + MOTION
   ------------------------------------------------------------------ */
body.flaw-legal-site :focus-visible {
  outline: 2px solid var(--flaw-focus);
  outline-offset: 2px;
}
body.flaw-legal-site .flaw-editorial-hero :focus-visible,
body.flaw-legal-site .flaw-editorial-section--dark :focus-visible,
body.flaw-legal-site .flaw-editorial-final :focus-visible,
body.flaw-legal-site .flaw-footer-contact :focus-visible {
  outline-color: var(--flaw-gold-light);
}
body.flaw-legal-site a:not(.button):not([class*="flaw-editorial-button"]) { cursor: pointer; }
body.flaw-legal-site .skip-link:focus {
  position: fixed;
  top: .5rem;
  left: .5rem;
  z-index: 1000;
  width: auto;
  height: auto;
  clip: auto;
  clip-path: none;
  padding: .75rem 1rem;
  background: var(--flaw-burgundy);
  color: #fff;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  body.flaw-legal-site *,
  body.flaw-legal-site *::before,
  body.flaw-legal-site *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
  }
}

/* ---------------------------------------------------------------------
   Narrow-viewport corrections
   ------------------------------------------------------------------ */
@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-editorial-hero__grid,
  body.flaw-legal-site .flaw-editorial-split,
  body.flaw-legal-site .flaw-editorial-final__grid,
  body.flaw-legal-site .jpv-ml-hero-grid,
  body.flaw-legal-site .jpv-ml-contact-grid {
    grid-template-columns: 1fr;
    gap: var(--s-7);
  }
  body.flaw-legal-site .flaw-editorial-hero__wash { inset: 55% 0 0 0; }
  body.flaw-legal-site .jpv-ml-hero::before { inset: 55% 0 0 0; }
  body.flaw-legal-site .flaw-article-layout {
    grid-template-columns: 1fr;
    gap: var(--s-5);
  }
  body.flaw-legal-site .flaw-article-aside {
    order: 0;
    position: static;
    max-width: 100%;
  }
  body.flaw-legal-site .flaw-article-content { order: 1; }
}

@media (max-width: 620px) {
  body.flaw-legal-site .flaw-editorial-hero__statement { max-width: none; }
  body.flaw-legal-site .flaw-editorial-actions,
  body.flaw-legal-site .jpv-ml-actions {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--s-3);
  }
  body.flaw-legal-site .flaw-editorial-button,
  body.flaw-legal-site .jpv-ml-button,
  body.flaw-legal-site .flaw-article-footer .flaw-editorial-button {
    width: 100%;
    flex: 0 0 auto;
  }
  body.flaw-legal-site .flaw-editorial-audience-grid,
  body.flaw-legal-site .flaw-editorial-industry-grid,
  body.flaw-legal-site .jpv-ml-card-grid,
  body.flaw-legal-site .jpv-ml-list-grid,
  body.flaw-legal-site .jpv-ml-trust,
  body.flaw-legal-site .flaw-editorial-journal-grid,
  body.flaw-legal-site .flaw-footer-contact__grid { grid-template-columns: 1fr; }
  body.flaw-legal-site .flaw-editorial-practice { grid-template-columns: 2rem minmax(0, 1fr); padding-inline: 0; }
  body.flaw-legal-site .flaw-editorial-practice:hover { padding-inline: 0; }
  body.flaw-legal-site .flaw-editorial-practice__arrow,
  body.flaw-legal-site .flaw-editorial-audience .flaw-editorial-practice__arrow { display: none; }
  body.flaw-legal-site .flaw-editorial-audience { grid-template-columns: 2rem minmax(0, 1fr); }
  body.flaw-legal-site .flaw-article-footer { display: block; }
  body.flaw-legal-site .flaw-topic-filters { flex-wrap: wrap; overflow: visible; }
}

/* ---------------------------------------------------------------------
   15. LATE CORRECTIONS
   ------------------------------------------------------------------ */
/* Practice rows read as a list, not as a nearly-empty full-width band. */
body.flaw-legal-site .flaw-editorial-practice-list,
body.flaw-legal-site .flaw-editorial-audience-grid {
  max-width: 64rem;
}
body.flaw-legal-site .flaw-editorial-practice p { max-width: 52ch; }

/* Flatsome draws its own 2px `::before` bar under `.is-underline`; the
   label already carries a tighter rule, so remove the duplicate. */
body.flaw-legal-site .button.is-underline::before,
body.flaw-legal-site .button.is-underline::after { display: none; content: none; }

/* ---------------------------------------------------------------------
   16. GENERATOR-WRAPPED ARTICLE BODIES
   Post bodies are wrapped in `article.jpv-bulk-*` / `section`, so the
   child combinators above never reach the prose. Measure and rhythm are
   therefore applied by descendant, then reset inside tables and figures.
   ------------------------------------------------------------------ */
body.flaw-legal-site :is(.flaw-article-content, .entry-content) :is(p, ul, ol, dl, blockquote) {
  max-width: var(--flaw-measure);
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content) :is(table, figure, .wp-block-table, .wp-block-gallery) :is(p, ul, ol, dl) {
  max-width: none;
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content)
  :is(p, ul, ol, dl, blockquote, figure, table, hr, section, article) +
  :is(p, ul, ol, dl, blockquote, figure, table, hr, section, article) {
  margin-top: var(--s-5);
}
body.flaw-legal-site :is(.flaw-article-content, .entry-content) hr {
  height: 1px;
  margin-block: var(--s-7);
  border: 0;
  background: var(--flaw-line);
}

/* Article H1s carry long bilingual titles; 20ch forced four-line stacks. */
body.flaw-legal-site .flaw-article-header h1,
body.flaw-legal-site .flaw-journal-archive__header h1 { max-width: 24ch; }

/* Plugin furniture (star rating, view counter) belongs after the argument,
   not above the opening paragraph of a legal article. */
body.flaw-legal-site .flaw-article-content {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
body.flaw-legal-site .flaw-article-content > .kk-star-ratings { order: 90; }
body.flaw-legal-site .flaw-article-content > .post-views { order: 91; }
body.flaw-legal-site .flaw-article-content > :is(.kk-star-ratings, .post-views) {
  margin-top: var(--s-6);
  padding-top: var(--s-4);
  border-top: 1px solid var(--flaw-line);
  color: var(--flaw-muted);
  font-size: var(--fs-meta);
}

/* Chinese sets ~1 glyph per em, so the Latin `ch` measure is the wrong
   unit; 38em lands around 38 characters per line. */
html[lang^="zh"], body.flaw-locale-cn { --flaw-measure: 38em; }

/* ---------------------------------------------------------------------
   17. TYPEFACE ENFORCEMENT
   The legacy premium/journal/lawyer layers used to hardcode
   `font-family: Georgia, "Times New Roman", serif` here, which beat the
   base heading rule. Georgia carries no Han glyphs at all, so Chinese
   headings dropped to an arbitrary system face and Vietnamese headings
   rendered in a different serif from the rest of the page. Those 26
   declarations have now been deleted from the legacy files, so the
   doubled body class that used to be needed to outrank them is gone and
   this block simply states the display face for the elements that need
   it explicitly.
   ------------------------------------------------------------------ */
body.flaw-legal-site
  :is(.entry-content, .flaw-article-content, .flaw-article-header,
      .flaw-journal-archive__header, .flaw-journal-card__body,
      .flaw-lawyer-card, .flaw-lawyer-profile, .flaw-lawyer-archive__header,
      .flaw-editorial-hero, .flaw-editorial-intro, .flaw-editorial-section,
      .flaw-editorial-final, .flaw-editorial-story, .flaw-editorial-practice,
      .flaw-editorial-audience, .flaw-editorial-industry-grid,
      .flaw-dynamic-hub, .jpv-ml-hero, .jpv-ml-section, .jpv-ml-card,
      .jpv-ml-list-box, .jpv-ml-hero-card, .jpv-page, .jpv-hub-page,
      .content-area, .flaw-article-aside)
  :is(h1, h2, h3, h4, h5, h6, .flaw-article-aside__value,
      .flaw-editorial-intro__text, .flaw-editorial-hero__statement p,
      .flaw-editorial-industry-grid span) {
  font-family: var(--flaw-font-display);
}

body.flaw-legal-site :is(.jpv-ml-page, .entry-content, .flaw-article-content, .content-area) {
  font-family: var(--flaw-font-body);
}

/* An article body that repeats its own title as an in-body H1 must not
   compete with the template H1. Visual demotion only — markup untouched. */
body.flaw-legal-site :is(.flaw-article-content, .entry-content) h1 {
  max-width: 28ch;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
}

/* ---------------------------------------------------------------------
   18. GUTTER RECONCILIATION
   Flatsome insets content twice: `.row` padding plus a fixed 15px `.col`
   padding. Left alone the header sat at 23px while the page body sat at
   38px on the same viewport. Subtracting the column padding makes the
   final inset equal the design gutter everywhere.
   ------------------------------------------------------------------ */
body.flaw-legal-site .row,
body.flaw-legal-site .container {
  padding-inline: max(0px, calc(var(--flaw-gutter) - 15px));
}
body.flaw-legal-site .container > .row,
body.flaw-legal-site .container > * > .row { padding-inline: 0; }

/* ---------------------------------------------------------------------
   19. BARE `jpv-p1-page` PROSE PAGES
   A large share of the site (About, the investment guides and the deep
   practice pages) renders as `article.jpv-p1-page` placed straight into
   `.content-area` under Flatsome's page-blank template: no `.container`,
   no `.entry-content`, and therefore NO horizontal gutter at all — text
   ran edge to edge on every viewport. Earlier rules in `flaw-system.css`
   scoped this to `.jpv-hub-page .jpv-p1-page`, a combination that never
   matches in production.
   ------------------------------------------------------------------ */
body.flaw-legal-site .jpv-p1-page {
  width: var(--flaw-shell);
  max-width: none;
  margin-inline: auto;
  padding-block: var(--flaw-section-y) var(--flaw-section-y-lg);
  color: var(--flaw-ink-soft);
  font-size: var(--fs-prose);
  line-height: var(--lh-prose);
}
body.flaw-legal-site .jpv-p1-page > section { margin-top: var(--s-8); }
body.flaw-legal-site .jpv-p1-page > h1 { margin-bottom: var(--s-4); }
body.flaw-legal-site .jpv-p1-page > h1 + p {
  max-width: 60ch;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-lead);
  line-height: 1.62;
}

/* --- Shared prose behaviour across every body shape ---------------- */
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page)
  :is(p, ul, ol, dl, blockquote) { max-width: var(--flaw-measure); }
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page)
  :is(table, figure, .wp-block-table) :is(p, ul, ol, dl) { max-width: none; }

body.flaw-legal-site .jpv-p1-page :is(h2, h3, h4) { color: var(--flaw-ink); }
body.flaw-legal-site .jpv-p1-page h2 { margin-bottom: var(--s-4); }
body.flaw-legal-site .jpv-p1-page h3 { margin-top: var(--s-6); margin-bottom: var(--s-3); }
body.flaw-legal-site .jpv-p1-page :is(p, ul, ol, dl, blockquote, figure, table) +
  :is(p, ul, ol, dl, blockquote, figure, table) { margin-top: var(--s-5); }
body.flaw-legal-site .jpv-p1-page :is(ul, ol) { padding-left: 1.35em; }
body.flaw-legal-site .jpv-p1-page li + li { margin-top: var(--s-2); }
body.flaw-legal-site .jpv-p1-page li::marker { color: var(--flaw-burgundy); }
body.flaw-legal-site .jpv-p1-page a {
  color: var(--flaw-burgundy);
  text-decoration: underline;
  text-decoration-thickness: .06em;
  text-underline-offset: .18em;
  overflow-wrap: anywhere;
}

/* WCAG 1.4.1: a link inside running text must not be identified by colour alone.
   The `.jpv-p1-page a` rule above does not reach the generator's service/hub page
   bodies, whose closing wrapper falls before the contact section — the mailto: and
   tel: links there resolved to `main > section > p > a` with no themed ancestor, and
   Lighthouse flagged them (link-in-text-block) on 6 EN pages. Scoped to paragraphs,
   which is where running text lives: list, breadcrumb and card links are already
   underlined by their own components and are deliberately left untouched. */
body.flaw-legal-site main p a:not([class*="button"]) {
  text-decoration: underline;
  text-decoration-thickness: .06em;
  text-underline-offset: .18em;
}

/* --- Tables: one treatment for every body shape -------------------- */
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) table {
  display: block;
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
  border-collapse: collapse;
  font-size: var(--fs-small);
  line-height: 1.55;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) :is(thead, tbody, tr) {
  display: table;
  width: 100%;
  table-layout: auto;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) :is(th, td) {
  min-width: 9rem;
  padding: .7rem .85rem;
  border: 1px solid var(--flaw-line);
  text-align: left;
  vertical-align: top;
}
/* Flatsome ships `td { color: #666 }`, which the child theme had never
   overridden: table body text measured 2.98:1 on paper. Table headings keep
   full ink; cells use the body-copy tone at 7.2:1. */
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) td {
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) th {
  background: var(--flaw-ivory-2);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-weight: 600;
}
body.flaw-legal-site :is(.entry-content, .flaw-article-content, .jpv-p1-page, .content-area .col-inner) tbody tr:nth-child(even) {
  background: rgba(30, 27, 25, .025);
}

/* Stored bodies carry relative font-size bumps that compound with nesting;
   pin prose text to the scale instead of letting it drift. */
body.flaw-legal-site :is(.jpv-p1-page, .flaw-article-content, .entry-content) :is(p, li, dd, dt) {
  font-size: var(--fs-prose);
}
body.flaw-legal-site :is(.jpv-p1-page, .flaw-article-content, .entry-content) :is(td, th, figcaption, small) {
  font-size: var(--fs-small);
}

/* ---------------------------------------------------------------------
   20. LAZY-LOAD PLACEHOLDER
   LiteSpeed swaps images for a transparent placeholder, which paints as
   flat browser grey against the ivory page — a hard flash on every load,
   including above the fold. Tint the placeholder to the paper tone so the
   reveal reads as a soft fade rather than a broken image.
   ------------------------------------------------------------------ */
body.flaw-legal-site img[data-lazyloaded] {
  background-color: var(--flaw-ivory-2);
}
/* The brand device is excluded: `animation-fill-mode: both` holds the
   keyframe's final `opacity: 1` and would override the device's own
   low-opacity watermark treatment. */
body.flaw-legal-site img.litespeed-loaded:not(.flaw-editorial-hero__device),
body.flaw-legal-site img[data-lazyloaded].litespeed-loaded:not(.flaw-editorial-hero__device) {
  background-color: transparent;
  animation: flaw-img-in .25s ease-out both;
}
body.flaw-legal-site img.flaw-editorial-hero__device[data-lazyloaded] {
  background-color: transparent;
}
@keyframes flaw-img-in { from { opacity: .35; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  body.flaw-legal-site img.litespeed-loaded:not(.flaw-editorial-hero__device) { animation: none; }
}

/* ---------------------------------------------------------------------
   21. DARK-SURFACE TEXT COLOUR (authoritative)
   Several legacy layers and the interior-page prose rules both target
   paragraphs that live on dark panels. These declarations use a doubled
   body class so the dark surfaces always win, whatever runs before them.
   ------------------------------------------------------------------ */
/* Generic dark-surface hook.
   Flatsome's `[ux_text color="light"]` emits no class at all, so headings and
   paragraphs inside an inline-dark `[section]` inherited the charcoal body
   colour — measured 1.08:1 for the H2 and 1.66:1 for the paragraph on the
   practice hub, i.e. invisible. Wave H tags those sections in the source with
   `flaw-dark-surface` and the whole class of surface is owned here rather
   than one component at a time. */
body.flaw-legal-site.flaw-legal-site .flaw-dark-surface :is(h1, h2, h3, h4, h5, h6),
body.flaw-legal-site.flaw-legal-site .flaw-dark-surface > .section-content :is(h1, h2, h3, h4, h5, h6) {
  color: #fff;
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .flaw-dark-surface :is(p, li, address, span, td, th, dd, dt) {
  color: rgba(255, 255, 255, .86);
}
body.flaw-legal-site.flaw-legal-site .flaw-dark-surface :is(strong, b) { color: #fff; }
body.flaw-legal-site.flaw-legal-site .flaw-dark-surface a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]) {
  color: #fff;
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, .45);
  text-underline-offset: .18em;
}
body.flaw-legal-site.flaw-legal-site .flaw-dark-surface a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]):hover {
  color: var(--flat-gray);
  text-decoration-color: var(--flat-gray);
}

body.flaw-legal-site.flaw-legal-site .flaw-editorial-hero__lead,
body.flaw-legal-site.flaw-legal-site .flaw-editorial-hero__statement p,
body.flaw-legal-site.flaw-legal-site .flaw-editorial-section--dark :is(p, li),
body.flaw-legal-site.flaw-legal-site .flaw-editorial-final :is(p, li),
body.flaw-legal-site.flaw-legal-site .jpv-ml-hero :is(p, li),
body.flaw-legal-site.flaw-legal-site .jpv-ml-contact-section :is(p, li),
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact :is(p, li, address, span) {
  color: rgba(255, 255, 255, .86);
}
body.flaw-legal-site.flaw-legal-site .flaw-editorial-hero__statement > span {
  color: rgba(255, 255, 255, .55);
}
/* Links on dark surfaces were never given a colour, so they fell through to
   Flatsome's navy. On the burgundy contact panel that put the firm's own
   phone number and email at 1.17:1 — present but unreadable. White on
   burgundy measures 9.6:1. */
body.flaw-legal-site.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-final,
  .flaw-editorial-section--dark, .jpv-ml-hero, .jpv-ml-contact-section)
  a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]) {
  color: #fff;
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, .45);
  text-underline-offset: .18em;
}
body.flaw-legal-site.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-final,
  .flaw-editorial-section--dark, .jpv-ml-hero, .jpv-ml-contact-section)
  a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]):hover {
  color: var(--flaw-gold-light);
  text-decoration-color: var(--flaw-gold-light);
}
body.flaw-legal-site.flaw-legal-site :is(.flaw-editorial-hero, .flaw-editorial-final,
  .flaw-editorial-section--dark) .flaw-editorial-kicker,
body.flaw-legal-site.flaw-legal-site .jpv-ml-hero .jpv-ml-eyebrow,
body.flaw-legal-site.flaw-legal-site .jpv-ml-contact-section .jpv-ml-eyebrow,
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__label {
  color: var(--flaw-gold-light);
}
body.flaw-legal-site.flaw-legal-site .flaw-editorial-industry-grid span {
  color: rgba(255, 255, 255, .9);
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact :is(a, .flaw-footer-contact__bottom) {
  color: rgba(255, 255, 255, .78);
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact a:hover { color: #fff; }

/* 404 --------------------------------------------------------------- */
body.flaw-legal-site .flaw-error-404__text {
  max-width: var(--flaw-measure);
  margin-top: var(--s-4);
  color: var(--flaw-ink-soft);
  font-size: var(--fs-lead);
  line-height: var(--lh-body);
}
body.flaw-legal-site .flaw-error-404__search {
  max-width: 32rem;
  margin-top: var(--s-6);
}
body.flaw-legal-site .flaw-error-404 .flaw-editorial-actions {
  margin-top: var(--s-6);
}
body.flaw-legal-site .flaw-error-404 .flaw-related-content {
  margin-top: var(--s-9);
}

/* ---------------------------------------------------------------------
   22. EMPTY STATES
   The card grids paint their 1px gaps by showing a rule colour through
   the gap, so an EMPTY grid renders as one flat grey slab (visible today
   on the people archive, where all seven profiles are still drafts).
   ------------------------------------------------------------------ */
body.flaw-legal-site :is(.flaw-lawyer-grid, .flaw-journal-grid):not(:has(.flaw-lawyer-card, .flaw-journal-card)) {
  display: block;
  background: transparent;
  border: 0;
}
body.flaw-legal-site :is(.flaw-lawyer-grid, .flaw-journal-grid) > p:only-child,
body.flaw-legal-site .flaw-dynamic-hub__empty {
  max-width: var(--flaw-measure);
  margin: 0;
  padding: var(--s-5);
  border: 1px solid var(--flaw-line);
  border-left: 2px solid var(--flaw-burgundy);
  background: var(--flaw-surface);
  color: var(--flaw-ink-soft);
  font-size: var(--fs-body);
  line-height: 1.6;
}

/* =====================================================================
   23. NAVIGATION SYSTEM  (supersedes the CSS-only dropdown in §6)

   The previous navigation opened submenus with `li:hover > ul.sub-menu`
   and offset the panel `top: calc(100% + 1rem)` — a 16px dead gap, so the
   pointer left the hover region before reaching the panel. There was no
   disclosure button and no aria-expanded anywhere in the navigation, the
   third level overlapped its own parent on desktop, and on touch the
   second level was permanently expanded while the third was display:none.

   This block defines one component, `.flaw-nav-item`, whose open state is
   the single class `.is-open`. assets/js/flaw-shell.js sets that class from
   hover intent, click, ArrowDown or tap; the markup, the ARIA and the CSS
   are identical in both modes, so there is one logical menu.
   ================================================================== */

body.flaw-legal-site .flaw-site-nav__list {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: clamp(.4rem, 1.1vw, 1.1rem);
  flex-wrap: nowrap;
  margin: 0;
  padding: 0;
  list-style: none;
}

body.flaw-legal-site .flaw-nav-item {
  position: relative;
  display: flex;
  align-items: center;
  margin: 0;
}

body.flaw-legal-site .flaw-nav-item__link {
  display: inline-flex;
  align-items: center;
  min-height: 2.75rem;
  padding-inline: .25rem;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-nav);
  font-weight: 500;
  letter-spacing: var(--ls-nav);
  line-height: 1.3;
  text-decoration: none;
  white-space: nowrap;
}
body.flaw-legal-site .flaw-nav-item__link:hover,
body.flaw-legal-site .flaw-nav-item.is-open > .flaw-nav-item__link {
  color: var(--flaw-burgundy);
}

/* Disclosure. A real <button> so the state is announced and Enter/Space
   work; the label beside it keeps its own href. */
body.flaw-legal-site .flaw-nav-item__toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.75rem;
  min-height: 2.75rem;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  cursor: pointer;
}
body.flaw-legal-site .flaw-nav-item__chevron {
  width: .42rem;
  height: .42rem;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: translateY(-.12em) rotate(45deg);
  transition: transform .18s ease;
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site .flaw-nav-item.is-open .flaw-nav-item__chevron {
  transform: translateY(.08em) rotate(-135deg);
  color: var(--flaw-burgundy);
}

/* ---- panels ------------------------------------------------------ */

body.flaw-legal-site .flaw-nav-panel { display: none; }
body.flaw-legal-site .flaw-nav-item.is-open > .flaw-nav-panel { display: block; }

@media (min-width: 1025px) {
  /* The wide practice panel spans the header rather than its own <li>, so
     it can never leave the viewport. `position: static` on the item makes
     the sticky header the containing block. */
  body.flaw-legal-site .flaw-nav-item--panel { position: static; }

  body.flaw-legal-site .flaw-nav-panel {
    position: absolute;
    top: 100%;
    z-index: 30;
    /* Padding, not margin: the gap between trigger and card stays inside
       the panel's own hit area, so the pointer never crosses dead space. */
    padding-top: .5rem;
  }
  body.flaw-legal-site .flaw-nav-panel--list { left: 0; min-width: 16rem; }
  body.flaw-legal-site .flaw-nav-panel--list.is-flipped { left: auto; right: 0; }
  body.flaw-legal-site .flaw-nav-panel--clusters { left: 0; right: 0; }

  body.flaw-legal-site .flaw-nav-panel__inner {
    border-top: 2px solid var(--flaw-burgundy);
    background: var(--flaw-surface);
    box-shadow: var(--flaw-shadow);
  }
  body.flaw-legal-site .flaw-nav-panel--list .flaw-nav-panel__inner {
    padding: var(--s-3) var(--s-4);
  }
  body.flaw-legal-site .flaw-nav-panel--clusters .flaw-nav-panel__inner {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--s-5) var(--s-6);
    width: var(--flaw-shell);
    margin-inline: auto;
    padding: var(--s-6) 0 var(--s-7);
    /* The panel spans the header, so the card surface must too. */
    box-shadow: none;
    background: transparent;
    border-top: 0;
  }
  body.flaw-legal-site .flaw-nav-panel--clusters {
    background: var(--flaw-surface);
    border-top: 2px solid var(--flaw-burgundy);
    box-shadow: var(--flaw-shadow);
  }
  /* The 0.5rem bridge must not paint over the header's own border. */
  body.flaw-legal-site .flaw-nav-panel--clusters { padding-top: 0; }
}

@media (min-width: 1400px) {
  /* Seven practice clusters (inc/routes.php). Four columns divides them 4+3;
     five would leave a 5+2 row with two orphans against three empty tracks. */
  body.flaw-legal-site .flaw-nav-panel--clusters .flaw-nav-panel__inner {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

body.flaw-legal-site .flaw-nav-cluster__label {
  margin: 0 0 var(--s-2);
  color: var(--flaw-burgundy);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-nav-cluster__list,
body.flaw-legal-site .flaw-nav-panel__list {
  margin: 0;
  padding: 0;
  list-style: none;
}
body.flaw-legal-site .flaw-nav-cluster__list li,
body.flaw-legal-site .flaw-nav-panel__list li { margin: 0; }
body.flaw-legal-site .flaw-nav-cluster__list a,
body.flaw-legal-site .flaw-nav-panel__list a {
  display: block;
  padding: .45rem 0;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.45;
  text-decoration: none;
}
body.flaw-legal-site .flaw-nav-cluster__list a:hover,
body.flaw-legal-site .flaw-nav-cluster__list a:focus-visible,
body.flaw-legal-site .flaw-nav-panel__list a:hover,
body.flaw-legal-site .flaw-nav-panel__list a:focus-visible {
  color: var(--flaw-burgundy);
}

/* The drawer's Contact row exists only where the header CTA cannot fit.
   Between 1025px and 1180px the bar is still horizontal but too narrow for
   the button, so the row appears there as a normal nav item — that window
   previously had no contact CTA at all. */
body.flaw-legal-site .flaw-nav-item--drawer-cta { display: none; }
@media (max-width: 1180px) {
  body.flaw-legal-site .flaw-nav-item--drawer-cta { display: flex; }
  body.flaw-legal-site .flaw-nav-item--drawer-cta > .flaw-nav-item__link {
    color: var(--flaw-burgundy);
    font-weight: 600;
  }
}

/* ---- collapsed navigation --------------------------------------- */

@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-site-nav__list {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    width: var(--flaw-shell);
    margin-inline: auto;
  }
  body.flaw-legal-site .flaw-nav-item {
    flex-wrap: wrap;
    border-bottom: 1px solid var(--flaw-line);
  }
  body.flaw-legal-site .flaw-nav-item__link {
    flex: 1 1 auto;
    min-height: 48px;
    padding: .75rem 0;
    font-size: .9375rem;
    font-weight: 600;
    white-space: normal;
  }
  /* 44px minimum target, and it must not overlap the link's own hit area. */
  body.flaw-legal-site .flaw-nav-item__toggle {
    flex: 0 0 auto;
    width: 44px;
    min-height: 48px;
  }
  body.flaw-legal-site .flaw-nav-panel {
    flex: 0 0 100%;
    order: 3;
    padding: 0 0 var(--s-3) var(--s-4);
    border-left: 2px solid var(--flaw-line);
    margin-bottom: var(--s-2);
  }
  body.flaw-legal-site .flaw-nav-panel__inner {
    display: block;
    background: transparent;
    border: 0;
    box-shadow: none;
    padding: 0;
    width: auto;
  }
  body.flaw-legal-site .flaw-nav-cluster + .flaw-nav-cluster { margin-top: var(--s-4); }
  body.flaw-legal-site .flaw-nav-cluster__list a,
  body.flaw-legal-site .flaw-nav-panel__list a {
    display: flex;
    align-items: center;
    min-height: 44px;
    color: var(--flaw-ink-soft);
    font-size: .875rem;
  }
}

/* =====================================================================
   24. SKIP LINK AND STICKY-HEADER SCROLL OFFSET

   The theme's own `.flaw-skip-link` was removed with the E-H structural
   wave: Flatsome's header.php already prints one, so the page carried
   two consecutive skip links. Its styles went with it; the surviving
   link is styled in section 30.4.
   ================================================================== */

/*
 * The header is `position: sticky; top: 0` and is 77px tall on desktop,
 * 68px on mobile. Without a scroll offset, every in-page anchor landed
 * its target underneath it — including `#flaw-enquiry`, which is where
 * the header CTA points on all three Contact pages and both editorial
 * homepages, and `#main`, which is the skip link's target. The heading
 * or first form row was hidden behind the bar on arrival.
 *
 * Set on the scroll container. `:root` rather than `html` so it outranks
 * the admin bar's own `html { scroll-padding-top: 32px }` regardless of
 * stylesheet order, and the admin-bar case gets the taller offset.
 */
:root { scroll-padding-top: 6rem; }
html:has(body.admin-bar) { scroll-padding-top: 8rem; }

body.flaw-legal-site .flaw-anchor-alias {
  display: block;
  height: 0;
  scroll-margin-top: 92px;
}

/* =====================================================================
   25. BREADCRUMB
   ================================================================== */
body.flaw-legal-site .flaw-breadcrumb-band {
  padding-block: var(--s-4) 0;
}
body.flaw-legal-site .flaw-breadcrumb__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .25rem .5rem;
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.5;
}
body.flaw-legal-site .flaw-breadcrumb__item { margin: 0; display: flex; align-items: center; gap: .5rem; }
body.flaw-legal-site .flaw-breadcrumb__item + .flaw-breadcrumb__item::before {
  content: "/";
  color: var(--flaw-muted);
}
body.flaw-legal-site .flaw-breadcrumb__item a {
  color: var(--flaw-ink-soft);
  text-decoration: none;
}
body.flaw-legal-site .flaw-breadcrumb__item a:hover { color: var(--flaw-burgundy); text-decoration: underline; }
body.flaw-legal-site .flaw-breadcrumb__item [aria-current="page"] { color: var(--flaw-muted); }

/* =====================================================================
   26. FORM SYSTEM

   One presentation for every Contact Form 7 instance: consistent 48px
   controls, visible labels, a real focus ring, an error state that is not
   colour-only, and themed loading / success / failure output. Corporate,
   not SaaS: 2px radius, no pill fields, no drop shadows.
   ================================================================== */
body.flaw-legal-site .flaw-form {
  --flaw-field-h: 48px;
  max-width: 42rem;
}
body.flaw-legal-site .flaw-form__title {
  margin: 0 0 var(--s-4);
  font-size: var(--fs-h3);
}
body.flaw-legal-site .flaw-form .wpcf7-form > p,
body.flaw-legal-site .flaw-form .jpv-ml-cf7 { margin: 0; }

body.flaw-legal-site .flaw-form .flaw-form__grid,
body.flaw-legal-site .flaw-form .jpv-ml-cf7,
body.flaw-legal-site .flaw-form .jpv-cf7-form {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s-4);
}
body.flaw-legal-site .flaw-form .flaw-form__grid > label,
body.flaw-legal-site .flaw-form .jpv-ml-cf7 > label,
body.flaw-legal-site .flaw-form .jpv-cf7-form > label {
  display: flex;
  flex-direction: column;
  gap: .4rem;
  margin: 0;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .01em;
}
body.flaw-legal-site .flaw-form .jpv-ml-cf7-wide,
body.flaw-legal-site .flaw-form .jpv-cf7-form > label:has(textarea) {
  grid-column: 1 / -1;
}

body.flaw-legal-site .flaw-form :is(input[type="text"], input[type="email"], input[type="tel"], input[type="url"], input[type="date"], input[type="number"], select, textarea) {
  width: 100%;
  min-height: var(--flaw-field-h);
  padding: .6rem .8rem;
  border: 1px solid var(--flaw-line-strong);
  border-radius: var(--flaw-radius);
  background: #fff;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-body);
  font-weight: 400;
  line-height: 1.5;
  box-shadow: none;
  transition: border-color .15s ease;
}
body.flaw-legal-site .flaw-form textarea { min-height: 8.5rem; resize: vertical; }
body.flaw-legal-site .flaw-form select { appearance: none; padding-right: 2.2rem;
  background-image: linear-gradient(45deg, transparent 50%, var(--flaw-ink-soft) 50%), linear-gradient(135deg, var(--flaw-ink-soft) 50%, transparent 50%);
  background-position: calc(100% - 1.15rem) 55%, calc(100% - .85rem) 55%;
  background-size: .32rem .32rem, .32rem .32rem;
  background-repeat: no-repeat;
}
body.flaw-legal-site .flaw-form :is(input, select, textarea)::placeholder {
  color: var(--flaw-muted);
  opacity: 1;
}
body.flaw-legal-site .flaw-form :is(input, select, textarea):focus-visible {
  outline: 2px solid var(--flaw-focus);
  outline-offset: 1px;
  border-color: var(--flaw-focus);
}
body.flaw-legal-site .flaw-form :is(input, select, textarea):disabled,
body.flaw-legal-site .flaw-form.is-submitting :is(input, select, textarea) {
  background: var(--flaw-ivory-2);
  color: var(--flaw-muted);
  cursor: not-allowed;
}

/* Required marker — a second, non-colour cue alongside the error state.
   The visible * is emitted in the form template with aria-hidden, and CF7
   emits aria-required on the control itself, so the cue is not colour-only
   and is not announced twice. */
body.flaw-legal-site .flaw-form__required {
  color: var(--flaw-burgundy);
  font-weight: 700;
}
body.flaw-legal-site .flaw-form__legend {
  grid-column: 1 / -1;
  margin: 0;
  color: var(--flaw-muted);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
}
body.flaw-legal-site .flaw-form__consent,
body.flaw-legal-site .flaw-form__actions { grid-column: 1 / -1; }

/* Consent. */
body.flaw-legal-site .flaw-form .wpcf7-acceptance .wpcf7-list-item { margin: 0; }
body.flaw-legal-site .flaw-form .wpcf7-acceptance label {
  display: grid;
  grid-template-columns: 1.25rem 1fr;
  gap: .7rem;
  align-items: start;
  font-size: var(--fs-meta);
  font-weight: 400;
  line-height: 1.55;
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site .flaw-form .wpcf7-acceptance input[type="checkbox"] {
  width: 1.25rem;
  height: 1.25rem;
  margin: .15rem 0 0;
  accent-color: var(--flaw-burgundy);
}

/* Submit — the primary button, at form scale. */
body.flaw-legal-site .flaw-form .wpcf7-submit {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--flaw-field-h);
  padding-inline: var(--s-6);
  border: 1px solid var(--flaw-burgundy);
  border-radius: var(--flaw-radius);
  background: var(--flaw-burgundy);
  color: #fff;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: none;
  cursor: pointer;
  transition: background-color .15s ease;
}
body.flaw-legal-site .flaw-form .wpcf7-submit:hover,
body.flaw-legal-site .flaw-form .wpcf7-submit:focus-visible {
  background: var(--flaw-burgundy-deep);
  border-color: var(--flaw-burgundy-deep);
}
body.flaw-legal-site .flaw-form .wpcf7-submit:disabled { opacity: .55; cursor: progress; }

/* Field-level error. Never colour alone: a left rule, a bold prefix marker
   and a heavier weight all carry the same message. */
body.flaw-legal-site .flaw-form .wpcf7-not-valid-tip {
  display: block;
  margin-top: .35rem;
  padding-left: .6rem;
  border-left: 2px solid var(--flaw-crimson, var(--flat-crimson));
  color: #8C1226;
  font-size: var(--fs-meta);
  font-weight: 600;
  line-height: 1.45;
}
body.flaw-legal-site .flaw-form .wpcf7-not-valid-tip::before { content: "! "; font-weight: 700; }
body.flaw-legal-site .flaw-form :is(input, select, textarea).wpcf7-not-valid {
  border-color: #8C1226;
  border-left-width: 3px;
}

/* Form-level response. */
body.flaw-legal-site .flaw-form .wpcf7-response-output {
  grid-column: 1 / -1;
  margin: var(--s-4) 0 0;
  padding: var(--s-4);
  border: 1px solid var(--flaw-line-strong);
  border-left: 3px solid var(--flaw-ink-soft);
  border-radius: 0;
  background: var(--flaw-surface);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.6;
}
body.flaw-legal-site .flaw-form form.sent .wpcf7-response-output {
  border-left-color: var(--flaw-burgundy);
  background: var(--flaw-ivory-2);
  font-weight: 600;
}
body.flaw-legal-site .flaw-form form.invalid .wpcf7-response-output,
body.flaw-legal-site .flaw-form form.failed .wpcf7-response-output,
body.flaw-legal-site .flaw-form form.spam .wpcf7-response-output {
  border-left-color: #8C1226;
  color: #8C1226;
  font-weight: 600;
}

/* Loading. CF7's spinner is a background GIF with no accessible name; the
   bar below reads as progress and respects reduced motion. */
body.flaw-legal-site .flaw-form .wpcf7-spinner {
  width: 100%;
  height: 2px;
  margin: var(--s-3) 0 0;
  border-radius: 0;
  background: var(--flaw-line);
  background-image: linear-gradient(90deg, var(--flaw-burgundy) 0 40%, transparent 40%);
  background-size: 60% 100%;
  background-repeat: no-repeat;
  animation: flaw-form-progress 1.1s linear infinite;
}
@keyframes flaw-form-progress {
  from { background-position: -60% 0; }
  to   { background-position: 160% 0; }
}

body.flaw-legal-site .flaw-form__note {
  grid-column: 1 / -1;
  margin: var(--s-4) 0 0;
  color: var(--flaw-muted);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.55;
}
/* The privacy-policy pointer that sits under the consent gate. It belongs to
   the shared form shell, not to one page: form 3785 renders on both the
   Vietnamese Contact page and the Vietnamese homepage enquiry band, and the
   English and Chinese forms will carry their own locale's policy link when
   they reach parity. Kept OUT of the [acceptance] label so that clicking the
   link never toggles the consent checkbox, and so the link text names its
   destination instead of being a phrase inside the consent sentence. */
/* The selector is (0,4,2) rather than (0,2,1) because the interior-page prose
   rule `…content-area .col-inner :is(p, li)` (0,4,2) also matches this
   paragraph on the Vietnamese homepage, where the same form 3785 is rendered
   inside a Flatsome column — it was painting the line at the 18px prose size,
   heavier than the 13px consent sentence directly above it. Same tie-break
   technique as sections 30 and 31: match the specificity, win on source
   order, no !important, every class genuinely on the element. */
body.flaw-legal-site.flaw-legal-site .flaw-form p.flaw-form__privacy {
  grid-column: 1 / -1;
  margin: calc(var(--s-2) * -1) 0 0;
  color: var(--flaw-muted);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.55;
}

body.flaw-legal-site .flaw-form__fallback { font-size: var(--fs-body); }

@media (max-width: 720px) {
  body.flaw-legal-site .flaw-form .flaw-form__grid,
  body.flaw-legal-site .flaw-form .jpv-ml-cf7,
  body.flaw-legal-site .flaw-form .jpv-cf7-form { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   27. FOOTER NAVIGATION

   The footer carried no links at all, so the thirteen policy and legal
   pages had no route from anywhere on the site.
   ================================================================== */
body.flaw-legal-site .flaw-footer-contact__grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1.2fr;
  gap: var(--s-6) var(--s-7);
  align-items: start;
}
body.flaw-legal-site .flaw-footer-contact__tagline {
  margin: var(--s-3) 0 0;
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h4);
  line-height: 1.35;
}
body.flaw-legal-site .flaw-footer-nav h2.flaw-footer-contact__label {
  margin: 0 0 var(--s-3);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-footer-nav ul { margin: 0; padding: 0; list-style: none; }
body.flaw-legal-site .flaw-footer-nav li { margin: 0; }
body.flaw-legal-site .flaw-footer-nav a {
  display: block;
  padding: .38rem 0;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.5;
  text-decoration: none;
}
body.flaw-legal-site .flaw-footer-nav a:hover { text-decoration: underline; }
body.flaw-legal-site .flaw-footer-contact__languages { opacity: .85; }
body.flaw-legal-site .flaw-footer-legal {
  display: flex;
  flex-wrap: wrap;
  gap: .35rem 1.1rem;
}
body.flaw-legal-site .flaw-footer-legal a {
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  text-decoration: none;
}
body.flaw-legal-site .flaw-footer-legal a:hover { text-decoration: underline; }
body.flaw-legal-site .flaw-footer-contact__disclaimer {
  padding-top: var(--s-4);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-meta);
  line-height: 1.6;
  opacity: .78;
}

@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-footer-contact__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 600px) {
  body.flaw-legal-site .flaw-footer-contact__grid { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   28. HOMEPAGE — cross-border band, non-interactive audience cards
   ================================================================== */
body.flaw-legal-site .flaw-editorial-audience {
  /* These four are descriptive content, not links. Keep the card shape but
     drop every affordance that implies a destination. */
  cursor: default;
}
body.flaw-legal-site .flaw-editorial-crossborder__action {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--s-4);
}
body.flaw-legal-site .flaw-editorial-crossborder__brand {
  margin: 0;
  font-family: var(--flaw-font-cjk-serif);
  font-size: var(--fs-h3);
  line-height: 1.3;
}
body.flaw-legal-site .flaw-editorial-actions--center {
  justify-content: center;
  margin-top: var(--s-6);
}
body.flaw-legal-site .flaw-editorial-final__grid { align-items: start; }
body.flaw-legal-site .flaw-editorial-final__lead { margin-block: var(--s-4); }
body.flaw-legal-site .flaw-editorial-final__channels {
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-body);
}
body.flaw-legal-site .flaw-editorial-final__channels li { margin: 0 0 .35rem; }
body.flaw-legal-site .flaw-editorial-final__form .flaw-form { max-width: none; }

/* =====================================================================
   29. REDUCED MOTION
   ================================================================== */
@media (prefers-reduced-motion: reduce) {
  body.flaw-legal-site .flaw-nav-item__chevron,
  body.flaw-legal-site .flaw-form :is(input, select, textarea),
  body.flaw-legal-site .flaw-form .wpcf7-submit { transition: none; }
  body.flaw-legal-site .flaw-form .wpcf7-spinner { animation: none; background-image: none; }
}

/* =====================================================================
   30. STRUCTURAL PHASE — INTERIOR PAGE SHELL, PEOPLE BAND, SKIP LINK

   Added with the E–H structural wave. Everything here styles markup that
   the theme itself emits; no stored page body is targeted except where
   noted, and in that one case the rule only removes a competing button
   style rather than changing what the content says.
   ================================================================== */

/* --- 30.1 Practice-page eyebrow ------------------------------------
   Sits between the breadcrumb and the H1 that the page body supplies,
   so it needs the breadcrumb band's own rhythm rather than a section
   head's. */
body.flaw-legal-site .flaw-page-eyebrow {
  margin: var(--s-5) 0 0;
}

/* --- 30.2 Interior-page footer block -------------------------------
   Related practices + the page's one primary CTA. Appended after the
   stored body on practice pages and the services hub. */
body.flaw-legal-site .flaw-page-footer {
  width: min(calc(100% - 3rem), 1280px);
  margin: var(--s-8) auto 0;
  padding-top: var(--s-7);
  border-top: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-page-footer__related { margin-bottom: var(--s-7); }
body.flaw-legal-site .flaw-page-footer__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
  gap: var(--s-3) var(--s-6);
  margin: var(--s-4) 0 0;
  padding: 0;
  list-style: none;
}
body.flaw-legal-site .flaw-page-footer__list li { margin: 0; }
body.flaw-legal-site .flaw-page-footer__list a {
  display: block;
  padding: .55rem 0;
  border-bottom: 1px solid var(--flaw-line);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-body);
  line-height: 1.4;
  text-decoration: none;
}
body.flaw-legal-site .flaw-page-footer__list a:hover { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-page-footer__cta {
  padding: var(--s-7);
  background: var(--flaw-ivory-2);
}
body.flaw-legal-site .flaw-page-footer__lead {
  max-width: 46ch;
  margin: 0;
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h3);
  line-height: 1.25;
}
body.flaw-legal-site .flaw-page-footer .flaw-editorial-actions { margin-top: var(--s-5); }

/* --- 30.3 Homepage People band -------------------------------------
   Reuses the lawyer-directory card so the site has one people card. */
body.flaw-legal-site .flaw-editorial-people .flaw-lawyer-grid { margin-top: var(--s-6); }
body.flaw-legal-site .flaw-editorial-people .flaw-lawyer-card__body h3 {
  margin: .35rem 0 .5rem;
  font-size: var(--fs-h4);
}

/* --- 30.4 One skip link, and it must be visible when focused -------
   The theme's own duplicate skip link is gone; the parent's is now the
   only one and it is served from the theme dictionary. Flatsome hides
   it with .screen-reader-text but does not style its focused state to
   this design system. */
body.flaw-legal-site a.skip-link:focus,
body.flaw-legal-site a.skip-link:focus-visible {
  position: fixed;
  top: .5rem;
  left: .5rem;
  z-index: 10000;
  width: auto;
  height: auto;
  clip: auto;
  clip-path: none;
  padding: .75rem 1.25rem;
  background: var(--flat-charcoal);
  color: #fff;
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-body);
  text-decoration: none;
  outline: 2px solid var(--flaw-focus);
  outline-offset: 2px;
}

/* --- 30.5 Retire the stored bodies' competing CTA button -----------
   Practice pages end their stored body with a `.jpv-cta` section whose
   link had no style of its own, and the Vietnamese homepage sets its
   in-body links as `.jpv-ml-button`. With the theme now supplying the
   one primary CTA on every practice page, a second solid button
   immediately above it would be two primary actions in a row. The
   stored link keeps its destination and its text and is presented as
   the tertiary style — a text link with an arrow — which is the third
   and last approved button style. Content is unchanged. */
body.flaw-legal-site .jpv-cta a:not(.jpv-ml-button) {
  display: inline-block;
  color: var(--flaw-burgundy);
  font-family: var(--flaw-font-ui);
  font-weight: 600;
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}
body.flaw-legal-site .jpv-cta a:not(.jpv-ml-button)::after { content: " ↗"; }
body.flaw-legal-site .jpv-cta a:not(.jpv-ml-button):hover { color: var(--flaw-burgundy-deep); }

/* --- 30.6 Touch target size for the language switcher --------------
   Measured at 390px during the E–H acceptance run: the three switcher
   links were 36 x 40, under the 44px practical minimum for a primary
   touch target (they cleared WCAG 2.2 AA 2.5.8's 24px, but the
   switcher is the only route between VI, EN and CN on a phone, so the
   practical floor is the one that matters). The bar has room: brand
   38px + 3 x 44px + a 44px burger is 214px of a 360px viewport. */
@media (max-width: 1024px) {
  body.flaw-legal-site .flaw-site-header__languages a {
    min-width: 2.75rem;
    min-height: 2.75rem;
  }
}
@media (max-width: 600px) {
  body.flaw-legal-site .flaw-site-header__languages a {
    min-width: 2.75rem;
    min-height: 2.75rem;
    padding-inline: .2rem;
  }
}

/* --- 30.7 The Vietnamese homepage hero is a dark surface -----------
   Measured live at 1440px during the Phase J run, on `/vn/` — the
   single most important page on the site:

     .jpv-ml-eyebrow / .jpv-ml-lead   #4A4A4A on #222222   1.80:1
     .jpv-ml-hero-card h2             #222222 on #2F2F2F   1.19:1
     .jpv-ml-hero-card li  (x5)       #4A4A4A on #2F2F2F   1.51:1
     .jpv-ml-button-ghost             #940C27 on #222222   1.77:1

   Eight of eleven AA failures on the page, and the 1.19:1 heading
   ("Bạn cần xử lý vấn đề pháp lý nào?") was effectively invisible.

   Same root cause as the Wave H H.3.2 defect: the stored hero paints a
   charcoal band, but only `.flaw-dark-surface` and the editorial
   sections were ever registered as dark, so the generic body rule
   `…​.content-area .col-inner :is(p, li)` (0,4,2) kept setting ink-soft
   on a charcoal ground. The body class is tripled to match that
   specificity and these rules sit last in the file, so they win the tie
   on source order. Nothing in post_content is touched — this only
   corrects the colour the theme paints the stored markup with.

   After: eyebrow/lead 12.2:1, card heading 13.4:1, list items 13.4:1,
   ghost button 15.9:1. */
body.flaw-legal-site.flaw-legal-site.flaw-legal-site :is(.jpv-ml-hero, .jpv-ml-hero-card) :is(h1, h2, h3, h4, h5, h6) {
  color: #fff;
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site :is(.jpv-ml-hero, .jpv-ml-hero-card) :is(p, li, span, dd, dt, strong, b) {
  color: rgba(255, 255, 255, .86);
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-hero .jpv-ml-eyebrow {
  color: var(--flaw-gold-light);
}
/* The ghost button is the hero's secondary action. On charcoal the
   burgundy outline is 1.77:1 for the label and barely visible as a
   border; the light variant is the same button in the approved
   reverse treatment. */
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-hero .jpv-ml-button-ghost {
  color: #fff;
  border-color: rgba(255, 255, 255, .55);
  background: transparent;
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-hero .jpv-ml-button-ghost:hover,
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-hero .jpv-ml-button-ghost:focus-visible {
  color: var(--flat-charcoal);
  background: #fff;
  border-color: #fff;
}

/* --- 30.8 `.jpv-ml-contact-section` is TWO different surfaces --------
   The same authored class paints two different grounds depending on the
   page it was written into:

     /vn/lien-he/, /en/contact/, /cn/contact-cn/   burgundy  #940C27
     /vn/  (the homepage enquiry band)             warm gray #D9D6D1

   The theme had it in the dark-surface set, which is right for the three
   Contact pages and wrong for the homepage: there it put the firm's own
   phone number and mailbox in white on warm gray at 1.45:1. Keying off
   the class alone cannot tell the two apart — the first attempt at this
   fix made every Contact page's links burgundy-on-burgundy — so the
   override is scoped by the homepage wrapper the stored markup provides.

   Burgundy on #D9D6D1 measures 6.9:1; ink-soft on #D9D6D1 measures 6.6:1. */
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-home .jpv-ml-contact-section
  a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]) {
  color: var(--flaw-burgundy);
  text-decoration: underline;
  text-decoration-color: rgba(148, 12, 39, .4);
  text-underline-offset: .18em;
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-home .jpv-ml-contact-section
  a:not(.button):not([class*="flaw-editorial-button"]):not([class*="jpv-ml-button"]):hover {
  color: var(--flaw-burgundy-deep);
  text-decoration-color: var(--flaw-burgundy-deep);
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-home .jpv-ml-contact-section .jpv-ml-eyebrow {
  color: var(--flaw-ink-soft);
}

/* --- 30.9 The enquiry card is always a white card -------------------
   `.jpv-ml-form-box` is a white panel, and on the Contact pages it sits
   inside the burgundy enquiry band. The band's dark-surface text rules
   were reaching into it, so the form's own "* required" legend rendered
   rgba(255,255,255,.86) on #FFFFFF — a 1.00:1 instruction the visitor
   could not read at all. A white card carries ink text wherever it is
   placed; CF7's own validation colours are left alone. */
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-form-box
  :is(p, li, span, strong, b, dd, dt, address):not(.wpcf7-not-valid-tip):not(.wpcf7-response-output):not([class*="wpcf7-form-control"]) {
  color: var(--flaw-ink-soft);
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site .jpv-ml-form-box :is(h1, h2, h3, h4, h5, h6, label) {
  color: var(--flaw-ink);
}

/* --- 30.10 Form labels on the dark enquiry band --------------------
   The editorial homepage places the enquiry form directly on the
   burgundy `.flaw-editorial-final` band, with no light card behind it —
   the Vietnamese homepage's white `.jpv-ml-form-box` is stored markup
   that only that page has. The shell's own text was already given the
   light treatment (the wrapper, the `* required` legend and the
   disclaimer note all resolve to white), but CF7 renders the field
   labels and the acceptance label itself, and those kept the ink
   colours:

     label                       #222222 on #940C27   1.77:1   (x7)
     .wpcf7-list-item-label      #4A4A4A on #940C27   1.01:1

   i.e. every field label on both the English and Chinese homepages, and
   the privacy acknowledgement the visitor has to read before the submit
   button unlocks. White is 9.0:1 on burgundy; .86 white is 7.4:1.

   Scoped to the dark bands only — on the Contact pages the same form
   sits inside a white card and must keep its ink labels. */
body.flaw-legal-site.flaw-legal-site.flaw-legal-site
  :is(.flaw-editorial-final, .flaw-editorial-section--dark, .flaw-dark-surface)
  .flaw-form :is(label, legend) {
  color: #fff;
}
body.flaw-legal-site.flaw-legal-site.flaw-legal-site
  :is(.flaw-editorial-final, .flaw-editorial-section--dark, .flaw-dark-surface)
  .flaw-form .wpcf7-list-item-label {
  color: rgba(255, 255, 255, .86);
}

/* --- 30.11 Target size (WCAG 2.2 AA, 2.5.8) ------------------------
   Two controls measured under 24 x 24 in the Phase J run:

     .flaw-breadcrumb__item a      98 x 20   (every interior page)
     input[name="privacy-consent"] 20 x 24   (all four enquiry forms)

   The breadcrumb crumbs are flex items, not inline text, so the
   "inline" exception does not apply, and a 24px circle centred on one
   crumb intersects its neighbour, so the spacing exception does not
   either. Padding is used rather than a bare min-height so the hit area
   grows around the text instead of leaving it top-aligned in a taller
   box; the band's own rhythm absorbs the 4px.

   The consent checkbox is the control that unlocks the submit button —
   Contact Form 7 keeps the button disabled until it is ticked — so it
   is the single most important small target on the site. Its label is
   clickable too, but the box itself should still meet the minimum. */
body.flaw-legal-site .flaw-breadcrumb__item :is(a, [aria-current="page"]) {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}
body.flaw-legal-site .flaw-form input[type="checkbox"] {
  min-width: 24px;
  min-height: 24px;
}

/* =====================================================================
   31. ENQUIRY FORM — REQUIRED MARKER AND ROW ALIGNMENT

   The required marker is authored inside the label, as
   `<label>Họ và tên <span class="flaw-form__required">*</span> [text* …]`,
   and section 26 lays each label out as `display: flex; flex-direction:
   column`. Every element child of a flex container is a flex item on its
   own line, so the marker became a third row between the label text and
   the control: required fields sat one label line plus one 0.4rem gap
   (25.9px, measured at 1440) below the non-required field beside them,
   and "Nội dung cần tư vấn" carried the same empty row above its
   textarea.

   The fix is structural rather than a nudge. The visible label text and
   its marker are wrapped in a single `.flaw-form__label` span in the
   three CF7 templates (3785 / 9506 / 9507), so every label is exactly
   two flex items — one text row, one control row — whether or not it is
   required, and the marker is ordinary inline content inside the text
   row. No negative margin, offset or transform is involved.

   The control rules below only restate what section 26 already intends.
   They are needed because two earlier rules outrank it on this form:

     body.flaw-legal-site :is(input:not(…), select, textarea)      (0,5,2)
     …jpv-contact-page .jpv-ml-form-box .jpv-ml-cf7 input:not(…)   (0,6,2)

   which is why the text input measured 45.6px, the selects 46.4px, and
   the textarea collapsed to 46.4px instead of honouring the 7rem /
   8.5rem min-height written for it. The selector used here is (0,6,3),
   so it clears both without `!important`, and every class in it is
   genuinely on the element. It is scoped to `.flaw-form
   .flaw-form__grid.jpv-ml-cf7`, which only the three enquiry forms
   carry — the footer form (`.jpv-cf7-form--footer`) and every other
   form on the site are outside it.
   ================================================================== */
body.flaw-legal-site .flaw-form .flaw-form__grid > label > .flaw-form__label {
  display: block;
  line-height: 1.65;
}
/* Pins the marker as inline content of the label's text row. */
body.flaw-legal-site .flaw-form .flaw-form__label .flaw-form__required {
  display: inline;
}
body.flaw-legal-site .flaw-form .flaw-form__grid.jpv-ml-cf7 > label > .wpcf7-form-control-wrap > :is(input.wpcf7-form-control, select.wpcf7-form-control, textarea.wpcf7-form-control) {
  min-height: var(--flaw-field-h, 48px);
  padding: .7rem .8rem;
}
/* Keeps the option text clear of the custom arrow drawn in section 26. */
body.flaw-legal-site .flaw-form .flaw-form__grid.jpv-ml-cf7 > label > .wpcf7-form-control-wrap > select.wpcf7-form-control {
  padding-right: 2.2rem;
}
body.flaw-legal-site .flaw-form .flaw-form__grid.jpv-ml-cf7 > label > .wpcf7-form-control-wrap > textarea.wpcf7-form-control {
  min-height: 8.5rem;
}

/* =====================================================================
   32. CONTACT PAGE V2  (`.flaw-contact-page`)

   The Vietnamese Contact body was a `.jpv-contact-page` shell inherited
   from the 2026-06-29 layout sync. Four legacy layers had accumulated
   overrides against `.jpv-ml-contact-section` / `.jpv-ml-form-box` /
   `.jpv-contact-page`, and the result was structurally functional but
   visually inconsistent: an eyebrow that repeated the breadcrumb's own
   "FLAT LAW FIRM" crumb immediately above the H1, two hero buttons that
   read as one semantically wrong string ("Gửi email (+84)988 424 851"),
   a full viewport-width burgundy enquiry band 812px tall, and three
   trailing sections of unstyled prose.

   This component does not fight that cascade — it replaces the class
   names. Nothing below is keyed to a `jpv-*` selector, so none of the
   legacy rules in flaw-premium-refinement.css, flaw-system.css or
   flaw-luxury-upgrade.css apply to the new body at all. The one legacy
   hook deliberately kept is the `jpv-ml-cf7` class inside the three CF7
   templates, because sections 26 and 31 own the form system through it
   and all three locales share it.

   Locale portability: every dimension is content-driven (grid `fr`,
   `minmax(0, …)`, `auto` rows, `ch`-free measures) so a longer English
   string or a denser Simplified Chinese string re-flows instead of
   clipping, and no form ID, string length or line count is assumed.
   ================================================================== */
body.flaw-legal-site .flaw-contact-page {
  /* Page-scoped tokens. Nothing here leaks to another template. */
  --flaw-contact-shell: min(100% - (2 * var(--flaw-gutter)), 1220px);
  --flaw-contact-measure: 51rem;                                  /* 816px */
  --flaw-contact-gap: clamp(3.5rem, 2.6rem + 3.4vw, 6.5rem);      /* 56 → 104 */
  --flaw-contact-pad: clamp(1.5rem, 1.0rem + 1.7vw, 2.75rem);     /* 24 → 44 */
  --flaw-contact-radius: 20px;

  width: var(--flaw-contact-shell);
  margin-inline: auto;
  /* §12 of the brief: breathing space before the global footer. */
  margin-bottom: clamp(3.5rem, 2.4rem + 2.8vw, 5.5rem);           /* 56 → 88 */
  color: var(--flaw-ink);
  font-family: var(--flaw-font-body);
}
body.flaw-legal-site .flaw-contact-page > * + * { margin-top: var(--flaw-contact-gap); }

/* --- 32.1 Shared eyebrow ------------------------------------------
   Same treatment as `.flaw-editorial-kicker` (§4), declared here so the
   component does not depend on a class the stored body would also have
   to carry. Copy is authored in sentence case; the caps are presentation. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-eyebrow {
  margin: 0 0 var(--s-3);
  color: var(--flaw-burgundy);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  line-height: 1.5;
  text-transform: uppercase;
}

/* --- 32.2 Page-scoped type ----------------------------------------
   The site scale tops out at 52px H1 / 36px H2, which is right for a
   practice page carrying a long title. The Contact H1 is three words,
   so the brief's 56–64 / 38–44 targets are applied here only. */
body.flaw-legal-site .flaw-contact-page h1 {
  margin: 0;
  font-family: var(--flaw-font-display);
  font-size: clamp(2.375rem, 1.15rem + 2.8vw, 3.75rem);           /* 38 → 60 */
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: var(--ls-display);
}
body.flaw-legal-site .flaw-contact-page h2 {
  margin: 0;
  font-family: var(--flaw-font-display);
  font-size: clamp(1.75rem, 1.1rem + 1.7vw, 2.625rem);            /* 28 → 42 */
  font-weight: 600;
  line-height: 1.18;
  letter-spacing: var(--ls-display);
}
body.flaw-legal-site .flaw-contact-page :is(p, li, dd, address) {
  font-size: var(--fs-prose);
  line-height: 1.7;
  font-style: normal;
}
body.flaw-legal-site .flaw-contact-page :is(h2, h3) + * { margin-top: var(--s-5); }

/* --- 32.3 Section 01 — hero ---------------------------------------
   Compact and institutional: eyebrow, H1, one lead at reading measure,
   then the two channels as labelled pairs. The previous body rendered
   them as two adjacent buttons whose labels concatenated into "Gửi
   email (+84)988 424 851" — a verb and a phone number reading as one
   string. A definition list states which value is which. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-hero {
  /* Measured at 1440: the brief's 300–360px band. The breadcrumb band above
     already supplies the top offset, so the hero adds little of its own. */
  padding-block: clamp(1rem, .75rem + .9vw, 1.625rem) clamp(1.5rem, 1.2rem + 1.0vw, 2rem);
  border-bottom: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-hero__lead {
  max-width: var(--flaw-contact-measure);
  margin: var(--s-5) 0 0;
  color: var(--flaw-ink-soft);
  font-size: clamp(1.125rem, 1.03rem + 0.42vw, 1.25rem);          /* 18 → 20 */
  line-height: 1.62;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-channels {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3) var(--s-7);
  margin: var(--s-4) 0 0;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-channels__item { margin: 0; }
/* Two legacy rules reach every definition list on the site: one sets
   `dl dd, dl dt { display: inline-block }`, which ran the label into its own
   value ("HOTLINE(+84) 988 424 851"), and one uppercases the whole `dl`,
   which inherited down into the mailbox ("INFO@FLAW.VN"). Both are reset on
   the component rather than edited at their source, which would change every
   other definition list on the site. */
body.flaw-legal-site .flaw-contact-page :is(.flaw-contact-channels, .flaw-contact-details) {
  text-transform: none;
}
body.flaw-legal-site .flaw-contact-page :is(.flaw-contact-channels, .flaw-contact-details) :is(dt, dd) {
  display: block;
}
body.flaw-legal-site .flaw-contact-page :is(.flaw-contact-channels, .flaw-contact-details) dt {
  margin: 0 0 .15rem;
  color: var(--flaw-muted);
  font-family: var(--flaw-font-ui);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-contact-page :is(.flaw-contact-channels, .flaw-contact-details) dd {
  margin: 0;
  font-family: var(--flaw-font-ui);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-channels a {
  display: inline-flex;
  align-items: center;
  min-height: 2.75rem;                                            /* 44px target */
  color: var(--flaw-burgundy);
  font-size: var(--fs-lead);
  font-weight: 600;
  text-decoration: none;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-channels a:hover,
body.flaw-legal-site .flaw-contact-page .flaw-contact-channels a:focus-visible {
  color: var(--flaw-burgundy-deep);
  text-decoration: underline;
  text-underline-offset: .18em;
}

/* --- 32.4 Section 02 — intake panel -------------------------------
   Contained, not full-bleed. The burgundy stays — it is the brand's
   one saturated surface and the enquiry is the page's primary action —
   but it is now a 39/61 panel inside the page container with a 20px
   radius, rather than a viewport-wide band. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake {
  display: grid;
  grid-template-columns: minmax(0, 39fr) minmax(0, 61fr);
  border: 1px solid var(--flaw-line);
  border-radius: var(--flaw-contact-radius);
  overflow: hidden;
  background: #fff;
}
/* The form column is the taller of the two on every desktop width, so the
   aside is stretched past its own content. Rather than leave 100px of empty
   burgundy under the address (the "awkward burgundy empty space" the brief
   calls out), the office block is pinned to the foot of the panel: the
   proposition reads at the top, the channels close it at the bottom. When the
   panel stacks on mobile the `auto` margin resolves to 0 and the block keeps
   its ordinary rhythm. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__aside {
  display: flex;
  flex-direction: column;
  padding: var(--flaw-contact-pad);
  background: var(--flat-burgundy);
  color: #fff;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__form {
  padding: var(--flaw-contact-pad);
  background: #fff;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__title {
  font-size: clamp(1.5rem, 1.2rem + 0.85vw, 1.9375rem);           /* 24 → 31 */
  line-height: 1.22;
}
/* The aside is a dark surface. Doubled body class so these win over the
   generic interior-page prose colour without !important; white on
   #940C27 is 9.0:1, .88 white is 7.6:1, warm gray is 6.2:1. */
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside :is(h2, h3) { color: #fff; }
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside :is(p, dd, address, li) {
  color: rgba(255, 255, 255, .88);
}
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside .flaw-contact-eyebrow,
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside dt {
  color: var(--flat-gray);
}
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside a {
  color: #fff;
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, .45);
  text-underline-offset: .18em;
}
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside a:hover,
body.flaw-legal-site.flaw-legal-site .flaw-contact-intake__aside a:focus-visible {
  text-decoration-color: #fff;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__body { margin: var(--s-4) 0 0; }
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__focus {
  margin: var(--s-4) 0 var(--s-6);
  padding-top: var(--s-4);
  border-top: 1px solid rgba(255, 255, 255, .28);
  font-size: var(--fs-body);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-details {
  display: grid;
  gap: var(--s-4);
  margin: auto 0 0;
  padding-top: var(--s-5);
  border-top: 1px solid rgba(255, 255, 255, .28);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-details__item { margin: 0; }
body.flaw-legal-site .flaw-contact-page .flaw-contact-details dd {
  font-size: var(--fs-body);
  line-height: 1.6;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-details :is(a, address) {
  display: inline-block;
  min-height: 1.5rem;
  font-style: normal;
}
/* §26 caps the shared form shell at 42rem so a form placed in a full-width
   column does not run to a 900px measure. Inside this panel the column IS
   the measure, so the cap is released and the two-column field grid keeps
   its intended proportions. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__form .flaw-form { max-width: none; }
/* The brief's submit label is set in caps; the CF7 object stores it in
   sentence case so assistive technology announces ordinary Vietnamese. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-intake__form .wpcf7-submit {
  width: 100%;
  text-transform: uppercase;
  letter-spacing: .08em;
}

/* --- 32.5 Section 03 — what to prepare ----------------------------
   Editorial checklist, not SaaS cards: one hairline border, no shadow,
   off-white ground, burgundy numbering supplied by a CSS counter so the
   ordinals are never part of the translated copy. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s-4);
  margin: var(--s-6) 0 0;
  padding: 0;
  list-style: none;
  counter-reset: flaw-contact-step;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__item {
  counter-increment: flaw-contact-step;
  margin: 0;
  padding: clamp(1.25rem, 1.05rem + 0.7vw, 1.5rem);               /* 20 → 24 */
  border: 1px solid var(--flaw-line);
  border-radius: 4px;
  background: var(--flaw-surface);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__item h3 {
  display: block;
  margin: 0;
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: clamp(1.1875rem, 1.09rem + 0.42vw, 1.3125rem);       /* 19 → 21 */
  font-weight: 600;
  letter-spacing: .03em;
  line-height: 1.32;
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__item h3::before {
  content: counter(flaw-contact-step, decimal-leading-zero) " — ";
  color: var(--flaw-burgundy);
  font-variant-numeric: tabular-nums;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__item p {
  margin: var(--s-3) 0 0;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-body);
  line-height: 1.65;
}

/* --- 32.6 Section 04 — FAQ ----------------------------------------
   Authored as headings and paragraphs, so the four answers are readable
   with no CSS and no JS at all. assets/js/flaw-contact.js upgrades each
   question in place to a real `<button aria-expanded aria-controls>` and
   collapses its panel; the styles below only apply once that upgrade has
   run (`.is-enhanced`), so the no-JS state is never a list of headings
   with hidden content. */
body.flaw-legal-site .flaw-contact-page .flaw-faq {
  max-width: var(--flaw-contact-measure);
  margin: var(--s-6) 0 0;
  border-top: 1px solid var(--flaw-line);
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__item { border-bottom: 1px solid var(--flaw-line); }
body.flaw-legal-site .flaw-contact-page .flaw-faq__question {
  margin: 0;
  padding-block: var(--s-4);
  font-family: var(--flaw-font-display);
  font-size: var(--fs-h4);
  font-weight: 600;
  line-height: 1.4;
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__answer { padding-bottom: var(--s-4); }
body.flaw-legal-site .flaw-contact-page .flaw-faq__answer p {
  max-width: var(--flaw-measure);
  margin: 0;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-body);
}

/* Enhanced state. */
body.flaw-legal-site .flaw-contact-page .flaw-faq.is-enhanced .flaw-faq__question { padding: 0; }
body.flaw-legal-site .flaw-contact-page .flaw-faq__trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  width: 100%;
  min-height: 2.75rem;                                            /* 44px target */
  margin: 0;
  padding: var(--s-4) 0;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--flaw-ink);
  font: inherit;
  text-align: left;
  text-transform: none;
  letter-spacing: normal;
  cursor: pointer;
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__trigger:hover { color: var(--flaw-burgundy); }
body.flaw-legal-site .flaw-contact-page .flaw-faq__trigger:focus-visible {
  outline: 2px solid var(--flaw-focus);
  outline-offset: -2px;
}
/* Indicator: a + that loses its vertical stroke when the panel opens. */
body.flaw-legal-site .flaw-contact-page .flaw-faq__icon {
  position: relative;
  flex: 0 0 auto;
  width: 1rem;
  height: 1rem;
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__icon::before,
body.flaw-legal-site .flaw-contact-page .flaw-faq__icon::after {
  content: "";
  position: absolute;
  inset: 50% 0 auto;
  height: 2px;
  background: var(--flaw-burgundy);
  transform: translateY(-1px);
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__icon::after {
  inset: 0 50% auto;
  width: 2px;
  height: 100%;
  transform: translateX(-1px);
  transition: opacity .15s ease;
}
body.flaw-legal-site .flaw-contact-page .flaw-faq__trigger[aria-expanded="true"] .flaw-faq__icon::after { opacity: 0; }

/* --- 32.7 Section 05 — initial-contact notice ---------------------
   The stored body ended with an oversized "Lưu ý" H2 over one italic
   sentence. The heading level is kept (it is a real section of the
   document) and only its presentation is reduced to a label. */
body.flaw-legal-site .flaw-contact-page .flaw-contact-notice {
  max-width: 56.25rem;                                            /* 900px */
  padding: clamp(1.5rem, 1.35rem + 0.5vw, 1.75rem);               /* 24 → 28 */
  border-left: 3px solid var(--flaw-burgundy);
  background: var(--flaw-ivory-2);
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-notice__title {
  /* §4 caps every H2 at a 28ch display measure. That is right for a 42px
     serif heading and wrong for a 14px uppercase label: 28ch resolved to
     220px and broke "LƯU Ý VỀ TRAO ĐỔI BAN ĐẦU" across two lines inside a
     900px panel. The heading level is correct and stays; only its measure
     is released. */
  max-width: none;
  margin: 0 0 var(--s-3);
  color: var(--flaw-ink);
  font-family: var(--flaw-font-ui);
  font-size: .875rem;                                             /* 14px */
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  line-height: 1.5;
  text-transform: uppercase;
}
body.flaw-legal-site .flaw-contact-page .flaw-contact-notice p {
  margin: 0;
  color: var(--flaw-ink-soft);
  font-size: var(--fs-body);
  line-height: 1.7;
  font-style: normal;
}

/* --- 32.8 Responsive ----------------------------------------------
   Two breakpoints only. 900px is where the 39/61 panel stops holding a
   two-column field grid beside a paragraph column; 640px is where the
   checklist stops holding two columns. Both are content thresholds, not
   device widths, so a longer EN or denser CN body crosses them at the
   same place the layout actually breaks. */
@media (max-width: 900px) {
  body.flaw-legal-site .flaw-contact-page .flaw-contact-intake { grid-template-columns: minmax(0, 1fr); }
  body.flaw-legal-site .flaw-contact-page .flaw-contact-details {
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
  }
}
@media (max-width: 640px) {
  body.flaw-legal-site .flaw-contact-page .flaw-contact-prepare__grid { grid-template-columns: minmax(0, 1fr); }
  body.flaw-legal-site .flaw-contact-page .flaw-contact-channels { gap: var(--s-2) var(--s-6); }
  body.flaw-legal-site .flaw-contact-page .flaw-contact-intake { border-radius: 14px; }
}

/* --- 32.9 Reduced motion ------------------------------------------
   The accordion animates nothing but the indicator's vertical stroke;
   under a reduced-motion preference even that resolves instantly. */
@media (prefers-reduced-motion: reduce) {
  body.flaw-legal-site .flaw-contact-page .flaw-faq__icon::after { transition: none; }
}

/* --- 33. Footer: lighter, quieter contact layer ------------------
   The footer remains a clear site boundary but no longer sits on the
   near-black surface. The standard (dark) approved logo is used here; the
   reverse mark remains reserved for genuinely dark surfaces. */
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact {
  background: #eee9e2;
  color: #332f2c;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact :is(p, li, address, span) {
  color: #514b47;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__label {
  color: #9f0b2d;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact a {
  color: #4b282e;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact a:hover {
  color: #9f0b2d;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-nav a {
  color: #514b47 !important;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels a,
body.flaw-legal-site.flaw-legal-site .flaw-footer-legal a {
  color: #4b282e !important;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-nav a:hover,
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels a:hover,
body.flaw-legal-site.flaw-legal-site .flaw-footer-legal a:hover {
  color: #9f0b2d !important;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__legalname {
  color: #332f2c;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__bottom {
  border-top-color: rgba(51, 47, 44, .18);
  color: #625b56;
}
/* Contact details should support the navigation rather than overpower it. */
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels :is(p, address) {
  font-family: var(--flaw-font-ui);
  font-size: .9375rem;
  line-height: 1.65;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels p {
  margin: 0 0 .8rem;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels .flaw-footer-contact__legalname {
  margin-top: 1.15rem;
  font-size: .9375rem;
  font-weight: 600;
}
body.flaw-legal-site.flaw-legal-site .flaw-footer-contact__channels .flaw-footer-contact__languages {
  margin-top: 1.8rem;
  font-size: .875rem;
  line-height: 1.55;
  opacity: 1;
}

/* --- 34. Header navigation: uppercase in every locale ------------- */
body.flaw-legal-site .flaw-site-nav :is(.flaw-nav-item__link, .flaw-nav-cluster__list a, .flaw-nav-panel__list a),
body.flaw-legal-site .flaw-site-header__cta {
  text-transform: uppercase;
}

/* --- 35. Accessibility corrections (Lighthouse mobile audit) ------- */

/* 35.1 The consent note under the enquiry form takes its colour from the
   form rule in section 30, which is later and more specific than the dark
   band's own prose rule. On the burgundy enquiry band that measured 1.4:1
   against #940c27 — a WCAG 1.4.3 failure on the Vietnamese homepage. The
   note is restored to the same light ink the rest of that band already
   uses; on light surfaces it keeps the muted ink. */
body.flaw-legal-site.flaw-legal-site :is(.flaw-editorial-final, .jpv-ml-contact-section, .flaw-editorial-section--dark) .flaw-form p.flaw-form__privacy {
  color: rgba(255, 255, 255, .86);
}

/* 35.2 WCAG 1.4.1: a link inside a block of text must not be identified by
   colour alone. Prose links in page content and the footer's contact
   channels are underlined. Buttons, cards, navigation and the language
   switcher carry their own classes and are deliberately excluded — they
   are standalone controls, not links inside a text block. */
body.flaw-legal-site .content-area :is(p, li, td, th) > a:not([class]),
body.flaw-legal-site .flaw-editorial-final__channels a {
  text-decoration: underline;
  text-underline-offset: .18em;
  text-decoration-thickness: from-font;
}

/* 35.2b The "Related pages" block on four translated pages is authored in
   `post_content` as a `section.flaw-related` SIBLING of the page root rather
   than a child of it, so it inherited no container from `.jpv-p1-page` (§19)
   or `.flaw-contact-page` (§32) and rendered its heading and link list at
   `left:0`, full viewport width. There is no other `.flaw-related` rule in
   the theme — the styled classes are `.flaw-related-content` (§9) and
   `.flaw-related-links` below, neither of which this shell carries.

   Each page is aligned to the grid its own neighbour establishes: the
   default is the standard 1200px shell, and the two contact pages take the
   1220px measure their body sets in `--flaw-contact-shell`. That token is
   declared on `.flaw-contact-page` itself, so a sibling cannot inherit it
   and the value is restated here.

   Pages: 9204 /en/about/, 9205 /zh/about-us/, 9328 /en/contact/,
   9219 /zh/lian-xi/. */
body.flaw-legal-site .flaw-related {
  width: var(--flaw-shell);
  margin-inline: auto;
}
body.flaw-legal-site .flaw-contact-page + .flaw-related {
  width: min(100% - (2 * var(--flaw-gutter)), 1220px);
}

/* 35.3 Related-practice links were one paragraph of pipe-separated anchors,
   so on a phone two tap targets sat a few pixels apart (WCAG 2.5.8). They
   are a list now; this gives each row its own line and a 44px target. */
body.flaw-legal-site .content-area ul.flaw-related-links {
  list-style: none;
  margin: 0;
  padding: 0;
}
body.flaw-legal-site .content-area ul.flaw-related-links > li { margin: 0; }
body.flaw-legal-site .content-area ul.flaw-related-links > li > a,
body.flaw-legal-site .content-area .jpv-link-list > a {
  display: flex;
  align-items: center;
  min-height: 44px;
  padding: var(--s-2) 0;
}
/* The satellite pages carry the same list as an unseparated run of anchors. */
body.flaw-legal-site .content-area .jpv-link-list {
  display: flex;
  flex-direction: column;
}

/* Mobile contact navigation: below the header (100) and modal overlays.
   Reserve the same safe-area-aware height before first paint, without JS. */
.flaw-mobile-contact { display: none; }
@media screen and (max-width: 767px) {
  body.flaw-legal-site {
    --flaw-contact-height: 64px;
    --flaw-contact-offset: calc(var(--flaw-contact-height) + env(safe-area-inset-bottom, 0px));
    padding-bottom: var(--flaw-contact-offset);
  }
  html { scroll-padding-bottom: calc(64px + env(safe-area-inset-bottom, 0px) + 16px); }
  body.flaw-legal-site .flaw-mobile-contact {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    position: fixed;
    inset: auto 0 0;
    z-index: 90;
    margin: 0;
    padding: 0 env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
    background: var(--flat-burgundy);
    color: #fff;
    box-shadow: 0 -2px 12px rgb(34 34 34 / 10%);
  }
  body.flaw-legal-site .flaw-mobile-contact a {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    min-width: 0;
    min-height: var(--flaw-contact-height);
    margin: 0;
    padding: 5px 8px;
    color: #fff;
    font-family: var(--flaw-font-ui);
    font-size: 12px;
    font-weight: 500;
    line-height: 15px;
    text-align: center;
    text-decoration: none;
    box-sizing: border-box;
  }
  body.flaw-legal-site .flaw-mobile-contact a + a { border-left: 1px solid rgb(255 255 255 / 24%); }
  body.flaw-legal-site .flaw-mobile-contact svg { width: 20px; height: 20px; flex: 0 0 20px; }
  body.flaw-legal-site .flaw-mobile-contact a:is(:hover, :active) { background: var(--flat-burgundy-dark); }
  body.flaw-legal-site .flaw-mobile-contact a:focus-visible { outline: 2px solid #fff; outline-offset: -5px; }
  body.flaw-legal-site:has(.flaw-site-header.is-open) .flaw-mobile-contact,
  body.flaw-legal-site:has(.mfp-wrap) .flaw-mobile-contact,
  body.flaw-legal-site:has(dialog[open]) .flaw-mobile-contact { visibility: hidden; }
  body.flaw-legal-site .back-to-top { bottom: calc(var(--flaw-contact-offset) + 15px); }
}
