/*
Theme Name: REHVÉAL
Theme URI: https://rehveal.com
Description: Custom child theme for REHVÉAL™ — strategic advisory. Built to the REHVÉAL Website Build Brief v4.1 brand canon, on Hello Elementor so Elementor Pro's Theme Builder owns the header, footer and templates. The canon palette and type are mirrored into Elementor's Global Colors and Global Fonts, so the editor offers her brand and nothing else.
Author: Luminos Agency
Author URI: https://luminosagency.com
Template: hello-elementor
Version: 1.0.0
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 8.1
License: Proprietary — © Luminos Agency for REHVEAL Holdings, LLC™
Text Domain: rehveal
Tags: accessibility-ready
*/

/* ════════════════════════════════════════════════════════════════════════
   This file loads AFTER assets/css/reference.css, which is generated from
   Régine's corrected reference build and must never be hand-edited. Every
   correction to her CSS belongs here, so re-importing her build stays safe.
   ════════════════════════════════════════════════════════════════════════ */


/* ── Web canon faces, self-hosted ──────────────────────────────────────
   Same families and latin subsets Google serves, from our own origin: no
   third-party connection, and no font swap part-way through an entrance. */

@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('assets/fonts/dmsans-normal-300-700-latin.woff2') format('woff2');
}
@font-face {
  font-family: 'Playfair Display';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('assets/fonts/playfair-normal-400-700-latin.woff2') format('woff2');
}
@font-face {
  font-family: 'Playfair Display';
  font-style: italic;
  font-weight: 400 700;
  font-display: swap;
  src: url('assets/fonts/playfair-italic-400-700-latin.woff2') format('woff2');
}


/* ── Punch list B · reconcile the off-canon tokens ─────────────────────
   Build Brief §3 lists Gold Pale as #F8F2E6. The reference build declared
   #E8D49A, but never used it — verified: one occurrence, the declaration
   itself. Aligning it costs nothing and stops the wrong value spreading.
   --plum-mid #4A2260 is kept: it is a real gradient stop in #hero, #signal
   and #questions, which the audit explicitly allows. */

:root {
  --gold-pale: #F8F2E6;
}


/* ── Punch list A · finish the gold-on-cream contrast ──────────────────
   Gold #B8973A on cream is 2.65:1 and fails AA; on plum it is 5.2:1 and
   passes, so the fix is scoped by SECTION, never by class — the same
   eyebrow class stays gold wherever it sits on plum. Plum on cream is
   13.8:1. Each selector below was derived from the rendered markup, not
   guessed: see tools/audit-contrast.py. */

#engages .engages-label,
#engages .pillar-number,
#about-rehveal .about-label,
.signal-section .signal-attribution {
  color: var(--plum);
}

/* The one VISIBLE change beyond eyebrows, flagged for Régine: the second
   perspective line is a display quote in gold on cream. At clamp(1.6rem,
   3.5vw, 2.6rem) it is large text, so it needs 3:1 — and 2.65:1 misses even
   that. It keeps its italic and its lighter weight, so it still reads as the
   answering half of the pair; only the colour moves to canon plum. */
#perspective .perspective-quote-2 {
  color: var(--plum);
}


/* ── Punch list D · accessibility finish ───────────────────────────────── */

/* Content must not depend on JavaScript to become visible. The reference
   build sets .fade-in { opacity: 0 } and only adds .visible from script, so
   a failed or blocked script hides the entire page. Invert it: visible by
   default, and only armed once the document advertises JS. */
.fade-in { opacity: 1; transform: none; }
html.js .fade-in { opacity: 0; transform: translateY(24px); }
html.js .fade-in.visible { opacity: 1; transform: translateY(0); }

@media (prefers-reduced-motion: reduce) {
  html.js .fade-in,
  html.js .fade-in.visible { opacity: 1; transform: none; transition: none; }
  .accordion-content { transition: none; }
  html { scroll-behavior: auto; }
}

