/* ============================================================
   wcag-s0076-jackson-square.css
   WCAG 2.1 Level AA override for the S0076-Jackson-Square Kentico template
   (TemplateId 1389, DefaultCssFileName: RPcssMaster_S0076-Jackson-Square).

   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.
   No top-bar sticky header in master CSS â sticky header comes
   from shared resources.
   ============================================================ */


/* ------------------------------------------------------------
   WCAG 2.4.7 Focus Visible
   ------------------------------------------------------------ */
.navbar-toggle:focus-visible,
.dropdown-toggle:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
header a:focus-visible,
nav a:focus-visible,
#hamburgerNavMenuContainer a: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;
  box-shadow: 0 0 0 2px #005fcc, 0 0 0 3px #fff;
}


/* ------------------------------------------------------------
   WCAG 2.4.11 Focus Not Obscured
   ------------------------------------------------------------ */
html {
  scroll-padding-top: 100px;
}

:focus-visible {
  scroll-margin-top: 100px;
}


/* ------------------------------------------------------------
   WCAG 1.4.11 Non-text Contrast (UI components)
   Base failures:
     border-bottom:2px solid #efefef on menu hover/dividers
       (lines 1766, 1770, 1774) â 1.18:1 â fails 3:1.
     border-bottom:solid 2px #ddd (line 2871) â 1.59:1 â fails.
   ------------------------------------------------------------ */
#menuDesktop #menuElem li a:hover,
#menuMobile li a:hover {
  border-bottom-color: #595959;
}

body #contactUsEnhancedContainer .form-control {
  border-bottom: 1px solid #595959 !important;
}


/* ------------------------------------------------------------
   WCAG 1.4.3 Contrast Minimum (text)
   Base failures:
     #7e7e7e text-color rules â 4.4:1 â fails 4.5:1.
     Shared footer-disclosure opacity 0.6 â 0.85.
   ------------------------------------------------------------ */
/* SCOPE NOTE: removed `.FloorPlansV3 .specification` /
   `.FloorPlansV2 .specification` color override. Verified across
   53 prod + 7 SAT Jackson-Square domains (any PMC): the
   `.FloorPlansV2 .specification strong` color varies per property
   with 28+ distinct brand values, including #964c44 (Gorman default,
   14 properties), #babd34 (Greystar's themckenzieapts), #40c1f1
   (cyan), #03700e (green), #c2072e (red), and many others. Forcing
   `#595959` would replace per-property brand accents with generic
   gray on every site. Brand-color contrast failures belong at the
   property-CSS level. See per-property-base-css memory. */

