@charset "UTF-8";

/* ==================================================================
   MMPark 2026 — Masonic Memorial Park Joomla 5/6 site template
   Built on the pcom2026 base architecture (Paschen Communications).
   (C) 2026 Paschen Communications, LLC — GPL-2.0-or-later

   THIS IS THE ONLY STYLESHEET. Edit it and upload it — there is no
   build step, no SCSS, nothing to compile. The file you edit is the
   file the browser loads.

   Plain, FLAT CSS — no nesting, no preprocessor syntax, no minimum
   browser version. Every selector is written out in full, so this file
   works in any browser that understands CSS custom properties.

   Order matters: a rule further down this file beats an identical
   selector further up. Section 9 is last on purpose.

   To re-theme colours, fonts and sizes, edit section 1 only.

   Media queries in this file, and only these three:
     640px   phone   — hamburger menu takes over, offers/footer 1-up
     900px   tablet  — hero stacks, offers 2-up, welcome grid 1-up
     1200px  desktop — nav spacing eases up

   CONTENTS
     1. DESIGN TOKENS  (1a. self-hosted webfonts)
     2. BASE
     3. HEADER
     4. HOME LAYOUT
     5. DEFAULT LAYOUT
     6. CONTENT HELPERS
     7. FOOTER
     8. SYSTEM PAGES
     9. STACKING / Z-INDEX
   ================================================================== */

/* ==================================================================
   1. DESIGN TOKENS  (:root custom properties)
   ================================================================== */

/* =============================================================
   MMPark 2026 — CSS custom properties
   Change anything here to re-theme the whole template.
   Naming follows the project convention (--color-*, --fs-*,
   --flh-*, --fw-*, --br-*), inherited from the pcom2026 base.
   =============================================================
   */
/* =============================================================
   1a. WEBFONTS — Libre Baskerville, Cormorant Garamond,
                  Public Sans, Work Sans — SELF-HOSTED

   The font files live in ../fonts/ and ship inside the template
   package. NOTHING is fetched from Google. Great Vibes is
   deliberately NOT included: the wordmark is always the supplied
   logo image (logo-mmp-top-black.png / logo-mmp-top-white.png),
   never live text, so no script font is needed at runtime.

   Do NOT add Google Fonts <link> tags or an @import — see the
   rationale in the pcom2026 base (section 1a there): GDPR exposure,
   no SRI hash possible, render-blocking on system pages. @font-face
   has no ordering restriction and is valid anywhere in this file.

   COVERAGE: latin + latin-ext only (English content). Libre
   Baskerville ships 400, 400 italic and 700 (hero headline is
   italic; section headings are bold). Cormorant Garamond ships
   400/500/600 (H1 only needs 600, but 400/500 are included for
   flexibility in local.css overrides). Public Sans ships
   400/500/600/700 plus 400 italic — italic is included because
   Joomla article content contains <em>, same reasoning as the
   pcom2026 base. Work Sans ships 400/500/600/700, no italic — it is
   only ever used for UI chrome (nav, buttons, card headings).

   TO ADD A WEIGHT: add the file to ../fonts/ and copy a rule below.
   Referencing a weight with no matching @font-face makes the browser
   fake it (synthetic bolding), which is why every weight actually
   used in section 2+ is declared here.
   =============================================================
   */
