/* ============================================================================
   Dakshin Vrindavan Trust — redesign.css
   Consolidated design system for the gaushala redesign.
   Translated faithfully from the Claude-Design mockups (index, Header, Footer,
   about, donate, adoption .dc.html) into a single production stylesheet.

   CONTENTS
     1. Design tokens (CSS custom properties)
     2. Base / reset helpers
     3. Typography helpers (.dv-h1 / .dv-h2 / .dv-eyebrow / .dv-grad)
     4. Keyframes (every animation found across the mockups)
     5. Helpers (.dv-sheen, .dv-beat)
     6. Header / nav classes (.dv-desknav, .dv-deskcta, .dv-burger,
        scroll-state via .site-header.is-scrolled, active nav, mobile drawer)
     7. Footer classes (.dv-foot-grid)
     8. Floating donate FAB (>=1024px) + sticky mobile action bar (<1024px)
     9. Responsive @media rules (every breakpoint from the mockups)
    10. prefers-reduced-motion

   OODO Dev Team | Dakshin Vrindavan Trust
   ========================================================================== */

/* ── 1. DESIGN TOKENS ─────────────────────────────────────────────────────
   Shared palette + spacing pulled from the mockup inline styles. Accent text
   uses a darker saffron (--dv-saffron-text #8A6800) for WCAG AA contrast on
   cream backgrounds, while the bright saffrons stay for fills/gradients. */
