.elementor-kit-7{--e-global-color-primary:#054059;--e-global-color-secondary:#00385F;--e-global-color-text:#021C26;--e-global-color-accent:#67AD3F;--e-global-typography-primary-font-family:"Ubuntu";--e-global-typography-primary-font-weight:400;--e-global-typography-secondary-font-family:"Ubuntu";--e-global-typography-secondary-font-weight:700;--e-global-typography-text-font-family:"Ubuntu";--e-global-typography-text-font-size:16px;--e-global-typography-text-font-weight:400;--e-global-typography-text-line-height:1.6em;--e-global-typography-text-letter-spacing:-0.03em;--e-global-typography-accent-font-family:"Ubuntu";--e-global-typography-accent-font-weight:400;--e-global-typography-mv-probe-font-family:"Ubuntu";--e-global-typography-mv-probe-font-size:clamp(32px, 3.89vw, 56px);--e-global-typography-mv-probe-font-weight:400;--e-global-typography-mv-probe-line-height:1.03em;--e-global-typography-mv-probe-letter-spacing:-0.05em;}.elementor-kit-7 e-page-transition{background-color:#FFBC7D;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1360px;}.e-con{--container-max-width:1360px;}.elementor-widget:not(:last-child){--kit-widget-spacing:20px;}.elementor-element{--widgets-spacing:20px 20px;--widgets-spacing-row:20px;--widgets-spacing-column:20px;}{}h1.entry-title{display:var(--page-title-display);}.site-header .site-branding{flex-direction:column;align-items:stretch;}.site-header{padding-inline-end:0px;padding-inline-start:0px;}.site-footer .site-branding{flex-direction:column;align-items:stretch;}@media(max-width:1024px){.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}:root { --mv-teal-heading:#054059; --mv-font-sans:Ubuntu; --mv-text-h2:clamp(32px, 3.89vw, 56px); --mv-ink:#021C26; --mv-navy:#00385F; --mv-link-navy:#023A5F; --mv-ink-black:#1F1F20; --mv-blue:#008CEC; --mv-blue-deep:#0070BD; --mv-blue-hero:#108DD0; --mv-blue-overlay:#117DAC; --mv-sky:#33AFF7; --mv-sky-light:#66C3F9; --mv-blue-tint:#99D7FB; --mv-blue-mist:#98D9ED; --mv-blue-ice:#C4F2FD; --mv-blue-pale:#CCEBFD; --mv-teal:#1A7D9B; --mv-teal-deep:#0F6480; --mv-teal-mid:#3397AF; --mv-teal-soft:#83BBC9; --mv-teal-tint:#99CBD7; --mv-teal-wash:#CCE5EB; --mv-teal-wash-lt:#E6F2F5; --mv-accent:#1A7D9B; --mv-accent-ink:#021C26; --mv-accent-mid:#3397AF; --mv-accent-light:#98D9ED; --mv-accent-soft:#99CBD7; --mv-accent-wash:#CCE5EB; --mv-accent-wash-lt:#E6F2F5; --mv-table-green-lt:#98ED98; --mv-table-green:#0DCA0A; --mv-table-green-dp:#1BAC11; --mv-white:#FFFFFF; --mv-bg:#F4F8FA; --mv-wash:#F0F5F6; --mv-wash-blue:#F0F8FA; --mv-rule:#707070; --mv-disabled:#D3D3D3; --mv-disabled-mid:#A6A6A6; --mv-disabled-lt:#E0E0E0; --mv-error:#AD4C3F; --mv-text-h1:clamp(47px, calc(28.56px + 5.18vw), 103px); --mv-text-display:clamp(167px, calc(134.9px + 8.96vw), 264px); --mv-text-h3:clamp(24px, 2.22vw, 32px); --mv-text-lead:clamp(18px, 1.39vw, 20px); --mv-text-body:clamp(14px, 13.296px + 0.1878vw, 16px); --mv-text-sm:14px; --mv-text-xs:12px; --mv-space-2xs:clamp(4px, 0.5vw, 8px); --mv-space-xs:clamp(8px, 0.9vw, 12px); --mv-space-sm:clamp(12px, 1.1vw, 16px); --mv-space-md:clamp(16px, 1.7vw, 24px); --mv-space-lg:clamp(24px, 2.2vw, 32px); --mv-space-xl:clamp(28px, 3vw, 40px); --mv-space-2xl:clamp(36px, 4.45vw, 64px); --mv-space-3xl:clamp(44px, 5.6vw, 80px); --mv-space-section:clamp(48px, 8vw, 112px); --mv-gutter:clamp(16px, 2.8vw, 40px); --mv-radius-xs:2px; --mv-radius-sm:4px; --mv-radius-md:8px; --mv-radius-lg:16px; --mv-radius-nav:20px; --mv-radius-full:999px; --mv-icon-circle:50px; --mv-container:1360px; --mv-blue-overlay-mid:#0A9ACA; --mv-radius-xl:24px; --mv-input-h:50px; --mv-space-form:clamp(24px, 3.3334vw, 48px); --mv-table-glow-1a:rgba(152,237,152,0.05); --mv-table-glow-1b:rgba(13,202,10,0.05); --mv-table-glow-1c:rgba(27,172,17,0.05); --mv-table-glow-2a:rgba(207,253,196,0.1); --mv-table-glow-2b:rgba(61,208,16,0.1); --mv-accent-wash-50:rgba(204,229,235,0.5); --mv-rule-accent:rgba(240,248,250,0.6); --mv-glass-white:rgba(255,255,255,0.2); --mv-glass-sheen:rgba(255,255,255,0.4); --mv-glass-accent:rgba(26,125,155,0.32); --mv-transparent:rgba(0,0,0,0); --mv-icon-sm:32px; --mv-accordion-pad:20px; --mv-text-eyebrow:clamp(16px, calc(15.296px + 0.1878vw), 18px); --mv-glass-gap:clamp(8.212px, calc(6.526px + 0.44958vw), 13px); --mv-gap-cta:clamp(16px, calc(14.5915px + 0.37559vw), 20px); --mv-hero-top:clamp(88px, calc(55.6px + 8.65vw), 122px); --mv-hero-bot:clamp(40px, 5.42vw, 78px); --mv-glass-rim:rgba(255,255,255,0.5); --mv-glass-teal:rgba(153,203,215,0.05); --mv-glass-teal-45:rgba(153,203,215,0.45); --mv-glass-teal-0:rgba(153,203,215,0); --mv-bloom-sky:rgba(51,175,247,0.5); --mv-bloom-teal:rgba(153,203,215,0.55); --mv-bloom-white:rgba(255,255,255,0.85); --mv-bloom-accent:rgba(153,203,215,0.28); --mv-alpha-0:rgba(255,255,255,0); --mv-teal-heading-80:rgba(5,64,89,0.8); --mv-footer-max:1312px; --mv-footer-col:192px; --mv-space-3xs:4px; --mv-icon-xs:24px; --mv-hairline:1px; --mv-logo-w:150px; --mv-footer-pad-m:64px; --mv-footer-gut-m:16px; --mv-footer-gap-m:48px; --mv-social-glyph:20px; --mv-blue-40:rgba(0,140,236,0.4); --mv-blue-tint-40:rgba(153,215,251,0.4); --mv-blue-70:rgba(0,140,236,0.7); --mv-blue-tint-70:rgba(153,215,251,0.7); --mv-white-15:rgba(255,255,255,0.15); --mv-teal-20:rgba(26,125,155,0.2); --mv-icp-glow-1a:rgba(16,141,208,0.4); --mv-icp-glow-1b:rgba(196,242,253,0.4); --mv-icp-glow-2a:rgba(17,125,172,0.5); --mv-icp-glow-2b:rgba(152,217,237,0.5); --mv-icp-pad-t:clamp(32px, 5.35vw, 77px); --mv-icp-pad-l:clamp(24px, 6.32vw, 91px); --mv-icp-pad-b:clamp(40px, 7.36vw, 106px); --mv-icp-dot:4px; --mv-icp-dot-active:28px; --mv-icp-rule-out:calc(24px - clamp(24px, 6.32vw, 91px)); --mv-icon-md:40px; --mv-icp-rule-w:calc(100% + 2 * clamp(24px, 6.32vw, 91px) - 48px); --mv-icp-col:32.5735%; --mv-text-ui:16px; --mv-accred-gap:clamp(30px, 19.88px + 2.7vw, 58.75px); --mv-accred-row-gap:clamp(26px, 3.3333vw, 48px); --mv-accred-copy-w:443px; --mv-accred-logos-w:680px; --mv-accred-h-hipaa:clamp(52.5px, 34.82px + 4.71vw, 102.7px); --mv-accred-h-legit:clamp(61.2px, 40.57px + 5.5vw, 119.8px); --mv-accred-h-a4pc:clamp(40.5px, 26.84px + 3.64vw, 79.3px); --mv-accred-h-pcab:clamp(48.9px, 32.46px + 4.38vw, 95.6px); --mv-accred-h-usp:clamp(52.1px, 34.56px + 4.68vw, 101.9px); --mv-accred-bleed-w:calc(100% + 2 * clamp(16px, 2.8vw, 40px)); --mv-accred-bleed-m:calc(-1 * clamp(16px, 2.8vw, 40px)); --mv-text-lead-m:20px; --mv-glass-dark-05:rgba(0,0,0,0.05); --mv-glass-white-08:rgba(255,255,255,0.08); --mv-rule-10:rgba(112,112,112,0.1); --mv-svc-card-r:clamp(8px, 5.183px + 0.75117vw, 16px); --mv-svc-label-r:clamp(4px, 1.8779vw - 3.042px, 24px); --mv-svc-label-h:clamp(68px, 60.958px + 1.8779vw, 88px); --mv-svc-label-h-hov:clamp(109px, 98.084px + 2.9108vw, 140px); --mv-svc-arrow:clamp(44px, 39.775px + 1.1268vw, 56px); --mv-svc-glyph:clamp(16px, 14.465px + 0.40939vw, 20.36px); --mv-svc-label-pad:clamp(14px, 11.887px + 0.56338vw, 20px); --mv-svc-stack-gap:32px; --mv-svc-sticky-top:120px; --mv-radius-2xl:32px; --mv-radius-3xl:40px; --mv-teal-heading-10:rgba(5,64,89,0.1); --mv-smart-panel-w:672px; --mv-smart-gap:px; --mv-smart-bleed-h:115%; --mv-smart-bleed-t:-7.5%; --mv-accent-soft-05:rgba(153,203,215,0.05); --mv-accent-soft-45:rgba(153,203,215,0.45); --mv-accent-soft-0:rgba(153,203,215,0); --mv-glass-card-r:16px; --mv-glass-pad-t:16px; --mv-glass-pad-x:24px; --mv-glass-pad-b:32px; --mv-glass-cta-pad-x:40px; --mv-hero-col-gap:32px; --mv-text-btn:16px; --mv-text-icon-label:14px; --mv-icon-box-sz:24px; --mv-icon-glyph-sz:19px; --mv-icon-box-w:px; --mv-icp-glow-2mid:rgba(10,154,202,0.5); --mv-icp-accent-1a:rgba(26,125,155,0.4); --mv-icp-accent-1b:rgba(204,229,235,0.4); --mv-icp-accent-2a:rgba(5,64,89,0.5); --mv-icp-accent-2mid:rgba(26,125,155,0.5); --mv-icp-accent-2b:rgba(153,203,215,0.5); --mv-icp-tel-1a:rgba(26,125,155,0.4); --mv-icp-tel-1b:rgba(204,229,235,0.4); --mv-icp-tel-2a:rgba(5,64,89,0.5); --mv-icp-tel-2mid:rgba(26,125,155,0.5); --mv-icp-tel-2b:rgba(153,203,215,0.5); --mv-accent-wash-card:#F0F8FA; --mv-warning:#FFA500; --mv-map-fill:#3E6726; --mv-map-rim-off:#6DA44B; --mv-white-80:rgba(255,255,255,0.8); --mv-ink-80:rgba(2,28,38,0.8); --mv-ink-48:rgba(2,28,38,0.48); --mv-container-table:1280px; --mv-container-video:1300px; --mv-glass-accent-0:rgba(26,125,155,0); --mv-map-glow:rgba(103,173,63,0.25); --gap-md:clamp(16px, 2.5vw, 24px); --gap-sm:clamp(12px, 1.5vw, 16px); --accent:#2563EB; --paper:#FFFFFF; --display:Fraunces; --font-base:clamp(0.9375rem, 0.917rem + 0.093vw, 1rem); --body:Inter; --font-sm:clamp(0.8125rem, 0.792rem + 0.093vw, 0.875rem); --ink:#0F172A; --muted:#475569; --space-section:clamp(48px, 7vw, 80px); --space-gutter:clamp(20px, 4vw, 40px); --gap-lg:clamp(24px, 4vw, 48px); --font-h3:clamp(1.25rem, 1.15rem + 0.4vw, 1.5rem); --font-h2:clamp(1.625rem, 1.35rem + 1.15vw, 2.125rem); --accent-deep:#1D4ED8; --mist:#F1F5F9; --space-md:clamp(24px, 3.5vw, 40px); --accent-soft:#EFF6FF; --space-4:16px; --space-1:4px; --font-lg:clamp(1.125rem, 1.083rem + 0.185vw, 1.25rem); --mv-green:#67AD3F; --mv-green-soft:#C3E3AF; --mv-green-mid:#87C75F; --mv-green-ink:#1A2A10; --mv-green-wash:#E1F1D7; --mv-glass-green-0:rgba(103,173,63,0); --mv-map-glow-0:rgba(103,173,63,0); --mv-table-green-mid:#87C75F; --mv-hero-wash:#C3E7FD; --mv-glass-white-10:rgba(255,255,255,0.1); --mv-glass-white-32:rgba(255,255,255,0.32); --mv-glass-ink-10:rgba(2,28,38,0.1); --mv-accent-rule:#66B1C3; --mv-glass-white-70:rgba(255,255,255,0.7); --mv-warning-ink:#B45309; }
/* Start custom CSS *//* ============================================================
   MV HEADING DEFAULTS — global fallback (Site Settings → Custom CSS)
   Mirrors the mv-h1 / mv-h2 / mv-h3 Global Classes so an Elementor
   heading carrying NO token class still renders on-brand instead of
   falling back to the theme reset (32px / #333 / system font).

   Specificity is 0-1-1 ON PURPOSE:
     • beats the theme reset  (reset.css  `h2 {}`        = 0-0-1)
     • loses to the token classes (`.elementor .mv-h2`  = 0-2-0)
   so a class always still wins. Scoped to .elementor so native
   Gutenberg blog-post bodies are untouched.
   ============================================================ */
.elementor h1,
.elementor h2,
.elementor h3,
.elementor h4,
.elementor h5,
.elementor h6 {
	font-family: var(--mv-font-sans);
	font-weight: 400;
	color: var(--mv-teal-heading);
}

.elementor h1 {
	font-size: var(--mv-text-h1);
	line-height: 1em;
	letter-spacing: -0.07em;
	color: var(--mv-navy);
}

.elementor h2 {
	font-size: var(--mv-text-h2);
	line-height: 1.03em;
	letter-spacing: -0.05em;
}

.elementor h3 {
	font-size: var(--mv-text-h3);
	line-height: 1.08em;
	letter-spacing: -0.02em;
	color: var(--mv-ink);
}

/* h4-h6 have no token class in the design system yet, so they inherit
   family / weight / heading colour only and keep the reset's sizes. */


/* ============================================================
   PER-WORD COLOUR RUNS — the editor-facing "make this word white"
   In any heading/paragraph rich-text field, wrap the words:
       <span class="mv-white">Choose MediVera</span>
   Palette: mv-white | mv-navy | mv-teal | mv-accent | mv-ink.
   mv-accent-* is THEME-DEPENDENT: teal by default, green on Telehealth only.
   Composes with <em> (which keeps its italic), and any number of
   runs per heading, so the editor picks the coloured words simply
   by moving the span. Figma uses this on all six hero H1s: the
   roman run is white, the italic <em> run is mv-navy #00385F.

   WHY THIS LIVES HERE AND NOT IN upsert_class (measured 2026-08-07):
   an inline run needs a DESCENDANT .elementor-kit-7, which a v4 Global Class
   cannot express — but the NVBC registry, which can, emits its CSS
   PAGE-SCOPED and only sees classes attached to an ELEMENT OF THAT
   PAGE. It does not descend into a native Component's template, and
   it cannot see a class that exists only inside an html-v3 string.
   Telehealth 1025's H1 lives inside Component 1875 and has NO
   page-level ancestor at all (the instance inlines its template and
   e-component has no `classes` prop), so there is nowhere valid to
   anchor a registry class. That is also why mv-hero-fx silently did
   nothing there while working on the homepage, whose H1 is a direct
   page element. Kit CSS is the only layer that reaches inside
   components, shortcodes and migrated body copy alike.

   Specificity 0-2-0 — beats inheritance from the heading (an
   inherited value always loses to a matching rule) while still
   losing to a v4 Global Class set directly on the same element.
   ⚠️ Contrast: white on the hero wash rgb(145,211,250) measures
   1.63:1 (Figma's own render is 1.72:1), under WCAG AA's 3:1 for
   large text. That is a property of the approved design.
   ============================================================ */
.elementor .mv-white { color: var(--mv-white); }
.elementor .mv-navy  { color: var(--mv-navy); }
.elementor .mv-teal  { color: var(--mv-teal); }
.elementor .mv-accent { color: var(--mv-accent); }
.elementor .mv-ink   { color: var(--mv-ink); }


/* ============================================================
   MV-PROSE — the blog article body (Gutenberg → on-brand)
   Put the class `mv-prose` on the Post Content widget of the
   single-post template. Everything below is a DESCENDANT rule, so
   it needs no per-block authoring: the 63 migrated posts render
   correctly as-imported.

   WHY KIT CSS AND NOT upsert_class / a v4 Global Class:
   a v4 Global Class cannot express a descendant .elementor-kit-7 at all,
   and the NVBC registry that can emits PAGE-SCOPED CSS keyed to a
   class attached to an element of that page. A Theme Builder
   template's post body is neither — same closed door as the hero
   colour runs documented above. Kit CSS is the only layer that
   reaches migrated body copy.

   SPECIFICITY 0-2-1 ON PURPOSE:
     • beats the theme reset            (`h2 {}`            = 0-0-1)
     • beats the MV heading defaults    (`.elementor h2 {}` = 0-1-1)
     • loses to an author inline style, which is why the 16 imported
       posts carrying hand-styled tables keep their own look. That
       is a known follow-up, not a bug in this block.

   Two local custom properties rather than new v4 Variables: a new
   v4 Variable cannot hold a clamp() (it stores value:"px" and
   dies — see mv-smart-gap / mv-icon-box-w, both dead), so the two
   prose-only sizes are declared here where they are used.
   ============================================================ */
/* ============================================================
   CATEGORY PILL ROW — /blog/ and all 10 category archives
   Which pill is "current" depends on the URL, and ONE template
   serves /blog/ plus every category archive — so the active state
   cannot be a v4 Global Class or an element setting. WordPress
   already publishes the answer as a body class, so it is derived
   declaratively from that: no JS, no dynamic tag, and no
   per-category marker class to keep in sync. Each pill is matched
   by its OWN href, so the state cannot drift from the link.
   ============================================================ */
.elementor .mv-cat-pills .mv-tab-pill {
	/* mv-tab-pill STORES white-space:nowrap, but that prop is not in
	   Elementor's atomic schema, so Style_Parser drops it and the
	   emitted rule never contains it. On the tabs it is used for
	   elsewhere, .e-tab-base supplies nowrap anyway and hides this;
	   on these plain links nothing does, and "Hormone Replacement"
	   breaks over two lines. Declared here until the class is
	   rewritten without the dead prop. */
	white-space: nowrap;
}

/* Matches .mv-tab-pill.e--selected, which is how the same pill reads
   as chosen in the tab context. Same token, so the two cannot drift. */
body.blog .elementor .mv-cat-pills a[href$="/blog/"],
body.category-mens-health .elementor .mv-cat-pills a[href$="/category/mens-health/"],
body.category-news .elementor .mv-cat-pills a[href$="/category/news/"],
body.category-resources .elementor .mv-cat-pills a[href$="/category/resources/"],
body.category-hormone-replacement .elementor .mv-cat-pills a[href$="/category/hormone-replacement/"],
body.category-medicine .elementor .mv-cat-pills a[href$="/category/medicine/"],
body.category-womens-health .elementor .mv-cat-pills a[href$="/category/womens-health/"],
body.category-weight-management .elementor .mv-cat-pills a[href$="/category/weight-management/"],
body.category-longevity .elementor .mv-cat-pills a[href$="/category/longevity/"],
body.category-peptides .elementor .mv-cat-pills a[href$="/category/peptides/"],
body.category-telehealth .elementor .mv-cat-pills a[href$="/category/telehealth/"] {
	background-color: var(--mv-teal-tint);
}

.elementor .mv-prose {
	--mv-prose-measure: 100%;   /* fills the 872 article column, matching figures and tables */
	--mv-prose-h3: clamp(20px, 1.67vw, 24px);
	font-family: var(--mv-font-sans);   /* family ONLY — never the `font` shorthand */
	color: var(--mv-ink);
}

/* ── the measure. Text and media both take the full article column ── */
.elementor .mv-prose p,
.elementor .mv-prose h2,
.elementor .mv-prose h3,
.elementor .mv-prose h4,
.elementor .mv-prose ul,
.elementor .mv-prose ol,
.elementor .mv-prose blockquote {
	max-width: var(--mv-prose-measure);
}

.elementor .mv-prose figure,
.elementor .mv-prose table,
.elementor .mv-prose .wp-block-table,
.elementor .mv-prose .wp-block-image {
	max-width: 100%;
}

/* ── body copy ── */
.elementor .mv-prose p {
	font-size: var(--mv-text-lead);
	line-height: 1.62em;
	letter-spacing: -0.01em;
	color: var(--mv-ink);
	margin: 0 0 var(--mv-space-md);
}

/* ── headings ── */
.elementor .mv-prose h2 {
	font-size: var(--mv-text-h3);
	line-height: 1.15em;
	letter-spacing: -0.03em;
	color: var(--mv-teal-heading);
	margin: var(--mv-space-2xl) 0 var(--mv-space-sm);
}

/* [2026-08-19 · Claude · medication-template] h3/h4 font-weight 700 -> 400.
   WHY: measured on a medication page, prose H2 rendered weight 400 and H3 weight 700, so the
   sub-heading looked HEAVIER than the heading above it. That is not a prose-only quirk — it
   contradicts the design system, where every heading class is 400: mv-h2 (g-29d9948) is 400 and
   mv-h3 (g-8a97b76) is 400. The built pages establish hierarchy by SIZE and COLOUR, never by
   weight, so 700 here was the outlier. Sizes and colours are left alone: prose deliberately runs
   h2 at --mv-text-h3 rather than --mv-text-h2, because a 56px heading inside an article column
   shouts; that editorial choice is still right. Now h2 32px teal / h3 24px teal / body 20px ink,
   all 400. Applies to the blog too (321 h3s), which was carrying the same inconsistency. */
.elementor .mv-prose h3 {
	font-size: var(--mv-prose-h3);
	line-height: 1.25em;
	letter-spacing: -0.02em;
	color: var(--mv-teal-heading);
	font-weight: 400;
	margin: var(--mv-space-xl) 0 var(--mv-space-xs);
}

.elementor .mv-prose h4 {
	font-size: var(--mv-text-lead);
	line-height: 1.3em;
	color: var(--mv-ink);
	font-weight: 500;   /* see the h3 note above; h4 keeps a nudge because it shares the body size */
	margin: var(--mv-space-lg) 0 var(--mv-space-2xs);
}

.elementor .mv-prose h2:first-child,
.elementor .mv-prose h3:first-child,
.elementor .mv-prose p:first-child {
	margin-top: 0;
}

/* ── lists. The ring marker is drawn here because mv-bullet-check
      stores no props and emits nothing. ── */
.elementor .mv-prose ul {
	list-style: none;
	padding-left: 0;
	margin: 0 0 var(--mv-space-md);
}

.elementor .mv-prose ul li {
	position: relative;
	padding-left: 34px;
	font-size: var(--mv-text-lead);
	line-height: 1.55em;
	color: var(--mv-ink);
	margin: 0 0 var(--mv-space-xs);
}

.elementor .mv-prose ul li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.42em;
	width: 20px;
	height: 20px;
	border-radius: var(--mv-radius-full);
	background: var(--mv-accent-wash);
	box-shadow: inset 0 0 0 2px var(--mv-accent);
}