/* Libre Baskerville 400 italic — latin */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/libre-baskerville-400-italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Libre Baskerville 400 italic — latin-ext */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/libre-baskerville-400-italic-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Libre Baskerville 400 — latin */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/libre-baskerville-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Libre Baskerville 400 — latin-ext */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/libre-baskerville-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Libre Baskerville 700 — latin */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/libre-baskerville-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Libre Baskerville 700 — latin-ext */
@font-face {
  font-family: 'Libre Baskerville';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/libre-baskerville-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Cormorant Garamond 400 — latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Cormorant Garamond 400 — latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Cormorant Garamond 500 — latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-500-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Cormorant Garamond 500 — latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-500-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Cormorant Garamond 600 — latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-600-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Cormorant Garamond 600 — latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/cormorant-garamond-600-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Public Sans 400 italic — latin */
@font-face {
  font-family: 'Public Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/public-sans-400-italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Public Sans 400 italic — latin-ext */
@font-face {
  font-family: 'Public Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/public-sans-400-italic-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Public Sans 400 — latin */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/public-sans-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Public Sans 400 — latin-ext */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/public-sans-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Public Sans 500 — latin */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/public-sans-500-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Public Sans 500 — latin-ext */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/public-sans-500-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Public Sans 600 — latin */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/public-sans-600-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Public Sans 600 — latin-ext */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/public-sans-600-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Public Sans 700 — latin */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/public-sans-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Public Sans 700 — latin-ext */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/public-sans-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Work Sans 400 — latin */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/work-sans-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Work Sans 400 — latin-ext */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/work-sans-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Work Sans 500 — latin */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/work-sans-500-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Work Sans 500 — latin-ext */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/work-sans-500-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Work Sans 600 — latin */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/work-sans-600-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Work Sans 600 — latin-ext */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('../fonts/work-sans-600-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Work Sans 700 — latin */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/work-sans-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Work Sans 700 — latin-ext */
@font-face {
  font-family: 'Work Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/work-sans-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root {
  /* ---- Brand colours ---- */
  --color-wine: #822B31; /* PRIMARY accent: CTA buttons, links, card rules, icons */
  --color-wine-dark: #5E1F24; /* button/link hover, active nav */
  --color-wine-faint: #F3E7E6; /* pale wine tint — blockquote fill, subtle hover states */
  --color-sage: #59894F; /* secondary: info callout rule */
  --color-sage-dark: #3C6034; /* headings on sage tint */
  /* ---- Warm neutrals (utility bar / hero gradients, from the existing site) ---- */
  --color-taupe-light: #E4D3CE;
  --color-taupe-mid: #AD908D;
  --color-hero-grad-start: #DACAC4;
  --color-hero-grad-end: #A18481;
  /* ---- Surfaces & text ---- */
  --color-bg: #FAF8F7; /* page background */
  --color-surface: #FFFFFF; /* nav bar, cards */
  --color-tint-cool: #DEE9F1; /* "Offers" band background */
  --color-tint-cool-line: #D1D9DD; /* offers-cell dividers */
  --color-tint-sage: #F2F7F1; /* "Our Offices" callout fill */
  --color-text: #1F1917; /* body text */
  --color-text-muted: #322C2A; /* nav, secondary text */
  /* Genuinely secondary text (article meta line). --color-text-muted is only
     a shade off body text, and a paler warm grey drops below 4.5:1 on
     --color-bg; this is the lightest warm neutral that still clears AA at
     small sizes (5.8:1 on #FAF8F7). */
  --color-text-meta: #6B5F5C;
  --color-footer-bg: #1C1412; /* footer background */
  --color-footer-text: rgba(228, 220, 217, 0.85); /* footer body text, 85% opacity per spec */
  --color-border: #E4DCD9; /* hairline borders */
  /* ---- Functional ---- */
  --color-link: var(--color-wine);
  --color-link-hover: var(--color-wine-dark);
  /* ---- Gradients & overlays ---- */
  --grad-utility: linear-gradient(120deg, var(--color-taupe-light), var(--color-taupe-mid));
  --grad-hero: linear-gradient(160deg, var(--color-hero-grad-start), var(--color-hero-grad-end));
  --overlay-photo: linear-gradient(180deg, rgba(20, 20, 10, 0) 40%, rgba(20, 20, 10, 0.55) 100%);
  /* ---- Alerts ----
     Two tokens per state, and they are NOT interchangeable:
       --color-<state>         faint FILL, used as the alert background
       --color-<state>-border  saturated ACCENT, used for the 4px left bar
     Bootstrap's own alert palette, kept deliberately — a Joomla system
     message should look like a Joomla system message, not fight the brand.
     TO RE-COLOUR A SITE: override these in css/local.css, not here —
     local.css is absent from the package, so it survives every upgrade. */
  --color-success: #d4edda;
  --color-success-border: #155724;
  --color-info: #d1ecf1;
  --color-info-border: #0c5460;
  --color-warning: #fff3cd;
  --color-warning-border: #856404;
  --color-danger: #f8d7da;
  --color-danger-border: #721c24;
  /* ---- Typography ---- */
  --font-display: 'Cormorant Garamond', Georgia, 'Times New Roman', serif; /* H1 / page heading */
  --font-head: 'Libre Baskerville', Georgia, 'Times New Roman', serif; /* H2 / hero headline (italic) */
  --font-body: 'Public Sans', Arial, Helvetica, sans-serif; /* body copy, callouts, footer, eyebrow */
  --font-menu: 'Work Sans', Arial, Helvetica, sans-serif; /* UI chrome: nav, buttons, H3+, card text */
  /* font sizes */
  --fs-300: 0.8125rem; /* 13px — utility bar / legal, eyebrow lower bound */
  --fs-350: 0.875rem; /* 14px — nav link, eyebrow upper bound */
  --fs-375: 0.90625rem; /* 14.5px — card / small body */
  --fs-400: 1rem; /* 16px — body FLOOR */
  --fs-500: 1.125rem; /* 18px — H3 / card heading */
  --fs-550: 1.375rem; /* 22px — H2 mobile */
  --fs-600: 1.625rem; /* 26px — H2 desktop / H1 mobile */
  --fs-650: 1.75rem; /* 28px — hero headline mobile */
  --fs-700: 2rem; /* 32px — H1 desktop */
  --fs-900: 2.375rem; /* 38px — hero headline desktop */
  /* Oversized display numeral — outside the text scale on purpose. Fluid so it
     doesn't dominate a phone screen. */
  --fs-error-code: clamp(3.5rem, 12vw, 6rem);
  /* line heights */
  --flh-300: 1.5; /* utility bar / legal */
  --flh-350: 1.15; /* nav link — incl. the 2-line case, see section 3 */
  --flh-375: 1.55; /* card / small body */
  --flh-400: 1.7; /* body */
  --flh-500: 1.4; /* H3 / card heading */
  --flh-600: 1.3; /* H2 section heading */
  --flh-700: 1.2; /* H1 page heading */
  --flh-900: 1.3; /* hero headline */
  /* font weights */
  --fw-400: 400;
  --fw-500: 500;
  --fw-600: 600;
  --fw-700: 700;
  /* ---- Radius ---- restrained, not pill-shaped */
  --br-small: 3px; /* buttons */
  --br-std: 4px; /* small cards */
  --br-large: 6px; /* cards, callouts */
  /* ---- Spacing & structure ---- */
  --space-section-top: 70px; /* vertical rhythm: top of a section */
  --space-section-bottom: 48px; /* vertical rhythm: bottom of a section */
  --space-gutter: 48px; /* .t-wrap side padding, desktop */
  --width-boxed: 1080px; /* content max-width; full-bleed bands ignore this on their outer wrapper */
  --height-header: 84px;
  --height-header-mobile: 64px;
  --height-topbar: 34px;
  /* ---- Effects ---- */
  --shadow-card: 0 14px 32px rgba(28, 20, 18, 0.1);
  --shadow-header: 0 2px 14px rgba(28, 20, 18, 0.06);
  --transition: 0.2s ease;
  /* ---- Layering (z-index scale) ----
     One place to control what paints over what. Values are deliberately
     high so third-party module CSS (sliders, page builders, pasted
     Custom HTML) can't scroll over the sticky header. Content regions
     are also isolated — see section 9. */
  --z-below: -1; /* decorative layers behind their own content */
  --z-base: 1; /* in-flow content that needs to sit above a ::before/::after */
  --z-sticky: 900; /* sticky elements inside the page body */
  --z-header: 1000; /* sticky site header — must stay clickable */
  --z-dropdown: 1010; /* menu drop-downs / mobile nav panel */
  --z-overlay: 1100; /* full-screen overlays (modals, off-canvas, lightboxes) */
}

/* ==================================================================
   2. BASE  (reset, typography, buttons, layout container)
   ================================================================== */

/* =============================================================
   MMPark 2026 — base reset, typography, buttons, helpers
   =============================================================
   */
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  /* Stop iOS/Android from silently inflating text in landscape. We set the
     mobile sizes deliberately below; let them stand.
     */
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  font-family: var(--font-body);
  font-weight: var(--fw-400);
  font-size: var(--fs-400);
  line-height: var(--flh-400);
  color: var(--color-text);
  background: var(--color-bg);
  -webkit-font-smoothing: antialiased;
}

img {
  max-width: 100%;
  height: auto;
  display: block;
}

a {
  color: var(--color-link);
  text-decoration: none;
  transition: color var(--transition);
}

a:hover {
  color: var(--color-link-hover);
}

h1, h2, h3, h4, h5, h6 {
  color: var(--color-text);
  margin: 0 0 0.5em;
}

/* EVERY heading level gets an explicit size and family. Levels left unsized
   fall back to the browser default (h5 0.83em, h6 0.67em) — which renders
   module and article headings smaller than the body text around them. h5/h6
   therefore bottom out at body size rather than dropping below it.
   */
h1 {
  font-family: var(--font-display);
  font-size: var(--fs-700);
  font-weight: var(--fw-600);
  line-height: var(--flh-700);
}

h2 {
  font-family: var(--font-head);
  font-size: var(--fs-600);
  font-weight: var(--fw-700);
  line-height: var(--flh-600);
}

h3 {
  font-family: var(--font-menu);
  font-size: var(--fs-500);
  font-weight: var(--fw-600);
  line-height: var(--flh-500);
}

h4 {
  font-family: var(--font-menu);
  font-size: var(--fs-400);
  font-weight: var(--fw-600);
}

h5 {
  font-family: var(--font-menu);
  font-size: var(--fs-400);
  font-weight: var(--fw-600);
}

h6 {
  font-family: var(--font-menu);
  font-size: var(--fs-400);
  font-weight: var(--fw-600);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

p {
  margin: 0 0 1.1em;
}

ul, ol {
  margin: 0 0 1.2em 1.25em;
}

li {
  margin-bottom: 0.5em;
}

blockquote {
  border-left: 4px solid var(--color-wine);
  background: var(--color-wine-faint);
  padding: 18px 24px;
  border-radius: 0 var(--br-large) var(--br-large) 0;
  margin: 1.4em 0;
  color: var(--color-wine-dark);
  font-weight: var(--fw-400);
}

/* Boxed content wrapper */
.t-wrap {
  max-width: var(--width-boxed);
  margin: 0 auto;
  padding: 0 var(--space-gutter);
}

/* Vertical section rhythm — asymmetric top/bottom per the design spec */
.t-section {
  padding: var(--space-section-top) 0 var(--space-section-bottom);
}

/* Buttons
   .btn / .btn-primary are aliased alongside .t-btn / .t-btn-primary: Joomla
   and Bootstrap both use the bare names as their own convention, and content
   typed into a module is very likely to reach for them instead of the
   template's own t- prefix. Scoped to just these two classes (not the full
   Bootstrap button system — btn-secondary, btn-outline-*, btn-lg, etc. get
   no styling here) so this doesn't reach into unrelated Bootstrap markup
   elsewhere on the site. */
.t-btn, .btn {
  display: inline-block;
  font-family: var(--font-menu);
  font-weight: var(--fw-600);
  font-size: 0.9375rem; /* 15px */
  line-height: 1;
  padding: 13px 26px;
  border-radius: var(--br-small);
  border: 2px solid transparent;
  cursor: pointer;
  transition: background var(--transition), color var(--transition), border-color var(--transition);
}

.t-btn-primary, .btn-primary {
  background: var(--color-wine);
  color: var(--color-surface);
}

.t-btn-primary:hover, .btn-primary:hover {
  background: var(--color-wine-dark);
  color: var(--color-surface);
}

.t-btn-ghost {
  border-color: var(--color-wine);
  color: var(--color-wine);
}

.t-btn-ghost:hover {
  background: var(--color-wine);
  color: var(--color-surface);
}

/* Eyebrow / kicker */
.t-eyebrow {
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-family: var(--font-body);
  font-size: var(--fs-350);
  font-weight: var(--fw-700);
  color: var(--color-wine);
}

@media only screen and (max-width: 640px) {
  /* Body stays at --fs-400 (1rem / 16px). Do NOT shrink it here: phones are
     held further from the eye than a monitor, so 16px is a floor, not a
     target — and any <input> under 16px makes iOS Safari zoom the page on
     focus. Tighten the vertical rhythm and the display sizes instead.
     */
  :root {
    --space-section-top: 44px;
    --space-section-bottom: 32px;
    --space-gutter: 24px;
  }
  h1 {
    font-size: var(--fs-600);
  }
  h2 {
    font-size: var(--fs-550);
  }
}

/* ==================================================================
   3. HEADER  (top bar, logo, nav, hamburger, mobile drawer)
   ================================================================== */

/* =============================================================
   MMPark 2026 — top bar, header, main navigation
   =============================================================
   */
/* ---- Top bar ---- */
.t-topbar {
  background: var(--grad-utility);
  color: var(--color-text-muted);
  font-size: var(--fs-300);
  font-family: var(--font-body);
}
.t-topbar .t-wrap {
  /* Full-bleed band per the design spec — only text sections (Welcome,
     Additional Services) are boxed to --width-boxed; chrome bands like this
     one run edge to edge with just the gutter padding .t-wrap already
     supplies. */
  max-width: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
  min-height: var(--height-topbar);
  gap: 16px;
}
.t-topbar a {
  color: var(--color-text-muted);
}
.t-topbar a:hover {
  color: var(--color-wine-dark);
}
.t-topbar p {
  margin: 0;
}

.t-topbar-start {
  display: flex;
  align-items: center;
  gap: 18px;
  margin-right: auto;
}
.t-topbar-start:empty {
  display: none;
}
.t-topbar-end {
  display: flex;
  align-items: center;
  gap: 18px;
}

/* ---- Header ---- */
.t-header {
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
  position: sticky;
  top: 0;
  z-index: var(--z-header); /* see section 1 / section 9 */
  box-shadow: var(--shadow-header);
}

.t-header-inner {
  /* Full-bleed, same reasoning as .t-topbar .t-wrap above. */
  max-width: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: var(--height-header);
  gap: 24px;
}

.t-logo {
  display: flex;
  align-items: center;
}

/* Drive the size from max-height and let the width follow, rather than
   fixing height. The global img{max-width:100%} reset squeezes the WIDTH
   when the header flex row runs out of room on a small phone; with a
   fixed height that squeeze renders as a horizontally squashed logo. With
   height:auto the image scales proportionally instead and simply gets
   smaller. */
.t-logo img {
  height: auto;
  max-height: 36px;
  width: auto;
  max-width: 100%;
  min-width: 200px; /* below this the script wordmark stops being legible */
}

.t-logo a {
  display: inline-flex;
  align-items: center;
}

.t-header-end {
  display: flex;
  align-items: center;
  gap: 16px;
}

/* ---- Main navigation (module output) ---- */
/* flex:1 + centered inner list visually centers the nav between the logo
   and the header-end button, without a grid rewrite of the header row. */
.t-nav {
  flex: 1;
  display: flex;
  justify-content: center;
}
.t-nav ul {
  list-style: none;
  display: flex;
  /* stretch, not center: when one label wraps to two lines it makes the row
     taller, and centred single-line items would then each sit at their own
     height, putting their hover underlines on several different baselines.
     Stretched, every item is the same height and the underlines line up. */
  align-items: stretch;
  gap: 30px;
  margin: 0;
}
.t-nav li {
  margin: 0;
}
/* Long labels wrap to two lines when the header row is tight, and both of the
   properties below are what make that case behave.

   display: NOT inline. Two reasons, and the first is a real bug:
     - a border-bottom on an INLINE box is painted on every line box it
       generates, so a 2-line item got the hover/active underline through its
       middle as well as under it. Any non-inline display draws it once, at
       the bottom of the item frame.
     - an inline anchor's own line-height doesn't govern its line boxes — each
       one is at least as tall as the STRUT of its block container, i.e. the
       li, which inherits the body's --flh-400 (1.7). That is why the two
       lines sat so far apart even though --flh-350 was 1. As a flex box the
       anchor becomes the block container and its own line-height applies.
   flex rather than block so the anchor also fills the stretched li and
   centres a 1- or 2-line label in it. Centring is only visible on a wrapped
   item: an unwrapped one is exactly as wide as its text. */
.t-nav a {
  font-family: var(--font-menu);
  font-weight: var(--fw-600);
  font-size: var(--fs-350);
  line-height: var(--flh-350);
  color: var(--color-text-muted);
  padding: 6px 0;
  border-bottom: 2px solid transparent;
  display: flex;
  align-items: center;
  justify-content: center;
}
.t-nav a:hover, .t-nav .active > a, .t-nav .current > a {
  color: var(--color-wine);
  border-color: var(--color-wine);
}
/* Non-clickable dropdown-parent headings (Joomla's own mod_menu core markup:
   a menu item with no link target of its own — Menu Item Type "Heading" —
   renders as <span class="mod-menu__heading nav-header"> instead of <a>).
   Matches .t-nav a's typography exactly so it doesn't look broken sitting
   next to real links, but deliberately keeps cursor:default and skips the
   wine hover colour real links get — it isn't clickable, and a hover colour
   change would imply otherwise. Hovering it still reveals its dropdown via
   the generic .t-nav li:hover > ul rule below, which doesn't care whether
   the li's first child is an <a> or this <span>. */
.t-nav .mod-menu__heading {
  font-family: var(--font-menu);
  font-weight: var(--fw-600);
  font-size: var(--fs-350);
  line-height: var(--flh-350);
  color: var(--color-text-muted);
  padding: 6px 0;
  border-bottom: 2px solid transparent;
  cursor: default;
  /* same box treatment as .t-nav a above — it wraps for the same reasons */
  display: flex;
  align-items: center;
  justify-content: center;
}
.t-nav li {
  position: relative;
}
.t-nav {
  /* nested dropdowns — shown on hover OR keyboard focus (no click needed) */
}
.t-nav ul ul {
  position: absolute;
  top: 100%;
  left: 0;
  display: block; /* kept in the DOM; toggled via visibility */
  flex-direction: column;
  align-items: stretch;
  gap: 0;
  background: var(--color-surface);
  box-shadow: var(--shadow-card);
  border-radius: var(--br-std);
  padding: 8px 0;
  min-width: 210px;
  opacity: 0;
  visibility: hidden;
  transform: translateY(6px);
  transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
  z-index: var(--z-dropdown);
}
.t-nav li:hover > ul,
.t-nav li:focus-within > ul {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.t-nav ul ul a {
  padding: 8px 18px;
  border: 0;
  display: block;
}
.t-nav ul ul li {
  width: 100%;
}

/* ---- Hamburger toggle ---- */
.t-nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  background: none;
  border: 0;
  cursor: pointer;
}
.t-nav-toggle span {
  display: block;
  height: 3px;
  width: 24px;
  background: var(--color-text);
  border-radius: 2px;
  transition: var(--transition);
}

/* ---- Responsive: 1200px — ease nav spacing before it gets tight ---- */
@media only screen and (max-width: 1200px) {
  .t-nav ul {
    gap: 20px;
  }
}
/* ---- Responsive: tablet ----
   The top bar is hidden below 640px but visible on everything above it,
   where --fs-300 (0.8125rem) is uncomfortably small on a hand-held screen.
   Bring it up to the nav-link size and let it centre once it wraps.
   */
@media only screen and (max-width: 900px) {
  .t-topbar {
    font-size: var(--fs-350);
  }
  .t-topbar .t-wrap {
    justify-content: center;
    min-height: 0;
    padding-block: 8px;
    gap: 4px 16px;
  }
  .t-topbar-start {
    margin-right: 0;
  }
}
/* ---- Responsive: mobile nav ---- */
@media only screen and (max-width: 640px) {
  .t-topbar {
    display: none;
  }
  .t-header-inner {
    min-height: var(--height-header-mobile);
    gap: 12px; /* logo has a 200px min-width floor (see section 3 base rule) —
                  every px matters once a phone gets down toward 320px wide */
  }
  .t-logo img {
    max-height: 30px;
  }
  /* The 200px logo floor and the header-end button both wanting space is a
     losing fight below ~480px — something has to give, and it isn't the
     logo (illegible) or the hamburger (the only way to reach the menu at
     all). Contact Us drops from the header on phones; it's still reachable
     from the footer's Quick Links, and can be added as a real menu item if
     it needs to be reachable from the drawer too. */
  .t-header-end .t-btn {
    display: none;
  }
  .t-nav-toggle {
    display: flex;
  }
  .t-nav {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: var(--z-dropdown);
    background: var(--color-surface);
    box-shadow: var(--shadow-card);
    max-height: 0;
    overflow: hidden;
    transition: max-height var(--transition);
  }
  .t-nav ul {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: 8px 0;
  }
  .t-nav a,
  .t-nav .mod-menu__heading {
    display: flex;
    align-items: center;
    /* the desktop rule centres the label; a full-width drawer row is a list
       item, so send it back to the left edge */
    justify-content: flex-start;
    min-height: 44px;
    font-size: var(--fs-400);
    padding: 10px var(--space-gutter);
    border: 0;
    border-bottom: 1px solid var(--color-border);
  }
  .t-nav ul ul {
    position: static;
    display: block;
    box-shadow: none;
    padding: 0 0 0 16px;
  }
  .t-nav ul ul a {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    font-size: var(--fs-375);
    min-height: 44px;
  }
  .t-nav-open .t-nav {
    max-height: 80vh;
    overflow: auto;
  }
}

/* ==================================================================
   4. HOME LAYOUT  (hero, offers band, additional services)
   ================================================================== */

/* =============================================================
   MMPark 2026 — HOME layout positions
   hero · feature · sub-feature (reskinned: Offers band) ·
   call-to-action (reskinned: Additional Services)
   =============================================================
   */
/* ---- Hero (split panel) ----
   The module assigned to "hero" carries its own two-panel markup using the
   .t-hero-split helper classes below (see HOW-TO-MODIFY.md for the exact
   snippet) — the section itself adds no padding, so the panels can run
   edge-to-edge. */
.t-hero {
  background: var(--color-surface);
  overflow: hidden;
}
.t-hero > .mod-wrapper, .t-hero > div {
  display: block;
}

.t-hero-split {
  display: grid;
  grid-template-columns: 0.9fr 1.1fr;
  min-height: 480px;
}

.t-hero-split-text {
  background: var(--grad-hero);
  color: var(--color-text);
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 56px var(--space-gutter);
}
/* A flex column's default align-items:stretch would otherwise stretch the
   button to the full width of the panel; size it to its own text instead. */
.t-hero-split-text .t-btn {
  align-self: flex-start;
}
.t-hero-split-text h1 {
  font-family: var(--font-head);
  font-style: italic;
  font-weight: var(--fw-400);
  font-size: var(--fs-900);
  line-height: var(--flh-900);
  color: var(--color-text);
  margin-bottom: 0.4em;
}
.t-hero-split-text p {
  font-size: var(--fs-400);
  line-height: var(--flh-400);
  color: var(--color-text-muted);
  max-width: 32em;
  margin-bottom: 1.6em;
}

.t-hero-split-image {
  position: relative;
  min-height: 320px;
}
.t-hero-split-image img {
  width: 100%;
  height: 100%;
  min-height: inherit;
  object-fit: cover;
}

/* ---- Section heading (centered eyebrow + title + intro) ----
   Available for optional use (e.g. on the unused "feature" position). */
.t-sec-head {
  text-align: center;
  max-width: 42em;
  margin: 0 auto 52px;
}
.t-sec-head h2 {
  margin: 0.3em 0;
}
.t-sec-head p {
  color: var(--color-text-muted);
  font-size: var(--fs-500);
  margin: 0;
}

/* ---- Feature (card grid) — position unused in the shipped comp, but kept
   live and re-themed so it renders correctly the moment a site editor
   assigns a module to it. ---- */
.t-feature {
  background: var(--color-tint-cool);
}

.t-feature-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 28px;
}

.t-card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--br-large);
  padding: 34px 30px;
  transition: transform var(--transition), box-shadow var(--transition);
}
.t-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-card);
}
.t-card .t-card-title {
  color: var(--color-text);
  font-size: var(--fs-500);
  margin-bottom: 0.4em;
}
.t-card .t-card-body {
  color: var(--color-text-muted);
}
.t-card p:last-child {
  margin-bottom: 0;
}

