/* ============================================================
   wcag-s0065-tableau.css
   WCAG 2.1 Level AA override for the S0065-Tableau Kentico template
   (TemplateId 1344, DefaultCssFileName: RPcssMaster_S0065-Tableau).

   Selectors verified against the live base CSS pulled from
   livesommery.com (cross-fetched) on 2026-05-12.

   This template does NOT use a .template-* wrapper.
   Layout: .desktopMenu is a position:fixed LEFT sidebar
   (width:16.666667%) â does not obscure focus vertically.
   Only #mobile-nav-header (50px top bar) needs scroll-padding
   compensation, and only on mobile.
   ============================================================ */


/* ------------------------------------------------------------
   WCAG 2.4.7 Focus Visible
   Base AGGRESSIVELY suppresses focus rings globally:
     :focus { outline:-webkit-focus-ring-color auto 0 !important }
   The !important + width 0 means our override must use
   !important to win.
   ------------------------------------------------------------ */
:focus-visible,
.navbar-toggle:focus-visible,
.dropdown-toggle:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
.desktopMenu a:focus-visible,
#mobile-nav-header a:focus-visible,
.sp-left-arrow:focus-visible,
.sp-right-arrow:focus-visible,
.contact-us-enhanced .form-control:focus-visible,
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible,
.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 !important;
  box-shadow: 0 0 0 2px #005fcc, 0 0 0 3px #fff !important;
}

/* 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. */
.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: #mobile-nav-header { position:fixed; top:0; height:50px }
   on mobile. Desktop uses a fixed LEFT sidebar (no vertical
   obscuring). 60px scroll padding (50 + 10 buffer).
   ------------------------------------------------------------ */
html {
  scroll-padding-top: 60px;
}

:focus-visible {
  scroll-margin-top: 60px;
}


/* ------------------------------------------------------------
   WCAG 1.4.11 Non-text Contrast (UI components)
   Base failures:
     .sp-left-arrow, .sp-right-arrow { border-color:#a9a9a9 !important }
     ... { border:solid 1px #a9a9a9 } (line 2086)
   #a9a9a9 on white â 2.83:1 â fails 3:1 minimum.
   ------------------------------------------------------------ */
.sp-left-arrow,
.sp-right-arrow {
  border-color: #595959 !important;
}

body #contactUsEnhancedContainer .form-control {
  border-bottom: 1px solid #595959 !important;
}


/* ------------------------------------------------------------
   WCAG 1.4.3 Contrast Minimum (text)
   Base failures:
     #7e7e7e in 8+ rules â 4.4:1 â fails 4.5:1 by a hair.
     Shared footer-disclosure opacity 0.6 â 0.85.
   ------------------------------------------------------------ */
.desktopMenu a,
.FloorPlansV3 .specification,
.FloorPlansV2 .specification {
  color: #595959;
}

.footer-widget footer .footer-disclosure {
  opacity: 0.85;
}


/* ------------------------------------------------------------
   WCAG 1.4.1 Use of Color (inline links)
   ------------------------------------------------------------ */
/* Scope: content containers only. Bare `p a` / `li a` / `dd a` selectors were dropped (same Balcony/Aurora/Bliss/Jackson-Square bleed bug — they would underline footer nav, header items, sidebar lists). */
.main-content-text a,
.inner-page-main a,
.main-content-wrapper a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

a.btn,
a.button,
.btn,
.btn-primary,
.desktopMenu a,
#mobile-nav-header a,
.cta-header-btn,
.header-CTA-button,
.footer-CTA-Button,
a.more-link,
a.less-link,
.footer-widget footer a {
  text-decoration: none;
}

/** ------------------------------------------------------------
   WCAG 2.2 AA 2.5.8 Target Size (Pointer)
   ------------------------------------------------------------ */
   /* Pre-dates 2982346 and is a non-fix for 2.5.8: line-height sizes the line box, not the
   anchor's hit area, and this targets the wrapping <div> rather than the <a>. Left in
   place to avoid an unrelated layout change; the anchor rules below are the real fix. */