.elementor .mv-prose ol {
	padding-left: 1.3em;
	margin: 0 0 var(--mv-space-md);
}

.elementor .mv-prose ol li {
	font-size: var(--mv-text-lead);
	line-height: 1.55em;
	color: var(--mv-ink);
	margin: 0 0 var(--mv-space-xs);
}

.elementor .mv-prose ol li::marker {
	color: var(--mv-teal);
	font-weight: 700;
}

/* nested lists sit tighter and drop the bottom gap */
.elementor .mv-prose li ul,
.elementor .mv-prose li ol {
	margin: var(--mv-space-xs) 0 0;
}

/* ── page theme: GREEN (Telehealth only) ──
   Blue is now the site DEFAULT (:root, Elementor Variables) because 4 of the 5
   inner pages are blue in Figma. Telehealth 4820:2647 is the ONLY green frame.
   Doubled class = specificity (0,2,0) so it beats :root (0,1,0) regardless of
   source order; the kit sheet loads BEFORE the Elementor :root block, so a
   single .mv-theme-green would tie and LOSE. */
body.elementor-page-1025,
.mv-theme-green.mv-theme-green {
	--mv-accent: #67AD3F;
	--mv-accent-ink: #1A2A10;
	--mv-accent-mid: #87C75F;
	--mv-accent-light: #A5D587;
	--mv-accent-soft: #C3E3AF;
	--mv-accent-wash: #E1F1D7;
	--mv-accent-wash-lt: #F0F8EB;
	--mv-accent-wash-card: #F3FAF0;
	--mv-accent-soft-05: rgba(195,227,175,0.05);
	--mv-accent-soft-45: rgba(195,227,175,0.45);
	--mv-accent-soft-0: rgba(195,227,175,0);
	--mv-accent-wash-50: rgba(225,241,215,0.5);
	--mv-rule-accent: rgba(240,248,235,0.6);
	--mv-glass-accent: rgba(103,173,63,0.32);
	--mv-glass-accent-0: rgba(103,173,63,0);
	--mv-bloom-accent: rgba(135,199,95,0.28);
	--mv-icp-accent-1a: rgba(61,208,16,0.4);
	--mv-icp-accent-1b: rgba(207,253,196,0.4);
	--mv-icp-accent-2a: rgba(27,172,17,0.5);
	--mv-icp-accent-2mid: rgba(13,202,10,0.5);
	--mv-icp-accent-2b: rgba(152,237,152,0.5);

	
}