:root {
  /* Core palette */
  --dv-cream: #FDFBF6;
  /* page background */
  --dv-cream-2: #F7F1E6;
  /* warm section band */
  --dv-cream-3: #FFFDF8;
  /* card top */
  --dv-ink: #3A352E;
  /* body text */
  --dv-ink-strong: #232220;
  /* headings / near-black UI */
  --dv-ink-soft: #6B6258;
  /* secondary text */
  --dv-ink-muted: #7A7163;
  /* tertiary / captions */
  --dv-deep-green: #141C12;
  /* hero base */
  --dv-green: #1F5C3D;
  /* accent green */
  --dv-green-bright: #3E8E5A;

  /* Saffron family */
  --dv-saffron: #EAAF00;
  /* primary saffron */
  --dv-saffron-hi: #F5C518;
  /* highlight saffron */
  --dv-saffron-deep: #B68900;
  /* gradient end / number accent */
  --dv-saffron-text: #8A6800;
  /* AA-safe small accent text on cream */
  --dv-saffron-soft: #FFF4D6;
  /* soft saffron tint (hover bg) */
  --dv-saffron-tint: #FCEABF;
  /* selection / pill tint */

  /* Surfaces / lines */
  --dv-white: #ffffff;
  --dv-line: #EFE6D6;
  /* hairline border on cream cards */
  --dv-line-2: #E9DFD0;
  /* alt border */
  --dv-footer-ink: #CFC7B8;
  /* footer body text */
  --dv-footer-soft: #A89F90;
  /* footer muted */
  --dv-footer-faint: #8A8175;
  /* footer faint */
  --dv-footer-head: #F4E9C9;
  /* footer headings */

  /* Brand gradient */
  --dv-cta-grad: linear-gradient(135deg, #F5C518 0%, #EAAF00 50%, #B68900 100%);
  --dv-cta-shadow: 0 6px 18px rgba(234, 175, 0, .36);
  --dv-cta-shadow-h: 0 10px 26px rgba(234, 175, 0, .46);

  /* Easing */
  --dv-ease: cubic-bezier(.16, 1, .3, 1);

  /* Fonts */
  --dv-serif-display: 'Cormorant Garamond', Georgia, serif;
  --dv-serif-title: 'Marcellus', serif;
  --dv-sans: 'Mukta', system-ui, -apple-system, sans-serif;
  --dv-serif-quote: 'Lora', Georgia, serif;
}

/* ── 2. BASE / RESET HELPERS ─────────────────────────────────────────────
   Scoped lightly so they don't fight the live site.css. These mirror the
   universal rules shared by every mockup helmet style block. */
.dv-redesign * {
  box-sizing: border-box;
}

.dv-redesign img {
  display: block;
  max-width: 100%;
}

.dv-redesign ::selection {
  background: var(--dv-saffron-tint);
  color: #241C00;
}

.dv-redesign details>summary {
  list-style: none;
}

.dv-redesign details>summary::-webkit-details-marker {
  display: none;
}

/* ── 3. TYPOGRAPHY HELPERS ───────────────────────────────────────────────── */
.dv-h1 {
  font-family: var(--dv-serif-display);
  font-weight: 600;
  letter-spacing: -.015em;
}

.dv-h2 {
  font-family: var(--dv-serif-display);
  font-weight: 600;
  letter-spacing: -.012em;
}

.dv-eyebrow {
  font-family: var(--dv-sans);
  font-size: 13px;
  letter-spacing: .2em;
  text-transform: uppercase;
  font-weight: 600;
}

.dv-grad {
  background: linear-gradient(100deg, #F5C518 0%, #E8A93A 48%, #C98A2E 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: var(--dv-saffron);
}

/* ── 4. KEYFRAMES ──────────────────────────────────────────────────────────
   Every @keyframes found across the six mockups, de-duplicated. The header
   mockup's dvBeat (scale 1.22/1.18) and the index mockup's dvBeat (1.2/1.16)
   were near-identical; the index variant is kept as canonical. */
@keyframes dvHeroIn {
  from {
    opacity: 0;
    transform: translateY(30px);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

@keyframes dvKen {
  from {
    transform: scale(1);
  }

  to {
    transform: scale(1.07);
  }
}

@keyframes dvScrollDot {
  0% {
    transform: translateY(0);
    opacity: 0;
  }

  30% {
    opacity: 1;
  }

  80% {
    transform: translateY(14px);
    opacity: 0;
  }

  100% {
    opacity: 0;
  }
}

@keyframes dvGlow {

  0%,
  100% {
    opacity: .5;
    transform: scale(1);
  }

  50% {
    opacity: .85;
    transform: scale(1.12);
  }
}

@keyframes dvBeat {

  0%,
  100% {
    transform: scale(1);
  }

  14% {
    transform: scale(1.2);
  }

  28% {
    transform: scale(1);
  }

  42% {
    transform: scale(1.16);
  }

  56% {
    transform: scale(1);
  }
}

@keyframes dvSheen {
  0% {
    transform: translateX(-120%);
  }

  60%,
  100% {
    transform: translateX(220%);
  }
}

/* ── 5. HELPERS ────────────────────────────────────────────────────────────
   .dv-sheen — diagonal light sweep on hover (CTA buttons).
   .dv-beat  — heartbeat pulse on the donate FAB icon. */
.dv-sheen,
.dv-tier-card button,
.dv-tier-card a,
.tier-card .btn {
  position: relative;
  overflow: hidden;
}

.dv-sheen::after,
.dv-tier-card button::after,
.dv-tier-card a::after,
.tier-card .btn::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 60%;
  height: 100%;
  background: linear-gradient(110deg, transparent 20%, rgba(255, 255, 255, .55) 50%, transparent 80%);
  transform: translateX(-120%);
}

.dv-sheen:hover::after,
.dv-tier-card button:hover::after,
.dv-tier-card a:hover::after,
.tier-card .btn:hover::after {
  animation: dvSheen 1.1s ease;
}

.dv-beat {
  animation: dvBeat 2.4s ease-in-out infinite;
}

/* ── 6. HEADER / NAV ───────────────────────────────────────────────────────
   The header partial reuses the LIVE structural hooks so site.js + portal-i18n
   keep working:
     • header.site-header              — sticky shell; .is-scrolled toggled by
                                          site.js (§8) for the glass shadow.
     • [data-nav-toggle] / [data-mobile-nav] — drawer wired by site.js (§1).
     • portal-i18n.js injects #dv-lang-switcher into .site-header .header-cta.
   The redesign *look* (trust strip, glass bar, pill nav) is layered on top via
   these dv- classes. */

/* Trust strip above the bar */
.dv-trust-strip {
  background: var(--dv-ink-strong);
  color: var(--dv-footer-head);
  font-size: 12.5px;
  letter-spacing: .04em;
  padding: 7px 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  position: relative;
}

.dv-trust-strip strong {
  color: var(--dv-saffron);
  font-weight: 600;
}

.dv-trust-strip .dv-dot {
  opacity: .55;
}

/* The EN/हि language toggle sits at the right of the trust strip, out of flow
   so it never shifts the centred trust items. */
.dv-trust-strip .dv-lang-in-strip {
  position: absolute;
  right: 14px;
  top: 50%;
  transform: translateY(-50%);
  margin: 0;
}

@media (max-width: 680px) {
  .dv-trust-strip {
    justify-content: center;
    padding-right: 60px;
    overflow: hidden;
    font-size: 10.5px;
  }

  .dv-trust-strip > span {
    flex-wrap: nowrap !important;
    white-space: nowrap;
  }

  .dv-trust-strip > span > span:nth-last-child(1),
  .dv-trust-strip > span > span:nth-last-child(2) {
    display: none !important;
  }

  .dv-trust-strip .dv-lang-in-strip {
    right: 10px;
  }
}

/* Post-hero compliance strip (80G · FCRA · 501(c)(3) · 0% admin): on small
   screens, lay the four items out as a tidy centred 2-column grid instead of a
   ragged flex-wrap, and drop the dot separators (every 2nd child). */
@media (max-width: 560px) {
  .dv-compliance {
    display: grid !important;
    grid-template-columns: auto auto;
    justify-content: center;
    justify-items: start;
    gap: 11px 26px !important;
  }

  .dv-compliance>span:nth-child(even) {
    display: none;
  }
}

/* Glass bar — base (top) state. site.js adds .is-scrolled to the header. */
.dv-bar {
  background: rgba(253, 251, 246, .96);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid rgba(233, 223, 208, .5);
  box-shadow: none;
  transition: background .3s ease, box-shadow .3s ease, border-color .3s ease;
}

/* Scrolled state — driven by the LIVE class site.js toggles. */
.site-header.is-scrolled .dv-bar {
  background: rgba(253, 251, 246, .88);
  border-bottom-color: rgba(233, 223, 208, .9);
  box-shadow: 0 6px 24px rgba(35, 34, 32, .08);
}

.dv-bar-inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px;
  height: 72px;
  display: flex;
  align-items: center;
  gap: 24px;
}

/* Brand logo */
.dv-brand {
  display: flex;
  align-items: center;
  flex: none;
  text-decoration: none;
}

.dv-brand img {
  height: 42px;
  width: auto;
  display: block;
}

/* Desktop nav (pill links) */
.dv-desknav {
  display: flex;
  align-items: center;
  gap: 20px;
  margin-left: auto;
}

.dv-navlink {
  text-decoration: none;
  color: var(--dv-ink);
  font-size: 15px;
  font-weight: 500;
  padding: 9px 18px;
  border-radius: 999px;
  transition: color .2s, background .2s;
}

.dv-navlink:hover {
  background: var(--dv-saffron-soft);
  color: #8A6800;
}

/* Active item — pages add .is-active to the matching link. */
.dv-navlink.is-active {
  background: var(--dv-saffron-soft);
  color: #8A6800;
}

/* Desktop donate CTA */
.dv-deskcta {
  flex: none;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--dv-cta-grad);
  color: #241C00;
  font-weight: 700;
  font-size: 14.5px;
  padding: 11px 22px;
  border-radius: 999px;
  box-shadow: var(--dv-cta-shadow);
  transition: transform .2s, box-shadow .2s;
}

.dv-deskcta:hover {
  transform: translateY(-2px);
  box-shadow: var(--dv-cta-shadow-h);
}

/* Burger (mobile) — wraps the live [data-nav-toggle] button */
.dv-burger {
  flex: none;
  margin-left: auto;
  display: none;
  width: 46px;
  height: 46px;
  align-items: center;
  justify-content: center;
  background: var(--dv-saffron-soft);
  border: 1px solid #EAD9A8;
  border-radius: 12px;
  cursor: pointer;
  color: #5A4A1E;
}

/* Mobile drawer — reuses the LIVE [data-mobile-nav] element. site.js toggles
   .is-open. We style both the drawer panel and its open state here so the
   live JS keeps full control of behaviour. */
.dv-mobile-nav {
  position: fixed;
  inset: 0;
  z-index: 120;
  background: rgba(26, 24, 21, .55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s ease;
}

.dv-mobile-nav.is-open {
  opacity: 1;
  pointer-events: auto;
}

.dv-mobile-panel {
  position: absolute;
  top: 0;
  right: 0;
  height: 100%;
  width: min(86vw, 360px);
  background: var(--dv-cream);
  box-shadow: -20px 0 60px rgba(0, 0, 0, .25);
  transform: translateX(100%);
  transition: transform .35s var(--dv-ease);
  display: flex;
  flex-direction: column;
  padding: 20px 22px;
  overflow-y: auto;
}

.dv-mobile-nav.is-open .dv-mobile-panel {
  transform: translateX(0);
}

.dv-mobile-link {
  text-decoration: none;
  color: var(--dv-ink-strong);
  font-size: 19px;
  font-weight: 600;
  padding: 15px 8px;
  border-bottom: 1px solid #EFE6D6;
}

.dv-mobile-cta {
  margin-top: 20px;
  text-decoration: none;
  text-align: center;
  background: var(--dv-cta-grad);
  color: #241C00;
  font-weight: 700;
  font-size: 17px;
  padding: 15px;
  border-radius: 14px;
  box-shadow: 0 8px 22px rgba(234, 175, 0, .4);
}

.dv-mobile-meta {
  margin: 18px 4px 0;
  font-size: 13px;
  color: #8A8175;
  line-height: 1.5;
}

/* ── 7. FOOTER ─────────────────────────────────────────────────────────────
   Re-skins the LIVE footer.site-footer. Keeps the live grid hook usable. */
.dv-foot-grid {
  display: grid;
  gap: 48px 56px;
  grid-template-columns: 1.4fr 1fr 1fr 1.3fr;
}

.dv-foot-head {
  margin: 0 0 16px;
  font-family: var(--dv-serif-title);
  font-size: 17px;
  font-weight: 400;
  color: var(--dv-footer-head);
  letter-spacing: .02em;
}

.dv-foot-link {
  text-decoration: none;
  color: var(--dv-footer-soft);
  font-size: 14.5px;
  transition: color .2s;
}

.dv-foot-link:hover {
  color: var(--dv-saffron);
}

.dv-foot-social {
  width: 42px;
  height: 42px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 11px;
  background: rgba(255, 255, 255, .06);
  color: var(--dv-footer-ink);
  transition: background .2s, color .2s;
}

.dv-foot-social:hover {
  background: var(--dv-saffron);
  color: var(--dv-ink-strong);
}

.dv-foot-pill {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 12.5px;
  color: var(--dv-footer-ink);
  background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .1);
  padding: 7px 13px;
  border-radius: 999px;
}

/* ── 8. FLOATING DONATE FAB (desktop) + STICKY ACTION BAR (mobile) ─────────
   Mockup swap: the floating heart FAB shows on wider viewports; the
   claymorphism action bar (Donate + WhatsApp) takes over on phones. Per the
   brief: action bar only < 1024px, FAB only >= 1024px. */
.dv-fab {
  position: fixed;
  right: 24px;
  bottom: 24px;
  z-index: 80;
  display: flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  background: linear-gradient(135deg, #F5C518, #EAAF00 48%, #B68900);
  color: #241C00;
  padding: 13px 22px 13px 16px;
  border-radius: 999px;
  box-shadow: 0 14px 34px rgba(234, 175, 0, .46), 0 4px 12px rgba(35, 34, 32, .18);
  transition: box-shadow .4s ease, transform .4s var(--dv-ease);
}

.dv-fab:hover {
  box-shadow: 0 18px 44px rgba(234, 175, 0, .56);
}

.dv-fab-icon {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: rgba(36, 28, 0, .14);
  display: flex;
  align-items: center;
  justify-content: center;
}

.dv-mobar {
  position: fixed;
  left: 12px;
  right: 12px;
  bottom: calc(12px + env(safe-area-inset-bottom));
  z-index: 80;
  display: none;
  grid-template-columns: 1.5fr 1fr;
  gap: 8px;
  background: rgba(253, 251, 246, .9);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(233, 223, 208, .8);
  border-radius: 20px;
  padding: 8px;
  box-shadow: 0 10px 30px rgba(35, 34, 32, .18);
}

.dv-mobar-donate {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-decoration: none;
  background: var(--dv-cta-grad);
  color: #241C00;
  font-weight: 700;
  font-size: 15px;
  padding: 13px 8px;
  border-radius: 14px;
  box-shadow: var(--dv-cta-shadow);
}

.dv-mobar-wa {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-decoration: none;
  background: #E7F2EA;
  color: var(--dv-green);
  font-weight: 700;
  font-size: 14px;
  padding: 13px 4px;
  border-radius: 14px;
  border: 1px solid #CDE6D6;
}

/* Desktop = FAB only, action bar hidden. The mockup used a 620px breakpoint
   for its swap; the brief mandates the 1024px threshold, so below 1024 we
   hide the FAB and show the action bar (and reserve bottom padding). */
@media (max-width: 1023.98px) {
  .dv-fab {
    display: none !important;
  }

  .dv-mobar {
    display: grid !important;
  }

  body {
    padding-bottom: 84px;
  }
}

@media (min-width: 1024px) {
  .dv-fab {
    display: flex !important;
  }

  .dv-mobar {
    display: none !important;
  }
}

/* Hidden state toggled by site.js IntersectionObserver */
.dv-fab.dv-fab-hidden {
  opacity: 0;
  pointer-events: none;
  transform: translateY(20px);
}

.dv-mobar.dv-mobar-hidden {
  opacity: 0;
  pointer-events: none;
  transform: translateY(20px);
}

/* ── 9. RESPONSIVE @MEDIA (every breakpoint from the mockups) ───────────────
   Grouped by component family. The grid utility classes are the shared
   layout vocabulary the page templates use. */

/* Header swap (Header.dc.html @900px) */
@media (max-width: 900px) {
  .dv-desknav {
    display: none !important;
  }

  .dv-deskcta {
    display: none !important;
  }

  .dv-burger {
    display: flex !important;
  }
}

/* Footer grid (Footer.dc.html @860 / @520) */
@media (max-width: 860px) {
  .dv-foot-grid {
    grid-template-columns: 1fr 1fr !important;
  }
}

@media (max-width: 520px) {
  .dv-foot-grid {
    grid-template-columns: 1fr !important;
  }
}

/* Home page grids (index.dc.html) */
@media (max-width: 1100px) {
  .dv-impact-grid {
    grid-template-columns: repeat(3, 1fr) !important;
  }
}

@media (max-width: 1000px) {

  .dv-story,
  .dv-calc-grid,
  .dv-trans,
  .dv-spotlight {
    grid-template-columns: 1fr !important;
    gap: 40px !important;
  }

  .dv-gallery {
    grid-template-columns: repeat(3, 1fr) !important;
  }

  .dv-herostats {
    gap: 10px !important;
  }
}

@media (max-width: 760px) {
  .dv-3col {
    grid-template-columns: 1fr !important;
  }

  .dv-impact-grid {
    grid-template-columns: repeat(2, 1fr) !important;
  }

  /* Keep position:relative so the absolutely-positioned <img> fills this box
     (static let it escape to the viewport, leaving an empty cream placeholder).
     A fixed 16:10 ratio keeps the crop compact + consistent at every width, and
     anchoring to the top keeps the cow's FACE in frame (the legs crop, not the
     head). */
  .dv-spotlight .dv-spotimg {
    position: relative !important;
    min-height: 0 !important;
    height: auto !important;
    aspect-ratio: 16 / 10 !important;
  }

  .dv-spotlight .dv-spotimg img {
    object-position: center top !important;
  }

  .dv-gallery {
    grid-template-columns: repeat(2, 1fr) !important;
    grid-auto-rows: 150px !important;
  }

  /* Drop the bento col/row spans so every photo is a uniform, aligned tile. */
  .dv-gallery .gallery__item {
    grid-column: auto !important;
    grid-row: auto !important;
  }

  .dv-hero {
    min-height: auto !important;
    padding-top: 96px !important;
  }
}

@media (max-width: 520px) {
  .dv-herostats {
    grid-template-columns: 1fr 1fr !important;
  }

  .dv-gallery {
    grid-auto-rows: 160px !important;
  }

  .dv-section {
    padding-left: 18px !important;
    padding-right: 18px !important;
  }
}

/* About page grids (about.dc.html) */
@media (max-width: 1000px) {
  .dv-hero-grid {
    grid-template-columns: 1fr !important;
  }

  .dv-hero-img {
    order: -1 !important;
    height: 300px !important;
  }

  .dv-2col {
    grid-template-columns: 1fr !important;
    gap: 40px !important;
  }

  .dv-stats3 {
    gap: 20px !important;
  }

  .dv-team-grid {
    grid-template-columns: repeat(3, 1fr) !important;
  }
}

@media (max-width: 760px) {
  .dv-team-grid {
    grid-template-columns: repeat(2, 1fr) !important;
  }
}

@media (max-width: 680px) {
  .dv-3col {
    grid-template-columns: 1fr !important;
  }

  .dv-stats3 {
    grid-template-columns: 1fr !important;
  }

  .dv-team-grid {
    display: grid !important;
    grid-template-columns: 1fr !important;
    gap: 20px !important;
  }

  .dv-team-grid>* {
    width: 100%;
    max-width: 380px;
    margin-left: auto;
    margin-right: auto;
  }
}

/* Donate page grids (donate.dc.html) */
@media (max-width: 1000px) {

  .dv-hero-grid,
  .dv-calc-grid {
    grid-template-columns: 1fr !important;
    gap: 40px !important;
  }

  .dv-hero-img {
    order: -1 !important;
    height: 280px !important;
  }

  .dv-tiers {
    grid-template-columns: 1fr 1fr !important;
  }

  .dv-banks {
    grid-template-columns: 1fr !important;
  }
}

@media (max-width: 680px) {
  .dv-tiers {
    grid-template-columns: 1fr !important;
  }
}

/* Adoption page grids (adoption.dc.html) */
@media (max-width: 1100px) {
  .dv-cow-grid {
    grid-template-columns: repeat(4, 1fr) !important;
  }
}

@media (max-width: 1000px) {
  .dv-hero-grid {
    grid-template-columns: 1fr !important;
    gap: 40px !important;
  }

  .dv-hero-img {
    order: -1 !important;
    height: 300px !important;
    width: 100% !important;
  }

  .dv-4col {
    grid-template-columns: 1fr 1fr !important;
  }

  .dv-banks {
    grid-template-columns: 1fr !important;
  }
}

@media (max-width: 860px) {
  .dv-cow-grid {
    grid-template-columns: repeat(3, 1fr) !important;
  }
}

@media (max-width: 800px) {
  .dv-featured {
    grid-template-columns: 1fr !important;
  }

  .dv-featured>div:first-child {
    min-height: 220px !important;
  }
}

@media (max-width: 600px) {
  .dv-4col {
    grid-template-columns: 1fr !important;
  }
}

@media (max-width: 560px) {
  .dv-cow-grid {
    grid-template-columns: repeat(2, 1fr) !important;
  }
}

/* Adoption cow-card hover pop-out effect (adoption.dc.html) */
.dv-cow-grid article.cow-card {
  transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.4s ease !important;
  position: relative;
  z-index: 1;
}

.dv-cow-grid article.cow-card:hover {
  transform: scale(1.3) !important;
  z-index: 10;
  box-shadow: 0 30px 60px rgba(0,0,0,0.35) !important;
}

.dv-cow-grid article.cow-card .id {
  transition: opacity 0.3s ease !important;
}

.dv-cow-grid article.cow-card:hover .id {
  opacity: 0 !important;
}

.dv-cow-grid article.cow-card .img img {
  transition: transform .55s cubic-bezier(.16, 1, .3, 1) !important;
}

.dv-cow-grid article.cow-card:hover .img img {
  transform: scale(1.03) !important;
}

/* Spotlight card hover pop-out effect (index.html) */
.dx-spotlight {
  transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.4s ease !important;
  position: relative;
  z-index: 1;
}

.dx-spotlight:hover, .dx-spotlight:active {
  transform: scale(1.05) !important;
  z-index: 10;
  box-shadow: 0 30px 60px rgba(0,0,0,0.5) !important;
}

/* Tier card hover pop-out effect */
.tier-card {
  transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.4s ease !important;
  position: relative;
  z-index: 1;
}

.tier-card:hover, .tier-card:active {
  transform: scale(1.05) !important;
  z-index: 10;
  box-shadow: 0 30px 60px rgba(0,0,0,0.15) !important;
}

.dv-cow-ov {
  display: none !important;
}

/* ── 10. REDUCED MOTION ────────────────────────────────────────────────────
   Honour the user's preference: disable every animation/transition introduced
   by this stylesheet (mirrors each mockup's prefers-reduced-motion rule). */
@media (prefers-reduced-motion: reduce) {

  .dv-redesign *,
  .dv-beat,
  .dv-sheen::after,
  .dv-fab,
  .dv-mobar,
  .dv-mobile-panel {
    animation: none !important;
    transition: none !important;
  }
}

/* ============================================================================
   ████  PORTAL REDESIGN  ████
   ----------------------------------------------------------------------------
   Donor-portal design system, translated from the Claude-Design mockups
   (PortalNav.dc.html + dashboard.dc.html) into production CSS.

   Loaded LAST after tokens.css + site.css + portal.css, so these rules
   re-skin the LIVE portal classes (`.portal-topbar`, `.sidebar[data-sidebar]`,
   `.sidebar-backdrop`, `.portal-main`, `.p-card`, `.stat-tile`, `.p-table`,
   the `.btn*` family, `.pill*`, `.banner`, `.dash-hero`, `.toast`) WITHOUT
   touching their JS↔DOM contract — only their appearance.

   EVERYTHING here is scoped under `body.dv-portal` so the public pages that
   also load redesign.css are completely unaffected. No `:root` token is
   redefined; we reuse the `--dv-*` palette declared in section 1 above plus
   the `--c-*` / `--s-*` / `--r-*` / `--fs-*` tokens from tokens.css.

   Visual language captured from the mockup:
     • Dark #232220 sidebar, 256px, fixed full-height (desktop).
     • Rounded nav items: SVG icon + label; hover = rgba(255,255,255,.06)+#fff;
       active = gold gradient linear-gradient(135deg,rgba(245,197,24,.18),
       rgba(245,197,24,.08)) + #F5C518 (driven by .is-active / aria-current).
     • Mobile: dark top bar + hamburger → slide-in drawer (translateX) with an
       opacity overlay, transition .3s cubic-bezier(.16,1,.3,1).
     • "Donate again" gold CTA pinned to the sidebar footer.
     • Premium cream content: rounded cards, stat tiles, tables.

   CONTENTS
     P1. Portal shell tokens + page background
     P2. Top bar (dark) + user pill + hamburger
     P3. Sidebar (dark) — sections, nav links, hover/active, footer CTA
     P4. Drawer + backdrop (mobile slide-in)
     P5. Main content area
     P6. Premium cards / stat tiles / dashboard hero
     P7. Tables (.p-table)
     P8. Buttons (.btn family — portal-scoped premium skin)
     P9. Pills + banners + toast
    P10. Keyframes + reduced motion (portal)

   OODO Dev Team | Dakshin Vrindavan Trust
   ========================================================================== */

/* ── P1. PORTAL SHELL TOKENS + PAGE BACKGROUND ─────────────────────────────
   Mockup uses a 256px sidebar and a warm #FAF7F1 canvas. We expose these as
   local custom props (NOT in :root) so portal.css's own --portal-* vars stay
   the fallback and only the portal scope shifts to the mockup metrics. */
body.dv-portal {
  --dvp-sidebar-w: 256px;
  --dvp-topbar-h: 64px;
  --dvp-ink: #232220;
  /* sidebar / topbar dark */
  --dvp-ink-2: #1D1C1A;
  /* drawer / deeper dark */
  --dvp-nav-text: #CFC7B8;
  /* nav resting text */
  --dvp-nav-muted: #9A9384;
  /* nav muted (sign out) */
  --dvp-nav-head: #9A9384;
  /* section header (AA on #232220) */
  --dvp-canvas: #FAF7F1;
  /* content canvas */
  --dvp-card: #ffffff;
  --dvp-card-line: #EFE6D6;
  --dvp-active-bg: linear-gradient(135deg, rgba(245, 197, 24, .18), rgba(245, 197, 24, .08));
  --dvp-active-fg: #F5C518;
  font-family: var(--dv-sans);
  background: var(--dvp-canvas);
  color: var(--dv-ink);
}

body.dv-portal,
body.dv-portal * {
  box-sizing: border-box;
}

/* ── P2. TOP BAR (dark) + USER PILL + HAMBURGER ────────────────────────────
   Re-skins the LIVE .portal-topbar. On the mockup the dark chrome carries the
   brand + hamburger on mobile and a user pill on the right. */
body.dv-portal .portal-topbar {
  background: var(--dvp-ink);
  border-bottom: 1px solid rgba(255, 255, 255, .06);
  height: var(--dvp-topbar-h);
  padding: 0 clamp(14px, 3vw, 22px);
  color: #fff;
}

body.dv-portal .portal-topbar .brand img {
  height: 32px;
  width: auto;
}

body.dv-portal .portal-topbar .grow {
  flex: 1;
}

/* User pill — keeps .avatar (filled by portal.js) + .user-name */
body.dv-portal .portal-topbar .user {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 5px 14px 5px 5px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .07);
  border: 1px solid rgba(255, 255, 255, .08);
  color: #EDE7DC;
  text-decoration: none;
  font-weight: 600;
  font-size: 14px;
  transition: background .2s var(--dv-ease), border-color .2s var(--dv-ease);
}

body.dv-portal .portal-topbar .user:hover {
  background: rgba(255, 255, 255, .12);
  border-color: rgba(245, 197, 24, .4);
}

body.dv-portal .portal-topbar .avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: linear-gradient(135deg, #F5C518, #EAAF00 50%, #B68900);
  color: #241C00;
  display: grid;
  place-items: center;
  font-weight: 700;
  font-size: 13px;
  flex: none;
}

body.dv-portal .portal-topbar .user-name {
  display: none;
}

@media (min-width: 600px) {
  body.dv-portal .portal-topbar .user-name {
    display: block;
    max-width: 140px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: #EDE7DC;
  }
}

/* Hamburger — mobile only (live [data-sidebar-toggle]) */
body.dv-portal .sidebar-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 10px;
  background: rgba(255, 255, 255, .08);
  border: none;
  color: #fff;
  cursor: pointer;
  flex: none;
  transition: background .2s var(--dv-ease);
}