.footer-widget footer.footer-10 .tableau-footer-mobile .footerRight #copyDateLinks-mobile {
    line-height: 24px;
}

/* TFS 2982346 - WCAG 2.5.8: nav social icons.
   Silktide flags these (google-search, twitter, flickr, pinterest) in
   #p_lt_zoneNav_rpWebpartSocialMedia_pnlSocialNetworks.social_media inside
   #nav-wrapper. Measured 25.1x19, display:inline - width passes, height fails
   the 24px size clause. .social_media also covers the mobile off-canvas set
   (39.1x24.5, already passing), so one rule is safe for both. */
.social_media .social-list li a {
    display: inline-block;
    min-height: 24px;
}

/* TFS 2982346 - WCAG 2.5.8: visible footer text links.
   Flagged: Sitemap (48.5x14px, tableau011326) and Residents (tableau01312023) -
   height fails the 24px size clause; width already clears it.

   Scoped to .tableau-footer / .tableau-footer-mobile rather than to a footer
   variant: Tableau renders footer-9 on some sites and footer-10 on others
   (Footer.ascx:776 / :1018) and BOTH wrap this same markup, so a variant-scoped
   rule would only fix half the fleet. Those two classes appear in no other footer
   block, so this stays correctly bounded.

   NOT `li a` - verified live on tableau011326 (footer-9) and tableau01312023
   (footer-10): the anchors' parents are <span class="residents">,
   <div id="copyDateLinks" class="sitemap"> and <div class="additional-footer-link">.
   There is no <li> in this footer, so an `li a` selector matches nothing. This is
   why the Ascension rule (.footer-links li a) could not simply be ported across.

   Both .tableau-footer and .tableau-footer-mobile carry a duplicate set - the mobile
   copies are why the site shows ~6 undersized links rather than 3.

   .privacy and .additional-footer-link are config-gated (Footer.ascx:802, :813) and
   did not render on either site measured; included so sites that do configure them
   are covered without a third pass.

   The icon links #link-hud / #link-ada / #link-rp are each an <a> wrapping an inline
   SVG (measured 31x14, display:inline) and ARE flagged - confirmed present on both
   tableau01312023 and tableau011326. An earlier revision of this rule excluded them
   on the basis that Silktide did not flag them; that was wrong. They carry ids rather
   than a shared class, so they need their own selectors. Note the ids are duplicated
   across the desktop and mobile footer blocks (a separate 4.1.1 concern, see #2985964)
   - CSS matches every occurrence regardless, so both copies are covered.

   The PMC logo is also a link where configured: Footer.ascx.cs:629 emits
   <div class="footer-logo footer-pmclogo"><a href="{link}"><img><span class="sr-only">
   inside div.pmc-logo. Measured 26.7x14. The anchor is emitted UNCONDITIONALLY -
   PMCLogo (Footer.ascx.cs:609-631) has no guard around it - so .pmc-logo a ships
   fleet-wide. An earlier revision of this comment said it "renders anchor-less on some
   sites"; that was an artefact of measuring against stale SAT builds, not the current
   code. NOTE: href is emitted from a value that can be empty, producing href="" -
   a separate defect, not addressed by this rule.

   padding 5px 0 rather than min-height alone: min-height:24px lands Residents, Sitemap
   and HUD at EXACTLY 24.0px, and the scanner rejects sitting on the line even though
   2.5.8's spacing clause only applies to targets UNDER 24x24. Same behaviour confirmed on
   Ascension the same day - .CMSSiteMapLink at 32px passes, footer links at 24.0 do not.
   Vertical-only keeps widths untouched (all six already measure 26.7-140px), so there is
   no wrap risk in the footer columns.
   Desktop and mobile are split below - only the desktop block is a single row. */

/* Desktop footer - single horizontal row, so the negative-margin cancel is safe:
   the 34px hit box on a 24px footprint has nothing above or below to overlap.
   margin-top/-bottom longhands, not the `margin: -5px 0` shorthand - the shorthand
   also zeroes horizontal margins and overrode base #link-rp { margin: .2rem 0 },
   contradicting "vertical-only keeps widths untouched". */
