/* ============================================================
   wcag-s0075-zen-garden.css
   WCAG 2.1 Level AA override for the S0075-Zen-Garden Kentico template
   (TemplateId 1387).

   Selectors verified against the live base CSS pulled from
   https://loneoakapartments.com on 2026-05-07.

   This template does NOT use a template-namespace prefix — base
   selectors are global. Bootstrap is loaded separately and
   suppresses outlines on .navbar-toggle / .dropdown-toggle as
   usual.

   Specificity strategy:
   Every selector is prefixed with `body #form` (ASP.NET WebForms
   page-level form ID) to lift specificity above widget CSS that
   loads after our override.
   ============================================================ */


/* ------------------------------------------------------------
   WCAG 2.4.7 Focus Visible
   The Zen-Garden CSS itself has no outline-suppression rules,
   but Bootstrap removes outlines on .navbar-toggle, .dropdown-
   toggle, .form-control:focus, etc. Restore visible focus rings
   via :focus-visible.
   .footer-widget footer a:focus { outline:none } also lives in
   the shared footer.min.css — covered here too.
   ------------------------------------------------------------ */
body #form .navbar-toggle:focus-visible,
body #form .dropdown-toggle:focus-visible,
body #form .btn:focus-visible,
body #form .form-control:focus-visible,
body #form input.form-control:focus-visible,
body #form select.form-control:focus-visible,
body #form textarea.form-control:focus-visible,
body #form a:focus-visible,
body #form button:focus-visible,
body #form input:focus-visible,
body #form select:focus-visible,
body #form textarea:focus-visible,
body #form [tabindex]:focus-visible,
body #form [role="button"]:focus-visible,
body #form .footer-widget footer a:focus-visible {
  /* Webkit-style two-ring halo: blue inner ring + white outer ring
     gives focus visibility on both light AND dark backgrounds.
     The `outline` declaration is intentionally omitted — outline
     paints on top of box-shadow and would cover the white ring. */
  outline-offset: 2px;
  box-shadow: 0 0 0 2px #005fcc, 0 0 0 3px #fff;
}

/* WCAG 2.4.13 AAA (Focus Appearance) — PME-507688 rework (Will Sharp,
   manual scan 2026-08-24): the shared blue+white ring above doesn't
   reliably clear 3:1 against every property's footer background (footers
   commonly run darker/branded compared to the form fields and buttons
   this shared rule also covers). Override just the footer link ring with
   a white+black double ring — one leg always clears 3:1 against any
   single backdrop, the same treatment already used for the Floor Plans V4
   focus rings. Scoped narrowly to `.footer-widget footer a` so the
   inputs/selects/tabindex/role=button elements above, which were not
   flagged, keep their existing ring. */
body #form .footer-widget footer a:focus-visible {
  box-shadow: 0 0 0 2px #fff, 0 0 0 4px #000 !important;
}


/* ------------------------------------------------------------
   WCAG 2.4.11 Focus Not Obscured
   Base: #topHeaderBar { position:fixed; top:0; padding:15px 0;
                         font-size:18px; ... } ≈ 50px tall.
   Reserve scroll space below the sticky bar.
   ------------------------------------------------------------ */
html {
  scroll-padding-top: 80px;
}

body #form :focus-visible {
  scroll-margin-top: 80px;
}


/* ------------------------------------------------------------
   WCAG 1.4.11 Non-text Contrast (form controls)
   Base: input.form-control, select.form-control, textarea.form-control
         { border:none; border-bottom: solid 1px #c1c1c1; ... }
   #c1c1c1 on white ≈ 1.85:1 — fails 3:1.
   ------------------------------------------------------------ */
body #form input.form-control,
body #form select.form-control,
body #form textarea.form-control {
  border-bottom-color: #595959;
}

body #form input::placeholder,
body #form textarea::placeholder {
  color: #595959;
  opacity: 1;
}


/* ------------------------------------------------------------
   WCAG 1.4.1 Use of Color (inline links)
   Base inline content links:
     .mainContent a, .contentPrivacy a, .content404 a,
     .thankyoublurb a, .readmoreWrapper a
       { color:#799c0b; font-size:24px; }
   No underline → fails 1.4.1 (color-only distinction).
   We add underline ONLY (no color change). Reasons:
     1. The 24px font-size qualifies as WCAG large text — only
        3:1 contrast required. #799c0b on white ≈ 3.5:1 PASSES
        large-text contrast, so 1.4.3 is not technically failed.
     2. Brand colors vary per property. A blanket color override
        in this template-level injection would clash with any
        property whose brand replaces the default green.
   If Silktide flags 1.4.3 anyway on a specific property, fix it
   at that property's site-CSS level, not here.
   ------------------------------------------------------------ */