body.dv-portal .sidebar-toggle:hover {
  background: rgba(255, 255, 255, .16);
}

@media (min-width: 1024px) {
  body.dv-portal .sidebar-toggle {
    display: none;
  }
}

/* ── P3. SIDEBAR (dark) ────────────────────────────────────────────────────
   Re-skins the LIVE nav.sidebar[data-sidebar]. portal.js toggles .is-open for
   the mobile drawer and adds .is-active / aria-current to the matched link. */
body.dv-portal .portal-shell {
  display: grid;
  grid-template-columns: 1fr;
  min-height: calc(100vh - var(--dvp-topbar-h));
}

@media (min-width: 1024px) {
  body.dv-portal .portal-shell {
    grid-template-columns: var(--dvp-sidebar-w) 1fr;
  }
}

body.dv-portal .sidebar {
  background: var(--dvp-ink);
  border-right: 1px solid rgba(255, 255, 255, .06);
  color: var(--dvp-nav-text);
  padding: 18px 14px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  /* Mobile: slide-in drawer; hidden by default */
  position: fixed;
  top: var(--dvp-topbar-h);
  left: 0;
  bottom: 0;
  width: min(82vw, 280px);
  transform: translateX(-100%);
  transition: transform .3s var(--dv-ease);
  z-index: 49;
  overflow-y: auto;
  box-shadow: 16px 0 48px rgba(0, 0, 0, .28);
}