/* A visible focus ring in canon gold, on a dark halo so it reads on both
   plum and cream. Browser default outlines belong to no design system. */
:where(a, button, input, textarea, select, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--gold-light);
  outline-offset: 3px;
  border-radius: 2px;
}
.section-cream :focus-visible,
#engages :focus-visible,
#credibility :focus-visible,
#perspective :focus-visible,
#about-rehveal :focus-visible,
#closing :focus-visible {
  outline-color: var(--plum);
}

/* Skip link — offscreen until focused. */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 1000;
  background: var(--plum);
  color: var(--cream);
  font-family: 'DM Sans', sans-serif;
  font-size: 0.78rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: 16px 24px;
  text-decoration: none;
}
.skip-link:focus {
  left: 24px;
  top: 16px;
}

/* The honeypot is for robots, not for people or screen readers. */
.hp-field {
  position: absolute !important;
  left: -9999px !important;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* Browser surfaces the design still owns. */
::selection { background: var(--gold); color: var(--plum); }
:root { accent-color: var(--plum); color-scheme: light; }
html { scroll-behavior: smooth; }


/* ── Defects the staging build surfaced, 2026-09-19 ────────────────────── */

/* Footer nav was plum at opacity .6, which composites to #87708A on cream-warm
   — 3.93:1, under AA. 0.7 gives 5.31:1 and is the smallest change that keeps
   her muted treatment. (Canon Mid Gray would also pass at 5.89:1, but it drops
   the plum tint she chose.) */
.footer-nav a { opacity: 0.7; }

/* The mark carries width/height attributes for CLS, and the height attribute
   is a presentational hint: with only `width: 100px` in CSS the height stayed
   at the intrinsic 1536px and the logo rendered stretched. */
.footer-mark { height: auto; }


/* ── Site chrome the reference build did not have ──────────────────────── */

/* The reference nav carried two links. The launch sitemap carries six, so
   it needs to wrap gracefully and collapse on small screens. */
.nav-links { flex-wrap: wrap; row-gap: 12px; }
@media (max-width: 1024px) { .nav-links { gap: 28px; } }

.nav-toggle {
  display: none;
  background: none;
  border: 1px solid rgba(184,151,58,0.45);
  color: var(--gold);
  font-family: 'DM Sans', sans-serif;
  font-size: 0.68rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  padding: 10px 16px;
  cursor: pointer;
}
@media (max-width: 860px) {
  nav { flex-wrap: wrap; }
  .nav-toggle { display: block; }
  .nav-links {
    flex-basis: 100%;
    flex-direction: column;
    gap: 0;
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  }
  nav.nav-open .nav-links { max-height: 420px; }
  .nav-links li { border-top: 1px solid rgba(184,151,58,0.18); }
  .nav-links a { display: block; padding: 18px 0; }
}

/* The nav is transparent until it scrolls, which works on the plum-gradient
   hero but leaves cream-topped pages with unreadable nav links against cream.
   Any view whose first section is cream carries the solid nav from the start.
   Seen on /field-journal/ 2026-09-19. */
body.field-journal #nav {
  background: rgba(61, 26, 75, 0.97);
  backdrop-filter: blur(12px);
  padding: 18px 60px;
  border-bottom: 1px solid rgba(184, 151, 58, 0.2);
}
@media (max-width: 860px) { body.field-journal #nav { padding: 16px 28px; } }

/* `hidden` must win over a component's own display value — the axis panels and
   the theme chips are flex/block containers, and the attribute alone loses. */
[hidden] { display: none !important; }

/* Current page in the nav. */
.nav-links .current-menu-item > a,
.nav-links .current_page_parent > a { color: var(--gold); }


/* ── Re-scoping her bare-tag rules ─────────────────────────────────────
   Her reference build was flat HTML where the only <nav> was the site header
   and the only <footer> was the site footer, so styling the bare tags was
   correct there. Elementor's Theme Builder renders its own <nav> inside the
   menu widget — in the footer too — and wraps locations in <header>/<footer>.
   Left alone, the footer's menu picked up `position: fixed` and stacked on top
   of the header. Her treatment is re-pointed at the two containers that
   actually are the site header and footer. */

nav {
  position: static;
  display: block;
  padding: 0;
  background: none;
  backdrop-filter: none;
  transition: none;
}

#nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  padding: 28px 60px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  transition: background 0.4s ease, padding 0.4s ease, backdrop-filter 0.4s ease;
}
#nav.scrolled {
  background: rgba(61, 26, 75, 0.97);
  backdrop-filter: blur(12px);
  padding: 18px 60px;
  border-bottom: 1px solid rgba(184, 151, 58, 0.2);
}
@media (max-width: 860px) {
  #nav { padding: 20px 28px; }
  #nav.scrolled { padding: 16px 28px; }
}