/* ---- Sub-feature, reskinned as "The Masonic Memorial Park Offers" ----
   The heading and the 4-up icon grid both come from the module content
   assigned to "sub-feature" (see HOW-TO-MODIFY.md for the markup). */
.t-subfeature {
  background: var(--color-tint-cool);
}
.t-subfeature .t-wrap {
  max-width: var(--width-boxed);
}
.t-subfeature h2 {
  margin-bottom: 36px;
}

/* The 1px gap + line-colored background shows through only BETWEEN cells
   (3 dividers for 4 columns) — deliberately no outer border, so the row
   doesn't get a frame around its own outside edge. */
.t-offers-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--color-tint-cool-line);
}
.t-offers-cell {
  background: var(--color-tint-cool);
  padding: 28px 24px;
  text-align: center;
}
.t-offers-cell img {
  width: 36px;
  height: 36px;
  margin: 0 auto 16px;
}
.t-offers-cell p {
  font-family: var(--font-menu);
  font-size: var(--fs-375);
  line-height: var(--flh-375);
  color: var(--color-text-muted);
  margin: 0;
}

/* ---- Call to action, reskinned as "Additional Services" ----
   Plain text section — no colour band, no centred CTA treatment. Content
   is a heading plus body copy typed straight into the module. ---- */