body.dv-portal .sidebar.is-open {
  transform: translateX(0);
}

@media (min-width: 1024px) {
  body.dv-portal .sidebar {
    position: sticky;
    top: var(--dvp-topbar-h);
    transform: none;
    box-shadow: none;
    width: auto;
    max-width: none;
    height: calc(100vh - var(--dvp-topbar-h));
  }
}

/* ── P3b. Authoritative PortalNav: brand head + flat nav + Donate-again CTA.
   The design has NO desktop topbar — the brand lives in the sidebar head, so
   hide .portal-topbar at >=1024px and float the sidebar to the very top. The
   topbar (hamburger + drawer) stays for mobile (<1024px). */
@media (min-width: 1024px) {
  body.dv-portal .portal-topbar {
    display: none;
  }

  body.dv-portal .portal-shell {
    min-height: 100vh;
  }

  body.dv-portal .sidebar {
    top: 0;
    height: 100vh;
  }
}

body.dv-portal .sidebar-brand {
  display: flex;
  flex-direction: column;
  gap: 7px;
  padding: 6px 10px 16px;
  margin-bottom: 8px;
  text-decoration: none;
  border-bottom: 1px solid rgba(255, 255, 255, .07);
}

body.dv-portal .sidebar-brand img {
  height: 32px;
  width: auto;
}