/* ── links ── */
.elementor .mv-prose a {
	color: var(--mv-link-navy);
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}

.elementor .mv-prose a:hover,
.elementor .mv-prose a:focus-visible {
	color: var(--mv-blue-deep);
	text-decoration-thickness: 2px;
}

/* ── media ── */
.elementor .mv-prose img {
	max-width: 100%;
	height: auto;
	border-radius: var(--mv-radius-xl);
	display: block;
}

.elementor .mv-prose figure {
	margin: var(--mv-space-xl) 0;
}

.elementor .mv-prose figcaption {
	font-size: var(--mv-text-sm);
	line-height: 1.5em;
	color: var(--mv-teal-heading);
	opacity: 0.65;
	margin-top: var(--mv-space-xs);
}

/* ── tables. A wide clinical table scrolls inside its own box so the
      page body never scrolls sideways. ── */
.elementor .mv-prose .wp-block-table {
	overflow-x: auto;
	margin: var(--mv-space-xl) 0;
}

.elementor .mv-prose table {
	border-collapse: collapse;
	width: 100%;
	font-size: var(--mv-text-body);
	line-height: 1.5em;
	color: var(--mv-ink);
}

.elementor .mv-prose thead th {
	background-image: linear-gradient(
		90deg,
		var(--mv-table-green-lt) 0%,
		var(--mv-table-green) 50.3%,
		var(--mv-table-green-dp) 100%
	);
	color: var(--mv-white);
	font-weight: 700;
	text-align: left;
	padding: var(--mv-space-sm) var(--mv-space-md);
}