body #form .mainContent a,
body #form .contentPrivacy a,
body #form .content404 a,
body #form .thankyoublurb a,
body #form .readmoreWrapper a {
  text-decoration: underline;
  text-underline-offset: 2px;
}


/* ------------------------------------------------------------
   TFS 2985969 — WCAG 1.4.1, interaction states
   The rest-state underline above is correct and wins (the base
   content-link rule at RPcssMaster_S0075-Zen-Garden.css:1101 sets
   only color + font-size). But the base ALSO carries a global,
   unscoped !important strip:
     RPcssMaster_S0075-Zen-Garden.css:134-136
       a:focus, a:hover, a:active { text-decoration: none!important; }
   Specificity (0,1,1) + !important, so it beats our plain
   rest-state rule the instant the link is hovered or keyboard-
   focused, and the link is colour-only again during interaction.
   Confirmed live on cctancenter.com/Neighborhood.aspx: all 10 POI
   prose links compute `underline` at rest and `none` on
   hover/focus/active. Reproduces on every S0075-Zen-Garden site
   by construction, because the base rule is global.

   Nesting note (corrected TFS 2985969): the containment is
   `.page_neighborhood > #neighborhoodTopContent.mainContent`, i.e.
   `.mainContent` is INSIDE `.page_neighborhood` — not the reverse,
   as an earlier draft of the plan stated. Measured live: 10 anchors
   under `.mainContent`, 12 under `.page_neighborhood`. Scoping to
   `.mainContent` is still correct and is what is used below; the
   two extra `.page_neighborhood` anchors are `a#getDirections` and
   `a#scroll-down`, which sit OUTSIDE `.mainContent` and are
   therefore correctly left un-underlined without needing an
   explicit opt-out.

   Counter it with an !important scoped to the SAME five content
   containers as the rest-state rule — no new containers are
   introduced here, this is purely a state fix. Each selector
   (e.g. `body #form .mainContent a:hover` = (1,2,2))
   out-specifies the base `a:hover` (0,1,1), so among competing
   !important declarations ours wins. Deliberately NOT a bare
   `a:hover` counter: the nav/header/footer/button opt-out block
   below is plain `text-decoration:none` with no !important, so a
   global counter would defeat it and underline the whole chrome.
   Those containers are safe by construction anyway —
   S0075-Zen-Garden-Master_1.ascx renders `<header>` and
   `<footer>` as siblings outside `<main id="main-content">`,
   which is where `.mainContent` lives.
   ------------------------------------------------------------ */
body #form .mainContent a:hover, body #form .mainContent a:focus, body #form .mainContent a:active,
body #form .contentPrivacy a:hover, body #form .contentPrivacy a:focus, body #form .contentPrivacy a:active,
body #form .content404 a:hover, body #form .content404 a:focus, body #form .content404 a:active,
body #form .thankyoublurb a:hover, body #form .thankyoublurb a:focus, body #form .thankyoublurb a:active,
body #form .readmoreWrapper a:hover, body #form .readmoreWrapper a:focus, body #form .readmoreWrapper a:active {
  text-decoration: underline !important;
  text-underline-offset: 2px;
}

/* Companion opt-out: keep button/utility-shaped links inside the
   content zones un-underlined on interaction. Needs the same
   !important to compete with the rule directly above, since the
   plain opt-out block further down cannot. Mirrors that block's
   shape list, re-scoped per content container. */