.t-cta {
  background: var(--color-bg);
  color: var(--color-text);
  text-align: left;
  padding: var(--space-section-top) 0 var(--space-section-bottom);
}
.t-cta .t-wrap {
  max-width: var(--width-boxed);
}
.t-cta h2 {
  color: var(--color-text);
}
.t-cta p {
  max-width: none;
  color: var(--color-text-muted);
  font-size: var(--fs-400);
  line-height: var(--flh-400);
}
.t-cta p:last-child {
  margin-bottom: 0;
}
.t-cta a:not(.t-btn) {
  color: var(--color-wine);
}

.t-main-home {
  padding: 0;
}

/* =============================================================
   Content helpers — used by the Custom HTML module snippets so
   hero / welcome / offers content matches the design without
   inline styles. (See HOW-TO-MODIFY.md.)
   =============================================================
   */
/* ---- Welcome grid + "Our Offices" callout (Home article body) ----
   This is a TEXT SECTION per the design spec, so unlike the chrome bands
   above it stays boxed to --width-boxed. index.php renders the Home
   article's component output with no wrapper of its own (see index.php,
   home layout), so this rule supplies its own boxing/padding directly
   rather than relying on an ancestor .t-wrap. */
.t-welcome-grid {
  max-width: var(--width-boxed);
  margin: 0 auto;
  padding: var(--space-section-top) var(--space-gutter) var(--space-section-bottom);
  display: grid;
  grid-template-columns: 1.35fr 0.9fr;
  gap: 56px;
  align-items: start;
}
.t-welcome-grid h2 {
  margin-bottom: 0.6em;
}
.t-welcome-grid p:last-child {
  margin-bottom: 0;
}