.elementor .mv-prose td,
.elementor .mv-prose tbody th {
	padding: var(--mv-space-sm) var(--mv-space-md);
	border-bottom: 1px solid var(--mv-accent-wash-lt);
	vertical-align: top;
	text-align: left;
}

.elementor .mv-prose tbody tr:last-child td,
.elementor .mv-prose tbody tr:last-child th {
	border-bottom: 0;
}

/* ── tables, third-party border and stripe reset. The rules above only ever set
      border-bottom, so the other three sides of every cell were never ours. Two
      stylesheets load first and fill the gap with values nobody chose:
        block library, .wp-block-table td,th { border: 1px solid } with no colour,
          so currentColor, which under .mv-prose is --mv-ink. Every body cell drew
          a 1px INK box against our pale blue horizontal rules.
        theme reset, table tbody > tr:nth-child(2n+1) > td,th
          { background-color: rgba(128,128,128,.07) }, a neutral grey. This palette
          contains no grey.
      Measured live 2026-09-10 at 1440 and 390 on /usp-compliant-503a-compounding-pharmacy/,
      which is one of 8 posts carrying a table. Declare all four sides and the
      stripe so no third-party default can reach a table again.
      The header's column dividers were white only by accident, currentColor on a
      white-text cell. They are declared now, so they survive any change to the
      header text colour.
      Blog tables cap at THREE columns. At 390px the prose measure is 343px: a
      3-column table fits with zero horizontal scroll, a 4-column one hides 44px
      behind a scroller iOS draws as an overlay and then hides. ── */
.elementor .mv-prose thead th {
	border: 0;
}

.elementor .mv-prose thead th + th {
	border-left: 1px solid var(--mv-white);
}

.elementor .mv-prose td,
.elementor .mv-prose tbody th {
	border-top: 0;
	border-left: 0;
	border-right: 0;
}

.elementor .mv-prose tbody tr:nth-child(2n + 1) > td,
.elementor .mv-prose tbody tr:nth-child(2n + 1) > th {
	background-color: var(--mv-wash-blue);
}

/* ── blockquote ── */
.elementor .mv-prose blockquote {
	margin: var(--mv-space-xl) 0;
	padding-left: var(--mv-space-md);
	border-left: 2px solid var(--mv-teal-tint);
	font-style: italic;
	font-size: var(--mv-prose-h3);
	line-height: 1.45em;
	color: var(--mv-teal-heading);
}

.elementor .mv-prose blockquote p {
	font-size: inherit;
	line-height: inherit;
	color: inherit;
}

/* ── rules and small print ── */
.elementor .mv-prose hr {
	border: 0;
	border-top: 1px solid var(--mv-rule-10);
	margin: var(--mv-space-2xl) 0;
}

.elementor .mv-prose strong,
.elementor .mv-prose b {
	font-weight: 700;
}

/* [2026-08-18 · Claude] mv-prose-page — a post body rendered INSIDE a page section
   (the /webinars/ Featured Webinar block), not as a standalone blog article.
   WHY: .mv-prose sets p/li to --mv-text-lead (20px), which is correct in an 872px
   article column but reads oversized beside the 16px body copy used everywhere else
   on a page — Stephen flagged it as "not the same size we use all over the place".
   Same specificity (0,2,0) as the rule it overrides, placed later in source order,
   so it wins without !important and the blog is untouched. */
.elementor .mv-prose-page p,
.elementor .mv-prose-page ul li,
.elementor .mv-prose-page ol li {
	/* ul li / ol li spelled out: .mv-prose ul li is (0,2,2) and a bare
	   .mv-prose-page li is only (0,2,1), so it lost and list items stayed 20px. */


	font-size: var(--mv-text-body);
}

/* ══════════════════════════════════════════════════════════════
   SINGLE POST — sticky rail + table of contents
   The fixed header is 80px and reserves NO space of its own, so
   the sticky offset and every jump target clear it explicitly.
   ══════════════════════════════════════════════════════════════ */

.elementor .mv-post-rail {
	top: 104px;              /* 80 header + 24 breathing */
	align-self: flex-start;
}

.elementor .mv-prose h2,
.elementor .mv-prose h3 {
	scroll-margin-top: 104px;
}

/* ── the bound fields ──
   A v4 ATOMIC widget cannot carry a dynamic binding: Elementor's own
   save validation throws "paragraph: invalid_value" on both the
   html-v3-wrapping-dynamic and the top-level dynamic envelope, which
   leaves the document permanently unsavable. So title / eyebrow /
   byline / featured image are v3 widgets with __dynamic__, and the
   type lands on their inner .elementor-heading-title, not the wrapper. */

.elementor .mv-post-eyebrow .elementor-heading-title {
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-lead);
	font-weight: 400;
	line-height: 1.08em;
	letter-spacing: -0.02em;
	color: var(--mv-teal-heading);
	margin: 0;
}

.elementor .mv-post-title-w .elementor-heading-title {
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-h2);
	font-weight: 400;
	line-height: 1.05em;
	letter-spacing: -0.04em;
	color: var(--mv-navy);
	margin: 12px 0 0;
}

.elementor .mv-post-byline .elementor-heading-title {
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	line-height: 1.4em;
	letter-spacing: -0.01em;
	color: var(--mv-ink);
	margin: 0;
}

.elementor .mv-post-byline-dim .elementor-heading-title {
	opacity: 0.7;
}

/* the byline separator is drawn, not typed, so there is no stray
   text node to go stale if a field is ever removed */
.elementor .mv-post-meta > .elementor-widget + .elementor-widget::before {
	content: "·";
	color: var(--mv-ink);
	opacity: 0.5;
	margin-right: var(--mv-space-xs);
}

.elementor .mv-post-meta > .elementor-widget {
	display: flex;
	align-items: center;
	width: auto;
}

.elementor .mv-author-name .elementor-heading-title {
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	font-weight: 700;
	line-height: 1.4em;
	color: var(--mv-ink);
	margin: 0;
}

/* the hero photo keeps the inner-page crop, radius and fit */
.elementor .mv-post-hero-img img {
	width: 100%;
	max-width: 100%;
	aspect-ratio: 413 / 550;
	object-fit: cover;
	display: block;
	border-radius: var(--mv-radius-xl);
}

/* ── the contents card: strip the widget's own chrome ── */
.elementor .mv-toc-card .elementor-widget-table-of-contents,
.elementor .mv-toc-card .elementor-toc,
.elementor .mv-toc-card .elementor-toc__body {
	background: transparent;
	border: 0;
	box-shadow: none;
	padding: 0;
}

.elementor .mv-toc-card .elementor-toc__header {
	background: transparent;
	border: 0;
	border-bottom: 1px solid var(--mv-teal-heading-10);
	padding: 0 0 var(--mv-space-sm);
	margin-bottom: var(--mv-space-xs);
}

.elementor .mv-toc-card .elementor-toc__header-title {
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	font-weight: 700;
	letter-spacing: -0.01em;
	color: var(--mv-teal-heading);
	margin: 0;
}

/* a long contents list scrolls inside the rail instead of
   pushing the pharmacist CTA off the screen */
.elementor .mv-toc-card .elementor-toc__body {
	max-height: calc(100vh - 260px);
	overflow-y: auto;
}

.elementor .mv-toc-card .elementor-toc__list-wrapper {
	list-style: none;
	margin: 0;
	padding: 0;
}