body #form .mainContent a.btn:hover, body #form .mainContent a.btn:focus, body #form .mainContent a.btn:active,
body #form .mainContent a.button:hover, body #form .mainContent a.button:focus, body #form .mainContent a.button:active,
body #form .mainContent a.more-link:hover, body #form .mainContent a.more-link:focus, body #form .mainContent a.more-link:active,
body #form .mainContent a.less-link:hover, body #form .mainContent a.less-link:focus, body #form .mainContent a.less-link:active,
body #form .mainContent a.cta-header-btn:hover, body #form .mainContent a.cta-header-btn:focus, body #form .mainContent a.cta-header-btn:active,
body #form .mainContent a.header-CTA-button:hover, body #form .mainContent a.header-CTA-button:focus, body #form .mainContent a.header-CTA-button:active,
body #form .mainContent a.footer-CTA-Button:hover, body #form .mainContent a.footer-CTA-Button:focus, body #form .mainContent a.footer-CTA-Button:active,
body #form .readmoreWrapper a.more-link:hover, body #form .readmoreWrapper a.more-link:focus, body #form .readmoreWrapper a.more-link:active,
body #form .readmoreWrapper a.less-link:hover, body #form .readmoreWrapper a.less-link:focus, body #form .readmoreWrapper a.less-link:active,
body #form .thankyoublurb a.btn:hover, body #form .thankyoublurb a.btn:focus, body #form .thankyoublurb a.btn:active,
body #form .thankyoublurb a.button:hover, body #form .thankyoublurb a.button:focus, body #form .thankyoublurb a.button:active,
body #form .content404 a.btn:hover, body #form .content404 a.btn:focus, body #form .content404 a.btn:active,
body #form .content404 a.button:hover, body #form .content404 a.button:focus, body #form .content404 a.button:active {
  text-decoration: none !important;
}


/* ------------------------------------------------------------
   WCAG 1.4.3 (footer disclosure opacity)
   Shared footer.min.css: .footer-widget footer .footer-disclosure
     { opacity:.6 }  — bump so 4.5:1 passes comfortably.
   ------------------------------------------------------------ */
body #form .footer-widget footer .footer-disclosure {
  opacity: 0.85;
}


/* ------------------------------------------------------------
   Footer link / nav / button opt-outs
   These are distinguishable by container or shape, so they do
   NOT need underline.
   ------------------------------------------------------------ */
body #form .btn,
body #form .button,
body #form header a,
body #form nav a,
body #form .navbar a,
body #form .cta-header-btn,
body #form .header-CTA-button,
body #form .footer-CTA-Button,
body #form .footer-widget footer a,
body #form a.more-link,
body #form a.less-link {
  text-decoration: none;
}

/* ------------------------------------------------------------
   TFS 2985969 — Google Maps bleed opt-out (measured live on sibling templates)
   The Maps JS API injects its own colour-only anchors ("Terms",
   "Report a map error", "Open this area in Google Maps") into
   `.gm-style` INSIDE our content containers, so a container-scoped
   underline rule reaches them. Confirmed live on Elan /About.aspx,
   themckenzieapts.com home, and both Balcony homepages (see
   sibling override files). Not independently re-verified on this
   Zen-Garden template — added defensively, since the existing
   `.mainContent` underline rule would otherwise reach these
   third-party map anchors too. These are third-party map chrome,
   not site prose — never underline them.

   `!important` and the `body #form` prefix are both required so
   this beats the content-container counters in this file family,
   including the `underline !important` interaction-state counters
   on Jackson-Square and Zen-Garden. States are listed explicitly
   because those counters are state-scoped.
   ------------------------------------------------------------ */
body #form .gm-style a,
body #form .gm-style a:hover,
body #form .gm-style a:focus,
body #form .gm-style a:active,
body #form .google-map-container a,
body #form .google-map-container a:hover,
body #form .google-map-container a:focus,
body #form .google-map-container a:active,
body #form .gm-style-cc a,
body #form a[href*="maps.google.com/maps?ll="],
body #form a[href^="https://www.google.com/maps/@"] {
  text-decoration: none !important;
}

/* ------------------------------------------------------------
   TFS 2905632 - WCAG 1.4.1 Use of Color (selected state)
   The Floor Plans bed/bath filter and view-switch tabs mark the
   selected item with a brand-color background + #fff text only
   (base rule sets border-color:transparent, no weight/underline).
   Add an underline so the selection is perceivable in greyscale
   and for color-blind users. `body #form` prefix keeps specificity
   above the rpWebpartCss_Floorplan* base bundles. No color changed.
   ------------------------------------------------------------ */
body #form .fp2-bed-bath ul li.active > a,
body #form .FloorPlansV2 .fp-switch-tabs .btn-default.active,
body #form .FloorPlansV3 .fp-switch-tabs .btn-default.active {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ------------------------------------------------------------
   TFS 2905631 - WCAG 1.4.11 Non-text Contrast (form controls)
   The full-width Neighborhood search input has no perceivable
   resting border: base CSS (rpWebpartCss_NeighborhoodFullWidth.css)
   sets `border:none; background:none; color:#fff` on a dark
   rgba(0,0,0,.83) search overlay. Add a light 1px boundary at
   #cfcfcf (~9.6:1 on that dark surface; matches the widget's
   existing placeholder color). All 21 priority templates use this
   dark default - none override it to a light surface.
   ------------------------------------------------------------ */