/* Same story for the footer: the tag rule becomes the container rule. */
footer { background: none; padding: 0; display: block; border-top: 0; text-align: inherit; }
footer.elementor-location-footer,
#site-footer {
  background: var(--cream-warm);
  text-align: center;
  border-top: 1px solid rgba(61, 26, 75, 0.08);
}

/* ── Elementor bridge ──────────────────────────────────────────────────
   The Theme Builder header and footer are Elementor documents, so their
   markup is Elementor's, not the reference build's. These rules carry her
   nav and footer treatment onto that markup. The header container takes the
   CSS ID `nav`, so everything her stylesheet already says about `nav` —
   including the transparent-until-scrolled behaviour — still applies. */

#nav { z-index: 100; }
#nav > .e-con-inner { display: contents; }

#nav .nav-logo a,
#nav .nav-logo .elementor-heading-title {
  font-family: 'Playfair Display', serif;
  font-size: 1.35rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: var(--gold);
  text-decoration: none;
}

#nav .nav-links .elementor-nav-menu a {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.78rem;
  font-weight: 400;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.75);
  padding: 0;
  background: none;
  transition: color 0.3s ease;
}
#nav .nav-links .elementor-nav-menu > li + li { margin-left: 48px; }
#nav .nav-links .elementor-nav-menu a:hover,
#nav .nav-links .elementor-nav-menu a.elementor-item-active { color: var(--gold); }

/* Burger and the mobile panel, in canon rather than Elementor's defaults. */
#nav .elementor-menu-toggle { color: var(--gold); background: none; }
#nav .elementor-nav-menu--dropdown { background: rgba(61, 26, 75, 0.98); }
#nav .elementor-nav-menu--dropdown a { color: rgba(255, 255, 255, 0.85); }

#site-footer .footer-mark-wrap img { width: 100px; height: auto; }
#site-footer .footer-nav .elementor-nav-menu a {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.7rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--plum);
  opacity: 0.7;               /* 5.31:1 on cream-warm; 0.6 measured 3.93:1 */
  background: none;
  transition: opacity 0.3s;
}
#site-footer .footer-nav .elementor-nav-menu > li + li { margin-left: 32px; }
#site-footer .footer-nav .elementor-nav-menu a:hover { opacity: 1; }
#site-footer .footer-copy-wrap p {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.68rem;
  letter-spacing: 0.06em;
  color: var(--grey);
  margin: 0;
}

/* ── The Field Journal ─────────────────────────────────────────────────
   Build Brief §6. A numbered archive on cream, browsable three ways:
   by number, by theme, and by the question it changes. Built to scale from
   three observations to dozens without redesign. */