.footer-widget footer .tableau-footer .residents a,
.footer-widget footer .tableau-footer #copyDateLinks a,
.footer-widget footer .tableau-footer .footerRightLinks .privacy a,
.footer-widget footer .tableau-footer .additional-footer-link a,
.footer-widget footer .tableau-footer .pmc-logo a,
.footer-widget footer .tableau-footer #link-hud,
.footer-widget footer .tableau-footer #link-ada,
.footer-widget footer .tableau-footer #link-rp {
    display: inline-block;
    min-height: 24px;
    padding: 5px 0;
    margin-top: -5px;
    margin-bottom: -5px;
}

/* Mobile footer - NOT a single row. Measured at 375px with .tableau-footer
   display:none: .tableau-footer-mobile is visible 361x141 with 4 links on 4 separate
   rows (Residents 624.3, Sitemap 676.3, link-rp 709.3, PMC 729.3). With the cancel,
   34px hit boxes on 24px footprints produced 3 overlapping pairs - Sitemap/link-rp 5px,
   link-ada/link-rp 24px, link-rp/PMC 10px - and link-rp paints later so it wins the tap.
   Omitting the cancel drops that to 1 and grows the block 141 -> 187px.
   min-width also needed: #link-hud and #link-ada measure 20px WIDE (20x24), so
   min-height alone leaves them failing on the other dimension. */
.footer-widget footer .tableau-footer-mobile .residents a,
.footer-widget footer .tableau-footer-mobile #copyDateLinks-mobile a,
.footer-widget footer .tableau-footer-mobile .footerRightLinks .privacy a,
.footer-widget footer .tableau-footer-mobile .additional-footer-link a,
.footer-widget footer .tableau-footer-mobile .pmc-logo a,
.footer-widget footer .tableau-footer-mobile #link-hud-mobile,
.footer-widget footer .tableau-footer-mobile #link-ada-mobile,
.footer-widget footer .tableau-footer-mobile #link-rp-mobile {
    display: inline-block;
    min-width: 24px;
    min-height: 24px;
    padding: 5px 0;
}

/* KNOWN REMAINING FAILURE, not fixed here - see the follow-up on TFS 2982346.
   On mobile, #link-ada still overlaps #link-rp by 24px because footer.css:1549 (footer-9)
   and :2202 (footer-10) put transform: translate(25px, -9px) on
   .tableau-footer-mobile #ADA-HUD-Links, dragging the icons into the logo's row
   regardless of margins. Undoing that is a layout change to deliberate base CSS, not a
   target-size tweak. Note this mobile block was never compliant - 4 links at 14px
   before any of this work. */

/* TFS 2982346 - keep the footer icons at their original size.
   These SVGs have no intrinsic height, so they stretch to fill the enlarged anchor -
   measured after the rule above, the ADA chair grew 20px -> 28.5px (+42%) and HUD
   20px -> 23.9px. Pinning them back to 20px leaves the anchor measuring >=24px (the
   padding supplies the rest), so the target still passes while the icons look
   unchanged. */
.footer-widget footer .tableau-footer #link-hud svg,
.footer-widget footer .tableau-footer #link-ada svg,
.footer-widget footer .tableau-footer #link-rp svg,
.footer-widget footer .tableau-footer-mobile #link-hud-mobile svg,
.footer-widget footer .tableau-footer-mobile #link-ada-mobile svg,
.footer-widget footer .tableau-footer-mobile #link-rp-mobile svg {
    height: 20px;
}

/* TFS 2982346 - social icons inside the expandable footer panel.
   Footer.ascx:1109 renders .footer-follow > ul.footer-social inside
   <div class="footer-content" style="display:none"> (Footer.ascx:1102), revealed only by
   $('.footer-content').toggle(). A static scan never reaches these, so this rule is NOT
   what clears the flagged items - it is genuine 2.5.8 work for users once the footer is
   expanded. footer.css:2356-2362 sets font-size:24px on the anchor and FA's .fa carries
   line-height:1, so height already clears 24px; width is the only deficiency.
   margin-bottom:0 neutralises footer.css:3059-3061 (.footer-social li a
   { margin-bottom: 1rem }), inert while the anchor is inline but would otherwise add
   ~16px under the social row once it becomes inline-block. */