.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 bleed bug)
   — they would underline footer nav, header nav, sidebar lists,
   and disclosure paragraphs unintentionally.

   TFS 2985969 — added `.topContent`, `.page_neighborhood` and
   `#contactusPrivacy`:
     * Neighborhood prose links (B2 Bar and Grill, Mezza Luna
       Pizzeria, Costco, Trader Joe's, Valley River Center) sit in
       `.topContent` / `.page_neighborhood`, not `.mainContent` —
       confirmed live on themckenzieapts.com/Neighborhood.aspx.
       The base even styles them explicitly
       (RPcssMaster_S0076-Jackson-Square.css:336
        `.topContent a, .topContent a:hover, .topContent a:focus
         { color: RPcolor4 }`) — brand color and nothing else, i.e.
       colour-only distinction.
     * `#privacyDiv a` — the Contact-page privacy link. NOTE: the
       id on this template is `#privacyDiv`, NOT `#contactusPrivacy`
       (that id belongs to Elan/Balcony/Teracy and does not exist on
       Jackson-Square — measured 0 occurrences on
       themckenzieapts.com/Contact.aspx). The live chain is
         main#main-content > .page-placeholder-container
           > .page_contactus > … > .mainContent
             > .contact-us-enhanced > #contactUsEnhancedContainer
               > .row > .col-md-6 > #privacyDiv > label > a
       This file has no `.mainContent a` selector (that is
       Zen-Garden's), and the pre-existing homepage rule is scoped
       to `#homeContactCallout #privacyDiv a`, which this Contact-page
       instance is NOT under — so it was uncovered. `#privacyDiv a`
       is therefore deliberately left UNSCOPED.
       `#contactusPrivacy a` is kept as harmless defence-in-depth in
       case a template variant emits it.
       The wrapper's `timeout-error-contact` class is NOT a hider —
       it is hardcoded on the always-rendered container
       (ContactUsEnhanced.ascx.cs:317) and only namespaces an
       optional child `.timeout-message`, so this link is
       user-facing.

   Bleed check: `.page_neighborhood` is the page-content wrapper
   authored in S0076-Jackson-Square-Neighborhood.ascx:5 and
   `.topContent` is the standard content-zone wrapper. Both render
   inside `<main id="main-content">` per
   S0076-Jackson-Square-Master.ascx:11-13, while `<header>`,
   `zoneNavBar`, `zoneHamburgerMenu` and `<footer>` are all
   siblings OUTSIDE `<main>` — so no site nav/header/footer anchor
   can ever match these two selectors.
   ------------------------------------------------------------ */
.main-content-text a,
.inner-page-main a,
.main-content-wrapper a,
.topContent a,
.page_neighborhood a,
#contactusPrivacy a,
#privacyDiv a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

a.btn,
a.button,
.btn,
.btn-primary,
header a,
nav a,
#hamburgerNavMenuContainer a,
.cta-header-btn,
.header-CTA-button,
.footer-CTA-Button,
a.more-link,
a.less-link,
.footer-widget footer a {
  text-decoration: none;
}

/* TFS 2985969 — re-assert the shape-based opt-outs at container
   scope. `.topContent a` / `.page_neighborhood a` are (0,1,1),
   which out-specifies the bare class opt-outs above that are only
   (0,1,0) (`.btn-primary`, `.cta-header-btn`, `.header-CTA-button`,
   `.footer-CTA-Button`) and the bare element opt-outs at (0,0,2)
   (`header a`, `nav a`). The (0,1,1) opt-outs (`a.btn`, `a.button`,
   `a.more-link`, `a.less-link`) already win on source order, and
   `.footer-widget footer a` (0,1,2) and
   `#hamburgerNavMenuContainer a` (1,0,1) already out-specify — but
   the weaker ones must be lifted so a button-shaped or in-page nav
   anchor inside a content zone is not underlined. */
.topContent header a,
.topContent nav a,
.topContent a.btn-primary,
.topContent a.cta-header-btn,
.topContent a.header-CTA-button,
.topContent a.footer-CTA-Button,
.page_neighborhood header a,
.page_neighborhood nav a,
.page_neighborhood a.btn-primary,
.page_neighborhood a.cta-header-btn,
.page_neighborhood a.header-CTA-button,
.page_neighborhood a.footer-CTA-Button,
/* Measured live under `.page_neighborhood` / `.topContent` on
   themckenzieapts.com — utility/control anchors, not prose:
   `a#directionsLink` is the 15th anchor under `.page_neighborhood`
   (it sits outside `.topContent`); `a.seo-number` is the tel: link;
   `a.sectionLink` is a section jump link. */
.page_neighborhood a#directionsLink,
.topContent a#directionsLink,
a#directionsLink,
.page_neighborhood a.seo-number,
.topContent a.seo-number,
a.seo-number,
.page_neighborhood a.sectionLink,
.topContent a.sectionLink,
a.sectionLink,
.page_neighborhood a.galleryButton,
.page_neighborhood a.leaseTodayButton,
.topContent a.galleryButton,
.topContent a.leaseTodayButton {
  text-decoration: none;
}

/* ------------------------------------------------------------
   TFS 2985969 — WCAG 1.4.1, interaction states
   The base strips the underline on every interaction state with
   an !important rule:
     RPcssMaster_S0076-Jackson-Square.css:329-333
       body a:hover, body a:focus, body a:active
         { text-decoration: none !important; ... }
   Specificity (0,1,2) + !important, so it beats the plain
   rest-state underline above and the link becomes colour-only
   again the moment it is hovered or keyboard-focused — the
   defect reproduced live on themckenzieapts.com.

   Counter it with a content-scoped !important. Each selector here
   (e.g. `.topContent a:hover` = (0,2,1)) out-specifies
   `body a:hover` (0,1,2) in the class column, so among competing
   !important declarations ours wins. Deliberately NOT a bare
   `body a:hover` counter — nav/header/footer anchors must keep
   the base `none` on interaction.
   ------------------------------------------------------------ */
.main-content-text a:hover, .main-content-text a:focus, .main-content-text a:active,
.inner-page-main a:hover, .inner-page-main a:focus, .inner-page-main a:active,
.main-content-wrapper a:hover, .main-content-wrapper a:focus, .main-content-wrapper a:active,
.topContent a:hover, .topContent a:focus, .topContent a:active,
.page_neighborhood a:hover, .page_neighborhood a:focus, .page_neighborhood a:active,
#contactusPrivacy a:hover, #contactusPrivacy a:focus, #contactusPrivacy a:active,
#privacyDiv a:hover, #privacyDiv a:focus, #privacyDiv a:active,
.expandable.home a:hover, .expandable.home a:focus, .expandable.home a:active,
#homeContactCallout #privacyDiv a:hover, #homeContactCallout #privacyDiv a:focus, #homeContactCallout #privacyDiv a:active {
  text-decoration: underline !important;
  text-underline-offset: 2px;
}

/* Companion opt-out: keep button/CTA/heading-shaped links inside
   content zones un-underlined on interaction too. Needs the same
   !important to compete with the rule directly above. This list
   mirrors the rest-state opt-out shapes exactly — the two must
   stay in sync, otherwise an anchor stays clean at rest but picks
   up an underline the moment it is hovered or focused. */
.topContent header a:hover, .topContent header a:focus, .topContent header a:active,
.topContent nav a:hover, .topContent nav a:focus, .topContent nav a:active,
.topContent a.cta-header-btn:hover, .topContent a.cta-header-btn:focus, .topContent a.cta-header-btn:active,
.topContent a.header-CTA-button:hover, .topContent a.header-CTA-button:focus, .topContent a.header-CTA-button:active,
.topContent a.footer-CTA-Button:hover, .topContent a.footer-CTA-Button:focus, .topContent a.footer-CTA-Button:active,
.page_neighborhood header a:hover, .page_neighborhood header a:focus, .page_neighborhood header a:active,
.page_neighborhood nav a:hover, .page_neighborhood nav a:focus, .page_neighborhood nav a:active,
.page_neighborhood a.cta-header-btn:hover, .page_neighborhood a.cta-header-btn:focus, .page_neighborhood a.cta-header-btn:active,
.page_neighborhood a.header-CTA-button:hover, .page_neighborhood a.header-CTA-button:focus, .page_neighborhood a.header-CTA-button:active,
.page_neighborhood a.footer-CTA-Button:hover, .page_neighborhood a.footer-CTA-Button:focus, .page_neighborhood a.footer-CTA-Button:active,
.main-content-text a.btn:hover, .main-content-text a.btn:focus, .main-content-text a.btn:active,
.main-content-text a.button:hover, .main-content-text a.button:focus, .main-content-text a.button:active,
.main-content-text a.more-link:hover, .main-content-text a.more-link:focus, .main-content-text a.more-link:active,
.main-content-text a.less-link:hover, .main-content-text a.less-link:focus, .main-content-text a.less-link:active,
.topContent a.btn:hover, .topContent a.btn:focus, .topContent a.btn:active,
.topContent a.button:hover, .topContent a.button:focus, .topContent a.button:active,
.topContent a.btn-primary:hover, .topContent a.btn-primary:focus, .topContent a.btn-primary:active,
.topContent a.more-link:hover, .topContent a.more-link:focus, .topContent a.more-link:active,
.topContent a.less-link:hover, .topContent a.less-link:focus, .topContent a.less-link:active,
.page_neighborhood a.btn:hover, .page_neighborhood a.btn:focus, .page_neighborhood a.btn:active,
.page_neighborhood a.button:hover, .page_neighborhood a.button:focus, .page_neighborhood a.button:active,
.page_neighborhood a.btn-primary:hover, .page_neighborhood a.btn-primary:focus, .page_neighborhood a.btn-primary:active,
.page_neighborhood a.more-link:hover, .page_neighborhood a.more-link:focus, .page_neighborhood a.more-link:active,
.page_neighborhood a.less-link:hover, .page_neighborhood a.less-link:focus, .page_neighborhood a.less-link:active,
.amenitiesCalloutHeader a:hover, .amenitiesCalloutHeader a:focus, .amenitiesCalloutHeader a:active,
.homeFloorPlanNeighborhoodCalloutHover a:hover, .homeFloorPlanNeighborhoodCalloutHover a:focus, .homeFloorPlanNeighborhoodCalloutHover a:active,
.contactCalloutHeader a:hover, .contactCalloutHeader a:focus, .contactCalloutHeader a:active,
.expandable.home a.btn:hover, .expandable.home a.btn:focus, .expandable.home a.btn:active,
.expandable.home a.button:hover, .expandable.home a.button:focus, .expandable.home a.button:active,
.expandable.home a.galleryButton:hover, .expandable.home a.galleryButton:focus, .expandable.home a.galleryButton:active,
.expandable.home a.leaseTodayButton:hover, .expandable.home a.leaseTodayButton:focus, .expandable.home a.leaseTodayButton:active,
.expandable.home a#leaseToday:hover, .expandable.home a#leaseToday:focus, .expandable.home a#leaseToday:active,
.expandable.home a#letsMeet:hover, .expandable.home a#letsMeet:focus, .expandable.home a#letsMeet:active,
header #directionsLink:hover, header #directionsLink:focus, header #directionsLink:active,
.header-phone:hover, .header-phone:focus, .header-phone:active,
.mobiHeader .seo-number:hover, .mobiHeader .seo-number:focus, .mobiHeader .seo-number:active,
.sidebarFlex .seo-number:hover, .sidebarFlex .seo-number:focus, .sidebarFlex .seo-number:active,
#navBarRightContent a.leaseTodayButton:hover, #navBarRightContent a.leaseTodayButton:focus, #navBarRightContent a.leaseTodayButton:active {
  text-decoration: none !important;
}