.fj-hero { background: var(--cream); padding: 180px 60px 0; text-align: center; }
.fj-hero-inner { max-width: 820px; margin: 0 auto; }
.fj-overline {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.7rem;
  font-weight: 400;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--plum);
  display: block;
  margin-bottom: 28px;
}
.fj-title {
  font-family: 'Playfair Display', serif;
  font-size: clamp(2rem, 4.6vw, 3.2rem);
  font-weight: 500;
  color: var(--plum);
  line-height: 1.2;
  margin-bottom: 28px;
}
.fj-lede {
  font-size: 1rem;
  font-weight: 300;
  color: var(--grey);
  line-height: 1.85;
  max-width: 640px;
  margin: 0 auto 56px;
}

/* Axis switcher — by number · by theme · by the question it changes. */
.fj-axes {
  display: flex;
  justify-content: center;
  gap: 2px;
  flex-wrap: wrap;
  margin-bottom: 40px;
}
.fj-axis {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--grey);
  background: none;
  border: 1px solid rgba(61,26,75,0.18);
  padding: 14px 24px;
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.fj-axis:hover { color: var(--plum); border-color: rgba(61,26,75,0.45); }
.fj-axis[aria-selected="true"] {
  background: var(--plum);
  border-color: var(--plum);
  color: var(--cream);
}

/* Theme filter chips. */
.fj-chips { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 72px; }
.fj-chip {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.68rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--grey);
  background: none;
  border: 1px solid rgba(61,26,75,0.18);
  border-radius: 999px;
  padding: 9px 18px;
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.fj-chip:hover { color: var(--plum); border-color: rgba(61,26,75,0.45); }
.fj-chip[aria-pressed="true"] { background: var(--plum); border-color: var(--plum); color: var(--cream); }

.fj-archive { background: var(--cream); padding: 0 60px 140px; }
.fj-inner { max-width: 1000px; margin: 0 auto; }

/* One observation: the plum card, then the field note beneath it. */
.fj-entry {
  display: grid;
  grid-template-columns: 340px 1fr;
  gap: 56px;
  align-items: start;
  padding: 72px 0;
  border-top: 1px solid rgba(61,26,75,0.12);
}
.fj-entry:first-child { border-top: none; }
.fj-card {
  position: relative;
  aspect-ratio: 1 / 1;
  background: var(--plum);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 44px;
  overflow: hidden;
}
.fj-card img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Fallback card, used until Régine supplies the finished 1:1 artwork. */
.fj-card-text {
  font-family: 'Playfair Display', serif;
  font-style: italic;
  font-size: 1.05rem;
  line-height: 1.55;
  color: var(--gold);
  text-align: center;
  position: relative;
  z-index: 2;
}
.fj-card-brackets::before,
.fj-card-brackets::after {
  content: '';
  position: absolute;
  width: 26px;
  height: 26px;
  border: 1px solid rgba(184,151,58,0.55);
}
.fj-card-brackets::before { top: 20px; left: 20px; border-right: 0; border-bottom: 0; }
.fj-card-brackets::after { bottom: 20px; right: 20px; border-left: 0; border-top: 0; }
.fj-card-foot {
  position: absolute;
  left: 0; right: 0; bottom: 18px;
  font-family: 'DM Sans', sans-serif;
  /* Solid gold, not gold at .75 alpha: the faded value composites to #99783E
     on plum and measures 3.52:1. Full gold on plum is 5.2:1 — the same reason
     her own audit cleared gold-on-plum and only flagged gold-on-cream. */
  font-size: 0.6rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold);
  text-align: center;
}

.fj-meta {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.66rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--plum);
  margin-bottom: 22px;
}
.fj-note-block { margin-bottom: 26px; }
.fj-note-label {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.62rem;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--grey);
  display: block;
  margin-bottom: 8px;
}
.fj-note-body { font-size: 0.97rem; color: var(--slate); line-height: 1.8; font-weight: 300; }
.fj-theme-tag {
  display: inline-block;
  font-family: 'DM Sans', sans-serif;
  font-size: 0.6rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--plum);
  border: 1px solid rgba(61,26,75,0.25);
  border-radius: 999px;
  padding: 6px 14px;
  text-decoration: none;
}

