.card-attribution{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:8px;border-top:1px solid var(--line)}
/* The listing company is a licence condition on every listing display, not a
   footnote, so it keeps the muted body colour rather than being greyed further
   — the MLS wording is "readily visible color and typeface". The logo is capped
   by height so marks of different aspect ratios line up on one row, and it
   never shrinks below its cap while the company name takes the slack.
   Two classes, because `.listing-card img` later in this file crops every card
   image to a 4:3 cover and would otherwise win on source order. */
.listing-card .card-attribution img{flex:0 0 auto;width:auto;height:18px;max-width:56px;aspect-ratio:auto;object-fit:contain}
.listing-card .card-attribution small{min-width:0;font-size: calc(11px * var(--rs-text-scale, 1));line-height:1.35;overflow-wrap:anywhere}
/* The same requirement on the other two surfaces that display listings: the
   map result cards and the comparison table. Each needs its own selector
   because both sit under rules that size images for their own layout. */
/* A footer across the whole card, not a line inside the text column. The card
   is a [thumbnail][copy] grid, so attribution nested in the copy cell had a
   brokerage name wrapping onto three lines in a narrow column while the space
   under the thumbnail sat empty. It is a sibling of the copy now and spans
   both tracks, which is also where a licence notice belongs -- attached to the
   card, not buried in its body text. */
.map-result-card .map-result-attribution{grid-column:1/-1;margin-top:0;padding-top:7px;border-top:1px solid var(--line)}
/* The list view drops the grid for a block layout, so there is no row gap to
   separate the footer -- it needs its own. */