.footer-widget footer.footer-10 .footer-container .footer-top .footer-top-column .footer-follow .footer-social li a {
    display: inline-block;
    min-width: 24px;
    text-align: center;
    margin-bottom: 0;
}

/* WCAG 2.4.7 — Silktide only counts outline width, not box-shadow.
   Pin an explicit outline on the in-house buttons it flagged. */
body button.open-footer-button:focus-visible,
body button[data-toggle="offCanvasMenu"]:focus-visible,
body button.fpsm-button:focus-visible,
body button[onclick*="f_hideAmenitiesModal"]:focus-visible,
body button.nested-gst:focus-visible,
body select.top-dropdown:focus-visible {
  outline: 2px solid #005fcc !important;
  outline-offset: 2px !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.

   FIX (TFS 2987209, fleet rescan 2026-08): the checkbox rule above renders
   box-sizing:border-box (confirmed live via computed style on all 8
   templates carrying this exact block), so the CSS containing block for
   this ::before (the padding box) is only 24px - 2*2px border = 20x20, not
   24x24. The original -12px inset was sized against the 24x24 assumption,
   so it actually produced a 20+2*12=44x44 overlay - exactly at the SC
   2.5.5 floor with zero cushion, which is why it measured as a genuine
   misclick onto the adjacent privacy-policy link on Ascension/Aurora/Bliss
   (live elementFromPoint hit-test, 2026-08-19) and as a 1-6px shortfall
   elsewhere once combined with per-template line-height jitter. Bumping
   each inset by 2px (one border-width) restores the intended 48x48
   cushion (20 + 2*14) regardless of box-sizing - re-verified live:
   elementFromPoint at every point in the overlay, including the corner
   nearest the link, now resolves to the checkbox with no measured
   encroachment onto the link/label.

   TABLEAU-SPECIFIC on top of the fix above: the #contactUsV1Privacy
   variant of this checkbox (ContactUsV1.ascx) sits inside
   `#cu_2_body.cu-2-wrapper` / `.right.bdr-clr1`, both `overflow:hidden`,
   whose left edge sits only ~4px left of the checkbox's own left edge
   (live-measured on chancerysquare.com, both 1366px and 390px). A plain
   symmetric -14px inset gets clipped by that ancestor before it can reach
   full width, measuring only ~40px wide - the "short 1-6px" and
   "left side specifically" shortfall QA flagged. On mobile the
   privacy-policy link also sits only ~5px below the checkbox here (same
   pattern as Topaz/Autumn-Ridge). Fix: keep left modest (it's clipped
   regardless, so -14 vs any larger value makes no difference) and borrow
   the width the left side can't use from the right, which has ~300px of
   clearance to the label/link on every measured viewport; keep bottom
   tight to protect the mobile link, and take the remainder from the top
   (ample clearance, no neighbor above).

   CORRECTED 2026-08-24 (PR review + independent live re-verification):
   the previous version of this comment claimed "48x46 achieved" -- wrong
   on both counts, in two different ways. The DECLARED overlay (before any
   clipping) is 20 (padding box) + 14(left) + 24(right) = 58 wide, and
   20 + 22(top) + 6(bottom) = 48 tall -- a PR reviewer correctly did this
   arithmetic and flagged the mismatch. Separately, the EFFECTIVE hit area
   after the `overflow:hidden` ancestors clip it (their left edge sits
   4px left of the checkbox's own left edge, per the paragraph above) is
   50 x 48, not 48x46 either. Both numbers were simply wrong; the live
   behavior itself is fine. Re-verified live at 1366x900 and every mobile
   width 360-430: effective hit area a solid, unbroken 50x48 rectangle
   (0.5px elementFromPoint walk, not just a corner probe), zero real
   clicks stolen from the privacy-policy link (checked per rendered LINE
   BOX via getClientRects(), not the link's union bounding rect -- a
   union-rect check falsely reports thousands of "stolen" points here
   because the link wraps to two lines at narrow widths, which is very
   likely what produced the original wrong numbers). Also hardened the
   margin: the shipped bottom clearance to the mobile link was exactly
   1px (zero-cushion, the same failure mode already corrected elsewhere
   in this ticket for Ascension/Aurora/Bliss) -- moved 2px from bottom to
   top, where there is no neighbor to encroach on, giving 3px of real
   clearance instead of 1px. Confirmed this change is a pure no-op on the
   effective size and steals nothing anywhere, at every viewport tested.
   Do not "simplify" this back to a symmetric inset -- the 4px left-clip
   and the borrow-from-the-right/top design are both load-bearing;
   production without this fix measures 38x44 (fails 2.5.5 on width) and
   actively steals 342 real clicks off the privacy-policy link at mobile
   widths. */
body .contact-mobile-form input[type="checkbox"]::before,
#contactusPrivacy input[type="checkbox"]::before,
#privacyDiv input[type="checkbox"]::before {
    content: "";
    position: absolute;
    top: -14px; left: -14px; right: -14px; bottom: -14px;
}
#contactUsV1Privacy input[type="checkbox"]::before {
    content: "";
    position: absolute;
    top: -24px; right: -24px; bottom: -4px; left: -14px;
}