body #form .neighborhood-widget .neighborhood-widget__search .form-group .form-control {
  border: 1px solid #cfcfcf;
}

/* WCAG 2.2 AA 2.5.8 Target Size (Pointer) — real fix (native checkbox can't be padded;
   appearance:none + explicit 24px sizing; :checked::after re-draws the check so consent UX is preserved) */
body .contact-mobile-form input[type="checkbox"],
#contactusPrivacy input[type="checkbox"],
#privacyDiv input[type="checkbox"],
#contactUsV1Privacy input[type="checkbox"] {
    -webkit-appearance: none;
    appearance: none;
    width: 24px; height: 24px;
    min-width: 24px; min-height: 24px;
    margin: 4px; padding: 0;
    border: 2px solid currentColor; border-radius: 3px;
    background: #fff; cursor: pointer; position: relative;
    vertical-align: middle; flex: 0 0 auto;
}
body .contact-mobile-form input[type="checkbox"]:checked::after,
#contactusPrivacy input[type="checkbox"]:checked::after,
#privacyDiv input[type="checkbox"]:checked::after,
#contactUsV1Privacy input[type="checkbox"]:checked::after {
    content: ""; position: absolute; left: 7px; top: 3px;
    width: 6px; height: 11px;
    border: solid #1a1a1a; border-width: 0 2px 2px 0;
    transform: rotate(45deg);
}
body .contact-mobile-form input[type="checkbox"]:focus-visible,
#contactusPrivacy input[type="checkbox"]:focus-visible,
#privacyDiv input[type="checkbox"]:focus-visible,
#contactUsV1Privacy input[type="checkbox"]:focus-visible {
    outline: 2px solid; outline-offset: 2px;
}

/* TFS 2987209 — WCAG 2.2 AAA 2.5.5 Target Size (Enhanced): expand the consent
   checkbox's pointer hit-area to 44×44 without changing anything visually
   (Option B, plan §4.4/§0.5 J — live-prototyped pixel-identical to today).
   The painted box stays 24×24 (position:relative already set above); this
   adds a transparent ::before centred over the box that only widens the
   clickable/tappable region. Do not touch :checked::after or :focus-visible
   above, and do not remove min-width/min-height:24px on the box rule above —
   on ContactUsFloating templates that min-width is the only reason the box
   is 24px wide at all (rpWebpartCss_ContactUsFloating.css sets width:auto
   !important, §0.4 D). Uses symmetric inset offsets, not
   left/top:50%+transform: live click-testing found percentage-based
   centering lands ~1-2px off-centre (asymmetric vs. the border-box),
   which stole clicks from an adjacent control (Submit button /
   privacy-policy link) on 3 of 16 templates — insets centre reliably
   regardless of border width. */
body .contact-mobile-form input[type="checkbox"]::before,
#contactusPrivacy input[type="checkbox"]::before,
#privacyDiv input[type="checkbox"]::before,
#contactUsV1Privacy input[type="checkbox"]::before {
    content: "";
    position: absolute;
    top: -12px; left: -12px; right: -12px; bottom: -12px;
}

/* TFS 2987209 — WCAG 2.2 AAA 2.5.5 Target Size (Enhanced): mobile-nav
   hamburger. Live-measured: `button#hamburgerMenuButton` is 40.2×41 at
   ≤767px (fails) but already 67.2×62 at ≥768px (passes) — the box is
   driven entirely by the glyph's own font-size (40px→60px), not by any
   width/height/padding, so this fix is gated to Bootstrap's own mobile
   breakpoint (confirmed live at the exact 767/768 boundary) to avoid
   touching the passing desktop state. A first candidate grew the box
   directly via min-width/min-height:44px — live-tested clean, but shifted
   the glyph ~2px down-left (button is right-anchored `position:absolute`,
   so growth is asymmetric). Switched to the same transparent ::before
   hit-area overlay already used for the consent checkbox above (button
   already `position:absolute`, so it anchors correctly): confirmed live
   0-pixel diff — glyph does not move at all — while the enlarged
   ~46.2×47 hit area clears 44×44 and the ≥768px state is confirmed
   unaffected (media-gated). `body #form` prefix per this file's
   specificity strategy (see header comment). */
@media (max-width: 767px) {
  body #form button#hamburgerMenuButton::before {
    content: "";
    position: absolute;
    top: -3px; left: -3px; right: -3px; bottom: -3px;
  }
}