.t-callout {
  background: var(--color-tint-sage);
  border-left: 3px solid var(--color-sage);
  padding: 26px 28px;
}
.t-callout .t-callout-label {
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-family: var(--font-body);
  font-size: var(--fs-350);
  font-weight: var(--fw-700);
  color: var(--color-sage-dark);
  margin-bottom: 0.8em;
}
.t-callout p {
  font-size: var(--fs-400);
  line-height: 1.6;
  color: var(--color-text);
  margin-bottom: 0.6em;
}
.t-callout p:last-child {
  margin-bottom: 0;
}

/* ---- Responsive ---- */
@media only screen and (max-width: 900px) {
  .t-feature-grid {
    grid-template-columns: 1fr;
  }
  .t-hero-split {
    grid-template-columns: 1fr;
  }
  .t-hero-split-image {
    min-height: 260px;
  }
  .t-welcome-grid {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .t-offers-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media only screen and (max-width: 640px) {
  .t-hero-split-text {
    padding: 40px var(--space-gutter);
  }
  .t-hero-split-text h1 {
    font-size: var(--fs-650);
  }
  .t-offers-grid {
    grid-template-columns: 1fr;
  }
}

/* ==================================================================
   5. DEFAULT LAYOUT  (page head, content/sidebar grid, modules,
                       article meta, custom fields)
   ================================================================== */

/* =============================================================
   MMPark 2026 — DEFAULT layout
   page banner · main content · optional left/right sidebars
   =============================================================
   */
/* ---- Page banner ---- */
.t-page-banner {
  background: var(--grad-hero);
  color: var(--color-text);
  padding: 54px 0;
}
.t-page-banner .t-page-title {
  color: var(--color-text);
  margin: 0;
}
.t-page-banner .t-crumbs {
  font-size: var(--fs-300);
  color: var(--color-text-muted);
  margin-top: 8px;
}
.t-page-banner .t-crumbs a {
  color: var(--color-text-muted);
}
.t-page-banner .t-crumbs a:hover {
  color: var(--color-wine);
}

/* ---- Breadcrumbs on their own, when the page banner is not rendered ---- */
.t-crumbs-bare {
  font-size: var(--fs-300);
  color: var(--color-text-muted);
  padding-top: 20px;
}
.t-crumbs-bare a {
  color: var(--color-link);
}
.t-crumbs-bare a:hover {
  color: var(--color-link-hover);
}

/* ---- Layout grid (sidebars are optional & collapse when empty) ---- */
.t-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 40px;
  padding: 56px 0;
}
.t-layout.t-has-l {
  grid-template-columns: 235px minmax(0, 1fr);
}
.t-layout.t-has-r {
  grid-template-columns: minmax(0, 1fr) 235px;
}
.t-layout.t-has-lr {
  grid-template-columns: 235px minmax(0, 1fr) 235px;
}

/* ---- Sidebars (minimalist) ---- */
.t-sidebar {
  font-size: var(--fs-400);
}

.t-module {
  background: var(--color-tint-sage);
  border: 1px solid var(--color-border);
  border-radius: var(--br-large);
  padding: 22px;
  margin-bottom: 24px;
}
.t-module .t-module-title {
  color: var(--color-sage-dark);
  font-family: var(--font-body);
  font-size: var(--fs-350);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-weight: var(--fw-700);
  margin-bottom: 12px;
  padding-bottom: 8px;
  border-bottom: 2px solid var(--color-sage);
  display: inline-block;
}
.t-module ul {
  list-style: none;
  margin: 0;
}
.t-module li {
  padding: 7px 0;
  margin: 0;
  border-bottom: 1px dashed var(--color-border);
}
.t-module li:last-child {
  border-bottom: 0;
}
.t-module a {
  color: var(--color-text);
}
.t-module a:hover {
  color: var(--color-wine);
}

/* ---- Main content ---- */
.t-main h2 {
  margin: 1.4em 0 0.5em;
}
.t-main h2:first-child {
  margin-top: 0;
}
.t-main p {
  color: var(--color-text);
}
.t-main a {
  color: var(--color-wine);
}

/* ---- Article meta line (com_content "article info") ----
   Joomla emits <dl class="article-info"> — a <dt> naming the block, then one
   <dd> per enabled item (author, category, publish date, hits). Left alone a
   definition list stacks every item on its own indented line; this lays them
   out as a single quiet strip under the title, hairline-separated, closed off
   from the body copy by a rule.
   Which items appear is Joomla's business, not the template's — the options
   live on the article, the menu item and Global Configuration (in that order
   of precedence). This styles whatever turns up, including nothing. */
.article-info {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 14px;
  margin: 0 0 26px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--color-border);
  font-family: var(--font-body);
  font-size: var(--fs-350);
  line-height: var(--flh-375);
  color: var(--color-text-meta);
}
.article-info dd {
  margin: 0;
}
/* Hairline between items — never before the first, and never left dangling at
   the start of a wrapped line, because the phone tier stacks them instead. */