/* TFS 2985969 — PR review follow-up (Melissa Gibson): the three selectors
   above were previously bare (`a#directionsLink`, `a.seo-number`,
   `a.leaseTodayButton`, all page-global, no container scope). `a.seo-number`
   in particular is the class the standalone PhoneNumber.ascx widget renders
   with NO companion class (Header.ascx's own header-phone links add a
   `header-phone` class alongside `seo-number` specifically for this
   reason) — so a bare, !important, unscoped rule would strip the underline
   from a tel: link authored inline in body prose too (routine on Contact/
   Neighborhood copy), turning this 1.4.1 fix into a 1.4.1 failure on
   authored content. Rescoped to `.header-phone` (the header-only
   discriminator) instead of the reusable `seo-number` class. `#directionsLink`
   is confirmed (Header.ascx:313,371) to only ever render inside `<header>`,
   so `header #directionsLink` is safe. `a.leaseTodayButton` is scoped to
   `#navBarRightContent`, its confirmed nav-bar container in the base CSS —
   it also already has `.expandable.home`/`.topContent` scoped copies above
   for its homepage-CTA placements, so this catches only the remaining
   nav-bar instance.

   `a.galleryButton` and `a.sectionLink` were intentionally left OUT of this
   rescoping, for different reasons:
   - `a.galleryButton` has base-CSS `background-color`/`padding`/`border`
     (RPcssMaster_S0076-Jackson-Square.css:1326) — a button shape, not
     inline prose text, so it's outside 1.4.1's link-in-text-block scope
     regardless of where it renders. Left bare/global, matching this file's
     convention for other button-shape opt-outs (`.btn`, `.button`).
   - `a.sectionLink` could NOT be located in any `.ascx`/`.ascx.cs` markup
     across CMS/RPWebParts or the Jackson-Square Shared templates (repo
     search, case-insensitive) despite existing in the base CSS
     (RPcssMaster_S0076-Jackson-Square.css:1348, no `!important` there).
     Left bare rather than guess an unverified container — flagged to
     Melissa as an open question in the PR thread.

   Round 2 (Melissa Gibson): `.header-phone` alone missed other genuine
   Header.ascx chrome instances of `a.seo-number` that render WITHOUT the
   `header-phone` companion class — the mobile top-bar phone number
   (`.mobiHeader > a.seo-number`, Header.ascx:287/325) and the off-canvas
   sidebar phone number (`.sidebarFlex.sidebar-footer > a.seo-number`,
   Header.ascx:310/368, inside `pnlHeader9`/`pnlHeader10`). Both wrapper
   classes (`mobiHeader`, `sidebarFlex`) are confirmed Header.ascx-only
   (repo search) so `.mobiHeader .seo-number` / `.sidebarFlex .seo-number`
   add coverage for these two chrome contexts without reopening the
   authored-prose risk `.header-phone` was scoped to avoid in the first
   place. */