/* ------------------------------------------------------------
   TFS 2982346 - WCAG 2.2 AA 2.5.8 Target Size (Pointer): footer links

   Live-measured on zengarden011226.sat-ws.realpage.com/Contact.aspx at 1280x900 (headless Chrome,
   border-box heights): 11 of 13 footer targets render under 24px tall.

     footer ul#CMSListMenu2 li a     12px tall, display:block, line-height 12px,
                                     9 links stacked at a 33.7px pitch
     footer ul#mobileMenuElem
       li.footerLink a               20px tall, display:block, ~60px pitch
     footer a#link-rp                16px tall, display:INLINE (RealPage mark)

   `line-height` alone does not fix any of these. On an inline element it does
   not change the border-box height at all; on the block ones the base already
   sets line-height equal to the text height. Only min-height plus real padding
   grows the hit area.

   No negative-margin cancel is used on CMSListMenu2, unlike Tableau. Measured
   both ways on the live page: padding-only and padding+cancel produce the
   IDENTICAL result here (11 -> 3 remaining, footer height +0.0px, document
   height +0px). The links sit in a floated `.menu.clearfix` container whose
   height is driven by its float context, not by the anchors' own boxes, so the
   padding does not push the footer taller and there is nothing to cancel.
   Padding-only is kept because a negative margin that buys nothing is pure
   overlap risk if this list ever wraps.


   SCOPE PREFIX: scoped on the `footer` element, NOT `.footer-widget footer`.
   This is one of the three templates in this ticket where that matters -
   this template nests `footer > .footer-widget` (reversed), so the Tableau/Ascension
   prefix selects NOTHING here. Verified against the live SAT DOM.
   ------------------------------------------------------------ */
footer ul#CMSListMenu2 li a.CMSListMenuLink,
footer ul#CMSListMenu2 li a.CMSListMenuLinkHighlighted {
    min-height: 24px;
    padding: 6px 0;
}

footer ul#mobileMenuElem li.footerLink a {
    min-height: 24px;
    padding: 2px 0;
}

/* Inline element - inline-block is what makes min-height apply at all.
   Deliberately NO `svg { height: 20px }` guard here, unlike Tableau and the
   other templates in this ticket. Zen-Garden's RealPage mark is a 76px-tall
   SVG overflowing a 16px inline anchor; pinning it to 20px shrank the visible
   logo and took 57px off the document height (measured live). inline-block
   plus min-height does NOT stretch it - the SVG stays 76px and the document
   height is unchanged at +0px. Do not add the guard back without re-measuring.
   ------------------------------------------------------------ */
footer a#link-rp {
    display: inline-block;
    min-height: 24px;
}

/* ------------------------------------------------------------
   TFS 2987209 — WCAG 2.2 AAA 2.5.5 Target Size (Enhanced), 44x44
   S0075-Zen-Garden. Measured on LIVE PRODUCTION
   (ballardonthepark.com), not SAT: this template's SAT host is on
   CDN build 2501476, which 301-redirect-loops on its assets while
   document.styleSheets still lists the override as loaded. SAT
   geometry for this template is a phantom and was discarded.

   *** #footerMenu — settled, do not build on it ***
   Confirmed DEAD across 6 production domains, upholding the earlier
   401-domain finding. A SAT pass that reported "11 live links" was
   a near-miss on the `.footer-menu` CLASS (one character apart),
   which wraps the real element `#footerNav7` inside the shared
   footer widget. Nothing here targets #footerMenu. If the footer
   nav ever needs work, target `.footer-menu .footer-nav a` or
   `[id^="footerNav"]` — the trailing 7 is a footer-VARIANT suffix
   and is not stable across templates.
   ------------------------------------------------------------ */

/* Nav links — gated to <=767px ON PURPOSE. They already pass at
   768px (63px) and 1440px (60-72px), and applying this
   unconditionally caused a SEVERE WIDTH COLLAPSE in the wider
   states: these are display:block full-width rows, so anything that
   makes them shrink-to-fit cost up to ~1177px of width on one link.
   That is the same trap that took a footer link from 199.7px to
   47.5px earlier on this ticket.

   Note there is deliberately NO display change even inside the
   media query: the anchors are already display:block, so min-height
   applies directly. Leaving display alone is what keeps the
   width-collapse risk at zero. */