.article-info dd + dd {
  border-left: 1px solid var(--color-border);
  padding-left: 14px;
}
.article-info a {
  color: var(--color-text-meta);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.article-info a:hover {
  color: var(--color-link-hover);
}

/* When the field block follows the meta line directly, the meta line's own
   rule already closes that region off — a second hairline 20px under it reads
   as a mistake rather than as structure. The block keeps its border-top for
   every other case (meta line switched off, fields further down the page). */
.article-info + .fields-container {
  margin-top: 0;
  border-top: 0;
}
/* ...and without the border there is no row above to share padding with, so
   the first entry drops its own and the meta line's margin sets the gap —
   otherwise the first row sits lower than the rhythm of the rest. */
.article-info + .fields-container > .field-entry:first-child {
  padding-top: 0;
}

/* ---- Custom fields (com_fields) ----
   Markup is <ul class="fields-container"> of <li class="field-entry">, each
   holding <span class="field-label"> and <span class="field-value">. Both
   spans are grid items here, which blockifies them — no display change of
   their own is needed, and none should be added: the value often contains a
   <div> from a field plugin, which is invalid inside an inline span and lays
   out unpredictably if the span stays inline.
   A fixed label column is the point of the grid: values line up down the page
   however long the labels get.
   The trailing colon belongs to Joomla's label ("Grave Site Records: ") — do
   NOT add one with ::after or every label ends up with two. */
.fields-container {
  list-style: none;
  margin: 26px 0;
  padding: 0;
  border-top: 1px solid var(--color-border);
}
.field-entry {
  display: grid;
  grid-template-columns: 190px minmax(0, 1fr);
  gap: 4px 24px;
  margin: 0;
  padding: 13px 0;
  border-bottom: 1px solid var(--color-border);
}
.field-label {
  font-family: var(--font-menu);
  font-size: var(--fs-300);
  font-weight: var(--fw-700);
  line-height: var(--flh-375);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--color-sage-dark);
  padding-top: 4px; /* optical: small caps ride high against the larger value */
}
.field-value {
  font-size: var(--fs-400);
  line-height: var(--flh-400);
  color: var(--color-text);
  min-width: 0; /* a long unbroken value shrinks instead of widening the grid */
}
/* Field plugins emit their own block wrappers; strip the leading/trailing
   margin so the row's own padding sets the spacing. */
.field-value > *:first-child,
.field-value .acfarticles-field-wrapper > *:first-child {
  margin-top: 0;
}
.field-value > *:last-child,
.field-value .acfarticles-field-wrapper > *:last-child {
  margin-bottom: 0;
}

/* ---- List values ----
   Any field whose plugin renders a <ul> lands here — including the Tassos ACF
   Articles field, which wraps its list in .acfarticles-field-wrapper (its
   sibling class, acf_articles_<n>_<n>, is per-instance and must not be styled).
   `columns` covers both shapes this data takes: a single entry stays one
   column, several flow into a second once there is room, and never more than
   two however wide the screen gets. */
.field-value ul,
.field-value ol {
  list-style: none;
  margin: 0;
  padding: 0;
  columns: 15rem 2;
  column-gap: 32px;
  /* Cap the measure. Without it the two columns split the full content width
     and short entries — which is what these lists mostly hold — end up with a
     200px void between the two, reading as two unrelated lists. */
  max-width: 34rem;
}
.field-value li {
  position: relative;
  margin: 0 0 4px;
  padding-left: 15px;
  /* Tighter than body copy: these are index entries, not prose, and body
     leading makes a four-name list look like four paragraphs. */
  line-height: var(--flh-375);
  break-inside: avoid; /* keep an entry off a column boundary */
}
.field-value li:last-child {
  margin-bottom: 0;
}
.field-value li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.62em; /* optical centre of the first line at --flh-375 */
  width: 4px;
  height: 4px;
  background: var(--color-wine);
  border-radius: 1px;
}
/* (0,2,1), so the link colour holds against `.t-main a` (0,1,1) wherever the
   two sit relative to each other in the cascade. */