.elementor .mv-toc-card .elementor-toc__list-item {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* the widget's marker is a real list marker, and list-style on the
   WRAPPER alone does not remove it — the  carries its own */
.elementor .mv-toc-card .elementor-toc__list-item::marker {
	content: "";
	font-size: 0;
}

/* the rule lives on the anchor so the active state can recolour
   its own leading edge without a :has() .elementor-kit-7 */
.elementor .mv-toc-card .elementor-toc__list-item-text {
	display: block;
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	line-height: 1.4em;
	color: var(--mv-teal-heading);
	opacity: 0.8;
	text-decoration: none;
	padding: 8px 0 8px 14px;
	border-left: 2px solid var(--mv-teal-tint);
	transition: color 150ms, opacity 150ms, border-color 150ms;
}

.elementor .mv-toc-card .elementor-toc__list-item-text:hover {
	opacity: 1;
	color: var(--mv-teal-deep);
}

/* H3s nest one level in — indented and a size smaller */
.elementor .mv-toc-card .elementor-toc__list-wrapper .elementor-toc__list-wrapper .elementor-toc__list-item-text {
	font-size: var(--mv-text-sm);
	padding-left: 28px;
}

/* the marker is an inline SVG icon (e-fas-circle), NOT a list
   marker — list-style:none computes correctly and removes nothing */
.elementor .mv-toc-card .elementor-toc__list-item-text-wrapper > svg {
	display: none;
}

/* Elementor marks EVERY heading you have scrolled past as active,
   not just the current one, so four entries read as "you are here"
   at once. Passed entries stay quiet … */
.elementor .mv-toc-card .elementor-toc__list-item-text.elementor-item-active {
	opacity: 0.8;
	font-weight: 400;
	color: var(--mv-teal-heading);
	border-left-color: var(--mv-teal-tint);
}

/* … and only the LAST passed entry — the one you are actually
   reading — is promoted. Higher specificity, so order is irrelevant. */
.elementor .mv-toc-card .elementor-toc__list-item:not(:has(~ .elementor-toc__list-item .elementor-item-active)) > .elementor-toc__list-item-text-wrapper > .elementor-toc__list-item-text.elementor-item-active {
	opacity: 1;
	font-weight: 700;
	color: var(--mv-teal-deep);
	border-left-color: var(--mv-teal-deep);
}

/* below 1024 the rail is a normal block and the contents collapse
   into an "On this page" bar above the body */
@media (max-width: 1024px) {
	/* 🔴 In a COLUMN flex, flex-basis sizes the MAIN axis — the height,
	   not the width. The desktop 64.12% / 24.12% bases therefore became
	   HEIGHTS once mv-post-grid switched to column, so the rail claimed
	   3268px, the article was pushed outside its parent, and the related
	   band rendered on top of the body. Width is the cross axis here and
	   must be set as width. */
	/* ⚠ The parent is in the .elementor-kit-7 on purpose: a bare
	   .elementor .mv-post-article ties the v4 global class at (0,2,0)
	   and kit CSS loads FIRST, so the tie LOSES. (0,3,0) wins. */
	.elementor .mv-post-grid > .mv-post-article,
	.elementor .mv-post-grid > .mv-post-rail {
		flex: 0 0 auto;
		width: 100%;
	}

	/* the hero photo stops being a portrait column and becomes a
	   banner: at 1024 the right column is full width, so the 413/550
	   crop would render ~965×1285 */
	.elementor .mv-post-hero-img img {
		aspect-ratio: 3 / 2;
		max-height: 420px;
	}

	.elementor .mv-post-rail {
		position: static;
		max-height: none;
		order: -1;          /* the contents belong ABOVE the body once
		                       the rail stops being a rail */
	}

	.elementor .mv-toc-card .elementor-toc__body {
		max-height: none;
	}
}

/* ── Full-screen search overlay ─────────────────────────────────────────────
   Elementor renders the lightbox close button as an inline SVG but the rule
   that sizes it (.e-font-icon-svg { width:1em; height:1em }) ships in a
   stylesheet that is not enqueued on this site, so the close X measures 0x0
   and the overlay can only be dismissed with Esc. Restore the size, scoped to
   the dialog close button so no other icon is touched. */
.elementor-search-form__container .dialog-lightbox-close-button {
	font-size: var(--mv-icon-xs);
	line-height: 1;
	cursor: pointer;
	color: var(--mv-white);
}

.elementor-search-form__container .dialog-close-button svg.e-font-icon-svg {
	width: 1em;
	height: 1em;
	fill: currentColor;
}

/* 🔴 PLACEMENT MATTERS. The block below was first inserted by anchoring on a comment
   inside the kit's `@media(max-width:767px)` section, so every rule in it applied ONLY
   below 768px. At 1440 nothing changed and it read as a caching problem -- I chased
   Elementor CSS regeneration and the broker's stylesheet cache before checking the
   brace balance ahead of the insertion point, which said "1 unclosed" immediately.
   ⭐ When kit CSS appears not to apply, count braces before it BEFORE blaming a cache. */
/* [2026-08-19 · Claude] Accordion delivered as post_content HTML (medication CPT).
   WHY THIS IS IN KIT CSS AND NOT upsert_class / a v4 global class:
   Elementor emits BOTH registry and v4 global-class CSS per page, from what that page's
   Elementor TREE uses. A `medication` post has no tree (its body is post_content rendered by
   the single template 3558), so neither route emits anything -- measured: global-1023
   (Providers, has a tree) is 24,446 bytes and carries mv-accordion/mv-sublead/mv-body;
   global-1594 is 5,925 bytes and carries none of them. Kit CSS is the ONLY stylesheet that
   reaches such a post, which is exactly why mv-prose/mv-prose-page live here too.
   Scoped under .mv-prose so it CANNOT touch the Elementor-built accordions on 1023/1025/etc.
   Every value is the shipped Providers 678f961 accordion, measured in-browser at 1440. */
.elementor .mv-prose .mv-accordion {
	display: flex;
	flex-direction: column;
	gap: var(--mv-space-sm);            /* 15.84px at 1440 = shipped */
}
.elementor .mv-prose .mv-accordion-item {
	background-color: var(--mv-wash-blue);   /* #F0F8FA = shipped rgb(240,248,250) */
	border-radius: var(--mv-radius-lg);      /* 16px = shipped. NOT radius-md, which is 8px. */
	padding: var(--mv-space-md) var(--mv-space-md) var(--mv-space-lg);
}
/* The trigger is a , so the UA stylesheet gives it 8px 16px padding, inline-block and
   centred text. All three must be cancelled explicitly or the row collapses to a small pill. */
.elementor .mv-prose .mv-accordion-trigger {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--mv-space-md);
	width: 100%;
	padding: 20px 0;                    /* shipped computes 20px 0; its source class is a
	                                       per-page global we cannot read off this page */
	background: none;
	border: 0;
	text-align: left;
	cursor: pointer;
	color: inherit;
	font: inherit;
	/* [2026-08-19 Claude] white-space MUST be reset here.
	   WHY: the UA stylesheet gives a button white-space:nowrap, and `font: inherit` does not
	   reset it. The spec accordion's labels are short so nothing showed at 1440, but a long FAQ
	   question rendered 547px of unwrappable text inside a 278px trigger at 390px wide, which
	   pushed documentElement.scrollWidth to 603 and made the WHOLE medication page scroll
	   sideways on a phone. No element reported overflow (nothing extended past the viewport),
	   so an overflow sweep found 0 offenders while the defect was live. */
	white-space: normal;
}
/* 🔴 The chevron SVG is authored width:100%/height:100% -- that is how the shipped one ships.
   With no SIZED PARENT it resolved to 300x305px and dwarfed the question. Sizing the parent is
   mandatory, not cosmetic: without it every post-body accordion renders with a giant caret. */
.elementor .mv-prose .mv-accordion-chevron {
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	color: var(--mv-teal-heading);
	transition: transform 200ms ease;
}
.elementor .mv-prose .mv-accordion-trigger[aria-expanded="true"] .mv-accordion-chevron {
	transform: rotate(180deg);
}
/* The question is an  inside the button, so `.mv-prose h3` styles it 24px/700/teal.
   The shipped accordion uses mv-sublead: 20px, weight 400, ink. Match that instead. */
.elementor .mv-prose .mv-accordion-q {
	margin: 0;
	font-size: var(--mv-text-lead);     /* 20px at 1440 = shipped */
	font-weight: 400;
	line-height: 1.35em;
	color: var(--mv-ink);
}
.elementor .mv-prose .mv-accordion-panel {
	padding: 0 0 var(--mv-space-md);
}




.elementor .mv-med-cta + .mv-med-cta,
.elementor .mv-btn-group > .elementor-widget-button {
	margin: 0;
}

/* [2026-08-19 · Claude · medication-template] Body blocks carried in post_content.
   WHY KIT CSS: these render inside a theme-post-content widget, which has no Elementor tree, so
   every v4 global class is inert there -- only kit CSS and mv-prose reach it (same reason as
   .mv-h1-med). Scoped under .mv-prose so nothing here can touch an Elementor-built page.
   mv-relmed-* renders the PER-POST related products (132 real cross-links, 1-11 per row);
   mv-references holds the 5 rows that carry actual citation lists; mv-fineprint is the FDA
   disclaimer the other 34 rows carry, set small and dim so it does not read as body copy. */
/* [2026-08-19 · Claude · medication-template] Hero CTAs — the HOUSE button, reproduced.
   🔴 MY FIRST VERSION WAS WRONG AND STEPHEN CAUGHT IT BY EYE. I had built this from
   getComputedStyle().backgroundColor, which returns only the FALLBACK COLOUR of a gradient
   element. Every one of these buttons is a gradient, so I copied flat #99CBD7 / #CCE5EB and
   produced a muddy pill next to a nearly invisible circle, where the shipped button is a
   pearlescent white-gradient pill beside a deep teal radial circle. ⭐ getComputedStyle is the
   WRONG instrument for a gradient — read the global class (background-overlay), or the compiled
   global-*.css, and copy the gradient itself.

   WHY THIS IS CSS AND NOT THE ACTUAL COMPONENT, which is what I would prefer:
   the labels are per-post ACF (explore_button has 3 distinct values, learn_more_button has 11), so
   the button must carry a dynamic binding. Measured on components 917 / 920: the **Link override
   DOES accept `$$type: dynamic`** (as [[component-instance-link-takes-a-dynamic-tag]] records) but
   the **Text override REFUSES it** — both `{$$type:dynamic}` and a dynamic nested inside
   `html-v3` are rejected with *Override "Text" value failed Elementor prop validation for
   "paragraph"*. So a real component instance can carry the per-post URL but not the per-post
   label, and a v3 button widget is the only element that can carry both.

   Values are copied from the global classes, prop for prop — mv-btn (g-76b9f1e),
   mv-btn-accent (g-1204227), mv-btn-alt (g-2d7b952), mv-btn-arrow (g-a8d53a3),
   mv-arrow-accent (g-afe0ae5), mv-arrow-alt (g-cfff5ad), mv-btn-shell (g-1c83786),
   mv-arrow-glyph (g-0b7b9a3). mv-btn-fx and mv-loads carry NO props at all (0 variants, and
   nothing in kit CSS either), so there is no hover state to reproduce — the whole effect is the
   450ms transition already on the pill and the circle.
   ⚠ Note the arrow's margin-inline-start is -5px, not -4px: it tucks UNDER the pill's 4px border,
   which is why the two read as one object. Getting that wrong by 1px is visible at 4×. */