.property-map-shell.view-list.list-property-open .map-result-card .map-result-attribution{margin-top:8px}
.map-result-card .map-result-attribution img{flex:0 0 auto;width:auto;height:16px;max-width:50px;aspect-ratio:auto;object-fit:contain}
.map-result-card .map-result-attribution small{min-width:0;color:var(--muted);font-size: calc(10px * var(--rs-text-scale, 1));line-height:1.35;overflow-wrap:anywhere}
.compare-table .compare-attribution-row td{vertical-align:top}
.compare-table .compare-attribution-row img{display:inline-block;width:auto;height:18px;max-width:56px;margin:0 0 6px;aspect-ratio:auto;object-fit:contain}
.compare-table .compare-attribution-row span{display:block;line-height:1.4;overflow-wrap:anywhere}
.listing-search,.property-detail{padding:58px 0 78px;background:var(--soft)}.listing-search h1{font-size: calc(44px * var(--rs-heading-scale, 1));margin:0 0 24px}.search-filters{display:grid;grid-template-columns:repeat(4,minmax(145px,1fr));gap:10px;align-items:end;background:#fff;border:1px solid var(--line);padding:16px}.search-filters label{display:grid;gap:5px;font-size: calc(13px * var(--rs-text-scale, 1));font-weight:750}.search-filters input{width:100%;padding:10px;border:1px solid #b9cbd5}.listing-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:18px}.listing-card{position:relative;background:#fff;border:1px solid var(--line)}.listing-card a{color:inherit;text-decoration:none}.listing-card img,.listing-no-photo{width:100%;aspect-ratio:4/3;object-fit:cover}.listing-no-photo{display:grid;place-items:center;background:#dce6eb;color:var(--muted)}.listing-card>a>div:last-child{padding:15px}.listing-card strong{font-size: calc(22px * var(--rs-text-scale, 1));color:var(--accent)}.listing-card h2{font-size: calc(18px * var(--rs-heading-scale, 1));margin:7px 0 3px}.listing-card p{margin:0 0 8px;color:var(--muted)}.listing-card small{color:var(--muted)}.compare-toggle{position:absolute;z-index:3;right:10px;top:10px;padding:8px 10px;background:#fff;color:var(--ink);border:1px solid var(--line)}.compare-toggle[aria-pressed=true]{background:var(--accent-fill);color:#fff}.compare-bar{position:fixed;z-index:50;left:50%;bottom:18px;transform:translateX(-50%);display:flex;align-items:center;justify-content:space-between;gap:30px;width:min(620px,calc(100% - 30px));padding:12px 14px;background:#fff;border:1px solid var(--line);box-shadow:0 12px 35px rgba(18,42,58,.25)}.compare-bar[hidden]{display:none}.compare-bar div{display:flex;align-items:center;gap:8px}.compare-heading{display:flex;justify-content:space-between;align-items:end}.compare-scroll{overflow:auto}.compare-table{width:100%;min-width:700px;border-collapse:collapse;background:#fff}.compare-table th,.compare-table td{border:1px solid var(--line);padding:14px;text-align:left;vertical-align:top}.compare-table thead th{min-width:210px}.compare-table thead th:first-child{min-width:150px}.compare-table img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;margin-bottom:10px}.compare-table a{display:block;color:var(--ink);font-weight:800}.compare-table button{margin-top:8px}.property-gallery{position:relative;margin-bottom:26px}.gallery-main{display:block;width:100%;padding:0;border:0;background:#dce6eb}.gallery-main img{display:block;width:100%;height:min(62vh,620px);object-fit:cover}.gallery-thumbs{display:flex;gap:8px;overflow-x:auto;padding:10px 0}.gallery-thumbs button{flex:0 0 100px;padding:2px;border:2px solid transparent;background:#fff}.gallery-thumbs button.active{border-color:var(--accent)}.gallery-thumbs img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}.gallery-prev,.gallery-next{position:absolute;top:calc(50% - 55px);width:44px;height:54px;border:0;background:rgba(255,255,255,.92);font-size: calc(34px * var(--rs-text-scale, 1))}.gallery-prev{left:10px}.gallery-next{right:10px}.gallery-count{position:absolute;right:12px;bottom:80px;background:rgba(18,42,58,.85);color:#fff;padding:7px 10px}.gallery-lightbox{width:100vw;height:100vh;max-width:none;max-height:none;border:0;background:rgba(8,16,22,.94);padding:50px}.gallery-lightbox::backdrop{background:rgba(8,16,22,.94)}.gallery-lightbox img{display:block;width:100%;height:100%;object-fit:contain}.gallery-lightbox button{position:absolute;z-index:2;border:0;background:rgba(255,255,255,.9);color:#17303f;font-size: calc(34px * var(--rs-text-scale, 1));width:48px;height:48px}.gallery-lightbox [data-lightbox-close]{right:16px;top:16px}.gallery-lightbox [data-lightbox-prev]{left:16px;top:50%}.gallery-lightbox [data-lightbox-next]{right:16px;top:50%}.property-layout{display:grid;grid-template-columns:minmax(0,2fr) minmax(300px,1fr);gap:30px}.property-layout>article,.property-layout>aside{background:#fff;border:1px solid var(--line);padding:25px}.property-price{display:block;font-size: calc(34px * var(--rs-text-scale, 1));color:var(--accent);margin:15px 0}.property-location{color:var(--muted)}.property-compare{margin-bottom:14px}.property-facts{display:flex;gap:12px;flex-wrap:wrap;padding:15px 0;border-block:1px solid var(--line);margin-bottom:18px}.property-section{padding:22px 0;border-top:1px solid var(--line)}.property-section h2{margin:0 0 14px}.property-section dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;background:var(--line)}.property-section dl div{background:#fff;padding:12px}.property-section dt{font-size: calc(13px * var(--rs-text-scale, 1));color:var(--muted)}.property-section dd{margin:4px 0 0;font-weight:750}.open-house-section article{display:grid;gap:4px;padding:14px;background:var(--soft);margin-bottom:8px}.listing-attribution{border-top:1px solid var(--line);margin-top:24px;padding-top:18px}.listing-attribution img,.idx-disclaimer img{max-width:150px;max-height:65px;object-fit:contain}.idx-disclaimer{display:flex;gap:18px;align-items:flex-start;background:#fff;border:1px solid var(--line);padding:18px;margin-top:20px;font-size: calc(13px * var(--rs-text-scale, 1));color:var(--muted)}.empty-public{text-align:center;padding:50px}.listing-pagination{display:flex;justify-content:center;align-items:center;gap:14px;margin:28px 0}.listing-pagination a{padding:10px 14px;background:#fff;border:1px solid var(--line);color:var(--ink);text-decoration:none;font-weight:750}@media(max-width:900px){.search-filters{grid-template-columns:repeat(2,1fr)}.property-layout{grid-template-columns:1fr}.gallery-main img{height:50vh}}@media(max-width:560px){.search-filters{grid-template-columns:1fr}.listing-search h1{font-size: calc(36px * var(--rs-heading-scale, 1))}.gallery-main img{height:320px}.gallery-lightbox{padding:60px 8px}.property-section dl{grid-template-columns:1fr}.compare-bar{bottom:8px;gap:8px}.compare-heading{align-items:start;gap:14px}}
@media(max-width:560px){.listing-search{padding:30px 0 56px}.listing-search .wrap{width:min(100% - 24px,1160px)}.search-filters{padding:12px}.search-filters input,.search-filters select,.search-filters button{min-height:44px;font-size: calc(16px * var(--rs-text-scale, 1))}.search-filters button{width:100%}.listing-grid{grid-template-columns:1fr;gap:14px}.listing-search h1{font-size: calc(32px * var(--rs-heading-scale, 1));margin-bottom:18px}.listing-tools{width:100%}.listing-tools>button,.listing-tools>details{flex:1 1 auto}.listing-tools>button,.save-search-panel>summary{min-height:44px}}

/* Listing status and property type overlays.
   Shared by the map result cards and the server-rendered listing cards so a
   status means the same colour everywhere on the site. Tone selectors carry two
   classes, so they beat the single-class base rule in interactive-map.css no
   matter which stylesheet loads last.
   Active is a true green, not the teal it started as -- at badge size over a
   photograph a blue-leaning green reads as the same slate as the neutral tone,
   which is exactly the confusion this is meant to remove. */
.listing-status-badge{position:absolute;z-index:3;left:10px;top:10px;padding:.2rem .5rem;border-radius:999px;background:#52616b;color:#fff;font-size: calc(.66rem * var(--rs-text-scale, 1));font-weight:800;letter-spacing:.03em;line-height:1.5;text-transform:uppercase;white-space:nowrap;box-shadow:0 1px 3px rgba(9,30,44,.4)}
/* Anchored to the photo, not the card, so it sits on the image rather than
   over the text. Small and low-contrast enough not to hide the property. */
.listing-card-media{position:relative;display:block}
.listing-type-chip{position:absolute;z-index:3;left:8px;bottom:8px;padding:.1rem .34rem;border-radius:4px;background:rgba(255,255,255,.92);border:1px solid rgba(16,47,67,.16);color:#1d3a4a;font-size: calc(.54rem * var(--rs-text-scale, 1));font-weight:800;letter-spacing:.03em;line-height:1.45;text-transform:uppercase;white-space:nowrap;box-shadow:0 1px 2px rgba(9,30,44,.22)}
/* Only displace the pre-existing overlays when a status badge is actually
   present, so a listing without one keeps its original layout. */
.listing-status-badge~.open-house-badge{top:46px}
.listing-status-badge~.price-reduced-badge{top:84px}
/* Three classes deliberately. 1.5.119 shipped these tones in
   interactive-map.css, which loads after this file, so a browser still holding
   that copy applied its old teal by load order and the badge read grey until a
   refresh dropped it. Out-specifying any stale two-class rule makes the colour
   independent of which stylesheet the browser happens to have. */
.map-result-card .map-result-status.st-active,.listing-card .listing-status-badge.st-active{background:#0d7a33}
.map-result-card .map-result-status.st-pending,.listing-card .listing-status-badge.st-pending{background:#b45309}
.map-result-card .map-result-status.st-contingent,.listing-card .listing-status-badge.st-contingent{background:#4f46e5}
.map-result-card .map-result-status.st-soon,.listing-card .listing-status-badge.st-soon{background:#0369a1}
.map-result-card .map-result-status.st-closed,.listing-card .listing-status-badge.st-closed{background:#9f1239}
.map-result-card .map-result-status.st-inactive,.listing-card .listing-status-badge.st-inactive{background:#52616b}
/* A filter that cannot apply to the chosen property type reads as unavailable
   rather than disappearing, so the bar keeps a stable shape and the visitor can
   see why the control stopped responding. */
.idx-filter-group.is-unavailable{opacity:.45}
.idx-filter-group.is-unavailable>summary{cursor:not-allowed;pointer-events:none}
/* Says plainly that a search overrode the filters, rather than silently
   returning results that contradict the controls still shown as set. */
.search-override-notice{display:flex;flex-wrap:wrap;align-items:baseline;gap:.35rem .7rem;margin:0 0 16px;padding:12px 14px;border:1px solid #cfe0cb;border-left:4px solid #0d7a33;border-radius:8px;background:#f2f9f3;color:#1d3a24;font-size: calc(.9rem * var(--rs-text-scale, 1))}
.search-override-notice strong{font-weight:800}
.search-override-notice span{color:#3b5741}
.search-override-notice a{margin-left:auto;color:#0d7a33;font-weight:800}