.fields-container .field-value a {
  color: var(--color-link);
}
.fields-container .field-value a:hover {
  color: var(--color-link-hover);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* ---- Responsive ---- */
@media only screen and (max-width: 1200px) {
  .t-layout.t-has-lr {
    grid-template-columns: minmax(0, 1fr) 235px;
  }
  .t-layout.t-has-lr .t-sidebar-left {
    display: none;
  }
}
@media only screen and (max-width: 900px) {
  .t-layout,
  .t-layout.t-has-l,
  .t-layout.t-has-r,
  .t-layout.t-has-lr {
    grid-template-columns: 1fr;
  }
  .t-sidebar {
    order: 2;
  }
  .t-layout.t-has-lr .t-sidebar-left {
    display: block;
  }
}
@media only screen and (max-width: 640px) {
  /* One meta item per line — a vertical hairline stranded at the start of a
     wrapped line reads as a mistake, and there is no room to wrap cleanly. */
  .article-info {
    flex-direction: column;
    gap: 3px;
  }
  .article-info dd + dd {
    border-left: 0;
    padding-left: 0;
  }
  /* Label above value: a 190px label column leaves nothing usable beside it. */
  .field-entry {
    grid-template-columns: minmax(0, 1fr);
    gap: 3px;
  }
  .field-value ul,
  .field-value ol {
    columns: auto;
  }
}

/* ==================================================================
   6. CONTENT HELPERS  (reusable grid/row/stack classes)
   ================================================================== */

/* =============================================================
   MMPark 2026 — general content classes (site-wide, reusable)

   A library of reusable STRUCTURAL classes you can use on ANY
   content page — just add the class in an article or a Custom
   HTML module. No per-page setup, no Joomla "Page Class" needed.

   Namespaced with `.c-` (content) so these never collide with the
   template's own `.t-` region classes. Add your own below following
   the same pattern: keep values in CSS variables (section 1) and
   write the media query out longhand, e.g.
   @media only screen and (max-width: 900px).
   =============================================================
   */
/* ---- Responsive column grids -------------------------------------
   <div class="c-grid c-grid--3"> … cells … </div>
   Collapses automatically: 4/3-up → 2-up on tablet → 1-up on phone.
   */
.c-grid {
  display: grid;
  gap: var(--space-gutter);
  grid-template-columns: 1fr;
}

.c-grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.c-grid--3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.c-grid--4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* Auto: as many equal columns as fit, each at least 240px wide. */
.c-grid--auto {
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}

@media only screen and (max-width: 900px) {
  .c-grid--3,
  .c-grid--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media only screen and (max-width: 640px) {
  .c-grid--2,
  .c-grid--3,
  .c-grid--4 {
    grid-template-columns: 1fr;
  }
}
/* ---- Flex row ----------------------------------------------------
   <div class="c-row c-row--middle"> … </div>  — items keep their
   own width; wraps on small screens.
   */
.c-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-gutter);
}

.c-row--middle {
  align-items: center;
}

.c-row--between {
  justify-content: space-between;
}

.c-row--center {
  justify-content: center;
}

/* Add c-row--equal to make every child share the width equally. */
.c-row--equal > * {
  flex: 1 1 0;
  min-width: 0;
}

/* ---- Vertical spacing (stack) ------------------------------------
   <div class="c-stack"> … blocks get even vertical rhythm … </div>
   */
.c-stack > * + * {
  margin-top: 1rem;
}

.c-stack--lg > * + * {
  margin-top: 2rem;
}

/* ---- Width helpers ----------------------------------------------- */
.c-narrow {
  max-width: 70ch;
  margin-inline: auto;
} /* readable text column */
.c-center {
  text-align: center;
}

/* ---- Add new reusable structural classes below ------------------- */

/* ==================================================================
   7. FOOTER
   ================================================================== */

/* =============================================================
   MMPark 2026 — footer
   =============================================================
   */
.t-footer {
  background: var(--color-footer-bg);
  color: var(--color-footer-text);
  padding: 64px 0 0;
  margin-top: 0;
  font-size: var(--fs-400);
}
.t-footer a {
  color: var(--color-footer-text);
}
.t-footer a:hover {
  color: var(--color-surface);
}
.t-footer .t-wrap {
  /* Full-bleed band per the design spec, same reasoning as the header/
     topbar overrides in section 3. */
  max-width: none;
}

.t-footer-grid {
  display: grid;
  grid-template-columns: 1.3fr 1fr 1fr 1fr;
  gap: 40px;
  padding-bottom: 48px;
}

.t-footer-module .t-footer-title {
  color: var(--color-surface);
  font-family: var(--font-body);
  font-size: var(--fs-300);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-weight: var(--fw-700);
  margin-bottom: 16px;
}
.t-footer-module ul {
  list-style: none;
  margin: 0;
}
.t-footer-module li {
  margin: 0;
}
.t-footer-module .t-footer-body a {
  display: block;
  padding: 5px 0;
}

/* Footer logo — sits at the top of column 1, above the address block */
.t-footer-logo {
  margin-bottom: 18px;
}

.t-footer-logo:empty {
  display: none;
}

.t-footer-logo img {
  max-height: 34px;
  width: auto;
  height: auto;
}

/* "Proud Member" badge column */
.t-footer-badge img {
  max-width: 120px;
  height: auto;
  margin-bottom: 10px;
}
.t-footer-badge p {
  font-size: var(--fs-375);
  line-height: var(--flh-375);
  color: var(--color-footer-text);
}

/* Bottom bar */
.t-footer-bottom {
  border-top: 1px solid rgba(255, 255, 255, 0.15);
  padding: 22px 0;
}

.t-footer-meta {
  font-size: var(--fs-300);
  color: var(--color-footer-text);
}

/* Copyright (left) / credit (right) split — lives inside the footer-bar module */
.t-footer-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
}

@media only screen and (max-width: 900px) {
  .t-footer-grid {
    grid-template-columns: 1fr 1fr;
  }
}
@media only screen and (max-width: 640px) {
  .t-footer-grid {
    grid-template-columns: 1fr;
    gap: 28px;
  }
  .t-footer-bar {
    flex-direction: column;
    align-items: flex-start;
  }
}

/* ==================================================================
   8. SYSTEM PAGES  (offline, error)
   ================================================================== */

/* =============================================================
   MMPark 2026 — system pages (error, offline) + Joomla helpers
   =============================================================
   */
/* ---- Error page ---- */
.t-error {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  background: var(--color-bg);
}

.t-error-main {
  flex: 1;
  display: grid;
  place-items: center;
  padding: 60px 0;
}

.t-error-box {
  text-align: center;
  max-width: 36em;
}

.t-error-code {
  font-size: var(--fs-error-code);
  font-weight: var(--fw-700);
  line-height: 1;
  color: var(--color-wine);
  font-family: var(--font-display);
}

.t-error-title {
  color: var(--color-text);
}

.t-error-msg {
  color: var(--color-text-muted);
  margin-bottom: 1.6em;
}

.t-error-footer {
  padding: 28px 0;
  margin-top: auto;
}

/* ---- Offline page ---- */
.t-offline {
  display: grid;
  place-items: center;
  min-height: 100vh;
  background: var(--color-tint-cool);
}

.t-offline-box {
  background: var(--color-surface);
  border-radius: var(--br-large);
  box-shadow: var(--shadow-card);
  padding: 48px;
  max-width: 440px;
  width: calc(100% - 32px);
  text-align: center;
}

.t-offline-logo {
  height: 42px;
  width: auto;
  margin: 0 auto 24px;
}

.t-offline-msg {
  color: var(--color-text-muted);
  margin-bottom: 1.4em;
}

.t-offline-form {
  text-align: left;
}

.t-field {
  margin-bottom: 16px;
}

.t-field label {
  display: block;
  font-weight: var(--fw-600);
  margin-bottom: 6px;
  font-size: var(--fs-300);
}

.t-field input {
  width: 100%;
  padding: 0.7em 0.9em;
  border: 1px solid var(--color-border);
  border-radius: var(--br-std);
  font-family: var(--font-body);
  font-size: var(--fs-400);
}

.t-field input:focus {
  outline: 2px solid var(--color-wine);
  border-color: var(--color-wine);
}