@media (max-width: 767px) {
    body #form #headerNav #menuElem li a,
    body #form #headerNav .menuElem li a {
        box-sizing: border-box;
        min-height: 44px;
    }

    /* Growing 11 nav rows at 375 makes the drawer taller than the
       viewport, which pushed "Apply Now" below the fold and out of
       reach — a NEW problem introduced by the height fix, so it is
       fixed here rather than shipped as a regression. Making the
       drawer scroll keeps every item reachable without shrinking
       the targets back down (reducing line-height/gap to compensate
       was the alternative, but that trades one 2.5.5 problem for
       another). */
    body #form #headerNav {
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }

    /* FIX (prod completeness sweep, 2026-08-20): once the drawer-scroll
       fix above deploys, "Apply Now" (the last drawer item) sits behind
       the OneTrust cookie-consent banner on a first visit —
       `overflow-y:auto` above does not help, because the banner is a
       SEPARATE fixed-position overlay outside the drawer entirely, not
       something the drawer's own scroll can move out from under.
       Deliberately NOT touching OneTrust's own CSS/z-index — it is
       third-party consent-management chrome with its own compliance
       requirements, and this ticket does not own it. Instead, give the
       drawer's own scrollable content generous bottom clearance so a
       natural scroll-to-end leaves "Apply Now" well clear of a typical
       bottom consent-banner footprint, without reaching into or
       reordering the banner itself. Dismissible on first interaction, so
       this only matters for that first-visit window.

       CORRECTED 2026-08-20 (independent live re-verification of this
       commit itself, on undeployed CSS injected client-side): 120px was
       short on two of the three live domains -- the real OneTrust banner
       measures 170.9px tall at 375x667, not the ~120px this value
       assumed, so on the two domains whose drawers didn't have enough
       natural slack to absorb the shortfall, Apply Now stayed partially
       or fully behind the banner even after this rule. Raised to 200px
       to clear the measured 170.9px banner with real margin, rather than
       landing at the same zero-cushion pattern this ticket has corrected
       elsewhere (Ascension/Aurora/Bliss checkbox insets). Also found:
       the occlusion this rule addresses is pre-existing on two of three
       domains regardless of the drawer-scroll fix above -- their drawer
       rows are already >=44px natively, so that fix changes nothing for
       them either way; this padding fix is what actually matters there. */
    body #form #headerNav {
        padding-bottom: 200px;
    }
}

/* Phone links — three instances on this template: the top header
   bar, the template-native footer property-info block, and the
   shared footer-7 widget instance. display:inline-block gives each
   a real box so min-height can apply; min-height is a no-op on any
   instance already at 44px. As on Aurora, the shared footer-widget
   instance is fixed per-template here rather than in the shared
   footer trio — see the fleet-wide follow-up note. */
body #form .topHeaderBarElement a.seo-number,
body #form #propertyInfoAddress a.seo-number,
body #form .footer-phone-content a.seo-number {
    box-sizing: border-box;
    display: inline-block;
    min-height: 44px;
}

/* ------------------------------------------------------------
   WCAG 2.2 AA 2.5.8 Target Size (Minimum) — TFS 3040687
   Shared-component block. IDENTICAL BYTES in every wcag-*.css —
   this issue spans 23 templates, so nothing here is template-tuned.

   Source of truth: Silktide check `ensure-minimum-target-size`
   pulled from PROD 2026-08-24 — 182 sites / 1,034 flagged elements
   (test/3040687-target-size/silktide-prod/raw-flagged.json). Every
   rule cites the bucket and the geometry Silktide reported, and each
   was measured in headless Chrome before being included.

   Specificity: `body` prefix + !important rather than this template's
   own namespace prefix. The namespace would narrow the match and miss
   elements rendered outside the template wrapper (the decoy anchor is
   one of those).

   *** NEVER ADD `display` TO A TEXT-LINK RULE HERE. ***
   MEASURED, then SEEN in a screenshot: `display:inline-block` on
   a[href*="greystar.com/privacy"] made that link drop ~9px BELOW its row-mates
   ("DISCLOSURES & LICENSES", "DMCA AGENT") in the elan08022023 footer — a
   visible zig-zag, because inline-block turns the link into an atomic box that
   carries its own padding into the line layout. Vertical padding on a plain
   INLINE link grows the hit box (what the scanner measures) while the glyphs
   stay exactly on the baseline. Padding alone is sufficient; `display` is not
   needed anywhere in this block except the decoy's `display:none`.

   *** 24.0px IS NOT ENOUGH — read before editing any value below. ***
   TFS 2955118 established empirically (see the Tableau and Ascension
   notes earlier in this file) that a target landing on EXACTLY 24.0px
   is still flagged by the scanner: ".CMSSiteMapLink at 32px passes,
   footer links at 24.0 do not." So every rule here OVERSHOOTS:
     - text links  -> vertical padding, which composes with any existing
                      padding instead of replacing it, and never caps the
                      box the way line-height does
     - icon/dots   -> 28px, not 24px
   Do NOT "tidy" these back to min-height:24px / line-height:24px. That
   reintroduces the 24.0 failure AND, because these rules carry
   !important, would override the working padding-based rules that some
   templates (e.g. Ascension) already ship.
   ------------------------------------------------------------ */