/* ------------------------------------------------------------
   TFS 2987209 — WCAG 2.2 AAA 2.5.5 Target Size (Enhanced), 44x44
   S0065-Tableau header nav / phone / header actions.
   Measured live at 375/768/1440 with CDP CSS.getMatchedStylesForNode
   on the exact nodes measured. This template does NOT load
   assets/common/header/css/header.css and does not use the shared
   Header widget — its header is template-native markup, so the fix
   belongs here rather than in a shared file. The WCAG override
   loads at document.styleSheets[11], after the master at [0], so
   plain rules win: no !important is needed and none is used.

   Technique: min-height/min-width + box-sizing:border-box, never
   padding and never a ::before overlay. min-* is uncontested on
   these selectors and, per CSS2.1 §10.7, is applied last in height
   resolution, so it beats any competing height/max-height without a
   specificity fight. Overlays are rejected fleet-wide on this
   ticket: vertical clearance between nav links measures 6.59px (desktop) / 11.36px (drawer) here,
   far below the ~25px an overlay would need, and an overlay was
   already live-measured stealing clicks on another template. A
   direct grow reflows instead — it pushes siblings in normal flow
   and cannot overlap them.
   ------------------------------------------------------------ */

/* Tableau has NO author CSS on its nav anchors at all — the only
   matched rules are Foundation's {*} and {a}. All geometry is
   inherited line-height, so these rules ADD sizing rather than
   override anything.

   Two mutually exclusive nav instances:
   - off-canvas drawer (375/768 only), links 24px tall
   - desktop vertical nav (1440 only), links 19px tall
   Narrowest desktop label "HOME" measures 47.59px — only 3.59px
   over the limit — so min-width is included as a guard; it is a
   no-op on every other label.

   *** QA / DESIGN NOTE — read before signing this off ***
   The desktop nav is a VERTICAL list of 11 links at 19px each with
   only 6.59px of separation. Bringing each to 44px necessarily
   grows that column by roughly 275px. This is the single largest
   visual change in this ticket and it is inherent to SC 2.5.5 on a
   vertical nav, not an artefact of the technique chosen — there is
   no way to give 11 stacked links a 44px target without the stack
   getting taller. Flagged explicitly rather than buried. */
body #form #offCanvasMenu #menuElem li a,
body #form .desktopMenu #menuElem li a {
    box-sizing: border-box;
    display: inline-block;
    min-width: 44px;
    min-height: 44px;
}