.elementor .mv-med-cta .elementor-button,
.elementor .mv-med-cta .elementor-button:hover {
	display: inline-flex;
	padding: 0;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	text-decoration: none;
}
/* = mv-btn-shell */
.elementor .mv-med-cta .elementor-button-content-wrapper {
	display: inline-flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	width: fit-content;
	gap: 0;
	padding: 0;
	text-decoration: none;
}
/* = mv-btn */
.elementor .mv-med-cta .elementor-button-text {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--mv-space-2xs);
	min-height: 50px;
	padding: 6px 12px;
	border-radius: var(--mv-radius-full);
	border-width: 4px;
	border-style: solid;
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	font-weight: 400;
	line-height: 1.6em;
	letter-spacing: -0.01em;
	text-transform: uppercase;
	text-decoration: none;
	cursor: pointer;
	transition: all 450ms;
}
/* = mv-btn-arrow, and the glyph rides on top of the gradient as a second background layer
   because a v3 button widget has no slot for an inline svg (= mv-arrow-glyph, 15x15). */
.elementor .mv-med-cta .elementor-button-content-wrapper::after {
	content: "";
	display: inline-flex;
	flex: 0 0 50px;
	width: 50px;
	height: 50px;
	margin-inline-start: -5px;
	position: relative;
	z-index: 1;
	padding: 0;
	border-radius: var(--mv-radius-full);
	border-width: 4px;
	border-style: solid;
	overflow: hidden;
	transition: all 450ms;
	background-repeat: no-repeat, no-repeat;
	background-position: center center, top left;
	background-size: 15px 15px, cover;
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20256%20256%22%3E%3Crect%20width%3D%22256%22%20height%3D%22256%22%20fill%3D%22none%22%2F%3E%3Cline%20x1%3D%2240%22%20y1%3D%22128%22%20x2%3D%22216%22%20y2%3D%22128%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3Cpolyline%20points%3D%22144%2056%20216%20128%20144%20200%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3C%2Fsvg%3E"), radial-gradient(circle at top left, var(--mv-accent) 0%, var(--mv-accent-soft) 100%);
}
/* --- primary = mv-btn-accent + mv-arrow-accent --- */
.elementor .mv-med-cta .elementor-button-text {
	border-color: var(--mv-accent-soft);
	color: var(--mv-ink);
	background-color: var(--mv-accent-soft);
	background-image: linear-gradient(90deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.51) 100%);
}
.elementor .mv-med-cta .elementor-button-content-wrapper::after {
	border-color: var(--mv-accent-soft);
	background-color: var(--mv-accent-wash);
}
/* --- secondary = mv-btn-alt + mv-arrow-alt. No base colour on the pill: the gradient fades the
       tint out to transparent, which is what makes it read as an outline button. --- */
.elementor .mv-med-cta-alt .elementor-button-text {
	border-color: var(--mv-white);
	color: var(--mv-ink);
	background-color: transparent;
	background-image: linear-gradient(90deg, var(--mv-teal-tint) 0%, rgba(153, 203, 215, 0) 100%);
}
.elementor .mv-med-cta-alt .elementor-button-content-wrapper::after {
	border-color: var(--mv-white);
	background-color: var(--mv-teal-wash);
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20256%20256%22%3E%3Crect%20width%3D%22256%22%20height%3D%22256%22%20fill%3D%22none%22%2F%3E%3Cline%20x1%3D%2240%22%20y1%3D%22128%22%20x2%3D%22216%22%20y2%3D%22128%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3Cpolyline%20points%3D%22144%2056%20216%20128%20144%20200%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3C%2Fsvg%3E"), radial-gradient(circle at top left, var(--mv-teal-tint) 0%, var(--mv-white) 100%);
}
@media (max-width: 767px) {
	.elementor .mv-med-cta .elementor-button-text { font-size: 12px; }
}

/* [2026-08-19 · Claude · medication-template] Section panels.
   A panel is a CONTAINED card, not a full-bleed band: post_content renders inside the boxed
   mv-container-inner, so a real band would have to escape to 100vw and that is the standard way
   horizontal overflow gets introduced here. Ground + radius are the shipped card recipe
   (--mv-wash-blue + --mv-radius-xl), so nothing new is invented.
   🔑 Accordion items INVERT to white inside a panel — they are wash-blue by default (matched to the
   shipped Providers accordion), and wash-on-wash would erase every item boundary. The panel keeps
   the same contrast relationship, just with the two grounds swapped. */
/* [2026-08-21 · Claude · webinars-featured-slot] Featured Webinar slot retired — no upcoming webinar.
   [2026-08-26 · Claude · webinars-featured-slot] The `display:none` rule that used to live here is
   GONE, and section `nextweb1` has been DELETED from page 1029.
   WHY the hide was not enough: display:none only stops the paint. The band's five headings
   (Featured Webinar / Peptide Therapeutics Part 2 / What you'll walk away with / Who should attend /
   Reserve Your Spot Today!) plus a LIVE HubSpot 'Register Now' form (f5e14c94) for the already-passed
   17 Aug 2026 session all still shipped in the DOM, and the HubSpot embed still rendered and counted
   them. Connor reviewed ticket 868kufqvf by the HEADING OUTLINE and reported a Featured Webinar
   section that 'is not visible on the page' — he was reading exactly this. A hidden band is not a
   removed band, and a passed event must not keep a live registration form anywhere in the markup.
   WHY the slot is empty at all: Reeva asked on 20 Aug for the 17 Aug webinar to be MOVED to Our
   Previous Webinars, and said there are no upcoming ones yet. Carousel 3479 is at offset 0 so Part 2
   sits in Our Previous Webinars. The hero CTA on component 2271 is overridden to the newsletter
   ('Subscribe for Provider Updates' -> /news-letter/) instead of the dead #featured-webinar anchor.
   ⭐ TO RESTORE when the next webinar is scheduled — all three together, or it breaks:
     1. re-append section `nextweb1` at index 1 from the repo backup
        _archive/page-1029-webinars-full-2026-08-26.json — loop item template 3454 was left intact;
     2. set carousel 3479 back to offset 1
        (PATCH carousel-marquee-kit/v1/instances/3479 with settings.offset = 1), or the new webinar
        shows in both places at once;
     3. repoint the hero CTA override on component 2271 back to the #featured-webinar anchor.
   🔴 Do NOT reintroduce a CSS hide as the mechanism — if it has to go away again, remove the section.
   (For the record: the old rule needed its `body` prefix to reach (0,2,1), because base-desktop.css
   ships `.elementor .e-flexbox-base{display:flex}` at (0,2,0) and loads AFTER post-7.css, so the
   unprefixed rule tied and lost on source order.) */

/* [2026-08-21 · Claude · peptide-video-card] Card CTA pill.
   WHY: the card markup was ported from prod, where `.explore-btn` is a THEME class that paints
   the pink pill. That class does not exist in the v4 build, so "Join the Waitlist" shipped as a
   bare underlined link on all seven peptide pages while the hero directly above it rendered the
   same label as a real pill.
   Styled here rather than re-marking the seven posts: the CTA is a plain anchor inside a wp:html
   block, so it cannot carry mv-med-cta — that class is written against the v3 button widget's
   inner .elementor-button-text span, which a plain anchor does not have. settings.classes is a
   no-op on an html widget for the same reason.
   Values are copied prop-for-prop from the mv-med-cta PRIMARY variant above (= mv-btn +
   mv-btn-accent + mv-arrow-accent) so the card CTA and the hero CTA are the same object; the
   arrow circle rides on the wrapping paragraph because the pill itself is the only element the
   anchor gives us. Prod's pink is deliberately NOT reproduced — the v4 palette has no pink CTA. */