/* 1. Hidden decoy anchor — 85 rows / 29 sites, reported 54x22.
      <a href="#" tabindex="-1" aria-hidden="true" rel="nofollow"
         style="opacity:.01;position:absolute;z-index:-999">___</a>
      Not a real control. Its inline style carries no !important, so
      this wins and takes it out of hit-testing and the a11y tree. */
body a[aria-hidden="true"][tabindex="-1"][rel="nofollow"] {
    display: none !important;
}

/* 2. Site-map page links — 371 rows / 52 sites, the largest bucket.
      Reported ~71x19, stacked about one line-height apart.
      NOTE: a.CMSListMenuLink (5 rows) is deliberately EXCLUDED — that
      is the primary-nav class, and forcing line-height on it across 22
      templates risks every page's header for 5 rows. */
body a.CMSSiteMapLink {
    padding-top: 5px !important;
    padding-bottom: 5px !important;
}

/* 3. Social icon links — NOT handled here. 44 rows / 23 sites, flagged at
      11.4x24 / 17.2x24 (icon-font glyph on a `display:inline` anchor).

      MEASURED: every fleet-wide formulation broke something.
        - `display:inline-flex` + min-28  -> SHRANK compliant icons
                                             (balcony 44x44 -> 28x28, slate 33 -> 28)
        - `display:inline-block` + min-28 -> same shrink (the box comes from the
                                             parent's layout; any display override
                                             re-computes it)
        - `padding: 4px 8px` (no shrink)  -> the extra width WRAPS the icon row
                                             onto a second line: slateqanew
                                             UL.header-social 5 icons, vertical
                                             centre spread 0px -> 28.6px (visible
                                             zig-zag); emerald +8px, balcony +4px.

      The containers differ per template, so this needs a container-scoped rule,
      not a fleet-wide one. **TFS 2982346 owns social-icon target size** and has
      per-template branches for exactly this. Left to that ticket on purpose.
      Do not re-add a global `a.facebook`-style rule here. */

/* 4. Hero scroll-down affordance — 18 rows / 15 sites, reported 9x16. */
body a#scroll-down {
    padding: 6px 8px !important;
}

/* 5. Hamburger / nav toggle — reported 16x6. a.dropdown-toggle is already
      handled elsewhere in this file; only the button form is new.

      min-* rather than padding: a <button> is inline-block by default, so
      min-width/min-height apply and can only ever RAISE a dimension. An
      earlier `padding: 10px` shorthand REPLACED the button's own padding and
      grew emerald10262023's header button from 90.5x44 to 110.5x47 — 20px
      wider for no benefit, since it was already compliant. Verified with
      min-*: elan08022023 menu-toggle stays 40x35 @375 and 55x45 @1440. */
body button.menu-toggle {
    min-width: 28px !important;
    min-height: 28px !important;
}

/* 6. Carousel dots and gallery pagination.
      padding + background-clip:content-box grows the HIT AREA while the
      painted dot keeps its original size, so the carousel looks the same.
      The padding is per-widget because the dots differ in size, and with
      box-sizing:border-box the content box (= the painted area) is
      28px - 2*padding. Get this wrong and the dot visibly SHRINKS.
        .owl-dot          measured  7x7  -> padding 10px leaves  8px painted
        flexslider dots   measured 14x14 -> padding  7px leaves 14px painted */
body button.owl-dot,
body .owl-dots button.owl-dot {
    box-sizing: border-box !important;
    min-width: 28px !important;
    min-height: 28px !important;
    padding: 10px !important;
    margin-left: 2px !important;
    margin-right: 2px !important;
    background-clip: content-box !important;
}
body .flex-control-nav a,
body .flex-control-paging a {
    box-sizing: border-box !important;
    min-width: 28px !important;
    min-height: 28px !important;
    padding: 7px !important;
    background-clip: content-box !important;
}
/* a.pagination-item is deliberately NOT handled here. MEASURED REGRESSION:
   on haute011326.sat-ws the gallery tiles are
   `a.fancybox3.gallery-item.pagination-item` at display:block, 469.5x449.5.
   Forcing `display:inline-block` collapsed them to 28px and shortened the page
   by 3,936px — it destroys the gallery grid. The flagged element was a
   380x2 collapsed inline on one site (17 rows, 1 site); that is not worth
   risking every gallery on the fleet. Route it to its own ticket with a
   container-scoped selector if it matters. */