body.dv-portal .sidebar-eyebrow {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--dvp-nav-head);
}

body.dv-portal .sidebar-nav {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

body.dv-portal .sidebar-foot {
  margin-top: auto;
  padding-top: 16px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

body.dv-portal .sidebar-donate {
  display: block;
  text-align: center;
  background: linear-gradient(135deg, #F5C518, #EAAF00 50%, #B68900);
  color: #241C00;
  font-weight: 700;
  font-size: 14.5px;
  padding: 12px;
  border-radius: 11px;
  text-decoration: none;
  transition: transform .2s var(--dv-ease), box-shadow .2s ease;
}

body.dv-portal .sidebar-donate:hover,
body.dv-portal .sidebar-donate:focus-visible {
  transform: translateY(-2px);
  box-shadow: 0 10px 24px rgba(234, 175, 0, .4);
}

@media (prefers-reduced-motion: reduce) {
  body.dv-portal .sidebar-donate {
    transition: none;
  }
}

/* Section headers (h4 data-i18n="auto.account" / "auto.public_site") */
body.dv-portal .sidebar-section {
  margin-bottom: 8px;
}

body.dv-portal .sidebar-section h4 {
  font-family: var(--dv-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--dvp-nav-head);
  padding: 14px 10px 8px;
  margin: 0;
}

body.dv-portal .sidebar-section:first-of-type h4 {
  padding-top: 4px;
}

/* Nav links — icon + label, rounded, hover + active states from the mockup */
body.dv-portal .sidebar a {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 12px;
  border-radius: 11px;
  color: var(--dvp-nav-text);
  font-size: 14.5px;
  font-weight: 500;
  text-decoration: none;
  margin-bottom: 2px;
  transition: background .15s var(--dv-ease), color .15s var(--dv-ease);
}

body.dv-portal .sidebar a svg {
  width: 19px;
  height: 19px;
  flex: none;
  color: currentColor;
  stroke-width: 1.9;
}

body.dv-portal .sidebar a:hover {
  background: rgba(255, 255, 255, .06);
  color: #fff;
  text-decoration: none;
}

/* Active — gold gradient + saffron text (portal.js adds .is-active + aria-current) */
body.dv-portal .sidebar a.is-active,
body.dv-portal .sidebar a[aria-current="page"] {
  background: var(--dvp-active-bg);
  color: var(--dvp-active-fg);
  font-weight: 600;
}

body.dv-portal .sidebar a.is-active svg,
body.dv-portal .sidebar a[aria-current="page"] svg {
  color: var(--dvp-active-fg);
}

/* Sign-out — muted red-ish hover, sits in its own section */
body.dv-portal .sidebar a[data-logout] {
  color: var(--dvp-nav-muted) !important;
  margin-top: 4px;
}

body.dv-portal .sidebar a[data-logout]:hover {
  color: #fff !important;
  background: rgba(255, 255, 255, .06);
}

/* "Donate again" CTA — pinned in its own group above sign-out is not part of
   the live nav, so we promote the Public-site group's primary action visually
   via .sidebar-cta when present. The live page keeps text links; we add a gold
   CTA hook the page can opt into. Kept here so the design vocab is complete. */
body.dv-portal .sidebar-cta {
  display: block;
  text-align: center;
  text-decoration: none;
  background: linear-gradient(135deg, #F5C518, #EAAF00 50%, #B68900);
  color: #241C00;
  font-weight: 700;
  font-size: 14.5px;
  padding: 12px;
  border-radius: 11px;
  margin: 8px 0;
  transition: transform .22s var(--dv-ease), box-shadow .22s var(--dv-ease), filter .22s var(--dv-ease);
}

body.dv-portal .sidebar-cta:hover {
  transform: translateY(-2px);
  box-shadow: 0 14px 30px rgba(234, 175, 0, .4);
  filter: brightness(1.03);
}

/* The trailing logout group gets a hairline divider above it (mockup). */
body.dv-portal .sidebar-section:last-of-type {
  border-top: 1px solid rgba(255, 255, 255, .08);
  padding-top: 12px;
  margin-top: 6px;
  margin-bottom: 0;
}

/* ── P4. DRAWER BACKDROP (mobile slide-in overlay) ─────────────────────────
   Re-skins the LIVE .sidebar-backdrop[data-sidebar-backdrop]; portal.js adds
   .is-open. The drawer panel itself is the .sidebar above. */
body.dv-portal .sidebar-backdrop {
  position: fixed;
  inset: var(--dvp-topbar-h) 0 0 0;
  z-index: 48;
  background: rgba(0, 0, 0, .5);
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s var(--dv-ease);
}

body.dv-portal .sidebar-backdrop.is-open {
  opacity: 1;
  pointer-events: auto;
}

@media (min-width: 1024px) {
  body.dv-portal .sidebar-backdrop {
    display: none;
  }
}

/* ── P5. MAIN CONTENT AREA ─────────────────────────────────────────────────*/
body.dv-portal .portal-main {
  background: var(--dvp-canvas);
  padding: clamp(20px, 4vw, 32px) clamp(18px, 4vw, 44px) 60px;
  min-width: 0;
}

@media (min-width: 1024px) {
  body.dv-portal .portal-main {
    max-width: 1160px;
    width: 100%;
    margin: 0 auto;
  }
}

/* ── P6. PREMIUM CARDS / STAT TILES / DASHBOARD HERO ───────────────────────*/
body.dv-portal .p-card {
  background: var(--dvp-card);
  border: 1px solid var(--dvp-card-line);
  border-radius: 20px;
  padding: clamp(20px, 3vw, 26px);
  box-shadow: 0 1px 2px rgba(35, 34, 32, .03), 0 12px 30px rgba(35, 34, 32, .05);
}

body.dv-portal .p-card h2 {
  font-family: var(--dv-serif-title);
  font-weight: 400;
  color: var(--dv-ink-strong);
  letter-spacing: .005em;
}

/* Two-up / four-up grids (live class names) */
body.dv-portal .p-grid-2 {
  display: grid;
  gap: 20px;
  grid-template-columns: 1fr;
}

body.dv-portal .p-grid-4 {
  display: grid;
  gap: 16px;
  grid-template-columns: 1fr;
}

@media (min-width: 480px) {
  body.dv-portal .p-grid-4 {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 760px) {
  body.dv-portal .p-grid-2 {
    grid-template-columns: 1.4fr 1fr;
  }
}

@media (min-width: 1024px) {
  body.dv-portal .p-grid-4 {
    grid-template-columns: repeat(4, 1fr);
  }
}

/* Stat tiles — white cards, Marcellus numerals; .accent = gold gradient */
body.dv-portal .stat-tile {
  background: var(--dvp-card);
  border: 1px solid var(--dvp-card-line);
  border-radius: 18px;
  padding: 22px;
}

body.dv-portal .stat-tile .label {
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--dv-ink-muted);
  margin-bottom: 8px;
}

body.dv-portal .stat-tile .value {
  font-family: var(--dv-serif-title);
  font-weight: 400;
  font-size: clamp(26px, 1.4rem + 1.4vw, 32px);
  color: var(--dv-ink-strong);
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

body.dv-portal .stat-tile .sub {
  font-size: 12.5px;
  color: var(--dv-ink-soft);
  margin-top: 6px;
}

body.dv-portal .stat-tile.accent {
  background: linear-gradient(150deg, #F5C518, #EAAF00 50%, #B68900);
  border: 0;
  color: #241C00;
}

body.dv-portal .stat-tile.accent .label,
body.dv-portal .stat-tile.accent .sub {
  color: rgba(36, 28, 0, .72);
}

body.dv-portal .stat-tile.accent .value {
  color: #241C00;
}

/* Dashboard hero — re-skin the LIVE .dash-hero (the mockup's greeting band) */
body.dv-portal .dash-hero {
  display: grid;
  gap: 0;
  grid-template-columns: 1fr;
  margin-bottom: 24px;
  background: linear-gradient(150deg, #FFF7E6 0%, #FBEFCB 100%);
  border: 1px solid #EAD9A8;
  border-radius: 22px;
  overflow: hidden;
  position: relative;
}

@media (min-width: 768px) {
  body.dv-portal .dash-hero {
    grid-template-columns: 1.25fr .75fr;
    align-items: stretch;
  }
}

body.dv-portal .dash-hero__copy {
  padding: clamp(22px, 3vw, 30px);
  display: flex;
  flex-direction: column;
  justify-content: center;
}

body.dv-portal .dash-hero__eyebrow {
  font-family: var(--dv-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--dv-saffron-text);
  margin: 0 0 7px;
}

body.dv-portal .dash-hero__title {
  font-family: var(--dv-serif-title);
  font-weight: 400;
  font-size: clamp(26px, 1.4rem + 1.6vw, 34px);
  color: var(--dv-ink-strong);
  margin: 0 0 8px;
  line-height: 1.12;
}

body.dv-portal .dash-hero__title [data-hero-name]:not(:empty)::before {
  content: ", ";
}

body.dv-portal .dash-hero__lede {
  font-size: 14.5px;
  color: var(--dv-ink);
  margin: 0;
  max-width: 54ch;
  line-height: 1.5;
}

body.dv-portal .dash-hero__art {
  position: relative;
  min-height: 180px;
}

body.dv-portal .dash-hero__art img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

body.dv-portal .dash-hero__art::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, #FBEFCB 0%, rgba(251, 239, 203, 0) 38%);
}

@media (min-width: 768px) {
  body.dv-portal .dash-hero__art {
    min-height: 100%;
  }
}

/* Rule-based ask block inside the hero copy column */
body.dv-portal .dash-hero__ask {
  margin-top: 18px;
  padding: 16px 18px;
  background: rgba(255, 255, 255, .72);
  border: 1px solid rgba(176, 122, 0, .32);
  border-radius: 14px;
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}

body.dv-portal .dash-hero__ask-label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--dv-saffron-text);
  margin: 0 0 4px;
}

body.dv-portal .dash-hero__ask-headline {
  font-family: var(--dv-serif-display);
  font-weight: 600;
  font-size: 19px;
  color: var(--dv-ink-strong);
  margin: 0 0 4px;
  line-height: 1.25;
}

body.dv-portal .dash-hero__ask-sub {
  font-size: 13.5px;
  color: var(--dv-ink-soft);
  margin: 0 0 12px;
}

body.dv-portal .dash-hero__ask-cta {
  display: inline-flex;
}

body.dv-portal .dash-empty {
  font-size: 13.5px;
  color: var(--dv-ink-soft);
  margin: 0;
  padding: 12px 0;
}

/* ── P7. TABLES (.p-table) ─────────────────────────────────────────────────*/
body.dv-portal .p-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}

body.dv-portal .p-table th,
body.dv-portal .p-table td {
  padding: 13px 10px;
  text-align: left;
  border-bottom: 1px solid #F2EADD;
  white-space: nowrap;
}

body.dv-portal .p-table th {
  font-weight: 600;
  color: var(--dv-ink-muted);
  font-size: 11.5px;
  letter-spacing: .06em;
  text-transform: uppercase;
  background: transparent;
}

body.dv-portal .p-table tbody tr:last-child td {
  border-bottom: 0;
}

body.dv-portal .p-table tbody tr:hover {
  background: #FCF8EF;
}

body.dv-portal .p-table .num {
  font-variant-numeric: tabular-nums;
  text-align: right;
}

@media (max-width: 600px) {
  body.dv-portal .p-table thead {
    display: none;
  }

  body.dv-portal .p-table,
  body.dv-portal .p-table tbody,
  body.dv-portal .p-table tr,
  body.dv-portal .p-table td {
    display: block;
    width: 100%;
  }

  body.dv-portal .p-table tr {
    border-bottom: 1px solid #F2EADD;
    padding: 12px 0;
  }

  body.dv-portal .p-table td {
    border: 0;
    padding: 3px 0;
    white-space: normal;
  }

  body.dv-portal .p-table td::before {
    content: attr(data-label) " ";
    font-weight: 600;
    color: var(--dv-ink-muted);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: .04em;
    display: block;
    margin-bottom: 2px;
  }
}

/* ── P8. BUTTONS (.btn family — portal-scoped premium skin) ────────────────
   site.css already defines .btn/.btn-primary/.btn-ghost/.btn-sm. We refine
   them inside the portal to the mockup's pill CTA look. */
body.dv-portal .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-family: var(--dv-sans);
  font-weight: 600;
  font-size: 14.5px;
  padding: 11px 22px;
  border-radius: 999px;
  border: 1px solid transparent;
  text-decoration: none;
  cursor: pointer;
  line-height: 1;
  transition: transform .2s var(--dv-ease), box-shadow .2s var(--dv-ease),
    background .2s var(--dv-ease), color .2s var(--dv-ease), filter .2s var(--dv-ease);
}

body.dv-portal .btn-primary {
  background: linear-gradient(135deg, #F5C518, #EAAF00 50%, #B68900);
  color: #241C00;
  font-weight: 700;
  box-shadow: 0 8px 20px rgba(234, 175, 0, .3);
}

body.dv-portal .btn-primary:hover,
body.dv-portal .btn-primary:focus-visible {
  color: #241C00;
  transform: translateY(-2px);
  box-shadow: 0 14px 30px rgba(234, 175, 0, .4);
  filter: brightness(1.03);
}

body.dv-portal .btn-ghost {
  background: #fff;
  color: var(--dv-ink-strong);
  border-color: var(--dvp-card-line);
}

body.dv-portal .btn-ghost:hover,
body.dv-portal .btn-ghost:focus-visible {
  background: var(--dv-saffron-soft);
  border-color: #EAD9A8;
  color: var(--dv-ink-strong);
}

body.dv-portal .btn-sm {
  padding: 9px 16px;
  font-size: 13.5px;
}

/* ── P9. PILLS + BANNERS + TOAST ───────────────────────────────────────────*/
body.dv-portal .pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px 12px;
  border-radius: 999px;
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.3;
  white-space: nowrap;
}

body.dv-portal .pill-success {
  background: #E8F3EC;
  color: #2D7A4F;
}

body.dv-portal .pill-warn {
  background: #FFF1E2;
  color: #B14A00;
}

body.dv-portal .pill-info {
  background: #E2F0FB;
  color: #0B5A99;
}

body.dv-portal .pill-mute {
  background: #F0EBE2;
  color: var(--dv-ink-muted);
}

/* Banners — info (temp portal) + success (first login). Inline styles on the
   live elements set the base look; we provide a class-level fallback so the
   premium rounding is consistent if those inline styles are ever removed. */
body.dv-portal .banner {
  border-radius: 16px;
  font-size: 14px;
}

body.dv-portal .banner .btn {
  white-space: nowrap;
}

/* Toast — re-skin the LIVE .toast (portal.js toggles .is-shown) */
body.dv-portal .toast {
  position: fixed;
  left: 50%;
  bottom: 24px;
  transform: translateX(-50%) translateY(20px);
  z-index: 100;
  background: var(--dvp-ink);
  color: #fff;
  padding: 11px 20px;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 500;
  box-shadow: 0 12px 32px rgba(35, 34, 32, .28);
  opacity: 0;
  pointer-events: none;
  transition: opacity .25s var(--dv-ease), transform .25s var(--dv-ease);
}

body.dv-portal .toast.is-shown {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}

/* ── P10. PORTAL KEYFRAMES + REDUCED MOTION ────────────────────────────────
   Gentle entrance for the content column (mirrors the mockup's settle-in). */
@keyframes dvpFadeUp {
  from {
    opacity: 0;
    transform: translateY(12px);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

body.dv-portal .portal-main>.dash-hero,
body.dv-portal .portal-main>.p-grid-4,
body.dv-portal .portal-main>.p-card,
body.dv-portal .portal-main>.p-grid-2 {
  animation: dvpFadeUp .5s var(--dv-ease) both;
}

body.dv-portal .portal-main>.p-grid-4 {
  animation-delay: .04s;
}

body.dv-portal .portal-main>.p-card {
  animation-delay: .08s;
}

body.dv-portal .portal-main>.p-grid-2 {
  animation-delay: .12s;
}

@media (prefers-reduced-motion: reduce) {

  body.dv-portal .sidebar,
  body.dv-portal .sidebar-backdrop,
  body.dv-portal .toast,
  body.dv-portal .btn,
  body.dv-portal .portal-topbar .user,
  body.dv-portal .sidebar a,
  body.dv-portal .portal-main>.dash-hero,
  body.dv-portal .portal-main>.p-grid-4,
  body.dv-portal .portal-main>.p-card,
  body.dv-portal .portal-main>.p-grid-2,
  body.dv-portal .sidebar-cta {
    animation: none !important;
    transition: none !important;
  }
}

/* ── 11. Inline-SVG icon utility ──────────────────────────────────────────
   Replaces the mockups' emoji-as-icons with a consistent monochrome SVG set.
   Sizes to the surrounding text (1em) and inherits its colour (currentColor),
   so each icon adopts its context's size + colour automatically. Decorative:
   every instance carries aria-hidden="true" and the adjacent text conveys
   meaning. */
.dv-ic {
  width: 1em;
  height: 1em;
  flex: 0 0 auto;
  display: inline-block;
  vertical-align: -0.14em;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* ── Homepage production polish (V1 final) ────────────────────────────────
   Mobile action bar yields to hero + footer (site.js drives .is-offstage
   via IntersectionObserver — no scroll listeners). */
.dv-mobar {
  transition: transform .3s var(--dv-ease), opacity .3s ease;
}

.dv-mobar.is-offstage {
  transform: translateY(140%);
  opacity: 0;
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .dv-mobar {
    transition: none;
  }
}

/* ≤390px header: logo readable, lang pill + burger clear of each other,
   44px touch targets, no clipping. */
@media (max-width: 390px) {
  .dv-bar-inner {
    padding: 0 12px;
    gap: 8px;
  }

  .dv-brand img {
    height: 32px;
  }

  .dv-burger {
    width: 44px;
    height: 44px;
    flex: none;
  }

  .dv-bar-inner #dv-lang-switcher {
    margin: 0 2px 0 auto;
  }
}

/* Hero type on small phones: tighter scale + rhythm, identical face and
   colours; desktop untouched (!important outranks the inline clamp). */
@media (max-width: 480px) {
  .dv-hero h1 {
    font-size: clamp(32px, 10.5vw, 44px) !important;
    line-height: 1.1 !important;
    letter-spacing: -.012em !important;
    margin-bottom: 16px !important;
  }

  .dv-hero .dv-eyebrow {
    font-size: 11px !important;
    letter-spacing: .15em !important;
  }

  .dv-hero p {
    font-size: 15.5px !important;
    line-height: 1.55 !important;
  }
}

/* Gallery ("Life in pictures"): one adaptive rule — uniform focal-safe
   square tiles on phones, consistent radius/gaps, no stretched crops. */
@media (max-width: 760px) {
  .dv-gallery {
    grid-auto-rows: auto !important;
  }

  .dv-gallery .gallery__item {
    aspect-ratio: 1 / 1 !important;
    height: auto !important;
  }

  .dv-gallery .gallery__item img {
    object-position: center 35%;
  }
}

/* ── dx-calc mobile alignment (V1 homepage polish, owner report) ──────────
   The calculator card cramps below ~480px: oversized numerals, wrapping
   mode toggle, uneven metric tiles. Same design, tightened scale — all
   !important because the widget is inline-styled. Desktop untouched. */
@media (max-width: 520px) {
  .dx-calc {
    padding: 22px 16px !important;
  }

  .dx-calc__head {
    flex-wrap: wrap !important;
    gap: 10px !important;
  }

  .dx-calc__head h2,
  .dx-calc__head h3 {
    font-size: 20px !important;
  }

  .dx-calc__mode {
    flex: none !important;
  }

  .dx-calc__mode button {
    font-size: 12.5px !important;
    padding: 8px 14px !important;
    white-space: nowrap !important;
  }

  .dx-calc__amount {
    justify-content: center !important;
  }

  .dx-calc__currency {
    font-size: 20px !important;
  }

  .dx-calc__value {
    font-size: 38px !important;
  }

  .dx-calc__period {
    font-size: 12.5px !important;
  }

  .dx-calc__suggest {
    font-size: 12.5px !important;
    text-align: center !important;
  }

  .dx-calc__quick {
    justify-content: center !important;
    gap: 8px !important;
  }

  .dx-calc__quick button {
    font-size: 12.5px !important;
    padding: 7px 12px !important;
  }

  .dx-calc__impact {
    display: grid !important;
    grid-template-columns: repeat(3, 1fr) !important;
    gap: 8px !important;
  }

  .dx-calc__impact-item {
    padding: 12px 6px !important;
    min-width: 0 !important;
  }

  .dx-calc__impact-num {
    font-size: 19px !important;
    line-height: 1.15 !important;
    word-break: break-word !important;
  }

  .dx-calc__impact-lbl {
    font-size: 9.5px !important;
    letter-spacing: .04em !important;
  }

  .dx-calc__cta {
    width: 100% !important;
    font-size: 15px !important;
    padding: 14px 12px !important;
  }

  .dx-calc__taxnote {
    font-size: 11.5px !important;
    line-height: 1.5 !important;
    margin-top: 12px !important;
  }
}
/* Mobile cow image zoom logic removed, now handled by DOM overlay in site.js */