/* ---- Joomla system message ---- */
.t-main .alert, .t-main-home .alert {
  border-left: 4px solid var(--color-wine);
  background: var(--color-wine-faint);
  padding: 14px 18px;
  border-radius: var(--br-std);
  margin-bottom: 1.2em;
}

/* State variants. The unstyled .alert above stays brand wine; these four
   carry the Bootstrap palette. Each sets the faint fill and the saturated
   accent from its own pair — see the Alerts block in section 1. */
.alert-success {
  border-left-color: var(--color-success-border) !important;
  background: var(--color-success) !important;
}

.alert-info {
  border-left-color: var(--color-info-border) !important;
  background: var(--color-info) !important;
}

.alert-warning {
  border-left-color: var(--color-warning-border) !important;
  background: var(--color-warning) !important;
}

.alert-danger, .alert-error {
  border-left-color: var(--color-danger-border) !important;
  background: var(--color-danger) !important;
}

/* Accessibility: visible focus states, 2px wine outline, 2px offset. */
a:focus-visible,
button:focus-visible,
.t-btn:focus-visible,
input:focus-visible {
  outline: 2px solid var(--color-wine);
  outline-offset: 2px;
}

/* Screen-reader-only text. Joomla core markup relies on this exact class
   name existing (mod_menu's Bootstrap5 "deeper parent" items emit
   <span class="visually-hidden">More about: X</span> for a dropdown toggle
   that already has its own visible label) — it assumes the site loads
   Bootstrap's utility CSS, which this template deliberately doesn't. Without
   this rule that "invisible" text renders as plain visible text. This is
   the standard hide-visually-but-not-from-assistive-tech pattern (same one
   Bootstrap's own .visually-hidden and WordPress's .screen-reader-text use)
   — not display:none, which screen readers also skip. */
/* .article-info-term is Joomla's <dt> for the article meta list — it reads
   "Details" and is the only thing naming that block to a screen reader, so it
   is hidden here rather than with display:none. */
.visually-hidden,
.sr-only,
.article-info-term {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* ---- Joomla core pagination footer ----
   Same story as .mod-menu__toggle-sub / .visually-hidden above: Joomla's
   Pagination class (getListFooter()) emits Bootstrap5-flavoured markup —
   .pagination / .page-item / .page-link, plus icon-angle-* glyph classes
   expecting an icon font — assuming the site loads Bootstrap and an icon
   font. This template loads neither, which is why this rendered as a bare
   bullet list with empty first/prev/next/last controls. This is core
   Joomla's OWN markup, reused by any extension that calls the core
   Pagination class instead of rolling its own UI (which is most of them)
   — hence it shows up on core views and third-party extensions alike.

   The outer wrapper div and the actual control list share the class
   "pagination" (Joomla nests <div class="pagination">...<div
   class="pagination"><nav><ul class="pagination">...). Targeting div vs ul
   separately avoids the two fighting each other. */
div.pagination {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 20px;
  margin-top: 24px;
  padding-top: 24px;
  border-top: 1px solid var(--color-border);
  font-size: var(--fs-400);
  color: var(--color-text-muted);
}
.pagination .form-select {
  font-family: var(--font-body);
  font-size: var(--fs-400); /* never below 16px on a form control — iOS zooms on focus otherwise */
  padding: 0.4em 0.6em;
  border: 1px solid var(--color-border);
  border-radius: var(--br-std);
  background: var(--color-surface);
  color: var(--color-text);
}
.pagination .counter {
  margin-left: auto;
}
ul.pagination {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 6px;
  list-style: none;
  margin: 0;
  width: 100%;
}
.page-item {
  margin: 0;
}
.page-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  padding: 0 12px;
  border: 1px solid var(--color-border);
  border-radius: var(--br-std);
  background: var(--color-surface);
  color: var(--color-text);
  font-family: var(--font-menu);
  font-size: var(--fs-375);
  transition: background var(--transition), color var(--transition), border-color var(--transition);
}
a.page-link:hover {
  background: var(--color-tint-cool);
  border-color: var(--color-wine);
  color: var(--color-wine);
}
.page-item.active .page-link {
  background: var(--color-wine);
  border-color: var(--color-wine);
  color: var(--color-surface);
}
.page-item.disabled .page-link {
  color: var(--color-border);
  cursor: default;
}
/* Icon-font glyphs Joomla expects for first/prev/next/last aren't available
   — no icon font is loaded — so give the four pagination-arrow icon classes
   a plain-text fallback instead of rendering empty. aria-hidden is already
   on these spans in Joomla's markup, and the parent link/span already
   carries a proper aria-label ("Go to next page" etc.), so this is purely
   visual — nothing is announced twice to a screen reader. */
.icon-angle-double-left::before {
  content: "\00AB"; /* « */
}
.icon-angle-left::before {
  content: "\2039"; /* ‹ */
}
.icon-angle-right::before {
  content: "\203A"; /* › */
}
.icon-angle-double-right::before {
  content: "\00BB"; /* » */
}

/* Print */
@media print {
  .t-topbar, .t-header, .t-footer, .t-nav-toggle {
    display: none !important;
  }
}

/* ==================================================================
   9. STACKING / Z-INDEX  (must stay LAST)
   ================================================================== */

/* =============================================================
   MMPark 2026 — stacking / layering rules

   WHY THIS FILE EXISTS
   The site header is `position: sticky` and must stay on top of, and
   clickable above, everything that scrolls under it. Module content is
   written by other people — third-party extensions, page builders and
   HTML pasted into a Custom module routinely carry `z-index: 999` or
   `9999`. Raising the header's own z-index alone is an arms race you
   eventually lose.

   THE FIX (two layers of defence)
   1. The header sits at var(--z-header) = 1000, well above ordinary
   module CSS (see section 3 / section 1).
   2. Every region that renders module or component output gets
   `isolation: isolate`. That makes the region its own stacking
   context, so a `z-index: 99999` inside a module only competes with
   its siblings *inside that region* — the whole region still paints
   below the header. This is what makes the fix permanent.

   ESCAPE HATCH
   If a module legitimately needs to cover the whole viewport (a
   lightbox, cookie bar, off-canvas panel), give any element inside it
   the class `t-overlay-escape`. Its region stops isolating, and the
   module's own z-index applies again — use var(--z-overlay) (1100) so
   it lands above the header rather than under it.
   =============================================================
   */
/* Regions that render module / component output.
   Keep this list in sync with the regions in index.php.
   */
.t-topbar,
.t-hero,
.t-feature,
.t-subfeature,
.t-cta,
.t-page-banner,
.t-layout,
.t-sidebar,
.t-main,
.t-main-home,
.t-footer {
  isolation: isolate;
}

/* Opt out per region when a module inside it must overlay the page. */
:is(.t-topbar,
.t-hero,
.t-feature,
.t-subfeature,
.t-cta,
.t-page-banner,
.t-layout,
.t-sidebar,
.t-main,
.t-main-home,
.t-footer):has(.t-overlay-escape) {
  isolation: auto;
}

/* Helper for content that has opted out: put it above the header on purpose. */
.t-overlay-escape {
  z-index: var(--z-overlay);
}