/* 7. Header / footer phone links — NOT handled here. 6 rows / 5 sites,
      flagged at ~102x19.

      MEASURED ON PROD (181-site sweep, 2026-08-25): the rule
        a.footer-phone.seo-number, a.header-phone.seo-number
          { padding-top:5px; padding-bottom:5px }
      SHRANK the phone CTA on 30 live sites — e.g. affinityatkendrick.com,
      esprialiving.com, affinityathudson.com: a.btn.footer-phone.seo-number went
      137x38 -> 137x32, and apartmentsdavie.com 175x46.6 -> 175x40.6. On those
      templates the element is a styled button whose own padding is larger than
      5px, and `padding-top/bottom` REPLACES it rather than adding to it.

      6 flagged rows is not worth a visible shrink on 30 sites. `min-height`
      would be safe but is a no-op on the inline instances that are actually
      flagged, so it would buy nothing. Needs a per-template rule that knows
      whether the phone renders as inline text or as a button. */

/* 8. "Read More" expander — 26 rows. Measured on encorerise.com: 94.5x20,
      `display:inline`, no sibling controls in its row, so vertical padding is
      safe here and lifts it to 38px.

      REMOVED from this rule after measurement, do not re-add:
        a[href*="greystar.com/privacy"] (38 rows / 7 sites) — every instance
          measured is ALREADY compliant (mirabellahouston 95.3x44,
          capitalplaceatsouthwood 94.6x44 and 132x27, thegeorgianapts 41x28).
          Padding them gained nothing and BROKE the footer legal row: on
          elan08022023 the base CSS makes that link `display:inline-block` at
          44px alongside "Disclosures & Licenses" / "DMCA Agent"; +9px padding
          grew it to 62px and dropped its centre 9px BELOW its row-mates —
          visible zig-zag, confirmed in a screenshot.
        a[href*="onlineleasing.realpage.com"] (12 rows) — no instance measured
          under 24px, so there was no evidence it needed the rule, and it
          carries the same row-breaking risk.
      Both need a per-template, container-scoped rule if they are ever a real
      failure. A fleet-wide href selector cannot tell "already fine" from
      "too small". */
body a.more-link {
    padding-top: 9px !important;
    padding-bottom: 9px !important;
}

/* 9. In-prose content links — the last and largest remaining bucket
      (~191 rows), e.g. neighbourhood/POI links inside pasted body copy:
        a "Bert Fields Park"  109.7x18  parent p.MsoNormal  prose 425 chars

      These are arguably EXEMPT under 2.5.8's Inline exception, but
      Silktide flags them, so they are padded here to clear the check.

      4px, not more: the flagged links measure 17-22px tall, so +8px lands them
      at 25-30px — clear of 24 without enlarging the box further than needed.
      Measured on thegeorgianapts-dallas.com/Neighborhood.aspx: pad 4px gives
      minHeight 26.0; pad 7px gives 32.0 but widens the box-overlap between
      links on adjacent lines from 26px to 32px for no compliance gain.

      Vertical padding on an INLINE box grows the hit area (which is what
      Silktide measures) without pushing text lines apart. Measured on
      thegeorgianapts-dallas.com/Neighborhood.aspx, altalongwood.com and
      thearialiving.com/site-map.aspx: body scrollHeight delta 0 at
      1440px, but -20px to +27px at 375px, and scrollWidth delta 0 at
      every width. None of these links carry a background-color or border
      (measured: 0 of them), so the enlarged box is invisible. So: no horizontal overflow, small vertical movement
      on mobile — QA regression check §3a in the validation guide.

      Scope is deliberately narrow — p / td / span, classless links only.
      DO NOT broaden this to `a:not([class])`: measured on
      mirabellahouston.com that also pads already-compliant 44px nav and
      footer links up to 57px, inflates the footer logo 170px -> 184px,
      and SHRANK a 44px CTA to 30px. */
body p a:not([class]),
body td a:not([class]),
body span a:not([class]) {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
}
/* ---------- end WCAG 2.5.8 Target Size (TFS 3040687) ---------- */