.elementor .mv-medcard__cta {
	display: inline-flex;
	align-items: center;
	align-self: flex-start;
	gap: 0;
	width: fit-content;
}
.elementor .mv-medcard__cta .explore-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--mv-space-2xs);
	min-height: 50px;
	padding: 6px 12px;
	position: relative;
	z-index: 1;
	border-radius: var(--mv-radius-full);
	border-width: 4px;
	border-style: solid;
	border-color: var(--mv-accent-soft);
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-body);
	font-weight: 400;
	line-height: 1.6em;
	letter-spacing: -0.01em;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--mv-ink);
	background-color: var(--mv-accent-soft);
	background-image: linear-gradient(90deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.51) 100%);
	cursor: pointer;
	transition: all 450ms;
}
.elementor .mv-medcard__cta::after {
	content: "";
	display: inline-flex;
	flex: 0 0 50px;
	width: 50px;
	height: 50px;
	margin-inline-start: -5px;
	position: relative;
	z-index: 1;
	padding: 0;
	border-radius: var(--mv-radius-full);
	border-width: 4px;
	border-style: solid;
	border-color: var(--mv-accent-soft);
	background-color: var(--mv-accent-wash);
	background-repeat: no-repeat, no-repeat;
	background-position: center center, top left;
	background-size: 15px 15px, cover;
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20256%20256%22%3E%3Crect%20width%3D%22256%22%20height%3D%22256%22%20fill%3D%22none%22%2F%3E%3Cline%20x1%3D%2240%22%20y1%3D%22128%22%20x2%3D%22216%22%20y2%3D%22128%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3Cpolyline%20points%3D%22144%2056%20216%20128%20144%20200%22%20fill%3D%22none%22%20stroke%3D%22%23021C26%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%2216%22%2F%3E%3C%2Fsvg%3E"), radial-gradient(circle at top left, var(--mv-accent) 0%, var(--mv-accent-soft) 100%);
	transition: all 450ms;
}

.elementor .mv-prose .mv-medsec-panel {
	background-color: var(--mv-wash-blue);
	border-radius: var(--mv-radius-xl);
	padding: var(--mv-space-xl) var(--mv-space-lg) var(--mv-space-lg);
	margin: var(--mv-space-2xl) 0;
}
.elementor .mv-prose .mv-medsec-panel > h2:first-child {
	margin-top: 0;
}
.elementor .mv-prose .mv-medsec-panel .mv-accordion-item {
	background-color: var(--mv-white);
}
.elementor .mv-prose .mv-medsec-panel .mv-accordion {
	margin-bottom: 0;
}

.elementor .mv-prose .mv-relmed-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: var(--mv-space-md);
	margin: var(--mv-space-md) 0 var(--mv-space-lg);
}
.elementor .mv-prose .mv-relmed-card {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--mv-space-sm);
	padding: var(--mv-space-md);
	background-color: var(--mv-wash-blue);
	border-radius: var(--mv-radius-lg);
	text-decoration: none;
	transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.elementor .mv-prose .mv-relmed-card:hover {
	transform: translateY(-2px);
	box-shadow: 0 8px 24px var(--mv-glass-ink-10);
}
.elementor .mv-prose .mv-relmed-img {
	width: 100%;
	max-width: 160px;
	aspect-ratio: 1 / 1;
	object-fit: contain;
	display: block;
}
/* [2026-08-19 · Claude] Was a ; now an  to match production, whose related-product
   titles are H3 — that is 3 of the 3 heading-count difference against prod on glutathione. It sits
   under the "Related Products" H2, so the level is correct rather than decorative. */
.elementor .mv-prose .mv-relmed-title {
	margin: 0;   /* it is an h3 now, so cancel the prose heading margins */
	font-family: var(--mv-font-sans);
	font-size: var(--mv-text-lead);
	font-weight: 400;
	line-height: 1.25em;
	color: var(--mv-navy);
	text-align: center;
}
.elementor .mv-prose .mv-relmed-more a {
	font-size: var(--mv-text-btn);
}
.elementor .mv-prose .mv-references {
	font-size: var(--mv-text-sm);
	line-height: 1.6em;
	color: var(--mv-ink-80);
}
.elementor .mv-prose .mv-references p,
.elementor .mv-prose .mv-references li {
	font-size: inherit;
	line-height: inherit;
}
.elementor .mv-prose .mv-fineprint {
	margin-top: var(--mv-space-lg);
	padding-top: var(--mv-space-md);
	border-top: var(--mv-hairline) solid var(--mv-rule-10);
	font-size: var(--mv-text-sm);
	line-height: 1.55em;
	/* [2026-08-19 · Claude] --mv-ink-48 was WRONG here and I put it there. Composited over white
	   it is rgb(134,146,151) = 3.20:1, and WCAG AA wants 4.5:1 for 14px normal text, so the legal
	   disclaimer was the least readable text on the page. --mv-ink-80 is 9.45:1. Dimming is fine
	   for a 20px lead; it is not fine at --mv-text-sm. Computed, not eyeballed. */
	color: var(--mv-ink-80);
}
.elementor .mv-prose .mv-fineprint p,
.elementor .mv-prose .mv-fineprint em,
.elementor .mv-prose .mv-fineprint i {
	font-size: inherit;
	line-height: inherit;
	color: inherit;
}

/* [2026-08-19 · Claude · medication-template] Hero photo for the singular/medication template.
   WHY A CLASSIC image WIDGET AND KIT CSS, same reason as .mv-h1-med above: the photo must be the
   POST's featured image, and an atomic e-image REFUSES a dynamic src -- validate_page 3558 said
   "UNSAVABLE: prop 'image' ... expects one of its union member envelopes ($$type: image |
   overridable)", i.e. `dynamic` is not a member of image-src. (This is the same ground
   validate_page's own loop_image_binding_unsupported rule covers.) So the widget is classic with
   __dynamic__ featured-image + a fallback of attachment 1590, and mv-page-hero-photo -- a v4
   global class, emitted per document from g-* references -- cannot reach it.
   ONE DELIBERATE DEPARTURE from mv-page-hero-photo (g-cc47b85): object-fit is CONTAIN, not COVER.
   Every other hero on this site is fed a portrait art-directed photo; the medication featured
   images are SQUARE 1300x1300 product shots of labelled vials, and a cover crop to 413/550 cuts
   roughly a quarter off the top and bottom -- i.e. off the label. Geometry and radius are copied
   unchanged so the slot still matches every other inner-page hero. */
.elementor .mv-med-hero-photo img {
	width: 100%;
	max-width: 413px;
	aspect-ratio: 413 / 550;
	object-fit: contain;
	display: block;
	border-radius: var(--mv-radius-xl);
}
.elementor .mv-h1-med .elementor-heading-title {
	font-family: var(--mv-font-sans);
	font-size: clamp(36px, calc(21.5px + 4.03vw), 80px);
	font-weight: 400;
	line-height: 1em;
	letter-spacing: -0.08em;
	color: var(--mv-navy);
	margin: 0;
}




/* ══════════════════════════════════════════════════════════════
   SINGLE WEBINAR — sticky copy rail
   [2026-08-19 · Claude · webinars-audit] Stephen's call: the copy
   column is ~620px against a ~1850px HubSpot form, which left
   ~1,230px of dead white beside the form (measured on all three
   watch-recording pages). Sticking the short column keeps the
   copy and banner in view while the long form scrolls.
   `position: sticky` lives on the element's atomic style, not
   here — `top` is NOT in the v4 atomic style schema, so the
   offset can only come from hand CSS. Same split as
   .mv-post-rail above. The fixed header is 80px and reserves no
   space of its own, so the offset clears it explicitly.
   ══════════════════════════════════════════════════════════════ */

.elementor .mv-webinar-rail {
	top: 104px;              /* 80 header + 24 breathing */
}




/* [2026-08-19 · Claude · webinars-audit] .mv-webinar-video — the recording
   iframe injected by the gate in template 3383's html widget on HubSpot's
   onFormSubmitted. Kit CSS because the node does not exist until runtime, so
   there is no Elementor element to carry a style. Ratio is fixed here rather
   than on the iframe so a Vimeo embed of any dimensions fills the panel. */

.elementor .mv-webinar-video {
	position: relative;
	width: 100%;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	border-radius: var(--mv-radius-lg);
	background: var(--mv-ink);
}

.elementor .mv-webinar-video iframe {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}


/* ══════════════════════════════════════════════════════════════
   GLOBAL LINK COLOUR — kill the #CC3366 pink default
   [2026-08-19 · Claude · webinars-audit] Stephen spotted a pink
   "Click this link to download the product catalog." in the
   HubSpot thank-you message on /webinar/the-many-faces-of-hormones/
   and asked for a global rule.
   MEASURED: a bare <a> injected ANYWHERE on the site computes to
   rgb(204,51,102) = #CC3366. It is not a variable and it is not in
   any stylesheet we could grep (theme reset/theme/header-footer,
   Elementor base, every plugin sheet) — it is simply the inherited
   site default, so EVERY classless anchor on EVERY page is pink,
   not just this one. Fixing it at the source is the global rule.
   Values mirror `.elementor .mv-prose a` above deliberately, so a
   stray link and a prose link look identical rather than becoming
   a second house style. Underlined because colour alone must not
   be the only cue that text is a link.
   ⚠ `:not([class])` is doing real work — every deliberate link
   style on the site (mv-btn, nav, footer, cards) carries a class,
   so they are untouched. Do not widen this to a bare `a`.
   ══════════════════════════════════════════════════════════════ */

.elementor a:not([class]),
.elementor .hs-richtext a,
.elementor .submitted-message a,
.elementor .hs_cos_wrapper a {
	color: var(--mv-link-navy);
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}

.elementor a:not([class]):hover,
.elementor a:not([class]):focus-visible,
.elementor .hs-richtext a:hover,
.elementor .submitted-message a:hover,
.elementor .submitted-message a:focus-visible {
	color: var(--mv-blue-deep);
	text-decoration-thickness: 2px;
}