/* ------------------------------------------------------------
   TFS 2870264 — WCAG 1.4.1 (homepage inline links)
   Jackson-Square's homepage stacks numbered section wrappers
   (`.headerContainer > .topContent`) and surfaces welcome prose
   inside `.expandable.home` (the rich-text editor block under
   the "Welcome Home" h1). Verified against
   jacksonsquare.ws.realpage.com.
   The amenities/floor-plans/neighborhood section anchors wrap
   `<h2>` headings (`.amenitiesCalloutHeader a`,
   `.homeFloorPlanNeighborhoodCalloutHover a`,
   `.contactCalloutHeader a`) — those are heading links, not
   prose links, so opted out.
   The contact form's privacy-policy link sits under
   `#privacyDiv > label > a` (inside `#homeContactCallout`) —
   underlined explicitly so the inline form-instruction link
   has a non-color indicator.
   ------------------------------------------------------------ */
.expandable.home a,
#homeContactCallout #privacyDiv label a,
#homeContactCallout #privacyDiv a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

.amenitiesCalloutHeader a,
.homeFloorPlanNeighborhoodCalloutHover a,
.contactCalloutHeader a,
.expandable.home a.btn,
.expandable.home a.button,
.expandable.home a#leaseToday,
.expandable.home a#letsMeet,
.expandable.home a.galleryButton,
.expandable.home a.leaseTodayButton {
  text-decoration: none;
}

/* ------------------------------------------------------------
   TFS 2985969 — Google Maps bleed opt-out (measured live)
   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. 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;
}