/* "By the question it changes" — the signature index. */
.fj-questions { list-style: none; max-width: 820px; margin: 0 auto; }
.fj-question-row { border-top: 1px solid rgba(61,26,75,0.12); padding: 34px 0; }
.fj-question-row:first-child { border-top: none; }
.fj-question-link {
  font-family: 'Playfair Display', serif;
  font-style: italic;
  font-size: 1.25rem;
  color: var(--plum);
  line-height: 1.45;
  text-decoration: none;
  display: block;
}
.fj-question-link:hover { color: var(--gold); }
.fj-question-ref {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.62rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--grey);
  margin-top: 10px;
  display: block;
}

.fj-rights {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.68rem;
  color: var(--grey);
  text-align: center;
  padding: 0 60px 90px;
  background: var(--cream);
}

.fj-empty { text-align: center; color: var(--grey); padding: 80px 0; font-weight: 300; }

@media (max-width: 860px) {
  .fj-hero { padding: 140px 28px 0; }
  .fj-archive { padding: 0 28px 100px; }
  .fj-entry { grid-template-columns: 1fr; gap: 32px; padding: 52px 0; }
  .fj-card { max-width: 420px; }
}


/* ── Blog ──────────────────────────────────────────────────────────────
   Longer-form articles, distinct from the Field Journal archive. */

.blog-list { background: var(--cream); padding: 0 60px 140px; }
.blog-inner { max-width: 820px; margin: 0 auto; }
.blog-entry { border-top: 1px solid rgba(61,26,75,0.12); padding: 56px 0; }
.blog-entry:first-child { border-top: none; }
.blog-date {
  font-family: 'DM Sans', sans-serif;
  font-size: 0.64rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--grey);
  display: block;
  margin-bottom: 14px;
}
.blog-title { font-family: 'Playfair Display', serif; font-size: 1.6rem; font-weight: 500; line-height: 1.3; margin-bottom: 16px; }
.blog-title a { color: var(--plum); text-decoration: none; }
.blog-title a:hover { color: var(--gold); }
.blog-excerpt { font-size: 0.97rem; color: var(--slate); line-height: 1.85; font-weight: 300; }

.entry-content { max-width: 720px; margin: 0 auto; font-size: 1rem; line-height: 1.85; font-weight: 300; color: var(--slate); }
.entry-content h2 { font-family: 'Playfair Display', serif; font-size: 1.7rem; font-weight: 500; color: var(--plum); margin: 56px 0 20px; }
.entry-content h3 { font-family: 'Playfair Display', serif; font-size: 1.3rem; font-weight: 500; color: var(--plum); margin: 40px 0 16px; }
.entry-content p { margin-bottom: 24px; }
.entry-content a { color: var(--plum); text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
.entry-content a:hover { color: var(--gold); }
.entry-content blockquote {
  font-family: 'Playfair Display', serif;
  font-style: italic;
  font-size: 1.3rem;
  color: var(--plum);
  border-left: 1px solid var(--gold);
  padding-left: 28px;
  margin: 40px 0;
}
.entry-content ul, .entry-content ol { margin: 0 0 24px 22px; }
.entry-content li { margin-bottom: 10px; }
.entry-content img { margin: 32px 0; }

.page-body { background: var(--cream); padding: 140px 60px; }
@media (max-width: 860px) {
  .page-body { padding: 110px 28px; }
  .blog-list { padding: 0 28px 100px; }
}

/* WordPress core alignment + caption classes the editor emits. */
.alignleft { float: left; margin: 6px 28px 20px 0; }
.alignright { float: right; margin: 6px 0 20px 28px; }
.aligncenter { display: block; margin-left: auto; margin-right: auto; }
.wp-caption-text, .wp-element-caption { font-size: 0.8rem; color: var(--grey); text-align: center; margin-top: 10px; }
.screen-reader-text {
  border: 0; clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden;
  padding: 0; position: absolute; width: 1px; white-space: nowrap;
}