/* ══════════════════════════════════════════════════════════════
   HUBSPOT FINE PRINT — floor the font size
   [2026-08-19 · Claude · webinars-audit] The closing legal
   paragraph ("This website is the property of MediVera...")
   rendered at 10px with a 25.6px line-height (ratio 2.56) on the
   register form, i.e. on /webinars/ twice and on both Peptide
   webinar pages. Measured, not eyeballed.
   ROOT CAUSE IS IN HUBSPOT, NOT HERE: the form editor authored
   `<p style="font-size: 10px;">` inline. Its sibling paragraphs
   are 13px and 16px and are fine. The real fix is to clear that
   inline size in the HubSpot form, which corrects every embed of
   this shared form at once — that is on the ticket.
   This rule is a GUARD, not the fix. It is deliberately keyed to
   the offending inline declaration so it cannot touch the 13px
   and 16px paragraphs, and so it stops applying by itself once
   HubSpot is corrected. `!important` is required only because the
   size is inline.
   ══════════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════════
   PEPTIDES HERO — launch-notice type hierarchy
   [2026-08-26 · Claude · ticket-868kwqd61] Client feedback, staging
   review week of 17 Aug: "the message is getting lost with the very
   large font size. Have 'We're Ready' remain very large and slightly
   reduce the size of the following two sentences."
   WHY THIS EXISTS: they reviewed the 13 AUG build (revision 2746),
   where the WHOLE launch notice WAS the H1 — "We're Ready. MediVera …
   has completed … Launch is set to follow final approval." — at
   --mv-text-h1, 79.5px at 1440. The 20 Aug edit answered only half of
   it: the H1 became "Peptides compounding pharmacy" (production's H1
   AND the page title — do NOT change that back), and the entire launch
   notice was pushed into the hero sub-copy at --mv-text-body. So
   "We're Ready" ended up SMALLER than everything else, buried
   mid-paragraph in nine lines of 16px: the opposite of the request.
   This restores the three tiers the client described, inside the
   sub-copy and UNDER the H1 rather than replacing it:
     "We're Ready."       --mv-text-h3   32px → 24px
     the two sentences    --mv-text-lead 20px → 18px
     background paragraph --mv-text-body 16px, untouched
   SCOPED TO PAGE 2487 because the hero is shared native component
   1880 (~9 live pages): its paragraph element cannot be restyled
   directly, and the runs cannot carry a class — html-v3 STRIPS class
   from inline tags on any Elementor-side save. The runs are marked by
   TAG + POSITION instead, which survives; the size lives here.
   🔴 `body` prefix is LOAD-BEARING — see the .page-id-1029 note above.
   ⚠ The runs are separated by a real SPACE in the stored html-v3, not
   only by these display:block rules, so textContent still extracts as
   "We're Ready. MediVera …" and not "Ready.MediVera".
   ══════════════════════════════════════════════════════════════ */

body.page-id-2487 .mv-page-hero-sub > strong:first-child {
	display: block;
	margin-bottom: var(--mv-space-2xs);
	color: var(--mv-navy);
	font-size: var(--mv-text-h3);
	line-height: 1.15;
}

body.page-id-2487 .mv-page-hero-sub > strong:first-child + span {
	display: block;
	margin-bottom: var(--mv-space-sm);
	font-size: var(--mv-text-lead);
	line-height: 1.4;
}


/* [2026-08-31 · Claude · ticket-868kxrdfd] Blog post furniture imported from production.
   WHY: production's SEO team rewrote four posts on 12 Aug and the new bodies carry 40-87 INLINE
   STYLES each - an #ED1E79 pink button, #003D55 navy where the brand navy is #054059, and
   'Open Sans' + warnock-pro where the brand font is Ubuntu. Importing verbatim would have put
   production's palette inside four blog posts. Every inline style is stripped by
   tools/post-import/import-prod-posts.mjs and the surviving panels land on these classes.
   WHY KIT CSS: post_content renders in a theme-post-content widget with no Elementor tree, so
   every v4 global class is inert there - the kit is the only sheet that reaches it. Same reason
   as mv-prose / mv-relmed-* / mv-fineprint above.
   ⭐ Only TWO panels are new. Production's pink button re-marks to the house pill
   (.mv-medcard__cta .explore-btn) and its sources block to .mv-fineprint + .mv-references, both
   already here from the medication-template pass. Tables: see the table block above. The kit's own
   rules are on-brand, but until 2026-09-10 they left three sides of every cell and the row stripe
   to the block library and the theme reset, which drew an ink grid and grey stripes.
   Every contrast figure below is COMPUTED against the composited ground, not eyeballed. */

/* a pull-aside note: tinted panel, accent rule on the leading edge. Production shipped this with
   a pink, a navy AND a green border across the four posts; one accent here, deliberately.
   The 4px --mv-green stripe is 2.56:1 on this ground, which is fine because it is DECORATIVE -
   the tint and the radius already say "aside", so the stripe carries no information of its own.
   🔴 Do not promote it to the only cue without changing the colour. */
.elementor .mv-prose .mv-post-note {
	background-color: var(--mv-wash-blue);
	border-inline-start: 4px solid var(--mv-green);
	border-radius: var(--mv-radius-md);
	padding: var(--mv-space-md) var(--mv-space-lg);
	margin: var(--mv-space-xl) 0;
}

.elementor .mv-prose .mv-post-note > *:last-child {
	margin-bottom: 0;
}

/* Body copy inside a panel steps DOWN from the 20px article lead: at --mv-text-lead the note
   competes with the article it is meant to sit beside. Spelled out per element because
   .mv-prose ul li is (0,2,2) and a bare .mv-post-note li would be (0,3,1) but lose on the
   ul-vs-li tie the same way .mv-prose-page did. */
.elementor .mv-prose .mv-post-note p,
.elementor .mv-prose .mv-post-note ul li,
.elementor .mv-prose .mv-post-note ol li {
	font-size: var(--mv-text-body);
	line-height: 1.65em;
}

/* 10.36:1 on the wash */
.elementor .mv-prose .mv-post-note-t {
	font-size: var(--mv-prose-h3);
	font-weight: 700;
	line-height: 1.3em;
	color: var(--mv-teal-heading);
	margin: 0 0 var(--mv-space-xs);
}

/* eyebrow: production set this in pink or green at 13px.
   🔴 --mv-teal is the obvious token here and it FAILS: #1A7D9B on --mv-wash-blue is 4.38:1, and
   14px bold is NOT WCAG large text (that starts at 18.66px bold), so it needs 4.5. Missing by
   0.12 is still missing. --mv-teal-deep is 6.18:1. --mv-green would be 2.56:1.
   (mv-eyebrow itself is an Elementor global class and inert in post_content.) */
.elementor .mv-prose .mv-post-eyebrow {
	font-size: var(--mv-text-sm);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--mv-teal-deep);
	margin: 0 0 var(--mv-space-xs);
}

/* the dark CTA panel that closes a post. White on --mv-teal-heading is 11.15:1. */
.elementor .mv-prose .mv-post-cta {
	background-color: var(--mv-teal-heading);
	border-radius: var(--mv-radius-xl);
	padding: var(--mv-space-xl) var(--mv-space-lg);
	margin: var(--mv-space-2xl) 0;
}

.elementor .mv-prose .mv-post-cta > *:last-child {
	margin-bottom: 0;
}

.elementor .mv-prose .mv-post-cta p,
.elementor .mv-prose .mv-post-cta ul li,
.elementor .mv-prose .mv-post-cta ol li {
	font-size: var(--mv-text-body);
	line-height: 1.65em;
	color: var(--mv-white);
}

.elementor .mv-prose .mv-post-cta-t {
	font-size: var(--mv-prose-h3);
	font-weight: 700;
	line-height: 1.3em;
	color: var(--mv-white);
	margin: 0 0 var(--mv-space-xs);
	/* house rule: white text always ships with a soft shadow. Blur is 2x the offset and in em, so
	   it scales with the type - 8x blur reads as grime, which is how the first version was rejected. */
	text-shadow: 0 0.02em 0.04em rgba(2, 28, 38, 0.32);
}

/* an inline link on the navy ground. .mv-prose a is --mv-link-navy = #023A5F on #054059, which
   computes to 1.06:1 - invisible, not merely dim. The house pill is excluded: it keeps its own
   ink-on-pearlescent label at 17.55:1. */
.elementor .mv-prose .mv-post-cta a:not(.explore-btn) {
	color: var(--mv-white);
}

.elementor .mv-prose .mv-post-cta a:not(.explore-btn):hover,
.elementor .mv-prose .mv-post-cta a:not(.explore-btn):focus-visible {
	color: var(--mv-green-soft);
}

/* the one place mv-fineprint could NOT be reused: it sets --mv-ink-80, which on navy is 1.1:1.
   --mv-white-80 composites to #CDD9DE = 7.74:1, well clear of the 4.5 that 14px needs. */
.elementor .mv-prose .mv-post-cta-fine {
	font-size: var(--mv-text-sm);
	line-height: 1.55em;
	color: var(--mv-white-80);
	margin: var(--mv-space-sm) 0 0;
}

.elementor .hs-richtext p[style*="font-size: 10px"],
.elementor .hs-richtext p[style*="font-size:10px"] {
	font-size: var(--mv-text-xs) !important;
	line-height: 1.5 !important;
}/* End custom CSS */