/* FIX (prod completeness sweep, 2026-08-20): the accepted +184px growth
   of the desktop vertical nav above (measured live, not the ~275px
   originally estimated) pushes the header CTA/phone below the fold on
   #nav-wrapper (class `.topContainer`, RPcssMaster_S0065-Tableau.css:38)
   — a `position:fixed; top:0` sidebar with no height/max-height/overflow
   constraint of its own, so content taller than the viewport is clipped
   by the viewport edge and genuinely unreachable (a fixed element does
   not scroll with the page, and has no internal scrollbar without one).
   Confirmed at common laptop sizes: 1280x720, 1440x700, 1024x640.
   max-height:100vh + overflow-y:auto gives the sidebar its own internal
   scrollbar so the CTA/phone below the grown nav stay reachable, without
   changing anything for viewports tall enough that it never triggers.

   CORRECTED 2026-08-20 (independent live re-verification of this rule):
   `max-height:100vh` alone leaves "Apply Online" 4px short of 44px at
   every affected viewport, because the page's own `footer.footer-10`
   permanently overlays the bottom ~39px of a locked one-screen layout —
   `100vh` reaches the true viewport bottom, but the last ~39px of that
   is already owned by the footer, not scrollable clearance. Measured two
   working mitigations live; picked `padding-bottom:44px` over
   `max-height:calc(100vh - 39px)` since it doesn't hard-code the
   footer's height as a magic number. Also added an explicit
   `overflow-x:hidden` -- per spec, `overflow-y:auto` against an
   otherwise-`visible` x-axis silently computes overflow-x to `auto` too;
   stating it explicitly makes the intent unambiguous rather than relying
   on that side-effect.

   CORRECTED AGAIN 2026-08-20 (independent re-verification of the first
   correction, cross-checked on a second live domain): `padding-bottom`
   fixed the primary bug on live22hundred.com but caused a NEW 2.5.5
   regression on chancerysquare.com -- that site's sidebar only overflows
   the viewport by ~18px, so `padding-bottom:44px` absorbs the entire
   overflow (scrollable range drops to 0) and shifts every item below the
   nav DOWN by the difference, pushing the phone link 18px lower into a
   `position:fixed; z-index:999` floating 3D-tour-button widget that
   wasn't in its way before -- confirmed live, phone drops 44px -> 38px,
   reproduced on 4/4 trials. The originally-rejected
   `max-height:calc(100vh - 39px)` alternative does NOT have this
   side-effect (it constrains the sidebar's own height rather than
   padding its content, so it can't push anything downward) and passes
   on BOTH domains. Switched to it; the "hard-coded magic number"
   objection is accepted as the lesser risk against a confirmed
   regression. */
#nav-wrapper {
    max-height: calc(100vh - 39px);
    overflow-y: auto;
    overflow-x: hidden;
}

/* Phone — four instances. Two need both axes: the
   #mobile-nav-header one is 23.58x0 (font-size:0, glyph lives in
   ::before), and the others measure 98.55-123.17 x 15-19 and need
   height only, for which min-width is a no-op. The footer instance
   is 0x0 on load because an ancestor .footer-content is
   display:none until "Open" is clicked — it is NOT dead, and it
   measures 123.17x19 once expanded. ::before is left untouched
   where it holds the icon glyph. */
body #form a.seo-number {
    box-sizing: border-box;
    display: inline-block;
    min-width: 44px;
    min-height: 44px;
}

/* "Apply Online" — 134.06x23 at 1440, height only (0x0 at 375/768
   inside the hidden #nav-wrapper, where the rule is a no-op).

   BUG FIX (prod completeness sweep, 2026-08-20): this rule shipped
   without `display: inline-block`, unlike sibling rules R2 (#454)/R3
   (#470) above — a no-op, confirmed live by client-side injection: the
   anchor is `display:inline` (same "no author CSS at all" situation as
   the nav links above), where min-height does not apply to a
   non-replaced inline box. Still 23px tall with the rule "applied."
   Adding the missing display change, matching the sibling rules. */
body #form .applyNowLink a {
    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) ---------- */
