﻿@font-face{font-family:'Suisse Int\'l';src:url('/fonts/SuisseIntl-Light.ttf') format('truetype');font-weight:300;font-display:swap;}@font-face{font-family:'Domaine Display Narrow';src:url('/fonts/DomaineDisplayNarrow-Medium.otf') format('opentype');font-weight:500;font-display:swap;}.wordmark,.enquire-btn,.nav-link,.loc-card-name,.drawer-head h2,.admin-name{font-synthesis:weight;}:root{--kf-red:#A6192E;--kf-red-dark:#7D1322;--kf-red-tint:rgba(166,25,46,0.09);--danger:#B23A2E;--danger-tint:rgba(178,58,46,0.08);--ink:#1A1A1A;--ink-2:#2B2B2B;--paper:#F5F5F3;--paper-2:#EAE9E6;--line:#DBD9D5;--line-strong:#B7B4AE;--teal:#52514D;--teal-dark:#363530;--green:#2E7D4F;--grey:#8A8880;--grey-strong:#5E5D57;--white:#FFFFFF;--font-display:'Suisse Int\'l','Helvetica Neue',Arial,sans-serif;--font-body:'Suisse Int\'l','Helvetica Neue',Arial,sans-serif;--font-serif:'Domaine Display Narrow',Georgia,'Times New Roman',serif;--font-mono:'IBM Plex Mono',monospace;--radius:2px;--shadow-card:0 1px 0 rgba(0,0,0,0.05),0 6px 16px -8px rgba(0,0,0,0.18);--ease-entrance:cubic-bezier(0.16,1,0.3,1);--ease-standard:cubic-bezier(0.4,0,0.2,1);--dur-fast:150ms;--dur-base:200ms;--dur-slow:280ms;--header-h:58px;}body{font-weight:300;}h1,h2,h3{font-weight:400;}*{box-sizing:border-box;}html,body{margin:0;padding:0;overflow-x:hidden;}body{font-family:var(--font-body);background:var(--paper);color:var(--ink);-webkit-font-smoothing:antialiased;}button{font-family:inherit;}input,select{font-family:inherit;}a{color:inherit;}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--teal);outline-offset:2px;}@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.001ms !important;animation-iteration-count:1 !important;transition-duration:0.001ms !important;scroll-behavior:auto !important;}}@keyframes fadeInUp{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:translateY(0);}}@keyframes fadeIn{from{opacity:0;}to{opacity:1;}}@keyframes pulseRing{0%{box-shadow:0 0 0 0 rgba(5,79,80,0.45);}70%{box-shadow:0 0 0 6px rgba(5,79,80,0);}100%{box-shadow:0 0 0 0 rgba(5,79,80,0);}}@keyframes popIn{0%{transform:scale(1);}40%{transform:scale(1.35);}100%{transform:scale(1);}}@keyframes slideUpFade{from{opacity:0;transform:translate(-50%,12px);}to{opacity:1;transform:translate(-50%,0);}}@keyframes railIn{from{opacity:0;transform:translateY(24px);}to{opacity:1;transform:translateY(0);}}#app{display:flex;flex-direction:column;height:100vh;min-height:100vh;overflow-x:hidden;width:100%;}.topbar-main{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:0 20px;height:var(--header-h);overflow:hidden;background:var(--white);border-bottom:2px solid var(--kf-red);flex:none;z-index:500;}.wordmark{display:flex;align-items:center;gap:12px;font-family:var(--font-display);font-weight:300;font-size:16px;letter-spacing:normal;white-space:nowrap;flex-shrink:0;min-width:0;cursor:pointer;}#navAdmin{display:none !important;}#navAdmin.visible{display:inline-flex !important;}.brand-logo{flex:none;display:block;height:30px;width:auto;object-fit:contain;}.wordmark .sub{font-family:var(--font-body);font-size:12px;font-weight:500;color:var(--grey);letter-spacing:0.07em;text-transform:uppercase;border-left:1px solid var(--line);padding-left:12px;white-space:nowrap;}.main-nav{display:flex;align-items:center;gap:14px;flex-shrink:1;min-width:0;overflow:hidden;}.nav-link{position:relative;background:transparent;border:none;color:var(--ink);padding:8px 0;font-size:17px;font-weight:600;cursor:pointer;transition:color var(--dur-fast) var(--ease-standard);white-space:nowrap;display:inline-flex;align-items:center;}.nav-link::after{content:'';position:absolute;left:0;right:0;bottom:-3px;height:2px;background:var(--kf-red);transform:scaleX(0);transform-origin:left;transition:transform var(--dur-base) var(--ease-standard);}.nav-link:hover{color:var(--kf-red);}.nav-link:hover::after{transform:scaleX(1);}.nav-link.active{color:var(--kf-red);}.nav-link.active::after{transform:scaleX(1);}.nav-badge{display:inline-flex;align-items:center;justify-content:center;background:var(--kf-red);color:var(--white);font-size:10px;font-weight:700;border-radius:50%;min-width:20px;height:20px;margin-left:6px;vertical-align:middle;line-height:1;text-align:center;}.nav-link.active .nav-badge{background:var(--ink);text-align:center;}.nav-link--icon{font-size:18px;opacity:0.45;transition:opacity 0.15s;line-height:1;}.nav-link--icon:hover{color:var(--ink);opacity:0.75;}.nav-link--icon:hover::after{transform:scaleX(0) !important;}.nav-link--icon.active{opacity:1;}.nav-link--icon.active::after{transform:scaleX(0) !important;}.nav-link--icon::after{transition:none;}.topbar-stat-inline{font-size:14px;color:var(--grey);white-space:nowrap;padding-left:20px;border-left:1px solid var(--line);flex:none;}.view{flex:1;min-height:0;display:none;}.view.active{display:flex;}#browse-view{flex-direction:row;}.filter-rail{width:250px;flex:none;background:var(--white);border-right:1px solid var(--line);overflow-y:auto;overflow-x:hidden;padding:8px 8px 30px;}.filter-rail h2{font-family:var(--font-body);font-size:11px;text-transform:uppercase;letter-spacing:0.1em;color:var(--grey);margin:0 0 14px;display:flex;align-items:center;justify-content:space-between;}.filter-close-btn{background:var(--paper-2);border:1px solid var(--line-strong);color:var(--ink);width:28px;height:28px;border-radius:50%;cursor:pointer;font-size:13px;line-height:1;flex:none;display:flex;align-items:center;justify-content:center;padding:0;}.filter-group{margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--line);}.filter-group:last-child{border-bottom:none;}.filter-label{display:block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.06em;color:var(--ink-2);margin-bottom:8px;}.filter-search{width:100%;max-width:100%;box-sizing:border-box;padding:7px 8px;border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--paper);font-size:12px;color:var(--ink);}.search-input-wrap{position:relative;}.search-input-wrap .filter-search{padding-right:30px;}.search-clear-btn{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:20px;height:20px;border-radius:50%;border:none;background:var(--line);color:var(--ink-2);font-size:10px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background 0.15s,color 0.15s;}.search-clear-btn:hover{background:var(--kf-red);color:var(--white);}.filter-select{width:100%;max-width:100%;box-sizing:border-box;padding:7px 8px;border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--white);font-size:12px;color:var(--ink);}.chip{font-size:11.5px;font-family:var(--font-body);padding:5px 9px;border:1px solid var(--line-strong);border-radius:999px;background:var(--white);cursor:pointer;color:var(--ink-2);user-select:none;text-align:center;}.chip.active{background:var(--ink);border-color:var(--ink);color:var(--kf-red);}.type-need-row{display:flex;gap:8px;}.type-need-row select{flex:1.3;}.type-need-row input{flex:0.8;width:auto;}.filter-inline-row{display:flex;align-items:center;justify-content:space-between;gap:10px;}.filter-label--inline{margin-bottom:0;flex:1;min-width:0;}.filter-input-fixed{width:76px;flex:none;}.toggle-row{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;font-weight:500;}.switch{position:relative;width:38px;height:20px;flex:none;}.switch input{opacity:0;width:0;height:0;}.switch .track{position:absolute;inset:0;background:var(--line-strong);border-radius:999px;transition:background var(--dur-fast) var(--ease-standard);cursor:pointer;}.switch .track::after{content:"";position:absolute;width:16px;height:16px;left:2px;top:2px;background:var(--white);border-radius:50%;transition:transform var(--dur-fast) var(--ease-standard);}.switch input:checked+.track{background:var(--teal);}.switch input:checked+.track::after{transform:translateX(18px);}.clear-filters{width:100%;margin-top:4px;padding:9px;background:transparent;border:1px dashed var(--line-strong);border-radius:var(--radius);color:var(--grey);font-size:12px;font-weight:600;cursor:pointer;letter-spacing:0.03em;text-transform:uppercase;}.clear-filters:hover{border-color:var(--kf-red);color:var(--kf-red);}.legend{display:flex;flex-direction:column;gap:6px;font-size:11.5px;font-family:var(--font-body);color:var(--ink-2);}.legend-row{display:flex;align-items:center;gap:8px;}.legend-dot{width:10px;height:10px;border-radius:50%;flex:none;border:1.5px solid rgba(0,0,0,0.25);}.legend-ring{width:10px;height:10px;border-radius:50%;flex:none;border:2.5px solid;background:var(--white);}.operator-legend{display:grid;grid-template-columns:1fr 1fr;gap:6px 10px;max-height:220px;overflow-y:auto;}.operator-legend-row{display:flex;align-items:center;gap:6px;font-size:10.5px;font-family:var(--font-body);color:var(--ink-2);line-height:1.3;}.operator-legend-dot{width:9px;height:9px;border-radius:50%;flex:none;border:1px solid rgba(0,0,0,0.2);}.results-col{flex:1;min-width:0;display:flex;flex-direction:column;}.advisory-banner{position:relative;overflow:hidden;display:flex;align-items:center;gap:12px;padding:7px 16px;background:linear-gradient(135deg,var(--white) 55%,rgba(166,25,46,0.04) 100%);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:6px;flex:none;animation:fadeInUp var(--dur-slow) var(--ease-entrance) both;}.advisory-diamonds{position:absolute;top:50%;right:-30px;transform:translateY(-50%);display:flex;pointer-events:none;}.advisory-diamonds span{width:44px;height:44px;background:var(--kf-red);opacity:0.05;transform:rotate(45deg);margin-left:-18px;}.advisory-diamonds span:nth-child(2){opacity:0.045;}.advisory-diamonds span:nth-child(3){opacity:0.04;}.advisory-diamonds span:nth-child(4){opacity:0.035;}.advisory-icon{flex:none;width:28px;height:28px;border-radius:50%;background:rgba(166,25,46,0.08);color:var(--kf-red);display:flex;align-items:center;justify-content:center;position:relative;z-index:1;}.advisory-text{position:relative;z-index:1;flex:1;min-width:0;}.advisory-eyebrow{display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:9px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:var(--kf-red);margin-bottom:2px;}.advisory-text h3{font-family:var(--font-display);font-size:17px;font-weight:500;letter-spacing:-0.005em;line-height:1.2;color:var(--ink);margin:0 0 2px;}.advisory-text p{font-size:11px;color:var(--grey);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.4;display:none;}.advisory-cta{position:relative;z-index:1;flex:none;display:inline-flex;align-items:center;gap:8px;background:var(--kf-red);color:var(--white);border:1px solid var(--kf-red);padding:7px 13px;border-radius:var(--radius);font-weight:700;font-size:12px;cursor:pointer;white-space:nowrap;transition:transform 0.18s ease,box-shadow 0.18s ease,background 0.18s ease;}.advisory-cta svg{transition:transform 0.18s ease;}.advisory-cta:hover{background:var(--kf-red-dark);box-shadow:0 6px 16px -4px rgba(166,25,46,0.45);transform:translateY(-1px);}.advisory-cta:hover svg{transform:translateX(3px);}@media (max-width:720px){.advisory-banner{flex-wrap:wrap;}.advisory-cta{width:100%;justify-content:center;}}#map{height:26%;min-height:170px;flex:none;border-bottom:none;}.map-resizer{height:8px;flex:none;background:var(--paper-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line);cursor:ns-resize;display:flex;align-items:center;justify-content:center;user-select:none;transition:background 0.15s;z-index:10;}.map-resizer:hover,.map-resizer.dragging{background:var(--line);}.map-resizer-dots{display:flex;gap:3px;}.map-resizer-dots span{width:3px;height:3px;border-radius:50%;background:var(--line-strong);}.map-resizer:hover .map-resizer-dots span,.map-resizer.dragging .map-resizer-dots span{background:var(--grey);}.results-header{display:flex;align-items:center;justify-content:space-between;padding:7px 20px;background:var(--paper-2);border-bottom:1px solid var(--line);flex:none;min-height:48px;}.results-count{font-family:var(--font-body);font-size:12px;color:var(--ink-2);}.results-count b{color:var(--ink);font-size:14px;}.active-chips{display:flex;flex-wrap:wrap;gap:6px;padding:10px 20px;background:var(--paper-2);border-bottom:1px solid var(--line);flex:none;}.active-chip{display:inline-flex;align-items:center;gap:6px;background:var(--white);border:1px solid var(--line-strong);border-radius:999px;padding:4px 6px 4px 12px;font-size:11.5px;color:var(--ink-2);animation:popIn var(--dur-fast) var(--ease-standard);text-align:center;}.active-chip button{background:var(--line);border:none;width:16px;height:16px;border-radius:50%;color:var(--ink-2);font-size:9px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background 0.15s,color 0.15s;}.active-chip button:hover{background:var(--kf-red);color:var(--white);}.active-chips-clear{align-self:center;background:transparent;border:none;color:var(--grey);font-size:11.5px;text-decoration:underline;cursor:pointer;padding:4px 6px;}.active-chips-clear:hover{color:var(--kf-red);}.sort-select{font-size:12px;padding:6px 8px;border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--white);}.mobile-filter-bar{display:none;}.results-list{flex:1;overflow-y:auto;padding:8px 14px 40px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-content:start;}.empty-state{grid-column:1/-1;text-align:center;padding:60px 20px;color:var(--grey);animation:fadeInUp var(--dur-slow) var(--ease-entrance) both;}.empty-state .glyph{font-family:var(--font-body);font-size:28px;color:var(--line-strong);margin-bottom:8px;}.empty-state h3{font-family:var(--font-serif);font-weight:500;font-size:20px;margin:0 0 6px;color:var(--ink-2);}.empty-state p{margin:0;font-size:13px;}.loc-card{background:var(--white);border:1px solid var(--line);border-radius:var(--radius);padding:10px;cursor:pointer;transition:box-shadow 0.2s ease,border-color 0.2s ease,transform 0.2s ease;display:flex;flex-direction:column;gap:6px;animation:fadeInUp var(--dur-slow) var(--ease-entrance) both;}.loc-card:nth-child(1){animation-delay:0.02s;}.loc-card:nth-child(2){animation-delay:0.05s;}.loc-card:nth-child(3){animation-delay:0.08s;}.loc-card:nth-child(4){animation-delay:0.11s;}.loc-card:nth-child(5){animation-delay:0.14s;}.loc-card:nth-child(6){animation-delay:0.17s;}.loc-card:nth-child(n+7){animation-delay:0.2s;}.loc-card:hover,.loc-card.highlighted{box-shadow:var(--shadow-card);border-color:var(--ink-2);transform:translateY(-2px);}.loc-card-top{display:flex;justify-content:space-between;gap:8px;}.loc-card-name{font-family:var(--font-display);font-weight:600;font-size:12px;line-height:1.25;color:var(--ink);}.status-pip{flex:none;width:7px;height:7px;border-radius:50%;margin-top:4px;border:1.5px solid rgba(0,0,0,0.2);}.status-pip.is-available{animation:pulseRing 2.2s var(--ease-standard) infinite;}.card-actions{display:flex;align-items:center;gap:8px;flex:none;}.star-btn{flex:none;width:20px;height:20px;border-radius:50%;border:1px solid var(--line-strong);background:var(--white);color:var(--line-strong);cursor:pointer;font-size:11px;display:flex;align-items:center;justify-content:center;line-height:1;padding:0;transition:color 0.15s,border-color 0.15s,background 0.15s,transform 0.15s;}.star-btn:hover{border-color:var(--kf-red);color:var(--kf-red);transform:scale(1.08);}.star-btn.active{background:var(--kf-red);border-color:var(--kf-red);color:var(--white);animation:popIn var(--dur-base) var(--ease-entrance);}.loc-card-meta{font-size:10px;color:var(--grey);display:flex;flex-wrap:wrap;gap:4px 8px;}.operator-tag{font-family:var(--font-body);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:var(--teal-dark);background:rgba(27,110,110,0.09);padding:3px 5px;border-radius:999px;display:inline-block;width:fit-content;text-align:center;}.status-label{font-family:var(--font-body);font-size:9.5px;font-weight:600;letter-spacing:0.03em;text-transform:uppercase;text-align:center;}.card-photo{width:100%;height:100px;border-radius:var(--radius);object-fit:cover;display:block;background:var(--paper-2);}.card-photo-placeholder{width:100%;height:100px;border-radius:var(--radius);background:linear-gradient(135deg,var(--paper-2) 0%,var(--line) 100%);display:flex;align-items:center;justify-content:center;color:var(--line-strong);font-family:var(--font-body);font-size:10px;text-transform:uppercase;letter-spacing:0.06em;}.price-tag{font-family:var(--font-body);font-size:12px;font-weight:600;color:var(--ink-2);white-space:nowrap;}.price-tag b{color:var(--ink);font-size:15px;font-weight:700;letter-spacing:-0.01em;}/* Every photo is visible at once — no horizontal scrolling. A single photo
   fills the width as a hero; more than one wraps into an even grid that always
   fits the container. object-fit:cover crops rather than distorting, so odd
   source aspect ratios still sit square in their box. */
.drawer-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;overflow:visible;margin-bottom:22px;}
.drawer-gallery img{width:100%;aspect-ratio:16/10;height:auto;object-fit:cover;object-position:center;display:block;border-radius:var(--radius);background:var(--paper-2);}.drawer-gallery-placeholder{aspect-ratio:16/10;height:auto;width:100%;border-radius:var(--radius);background:linear-gradient(135deg,var(--paper-2) 0%,var(--line) 100%);display:flex;align-items:center;justify-content:center;color:var(--grey);font-size:12.5px;text-align:center;padding:10px;margin-bottom:22px;}.admin-photo-input{width:220px;padding:6px 8px;border-radius:var(--radius);border:1px solid rgba(244,246,241,0.25);background:rgba(244,246,241,0.06);color:var(--paper);font-size:11px;}.led-board{background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);padding:5px 4px;display:grid;grid-template-columns:repeat(4,1fr);}.led-cell{text-align:center;padding:2px 1px;border-right:1px solid var(--line);}.led-cell:last-child{border-right:none;}.led-value{font-family:var(--font-display);font-weight:600;font-size:13px;color:var(--ink);line-height:1.1;}.led-value.zero{color:var(--line-strong);}.led-label{font-family:var(--font-body);font-size:8px;letter-spacing:0.03em;text-transform:uppercase;color:var(--grey);margin-top:3px;}.plan-pin{width:22px;height:22px;display:flex;align-items:center;justify-content:center;}.plan-pin svg{display:block;}.cluster-pin{font-family:var(--font-body);font-weight:600;color:var(--white);background:var(--ink-2);border:2px solid var(--white);border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center;font-size:12px;}.leaflet-control-attribution{display:none !important;}.leaflet-popup-content-wrapper{border-radius:var(--radius);font-family:var(--font-body);}.leaflet-popup-content{margin:16px 18px;text-align:center;}.popup-title{font-family:var(--font-display);font-weight:600;font-size:13.5px;margin-bottom:2px;text-align:center;}.popup-meta{font-size:11px;color:var(--grey);margin-bottom:6px;display:flex;align-items:center;gap:5px;text-align:center;justify-content:center;}.popup-operator-dot{display:inline-block;width:9px;height:9px;border-radius:50%;flex:none;border:1px solid rgba(0,0,0,0.2);}.popup-link{font-size:11.5px;font-weight:600;color:var(--teal-dark);cursor:pointer;}.drawer-backdrop{position:fixed;inset:0;background:rgba(14,34,51,0.45);z-index:900;opacity:0;visibility:hidden;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}.drawer-backdrop.open{opacity:1;visibility:visible;}.drawer{position:fixed;top:0;right:0;bottom:0;width:min(440px,100vw);background:var(--paper);z-index:901;transform:translateX(100%);transition:transform var(--dur-slow) var(--ease-entrance);box-shadow:-8px 0 24px rgba(0,0,0,0.2);display:flex;flex-direction:column;}.drawer.open{transform:translateX(0);}.drawer-head{background:var(--ink);color:var(--paper);padding:20px;flex:none;position:relative;}.drawer-close{position:absolute;top:14px;right:14px;background:rgba(244,246,241,0.1);border:1px solid rgba(244,246,241,0.25);color:var(--paper);width:30px;height:30px;border-radius:50%;cursor:pointer;font-size:15px;line-height:1;}.drawer-star{position:absolute;top:14px;right:54px;background:rgba(244,246,241,0.1);border:1px solid rgba(244,246,241,0.25);color:var(--paper);width:30px;height:30px;font-size:14px;line-height:1;}.drawer-star.active{background:var(--kf-red);border-color:var(--kf-red);color:var(--white);}.drawer-head .operator-tag{background:var(--kf-red);color:var(--white);margin-bottom:10px;text-align:center;}.drawer-head h2{font-family:var(--font-serif);font-weight:500;font-size:27px;margin:0 0 6px;padding-right:30px;line-height:1.1;letter-spacing:-0.005em;}.drawer-head .addr{font-size:12.5px;color:rgba(244,246,241,0.7);}.drawer-body{padding:20px;overflow-y:auto;flex:1;}.drawer-section-title{font-family:var(--font-body);font-size:10.5px;text-transform:uppercase;letter-spacing:0.1em;color:var(--grey);margin:0 0 10px;}.led-board.large{grid-template-columns:repeat(2,1fr);gap:10px;padding:14px;margin-bottom:22px;}.led-board.large .led-value{font-size:26px;}.led-board.large .led-label{font-size:9.5px;}.detail-row{display:flex;justify-content:space-between;padding:9px 0;border-bottom:1px solid var(--line);font-size:13px;}.detail-row span:first-child{color:var(--grey);}.detail-row span:last-child{font-weight:500;text-align:right;}.enquire-btn{width:100%;margin-top:22px;padding:13px;background:var(--kf-red);color:var(--white);border:none;border-radius:var(--radius);font-weight:700;font-size:14px;letter-spacing:0.02em;cursor:pointer;transition:background 0.18s ease,transform 0.18s ease,box-shadow 0.18s ease;text-align:center;}.enquire-btn:hover{background:var(--kf-red-dark);transform:translateY(-1px);box-shadow:0 6px 16px -4px rgba(166,25,46,0.4);}.enquire-btn:active{transform:translateY(0);}.enquire-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-46%) scale(0.97);width:min(560px,92vw);max-height:90vh;background:var(--paper);border-radius:var(--radius);z-index:9999;opacity:0;visibility:hidden;box-shadow:0 20px 60px rgba(0,0,0,0.35);transition:opacity 0.22s ease,transform 0.22s ease,visibility 0.22s;}.enquire-modal.open{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1);}.enquire-modal .drawer-close{position:absolute;top:14px;right:14px;z-index:2;background:rgba(0,0,0,0.35);border-color:rgba(255,255,255,0.4);}.enquire-modal-scroll{max-height:90vh;overflow-y:auto;border-radius:var(--radius);}.agent-card{display:flex;align-items:center;gap:16px;padding:14px 18px;background:var(--paper-2);border-bottom:1px solid var(--line);}.agent-avatar{flex:none;width:64px;height:64px;border-radius:50%;background:var(--white);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;overflow:hidden;}.agent-avatar img{width:100%;height:100%;object-fit:cover;}.agent-name{font-family:var(--font-serif);font-weight:500;font-size:22px;color:var(--ink);}.agent-ref{font-size:12px;color:var(--grey);margin-top:2px;}.agent-phones{display:flex;gap:16px;margin-top:8px;}.agent-phones a{color:var(--kf-red);font-weight:700;font-size:14px;text-decoration:none;}.agent-phones a:hover{text-decoration:underline;}@media (max-width:560px){}.enquire-form-body{padding:14px 18px 18px;}.enquire-location-chip{display:inline-block;background:rgba(166,25,46,0.08);color:var(--kf-red);font-weight:600;font-size:13px;padding:8px 12px;border-radius:var(--radius);margin-bottom:10px;}#enquireForm .edit-grid{margin-bottom:8px;}#enquireForm .edit-grid label{text-transform:uppercase;}.enquire-message-label{display:flex;flex-direction:column;gap:5px;font-size:11.5px;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:var(--grey);}.enquire-message-label textarea{min-height:50px;resize:vertical;padding:9px 10px;border:1px solid var(--line-strong);border-radius:var(--radius);font-size:13px;font-weight:400;text-transform:none;letter-spacing:normal;color:var(--ink);font-family:var(--font-body);}.enquire-form-actions{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:10px;}.enquire-form-note{font-size:12px;color:var(--grey);white-space:nowrap;}.enquire-form-error{margin-top:12px;padding:10px 12px;background:rgba(194,59,46,0.08);border:1px solid rgba(194,59,46,0.3);border-radius:var(--radius);color:var(--danger);font-size:12.5px;line-height:1.5;}#enquireForm input.invalid,#enquireForm textarea.invalid{border-color:var(--danger) !important;background-color:rgba(194,59,46,0.05) !important;}#enquireForm .consent-checkbox-label.invalid{border:1px solid rgba(194,59,46,0.3);border-radius:var(--radius);padding:8px 10px;background-color:rgba(194,59,46,0.05);margin-bottom:12px;}.enquire-form-actions .enquire-btn{width:auto;margin-top:0;padding:12px 24px;flex:none;text-align:center;}.consent-checkbox-label{display:flex;align-items:flex-start;gap:10px;margin:18px 0;font-size:12px;color:var(--ink);line-height:1.5;cursor:pointer;}.consent-checkbox-label input[type="checkbox"]{margin-top:3px;flex-shrink:0;cursor:pointer;}.consent-text{font-size:10px;color:var(--grey-strong);line-height:1.6;}.enquire-success{text-align:center;padding:30px 10px 10px;}.enquire-success-check{width:52px;height:52px;border-radius:50%;background:rgba(46,125,79,0.12);color:var(--green);font-size:26px;display:flex;align-items:center;justify-content:center;margin:0 auto 14px;}.enquire-success h3{font-family:var(--font-display);margin:0 0 8px;}.enquire-success p{color:var(--grey);font-size:13.5px;max-width:380px;margin:0 auto 20px;}#shortlist-view{background:var(--paper);overflow-y:auto;}.shortlist-shell{max-width:1200px;margin:0 auto;padding:28px 24px 60px;width:100%;}.shortlist-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:10px;}.shortlist-toolbar h2{font-family:var(--font-serif);font-weight:500;font-size:30px;margin:0 0 4px;letter-spacing:-0.005em;}.shortlist-toolbar p{margin:0;color:var(--grey);font-size:13px;}.shortlist-toolbar-actions{display:flex;gap:8px;flex-wrap:wrap;}.icon-btn-light{background:var(--white);border:1px solid var(--line-strong);color:var(--ink);padding:9px 14px;border-radius:var(--radius);font-size:12.5px;font-weight:600;cursor:pointer;}.icon-btn-light:hover{border-color:var(--kf-red);color:var(--kf-red);}.shortlist-empty{text-align:center;padding:80px 20px;color:var(--grey);}.shortlist-empty h3{font-family:var(--font-serif);font-weight:500;font-size:22px;color:var(--ink-2);margin:10px 0 6px;}.shortlist-empty .browse-cta{margin-top:16px;background:var(--kf-red);color:var(--white);border:none;padding:10px 22px;border-radius:var(--radius);font-weight:700;font-size:13px;cursor:pointer;}.compare-scroll{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--white);}.compare-table{border-collapse:collapse;width:100%;min-width:640px;}.compare-table th,.compare-table td{padding:12px 16px;border-bottom:1px solid var(--line);border-right:1px solid var(--line);text-align:left;font-size:13px;vertical-align:top;}.compare-table th:last-child,.compare-table td:last-child{border-right:none;}.compare-table .compare-row-label{background:var(--paper-2);font-weight:600;font-size:11.5px;text-transform:uppercase;letter-spacing:0.04em;color:var(--grey);white-space:nowrap;position:sticky;left:0;}.compare-col-head{min-width:190px;}.compare-col-head .operator-tag{margin-bottom:6px;text-align:center;}.compare-col-head .compare-name{font-family:var(--font-display);font-weight:600;font-size:14px;cursor:pointer;}.compare-col-head .compare-name:hover{text-decoration:underline;}.compare-remove-btn{float:right;background:transparent;border:none;color:var(--grey);cursor:pointer;font-size:13px;}.compare-remove-btn:hover{color:var(--kf-red);}.compare-price b{color:var(--ink);font-size:14px;}@media print{
  /* Margins belong to @page, not to the content. Sizing the document to the
     full 210mm paper looks right on screen but prints small: no printer reaches
     the paper edge, so the dialog scales 210mm of content into its ~182mm
     printable area — roughly 87%, which shows up as white gutters all round.
     Declaring the margin here instead makes the page box the layout target, so
     the content fills whatever area is actually printable at 100%. */
  @page{size:A4 portrait;margin:12mm 14mm;}

  /* width:100% resolves against the page box in print, not the screen viewport.
     That is also what stops a phone printing a shrunken page — the mobile
     viewport (375px from width=device-width) would otherwise become the print
     canvas. Percentages keep this correct on any device without hard-coding a
     paper size. */
  html,body{
    width:100%!important;min-width:0!important;max-width:none!important;
    margin:0!important;padding:0!important;background:#fff!important;
    height:auto!important;min-height:0!important;overflow:visible!important;
    -webkit-text-size-adjust:100%!important;text-size-adjust:100%!important;
    zoom:1!important;
  }
  body>*{display:none!important;}
  #printDoc{display:block!important;width:100%!important;margin:0!important;}
}.sl-table{width:100%;border-collapse:collapse;font-size:13px;table-layout:auto;}.sl-table thead th{background:var(--paper-2);font-family:var(--font-body);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:var(--grey);padding:10px 14px;border-bottom:2px solid var(--kf-red);text-align:left;vertical-align:middle;}.sl-table tbody tr{border-bottom:1px solid var(--line);}.sl-table tbody tr:hover{background:var(--paper-2);}.sl-table td{padding:12px 14px;vertical-align:middle;}.sl-name-cell{min-width:180px;max-width:260px;}.sl-action-cell{width:36px;text-align:center;}.sl-name{font-weight:600;font-size:13px;color:var(--ink);cursor:pointer;}.sl-name:hover{color:var(--kf-red);text-decoration:underline;}.sl-operator{font-size:11px;color:var(--grey);margin-top:2px;}.sl-num{text-align:center;font-weight:400;font-size:15px;}.sl-price{font-weight:700;color:var(--ink);white-space:nowrap;}.sl-status{font-weight:400;font-size:12px;white-space:nowrap;}.sl-remove{background:none;border:1px solid var(--line-strong);color:var(--grey);width:22px;height:22px;border-radius:50%;font-size:13px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;line-height:1;}.sl-remove:hover{border-color:var(--kf-red);color:var(--kf-red);}#admin-view{flex-direction:column;background:var(--ink);}.admin-locked{flex:1;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:14px;color:var(--paper);}.admin-locked .glyph{font-family:var(--font-body);font-size:34px;color:var(--kf-red);}.admin-locked h2{font-family:var(--font-serif);font-weight:500;font-size:24px;margin:0;}.admin-locked p{margin:0;color:rgba(244,246,241,0.6);font-size:13px;max-width:360px;text-align:center;}.admin-locked input{padding:10px 22px;border-radius:var(--radius);border:1px solid rgba(244,246,241,0.3);background:rgba(244,246,241,0.08);color:var(--paper);font-family:var(--font-body);font-size:14px;font-weight:700;width:220px;text-align:center;}.admin-locked input#adminPasscode{letter-spacing:0.1em;}.admin-locked input::placeholder{color:rgba(244,246,241,0.35);}.admin-locked button{padding:10px 22px;background:var(--kf-red);color:var(--white);border:none;border-radius:var(--radius);font-weight:700;cursor:pointer;}.admin-locked .err{color:var(--kf-red);font-size:12px;min-height:16px;}.admin-shell{flex:1;display:none;flex-direction:column;min-height:0;}.admin-shell.active{display:flex;}#adminLocationsPanel{flex:1;display:flex;flex-direction:column;min-height:0;}#adminEnquiriesPanel{flex:1;display:flex;flex-direction:column;min-height:0;}.admin-subnav{display:flex;gap:4px;padding:14px 22px 0;background:var(--ink-2);border-bottom:1px solid rgba(244,246,241,0.15);flex:none;}.admin-subnav-btn{background:transparent;border:none;color:rgba(244,246,241,0.6);padding:10px 16px;font-size:13px;font-weight:600;cursor:pointer;border-bottom:2px solid transparent;}.admin-subnav-btn.active{color:var(--white);border-bottom-color:var(--kf-red);}.admin-toolbar{flex:none;padding:14px 22px;background:var(--ink-2);border-bottom:1px solid rgba(244,246,241,0.15);display:flex;align-items:center;gap:12px;flex-wrap:wrap;}.admin-toolbar input,.admin-toolbar select{padding:8px 10px;border-radius:var(--radius);border:1px solid rgba(244,246,241,0.25);background:rgba(244,246,241,0.07);color:var(--paper);font-size:12.5px;}.admin-toolbar input::placeholder{color:rgba(244,246,241,0.4);}.admin-toolbar .spacer{flex:1;}.admin-toolbar .save-status{font-family:var(--font-body);font-size:11.5px;color:rgba(244,246,241,0.55);}.admin-toolbar .save-status.ok{color:#6FCF97;}.admin-scroll{flex:1;overflow-y:auto;padding:4px 22px 50px;}.admin-table-wrap{min-width:1180px;}.admin-table{width:100%;border-collapse:collapse;font-size:12.5px;color:var(--paper);}.admin-table thead th{position:sticky;top:0;background:var(--ink);text-align:left;padding:10px 10px;font-family:var(--font-body);font-size:10px;text-transform:uppercase;letter-spacing:0.06em;color:rgba(244,246,241,0.5);border-bottom:1px solid rgba(244,246,241,0.2);white-space:nowrap;}.admin-table thead th.sortable{cursor:pointer;user-select:none;}.admin-table thead th.sortable:hover{color:rgba(244,246,241,0.85);}.admin-table thead th.sortable .sort-arrow{display:inline-block;margin-left:4px;width:8px;opacity:0.35;font-size:9px;}.admin-table thead th.sortable.sort-active{color:var(--kf-red);}.admin-table thead th.sortable.sort-active .sort-arrow{opacity:1;}.admin-table td{padding:9px 10px;border-bottom:1px solid rgba(244,246,241,0.08);vertical-align:middle;}.admin-table tr:hover td{background:rgba(244,246,241,0.04);}.admin-name{font-weight:600;}.admin-sub{font-size:11px;color:rgba(244,246,241,0.5);}.stock-input{width:56px;padding:6px 6px;text-align:center;border-radius:var(--radius);border:1px solid rgba(244,246,241,0.25);background:rgba(244,246,241,0.06);color:var(--kf-red);font-family:var(--font-body);font-weight:600;}.stock-input.zero{color:rgba(244,246,241,0.35);}.stock-input:focus{background:rgba(244,246,241,0.12);}.row-flag{font-family:var(--font-body);font-size:10px;padding:3px 7px;border-radius:999px;text-transform:uppercase;letter-spacing:0.03em;}.row-actions button{background:transparent;border:1px solid rgba(244,246,241,0.25);color:rgba(244,246,241,0.7);padding:5px 8px;border-radius:var(--radius);font-size:11px;cursor:pointer;}.row-actions button:hover{border-color:var(--kf-red);color:var(--kf-red);}.admin-empty{color:rgba(244,246,241,0.5);text-align:center;padding:40px;font-size:13px;}.admin-import-summary{margin:0 22px 10px;padding:10px 14px;background:rgba(111,207,151,0.12);border:1px solid rgba(111,207,151,0.35);border-radius:var(--radius);color:#6FCF97;font-size:12.5px;}.admin-import-summary.error{background:rgba(194,59,46,0.12);border-color:rgba(194,59,46,0.4);color:#E58176;}.bulk-toolbar{display:flex;align-items:center;gap:10px;padding:10px 22px;background:rgba(226,160,63,0.12);border-bottom:1px solid rgba(226,160,63,0.3);color:var(--kf-red);font-size:12.5px;font-weight:600;}.icon-btn.danger-btn{border-color:rgba(194,59,46,0.5);color:#E58176;}.icon-btn.danger-btn:hover{background:rgba(194,59,46,0.2);}.admin-table td:first-child,.admin-table th:first-child{text-align:center;}.photo-cell{display:flex;align-items:center;gap:6px;}.photo-thumb{flex:none;width:30px;height:30px;border-radius:3px;background:rgba(244,246,241,0.08);overflow:hidden;display:flex;align-items:center;justify-content:center;}.photo-thumb img{width:100%;height:100%;object-fit:cover;}.admin-photo-input{width:150px;}.photo-upload-btn{flex:none;width:28px;height:28px;border-radius:var(--radius);border:1px solid rgba(244,246,241,0.25);background:rgba(244,246,241,0.06);color:rgba(244,246,241,0.75);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:13px;}.photo-upload-btn:hover{border-color:var(--kf-red);color:var(--kf-red);}.undo-toast{position:fixed;bottom:26px;left:50%;transform:translate(-50%,0);background:var(--ink);color:var(--white);padding:12px 14px 12px 18px;border-radius:999px;display:flex;align-items:center;gap:14px;font-size:13px;box-shadow:0 10px 30px rgba(0,0,0,0.3);z-index:999;animation:slideUpFade var(--dur-base) var(--ease-entrance) both;}.undo-toast button{background:var(--kf-red);color:var(--white);border:none;padding:7px 16px;border-radius:999px;font-weight:700;font-size:12.5px;cursor:pointer;}.row-actions{display:flex;gap:6px;}.row-actions button{background:transparent;border:1px solid rgba(244,246,241,0.25);color:rgba(244,246,241,0.7);padding:5px 8px;border-radius:var(--radius);font-size:11px;cursor:pointer;white-space:nowrap;}.row-actions button:hover{border-color:var(--kf-red);color:var(--kf-red);}.row-actions button.danger:hover{border-color:#E58176;color:#E58176;}.edit-modal-backdrop{position:fixed;inset:0;background:rgba(14,34,51,0.5);z-index:9998;opacity:0;visibility:hidden;transition:opacity 0.2s ease,visibility 0.2s;}.edit-modal-backdrop.open{opacity:1;visibility:visible;}.edit-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-46%) scale(0.97);width:min(640px,92vw);max-height:88vh;background:var(--paper);border-radius:var(--radius);z-index:9999;opacity:0;visibility:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,0.35);transition:opacity 0.22s ease,transform 0.22s ease,visibility 0.22s;}.edit-modal.open{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1);}.edit-modal-head{background:var(--ink);color:var(--white);padding:16px 20px;display:flex;align-items:center;justify-content:space-between;border-radius:var(--radius) var(--radius) 0 0;flex:none;}.edit-modal-head h3{margin:0;font-family:var(--font-display);font-size:16px;}.edit-modal-body{padding:20px;overflow-y:auto;}.edit-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;}.edit-grid label{display:flex;flex-direction:column;gap:5px;font-size:11.5px;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:var(--grey);}.edit-grid input{padding:9px 10px;border:1px solid var(--line-strong);border-radius:var(--radius);font-size:13px;font-weight:400;text-transform:none;letter-spacing:normal;color:var(--ink);font-family:var(--font-body);}#editMap{height:220px;border-radius:var(--radius);border:1px solid var(--line-strong);margin-top:8px;}.edit-modal-actions{display:flex;align-items:center;gap:10px;margin-top:20px;padding-top:16px;border-top:1px solid var(--line);}.modal-primary-btn{background:var(--kf-red);color:var(--white);border:none;padding:10px 20px;border-radius:var(--radius);font-weight:700;font-size:13px;cursor:pointer;text-align:center;transition:background 0.18s ease,transform 0.18s ease,box-shadow 0.18s ease;}.modal-primary-btn:hover{background:var(--kf-red-dark);transform:translateY(-1px);box-shadow:0 6px 16px -4px rgba(166,25,46,0.4);}.modal-primary-btn:active{transform:translateY(0);}.filter-rail::-webkit-scrollbar{width:4px;}.filter-rail::-webkit-scrollbar-track{background:transparent;}.filter-rail::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px;}.filter-rail::-webkit-scrollbar-thumb:hover{background:var(--grey);}.filter-rail{scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent;}.results-list::-webkit-scrollbar,.admin-scroll::-webkit-scrollbar,.drawer-body::-webkit-scrollbar{width:6px;}.results-list::-webkit-scrollbar-thumb,.admin-scroll::-webkit-scrollbar-thumb,.drawer-body::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px;}.mobile-filter-bar{display:none;}@media (min-width:881px) and (max-width:1100px){.loc-card{padding:12px;gap:8px;}.loc-card-name{font-size:13px;}.card-photo,.card-photo-placeholder{height:100px;}}@media (min-width:881px) and (max-width:1300px){.results-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;}.filter-rail{width:220px;}.filter-rail .filter-group{padding-bottom:12px;margin-bottom:14px;}.filter-label{font-size:10.5px;}.filter-search,.filter-select{padding:7px 8px;font-size:12px;}}@media (max-width:880px){.topbar-main{padding:0 20px;height:var(--header-h);gap:20px;}.wordmark .sub{display:none;}.main-nav{gap:14px;}.nav-link{font-size:17px;padding:8px 0;}#browse-view{flex-direction:column;}.mobile-filter-bar{display:flex;align-items:center;justify-content:space-between;width:calc(100% - 32px);margin:14px 16px 0;background:var(--white);border:1px solid var(--line-strong);border-radius:var(--radius);padding:13px 16px;font-family:var(--font-body);font-size:13.5px;font-weight:600;color:var(--ink);cursor:pointer;flex:none;}.mobile-filter-bar:active{background:var(--paper-2);}.mobile-filter-bar-label{display:flex;align-items:center;gap:9px;color:var(--ink-2);}.mobile-filter-bar-badge{display:inline-flex;align-items:center;justify-content:center;background:var(--kf-red);color:var(--white);font-size:10px;font-weight:700;border-radius:50%;min-width:18px;height:18px;line-height:1;}.mobile-filter-bar-chevron{color:var(--line-strong);font-size:18px;font-weight:600;}.filter-rail{display:none;width:100%;position:fixed;top:var(--header-h);left:0;right:0;bottom:0;padding-top:18px;padding-bottom:calc(env(safe-area-inset-bottom,0px)+24px);z-index:800;box-shadow:0 10px 30px rgba(0,0,0,0.3);}#mobileFilterBackdrop{z-index:799;}.filter-rail.open{display:block;animation:railIn var(--dur-slow) var(--ease-entrance) both;}#map{height:220px;margin-top:14px;}.results-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;padding:14px 16px 40px;}.admin-toolbar{flex-direction:column;align-items:stretch;}.admin-table-wrap{min-width:900px;}.drawer{width:100%;}.drawer-body,.admin-scroll{padding-bottom:calc(env(safe-area-inset-bottom,0px)+24px);}select,input[type="text"],input[type="number"],input[type="password"],button{font-size:16px;}.filter-label,.results-count,.loc-card-name{font-size:inherit;}}@media (max-width:620px){.loc-card{padding:10px;gap:8px;}.loc-card-name{font-size:12.5px;line-height:1.25;}.card-photo,.card-photo-placeholder{height:90px;font-size:9px;}.operator-tag{font-size:9px;padding:2px 6px;text-align:center;}.loc-card-meta{font-size:10px;}.status-label{font-size:9.5px;text-align:center;}.price-tag{font-size:11.5px;font-weight:600;}.price-tag b{font-size:14px;font-weight:700;}.status-pip{width:7px;height:7px;}}*{-webkit-tap-highlight-color:transparent;}button,.loc-card,.chip,select,.nav-link{touch-action:manipulation;}.icon-btn{background:rgba(244,246,241,0.08);border:1px solid rgba(244,246,241,0.2);color:var(--paper);padding:8px 12px;border-radius:var(--radius);font-size:12px;font-weight:600;cursor:pointer;}.icon-btn:hover{background:rgba(244,246,241,0.16);}
/* ===== SITE FOOTER ===== */
.kf-site-footer{position:fixed;bottom:0;left:0;right:0;z-index:600;background:var(--white);border-top:1px solid var(--line);height:36px;display:flex;align-items:center;justify-content:center;}
.kf-footer-inner{display:flex;align-items:center;justify-content:space-between;width:100%;max-width:1400px;padding:0 20px;gap:12px;}
.kf-footer-copy{font-size:10.5px;color:var(--grey);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.kf-footer-links{display:flex;align-items:center;gap:10px;flex-shrink:0;}
.kf-footer-link{font-size:11px;font-weight:600;color:var(--grey);text-decoration:none;white-space:nowrap;transition:color var(--dur-fast) var(--ease-standard);}
.kf-footer-link:hover{color:var(--kf-red);}
.kf-footer-sep{font-size:10px;color:var(--line-strong);}
/* Extra bottom clearance so fixed footer doesn't cover scrollable content */
.results-list{padding-bottom:52px;}
.shortlist-shell{padding-bottom:76px;}
.drawer-body{padding-bottom:52px;}
@media (max-width:880px){.results-list{padding-bottom:52px;}}
@media (max-width:560px){.results-list{padding-bottom:52px;}.kf-footer-copy{display:none;}}
/* ---- OneMap lookup (admin edit modal) ---- */
.onemap-bar{margin-bottom:16px;padding:12px 13px;background:rgba(0,0,0,0.03);border:1px solid var(--line);border-radius:var(--radius);}
.onemap-row{display:flex;gap:8px;}
.onemap-row input{flex:1;padding:9px 11px;border:1px solid var(--line-strong);border-radius:var(--radius);font-size:13px;font-family:var(--font-body);color:var(--ink);background:var(--white);}
.onemap-row input:focus{outline:2px solid var(--kf-red);outline-offset:-1px;}
.onemap-row button{padding:9px 16px;background:var(--ink);color:var(--white);border:none;border-radius:var(--radius);font-size:12.5px;font-weight:700;cursor:pointer;white-space:nowrap;}
.onemap-row button:hover{background:var(--kf-red);}
.onemap-row button:disabled{opacity:0.5;cursor:default;}
.onemap-hint{margin:7px 0 0;font-size:11px;color:var(--grey);line-height:1.45;}
.onemap-hint.err{color:var(--kf-red);}
.onemap-hint.ok{color:#2E7D4F;}
.onemap-results{display:flex;flex-direction:column;gap:4px;margin-top:9px;}
.onemap-hit{text-align:left;padding:8px 10px;background:var(--white);border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;font-family:var(--font-body);}
.onemap-hit:hover{border-color:var(--kf-red);}
.onemap-hit b{display:block;font-size:12.5px;font-weight:600;color:var(--ink);}
.onemap-hit span{display:block;font-size:11px;color:var(--grey);margin-top:2px;}
.pin-suggest{margin-top:8px;padding:9px 11px;background:rgba(226,160,63,0.12);border:1px solid rgba(226,160,63,0.35);border-radius:var(--radius);font-size:11.5px;color:var(--ink-2);line-height:1.5;}
.pin-suggest button{margin-left:6px;background:none;border:none;color:var(--kf-red);font-weight:700;font-size:11.5px;cursor:pointer;text-decoration:underline;padding:0;}
/* ---- Admin settings panel ---- */
#adminSettingsPanel{flex:1;display:none;flex-direction:column;min-height:0;}
.settings-wrap{max-width:760px;padding:22px 0 60px;display:flex;flex-direction:column;gap:20px;}
.settings-card{background:rgba(244,246,241,0.05);border:1px solid rgba(244,246,241,0.15);border-radius:var(--radius);padding:20px 22px;}
.settings-card h3{font-family:var(--font-serif);font-weight:500;font-size:19px;margin:0 0 6px;color:var(--paper);}
.settings-note{margin:0 0 16px;font-size:12.5px;color:rgba(244,246,241,0.6);line-height:1.55;max-width:62ch;}
.settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 14px;}
.settings-grid label,.settings-photo-label{display:flex;flex-direction:column;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:rgba(244,246,241,0.55);}
.settings-grid input,.settings-photo-label input{padding:9px 11px;border:1px solid rgba(244,246,241,0.25);border-radius:var(--radius);background:rgba(244,246,241,0.08);color:var(--paper);font-size:13px;font-family:var(--font-body);text-transform:none;letter-spacing:normal;}
.settings-grid input:focus{outline:2px solid var(--kf-red);outline-offset:-1px;}
.settings-photo-label{margin-top:14px;}
.settings-photo-row{display:flex;align-items:center;gap:14px;margin-top:12px;}
.agent-photo-preview{width:64px;height:64px;border-radius:50%;overflow:hidden;background:rgba(244,246,241,0.1);border:1px solid rgba(244,246,241,0.25);display:flex;align-items:center;justify-content:center;flex:none;}
.agent-photo-preview img{width:100%;height:100%;object-fit:cover;}
.agent-photo-preview span{font-size:9px;color:rgba(244,246,241,0.4);text-transform:uppercase;letter-spacing:0.05em;}
.settings-actions{display:flex;align-items:center;gap:14px;margin-top:18px;}
.settings-status{font-size:11.5px;color:rgba(244,246,241,0.55);}
.settings-status.ok{color:#6FCF97;}
.settings-status.err{color:#E58176;}
.audit-out{margin-top:14px;}
.audit-progress,.audit-summary{font-size:12.5px;color:rgba(244,246,241,0.7);margin:0 0 10px;}
.audit-summary b{color:var(--paper);}
.audit-rows{display:flex;flex-direction:column;gap:6px;max-height:340px;overflow-y:auto;}
.audit-row{display:flex;align-items:center;gap:12px;padding:9px 12px;background:rgba(244,246,241,0.05);border:1px solid rgba(244,246,241,0.12);border-radius:var(--radius);}
.audit-row-main{flex:1;min-width:0;}
.audit-row-main b{display:block;font-size:12.5px;font-weight:600;color:var(--paper);}
.audit-row-main span{display:block;font-size:10.5px;color:rgba(244,246,241,0.5);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.audit-dist{font-family:var(--font-body);font-size:12px;font-weight:700;color:var(--kf-red);white-space:nowrap;}
.audit-fix{background:none;border:1px solid rgba(244,246,241,0.3);color:var(--paper);padding:5px 11px;border-radius:var(--radius);font-size:11px;font-weight:600;cursor:pointer;white-space:nowrap;}
.audit-fix:hover:not(:disabled){border-color:var(--kf-red);color:var(--kf-red);}
.audit-fix:disabled{opacity:0.45;cursor:default;}
@media (max-width:640px){.settings-grid{grid-template-columns:1fr;}}
/* ---- Keyboard focus ---- */
.loc-card:focus{outline:none;}
.loc-card:focus-visible{outline:2px solid var(--kf-red);outline-offset:2px;}
.leaflet-marker-icon:focus-visible,.leaflet-marker-icon:focus{outline:2px solid var(--kf-red);outline-offset:2px;border-radius:3px;}
.popup-link:focus-visible{outline:2px solid var(--kf-red);outline-offset:2px;}
.active-chip button:focus-visible,.star-btn:focus-visible,.sl-remove:focus-visible{outline:2px solid var(--kf-red);outline-offset:2px;}
.list-sentinel{grid-column:1/-1;padding:22px;text-align:center;font-size:12px;color:var(--grey);letter-spacing:0.04em;}
/* =========================================================
   Mobile refinements
   Phone layout is a single column with 44px touch targets, per the
   WCAG 2.2 target-size guidance. Kept in one block at the end of the
   sheet so it wins on cascade order without specificity hacks.
   ========================================================= */
@media (max-width:560px){
  /* One column: two 165px columns forced names onto three lines. Type is set
     a step down from desktop — at this width the card is the whole screen, so
     it does not need desktop's emphasis to be readable. */
  .results-list{grid-template-columns:1fr;gap:8px;padding:10px 12px 40px;}
  .loc-card{padding:10px;gap:7px;}
  .loc-card-name{font-size:13.5px;line-height:1.3;}
  .card-photo,.card-photo-placeholder{height:132px;font-size:10px;}
  .operator-tag{font-size:9px;padding:2px 6px;}
  .loc-card-meta{font-size:10.5px;}
  .status-label{font-size:9.5px;text-align:left;}
  .price-tag{font-size:11px;font-weight:600;}
  .price-tag b{font-size:13.5px;font-weight:700;}
  .status-pip{width:8px;height:8px;}
  .results-bar,.results-count{font-size:12px;}
  .sort-select{font-size:12.5px;}

  /* Touch targets */
  .star-btn{width:40px;height:40px;font-size:18px;}
  .nav-link{min-height:44px;display:inline-flex;align-items:center;}
  .nav-link--icon{min-width:44px;justify-content:center;}
  .advisory-cta{min-height:44px;}
  /* The drawer's star and close sit absolutely positioned against the right
     edge, so they must be sized AND spaced together — widening only the close
     button pushed it under the star. Both are 44px; the star clears it by
     12px (edge) + 44px (close) + 8px (gap). */
  .drawer-star,.drawer-close{width:44px;height:44px;font-size:18px;}
  .drawer-close{right:12px;top:12px;}
  .drawer-star{right:64px;top:12px;}
  .filter-close-btn{width:44px;height:44px;font-size:20px;}
  .leaflet-control-zoom a{width:38px!important;height:38px!important;line-height:38px!important;font-size:19px!important;}
  .icon-btn-light,.modal-primary-btn,.browse-cta,.clear-filters{min-height:44px;padding-left:16px;padding-right:16px;font-size:13px;}
  .sl-remove{width:32px;height:32px;font-size:16px;}
  .search-clear-btn{width:32px;height:32px;font-size:13px;right:5px;}
  .search-input-wrap .filter-search{padding-right:42px;}
  .active-chip{font-size:11px;}
  .active-chip button{min-width:26px;min-height:26px;}

  /* Filter rail: tighter rows and smaller labels so more of the form is
     visible at once. Controls stay 42px tall to remain comfortably tappable,
     and inputs stay at 16px because anything smaller makes iOS Safari zoom
     the page on focus — that is a platform rule, not a style choice. */
  .filter-rail{padding:14px 16px 28px;}
  .filter-rail h2{font-size:12px;margin-bottom:14px;}
  .filter-group{padding-bottom:12px;margin-bottom:12px;}
  .filter-label{font-size:9.5px;margin-bottom:5px;letter-spacing:0.07em;}
  .filter-select,.filter-search{min-height:42px;padding-top:8px;padding-bottom:8px;}
  input,select,textarea{font-size:16px;}
  .type-need-row{margin-top:6px;}
  
  .toggle-row{font-size:12.5px;}
  .legend{font-size:10.5px;gap:5px;}
  .operator-legend{max-height:150px;}
  .operator-legend-row{font-size:9.5px;}
  #priceMaxHint{font-size:10px;}

  /* Header: the location count is the first thing worth dropping. */
  .topbar-stat-inline{display:none;}
  .topbar-main{gap:12px;padding:10px 14px;}
  .wordmark{font-size:14px;}
  .nav-link{font-size:15px;}

  /* Shortlist table scrolls in its own box rather than the page. */
  .sl-table{font-size:12px;}
  .sl-table thead th,.sl-table td{padding:9px 8px;}
  .sl-name-cell{min-width:140px;}
  #shortlistContent{overflow-x:auto;-webkit-overflow-scrolling:touch;}

  /* Admin tables likewise. */
  .admin-scroll{padding-left:14px;padding-right:14px;}
  .settings-wrap{padding-top:16px;}

  /* Drawer takes the full sheet on a phone, with type a step down. */
  .drawer{width:100%;max-width:100%;}
  .drawer-body{padding:16px;}
  .drawer-head{padding:14px 16px;}
  .drawer-head h2{font-size:17px;line-height:1.25;padding-right:116px;}
  .drawer-head .sub{font-size:11px;}
  .drawer-section-title{font-size:9.5px;margin-bottom:8px;}
  .led-value{font-size:19px;}
  .led-label{font-size:8px;}
  .drawer-gallery{margin-bottom:16px;gap:6px;}

  /* Modals: full-width sheets inside the viewport rather than a fixed width
     that overflowed it, with the action row stacking so no button lands
     off-screen. */
  /* The .open state re-applies a translate(-50%,-50%) centring transform, so
     these have to match that specificity to pin the sheet to the viewport
     instead — otherwise the modal is dragged half its width off-screen. */
  .edit-modal,.enquire-modal,.bulk-edit-modal,
  .edit-modal.open,.enquire-modal.open,.bulk-edit-modal.open{
    width:calc(100vw - 24px);max-width:calc(100vw - 24px);
    max-height:calc(100vh - 48px);
    left:12px;right:12px;top:24px;
    transform:none;
  }
  .edit-modal-body,.enquire-modal-body,.enquire-modal-scroll{padding:16px;max-height:calc(100vh - 150px);overflow-y:auto;}
  .enquire-form-body{padding:0;}
  .edit-modal-head,.enquire-modal-head{padding:14px 16px;}
  .edit-modal-head h3,.enquire-modal-head h3{font-size:16px;}
  /* Action rows stack rather than sitting side by side — a two-button flex row
     overflowed the sheet and pushed the primary action off-screen. */
  .edit-modal-actions,.enquire-actions,.enquire-form-actions{
    flex-direction:column-reverse;align-items:stretch;gap:8px;
  }
  .edit-modal-actions .spacer,.enquire-actions .spacer,.enquire-form-actions .spacer{display:none;}
  .edit-modal-actions button,.enquire-actions button,.enquire-form-actions button,
  .enquire-btn{width:100%;min-height:44px;}
  .edit-grid{grid-template-columns:1fr;}
  .onemap-row{flex-direction:column;}
  .onemap-row button{width:100%;min-height:44px;}
}

/* Very narrow phones */
@media (max-width:380px){
  .wordmark{font-size:13px;}
  .brand-logo{height:30px;}
  .main-nav{gap:10px;}
  .nav-link{font-size:15px;}
}
/* =========================================================
   Stacking order
   Leaflet puts its own controls at z-index 1000, which sat above both the
   filter rail (800) and the detail drawer (901) — the zoom buttons floated
   over the drawer contents on mobile. Everything that overlays the map is
   lifted above that 1000 line here, in one place, so the order is legible.

     400   map panes (Leaflet)
     1000  map controls (Leaflet)
     1100  overlay backdrops
     1200  filter rail / detail drawer
     1300  toasts
     9998+ modals
   ========================================================= */
.drawer-backdrop{z-index:1100;}
.filter-rail,.drawer{z-index:1200;}
.undo-toast{z-index:1300;}
/* ===== POST-PRINT "DO YOU NEED HELP?" MODAL =====
   Shown once the shortlist PDF has been printed/saved. Reuses the enquire
   modal's shell (.enquire-modal) and the agent card, so it is native to the
   rest of the site; only the pieces unique to this dialog live here. */
.help-modal-status{display:flex;align-items:center;gap:9px;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--green);margin-bottom:13px;}
.help-modal-check{width:16px;height:16px;flex:none;border-radius:50%;background:var(--green);color:var(--white);font-size:10px;line-height:1;display:flex;align-items:center;justify-content:center;}
.help-modal-head{padding:24px 18px 18px;background:var(--white);border-bottom:1px solid var(--line);}
.help-modal-head h2{font-family:var(--font-serif);font-weight:500;font-size:26px;line-height:1.1;letter-spacing:-0.005em;padding-right:34px;margin:0;color:var(--ink);}
.help-modal-head p{font-size:13px;color:var(--grey);line-height:1.7;margin:10px 0 0;}
.help-modal-count{display:inline-flex;align-items:center;gap:8px;margin-top:13px;padding:7px 12px;background:var(--paper-2);border-radius:var(--radius);font-size:12px;color:var(--ink-2);}
.help-modal-count b{color:var(--kf-red);font-weight:700;}
.help-modal-body{padding:16px 18px 18px;}
.help-modal-actions{display:grid;grid-template-columns:1fr 1fr;gap:9px;}
.help-modal-actions .span-2{grid-column:1 / -1;}
.help-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;font-family:inherit;font-size:12.5px;font-weight:700;letter-spacing:0.02em;padding:12px 16px;border-radius:var(--radius);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:background 0.18s ease,color 0.18s ease,border-color 0.18s ease,transform 0.18s ease,box-shadow 0.18s ease;}
.help-btn svg{flex:none;}
.help-btn--primary{background:var(--kf-red);color:var(--white);}
.help-btn--primary:hover{background:var(--kf-red-dark);transform:translateY(-1px);box-shadow:0 6px 16px -4px rgba(166,25,46,0.4);}
.help-btn--ghost{background:var(--white);border-color:var(--line-strong);color:var(--ink);}
.help-btn--ghost:hover{border-color:var(--kf-red);color:var(--kf-red);}
.help-btn--quiet{background:transparent;color:var(--grey);font-weight:600;}
.help-btn--quiet:hover{color:var(--kf-red);}
.help-modal-foot{margin:14px 0 0;font-size:11px;color:var(--grey);line-height:1.6;text-align:center;}
@media (max-width:520px){
  .help-modal-actions{grid-template-columns:1fr;}
  .help-modal-head{padding:22px 16px 16px;}
  .help-modal-body{padding:14px 16px 16px;}
}
@media print{ .help-modal, .help-modal + .drawer-backdrop { display:none !important; } }
/* =========================================================
   Motion polish pass
   Standardised on two curves used everywhere in the app: --ease-entrance
   (cubic-bezier(0.16,1,0.3,1)) for anything appearing/moving into place,
   --ease-standard (cubic-bezier(0.4,0,0.2,1)) for simple state fades. Durations
   are --dur-fast/base/slow (150/200/280ms). Kept subtle deliberately — no
   overshoot/bounce curves anywhere, this is a corporate real-estate tool.
   ========================================================= */
.view.active{animation:viewFadeIn var(--dur-base) var(--ease-standard) both;}
@keyframes viewFadeIn{from{opacity:0;}to{opacity:1;}}
.loc-card{transition:box-shadow var(--dur-base) var(--ease-standard),border-color var(--dur-base) var(--ease-standard),transform var(--dur-base) var(--ease-standard);}
/* Buttons get a small press-down instead of relying on browser default active
   states, which is invisible on most of these — keeps interaction feedback
   consistent across the icon buttons, primary buttons and chips. */
.enquire-btn:active,.modal-primary-btn:active,.icon-btn:active,.icon-btn-light:active,.chip:active,.audit-fix:active:not(:disabled),.help-btn:active{transform:scale(0.97);}
/* Close/remove roundels: transform-only feedback so no colour is touched.
   The search clear button positions itself with translateY(-50%), so its
   states must compose with that transform rather than replace it. */
.drawer-close,.filter-close-btn,.sl-remove,.compare-remove-btn,.import-panel-btn{transition:transform var(--dur-fast) var(--ease-standard),background var(--dur-fast) var(--ease-standard),color var(--dur-fast) var(--ease-standard),border-color var(--dur-fast) var(--ease-standard);}
.drawer-close:hover,.filter-close-btn:hover{transform:scale(1.08);}
.drawer-close:active,.filter-close-btn:active,.sl-remove:active,.compare-remove-btn:active,.import-panel-btn:active,.active-chip button:active{transform:scale(0.92);}
.search-clear-btn:active{transform:translateY(-50%) scale(0.9);}
/* Mobile filter trigger: the chevron leans the way the sheet will move. */
.mobile-filter-bar-chevron{transition:transform var(--dur-fast) var(--ease-standard);}
.mobile-filter-bar:active .mobile-filter-bar-chevron{transform:translateX(3px);}
.chip{transition:background var(--dur-fast) var(--ease-standard),border-color var(--dur-fast) var(--ease-standard),color var(--dur-fast) var(--ease-standard),transform var(--dur-fast) var(--ease-standard);}
.icon-btn,.icon-btn-light{transition:background var(--dur-fast) var(--ease-standard),border-color var(--dur-fast) var(--ease-standard),color var(--dur-fast) var(--ease-standard),transform var(--dur-fast) var(--ease-standard);}
/* Skeleton rows shown while the seed register loads, instead of a blank list —
   same card footprint so nothing reflows when real cards replace them. */
.loc-card-skeleton{background:var(--white);border:1px solid var(--line);border-radius:var(--radius);padding:10px;display:flex;flex-direction:column;gap:8px;}
.loc-card-skeleton .sk-bar{border-radius:var(--radius);background:linear-gradient(90deg,var(--paper-2) 25%,var(--line) 37%,var(--paper-2) 63%);background-size:400% 100%;animation:skeletonShimmer 1.4s var(--ease-standard) infinite;}
.loc-card-skeleton .sk-photo{height:100px;}
.loc-card-skeleton .sk-line{height:10px;width:70%;}
.loc-card-skeleton .sk-line.short{width:40%;}
@keyframes skeletonShimmer{0%{background-position:100% 0;}100%{background-position:-100% 0;}}
@media (prefers-reduced-motion:reduce){.loc-card-skeleton .sk-bar{animation:none;}}

/* ---- Availability / pricing disclaimer (detail drawer) ---- */
.avail-disclaimer{margin:14px 0 0;font-size:10.5px;line-height:1.5;color:var(--grey);border-top:1px solid var(--line);padding-top:10px;}

/* ---- Admin: Excel import status panel ---- */
.admin-import-summary.warn{background:rgba(226,160,63,0.12);border-color:rgba(226,160,63,0.4);color:#E2A03F;}
.import-status-head{font-weight:700;font-size:13px;color:var(--paper);}
.import-status-head b{color:var(--white);}
.import-badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;}
.import-badge{font-family:var(--font-body);font-size:11px;letter-spacing:0.02em;padding:3px 9px;border-radius:999px;border:1px solid transparent;}
.import-badge b{font-size:12.5px;}
.import-badge.overwritten{background:rgba(226,160,63,0.18);border-color:rgba(226,160,63,0.45);color:#E2A03F;}
.import-badge.added{background:rgba(111,207,151,0.15);border-color:rgba(111,207,151,0.4);color:#6FCF97;}
.import-badge.rejected{background:rgba(194,59,46,0.15);border-color:rgba(194,59,46,0.45);color:#E58176;}
.import-badge.nil{background:rgba(244,246,241,0.06);border-color:rgba(244,246,241,0.18);color:rgba(244,246,241,0.55);}
.import-detail{margin-top:10px;color:rgba(244,246,241,0.8);}
.import-detail-head,.import-detail>summary{font-size:12px;font-weight:600;color:rgba(244,246,241,0.8);}
.import-detail>summary{cursor:pointer;}
.import-name-list{margin:6px 0 0;padding-left:18px;font-size:12px;color:rgba(244,246,241,0.7);max-height:180px;overflow-y:auto;}
.import-name-list li{margin:2px 0;}
.import-rejected .import-detail-head,.import-rejected .import-name-list{color:#E58176;}
.import-note{margin-top:10px;font-size:11.5px;color:rgba(244,246,241,0.6);}
.import-note b{color:rgba(244,246,241,0.85);}
/* Rows the last import touched, so the table itself answers "did my file hit this one?" */
.admin-table tr.row-imported td{background:rgba(226,160,63,0.08);}
.admin-table tr.row-imported td:first-child{box-shadow:inset 2px 0 0 #E2A03F;}
.import-tag{display:inline-block;margin-top:4px;font-family:var(--font-body);font-size:9.5px;text-transform:uppercase;letter-spacing:0.04em;padding:2px 6px;border-radius:999px;}
.import-tag.overwritten{background:rgba(226,160,63,0.2);color:#E2A03F;}
.import-tag.added{background:rgba(111,207,151,0.18);color:#6FCF97;}

/* ---- Map key & operator list ---- */
.legend-pin{width:22px;height:22px;flex:none;display:inline-flex;align-items:center;justify-content:center;}
.legend-pin svg{display:block;}
/* The operator list is a set of filter toggles, not a colour key. */
.operator-legend-row{display:flex;align-items:center;gap:6px;width:100%;text-align:left;background:none;border:1px solid transparent;border-radius:var(--radius);padding:3px 6px;font-size:10.5px;font-family:var(--font-body);color:var(--ink-2);line-height:1.3;cursor:pointer;}.operator-legend-name{min-width:0;}.operator-legend-row.active .operator-legend-dot{border-color:rgba(255,255,255,0.75);}
.operator-legend-row:hover{background:var(--paper-2);border-color:var(--line);}
.operator-legend-row.active{background:var(--kf-red);border-color:var(--kf-red);color:var(--white);font-weight:600;}
.operator-legend-row:focus-visible{outline:2px solid var(--kf-red);outline-offset:1px;}
/* Clusters speak the same two states as the pins: solid = something is free
   here, hollow = everything in this group is taken. */
.cluster-pin.is-available{background:#054F50;color:var(--white);border-color:var(--white);}
.cluster-pin.is-full{background:var(--white);color:#C23B2E;border:2px solid #C23B2E;}

/* The import panel sits above the register table, so it must never grow far
   enough to push the dashboard off screen — a research sheet can reject well
   over a hundred rows. Hard cap, own scrollbar, detail groups closed. */
.admin-import-summary{max-height:42vh;overflow-y:auto;}
.import-group{margin-top:6px;}
.import-group>summary{cursor:pointer;font-size:11.5px;color:rgba(244,246,241,0.75);padding:2px 0;}
.import-group>summary:hover{color:var(--paper);}
.import-group .import-name-list{max-height:150px;}

/* ---- MRT stations on the map ---- */
.mrt-station{position:relative;width:6px;height:6px;}
.mrt-dot{position:absolute;top:0;left:0;width:6px;height:6px;border-radius:50%;background:var(--mrt-line,var(--ink-2));box-shadow:0 0 0 1px rgba(255,255,255,0.85);box-sizing:border-box;transition:transform var(--dur-fast) var(--ease-entrance);}.mrt-station:hover .mrt-dot{transform:scale(2.4);}
/* The label hangs off the dot so it can never shift the anchor. Hidden until
   the map is zoomed in far enough for 146 of them to be readable. */
.mrt-label{position:absolute;left:11px;top:50%;transform:translateY(-50%);display:none;align-items:center;gap:3px;white-space:nowrap;background:rgba(255,255,255,0.92);border-radius:3px;padding:2px 4px;border:1px solid rgba(0,0,0,0.10);pointer-events:none;}
.mrt-labels-on .mrt-label{display:flex;}
.mrt-labels-on .mrt-label.is-crowded{display:none;}
.mrt-name{font-family:var(--font-body);font-size:10.5px;font-weight:600;color:var(--ink);}
.mrt-code{font-family:var(--font-body);font-size:9px;font-weight:700;letter-spacing:0.02em;padding:1px 4px;border-radius:2px;line-height:1.35;}
.mrt-tip{font-family:var(--font-body);font-size:11px;font-weight:600;display:flex;align-items:center;gap:4px;}
.mrt-tip-name{margin-right:2px;}

/* A <td> set to display:flex drops out of the table layout: it stops stretching
   to the row height and paints its own box, which is why the "overwritten by
   import" highlight stopped dead at the actions column. Keep the cell a cell
   and lay the buttons out inside it. */
.admin-table td.row-actions{display:table-cell;white-space:nowrap;vertical-align:middle;}
.admin-table td.row-actions button{display:inline-flex;align-items:center;vertical-align:middle;}
.admin-table td.row-actions button + button{margin-left:6px;}
/* Paint the tint on the row so no cell can opt out of it, and carry the marker
   bar on the first cell only. */
.admin-table tr.row-imported{background:rgba(226,160,63,0.10);}
.admin-table tr.row-imported td{background:transparent;}
.admin-table tr.row-imported:hover{background:rgba(226,160,63,0.16);}
.admin-table tr.row-imported:hover td{background:transparent;}

/* ---- Import panel: minimise / dismiss ---- */
.import-panel-head{display:flex;align-items:flex-start;gap:10px;position:sticky;top:0;z-index:2;background:var(--ink-2);margin:-10px -14px 0;padding:10px 14px 6px;}
.import-panel-head .import-status-head{flex:1;min-width:0;}
.import-panel-controls{display:flex;gap:4px;flex:none;}
.import-panel-btn{background:rgba(244,246,241,0.08);border:1px solid rgba(244,246,241,0.22);color:var(--paper);width:22px;height:22px;border-radius:var(--radius);font-size:13px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;}
.import-panel-btn:hover{background:rgba(244,246,241,0.18);border-color:var(--kf-red);color:var(--kf-red);}
/* Minimised: keep the headline and the counts, drop everything else. */
.admin-import-summary.is-minimised{max-height:none;overflow:visible;}
.admin-import-summary.is-minimised > *:not(.import-panel-head):not(.import-badges){display:none;}
/* ---- Admin header: when the shared register last changed ---- */
.admin-last-updated{font-family:var(--font-body);font-size:11.5px;color:rgba(244,246,241,0.55);align-self:center;padding:0 14px;white-space:nowrap;}

/* Server-stamped, read-only: styled as a quiet annotation, not an editable cell. */
.admin-modified{font-size:11.5px;color:rgba(244,246,241,0.55);white-space:nowrap;}

/* The admin toolbar is dark, so its selects carry near-white text — but the
   native dropdown POPUP is painted by the browser on its own default white
   surface, leaving white options on white. color-scheme makes the popup itself
   dark in Chromium and Firefox; the explicit option colours cover anything that
   ignores it, and Safari, which styles options but not the popup chrome. */
.admin-toolbar select,.admin-toolbar input{color-scheme:dark;}
.admin-toolbar select option,.admin-toolbar select optgroup{background:var(--ink-2);color:var(--paper);}

/* The register failed to load: the table below is seed data and saving is
   blocked, so this has to read as a warning rather than a status line. */
.admin-last-updated.is-degraded{color:#E58176;font-weight:700;}

/* A precinct the app worked out rather than one the register was given. */
.inferred-tag{display:inline-block;margin-left:5px;padding:1px 4px;border-radius:2px;background:rgba(244,246,241,0.12);color:rgba(244,246,241,0.6);font-size:9px;text-transform:uppercase;letter-spacing:0.04em;}
/* ===== FLOATING WHATSAPP BUTTON ===== */
.wa-float{position:fixed;right:20px;bottom:52px;width:54px;height:54px;border-radius:50%;background:#25D366;color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 14px rgba(0,0,0,0.22);z-index:1000;transition:transform 0.15s ease,box-shadow 0.15s ease;}
.wa-float svg{width:26px;height:26px;}
.wa-float:hover{transform:scale(1.07);box-shadow:0 6px 18px rgba(0,0,0,0.28);}
.wa-float:focus-visible{outline:2px solid var(--kf-red);outline-offset:3px;}
@media (max-width:640px){.wa-float{right:14px;bottom:48px;width:48px;height:48px;}}

/* ===== SHORTLIST MAP ===== */
/* The same basemap and the same pins as Browse, filtered to the saved
   spaces. Hidden rather than collapsed when the shortlist is empty, so the
   empty state keeps the page to itself. */
.shortlist-map{height:300px;margin-bottom:22px;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:var(--paper-2);}
.shortlist-map:empty{display:none;}
@media (max-width:640px){.shortlist-map{height:220px;margin-bottom:16px;}}

/* Switch sitting on the shortlist map, top right. White plate so it stays
   legible over both the pale basemap and the darker water. */
.shortlist-mrt-toggle{display:flex;align-items:center;gap:6px;background:var(--white);border:1px solid var(--line-strong);border-radius:var(--radius);padding:5px 9px;margin:10px;font-size:11.5px;color:var(--ink);cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,0.18);user-select:none;white-space:nowrap;}
.shortlist-mrt-toggle input{margin:0;cursor:pointer;accent-color:var(--kf-red);}
@media (max-width:640px){.shortlist-mrt-toggle{font-size:11px;padding:4px 7px;}}

/* Sortable shortlist headers. The arrow occupies its slot whether or not a
   column is the sorted one, so the header row does not shift on click. */
.sl-sortable{cursor:pointer;user-select:none;}
.sl-sortable:hover{color:var(--kf-red);}
.sl-sortable:focus-visible{outline:2px solid var(--kf-red);outline-offset:-2px;}
.sl-sortable.is-sorted{color:var(--kf-red);}
.sl-th-inner{display:flex;align-items:center;gap:4px;}
/* Numeric columns centre their header over the figures below. */
.sl-table thead th.sl-num .sl-th-inner{justify-content:center;}
.sl-th-label{min-width:0;}
/* Fixed width so the header does not shift when the arrow appears,
   and flex:none so it can never wrap onto a line of its own. */
.sl-sort-arrow{flex:none;width:9px;font-size:8px;line-height:1;}

/* Shortlist row: the pin that identifies it on the map, then the name. */
.sl-name-row{display:flex;align-items:flex-start;gap:9px;}
.sl-pin{flex:none;width:22px;height:22px;display:flex;align-items:center;justify-content:center;margin-top:-1px;}
.sl-pin svg{display:block;width:22px;height:22px;}
/* The whole row points the map at this space, so it has to look like it
   does something. The name keeps its own link affordance on top. */
.sl-row{cursor:pointer;}
.sl-row.is-located{background:rgba(166,25,46,0.06);box-shadow:inset 3px 0 0 var(--kf-red);}
.sl-row.is-located:hover{background:rgba(166,25,46,0.09);}
@media (max-width:640px){.sl-pin,.sl-pin svg{width:18px;height:18px;}.sl-name-row{gap:7px;}}

/* ===== LOCATION CARD ===== */
/* The photo is the card's face, so it runs to the edges under the padding
   rather than sitting inside it, and the two things that used to compete for
   the top row - the star and the status - now sit on the photo where there is
   already space. That gave the body back a whole line for the facts an
   occupier actually decides on. */
/* No overflow:hidden on the card itself. It is a grid item, and hiding its
   overflow stopped its content contributing to the row height: measured, the
   grid sized every row to 1.33px while the card's own content came to 239px,
   so the whole results list collapsed to slivers. The clipping is only needed
   to round the photo's top corners, which is the wrapper's job. */
.loc-card{padding:0;gap:0;}
.card-photo-wrap{position:relative;overflow:hidden;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);}
.loc-card .card-photo,.loc-card .card-photo-placeholder{border-radius:0;width:100%;display:block;}
.loc-card .star-btn{position:absolute;top:8px;right:8px;width:26px;height:26px;border-radius:50%;background:rgba(255,255,255,0.92);border:1px solid rgba(0,0,0,0.08);box-shadow:0 1px 4px rgba(0,0,0,0.18);display:flex;align-items:center;justify-content:center;font-size:13px;line-height:1;padding:0;color:var(--grey);}
.loc-card .star-btn.active{background:var(--kf-red);border-color:var(--kf-red);color:var(--white);}
/* Status reads once, on the photo, instead of a pip at the top and a word at
   the bottom saying the same thing. */
/* The colour comes from STATUS_COLOR in app.js, set inline, because that is
   the same value the pin outline and the legend use. Written here as a second
   set of hexes it had already drifted: the flag was #2E7D4F while an available
   pin is outlined in Knight Frank's #054F50, so the card and the map disagreed
   about what "available" looks like. The background below is only the fallback
   for the moment before the inline value applies. */
.card-status-flag{position:absolute;left:8px;bottom:8px;font-size:8.5px;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;padding:3px 7px;border-radius:999px;color:var(--white);background:var(--ink-2);box-shadow:0 1px 3px rgba(0,0,0,0.25);}
.loc-card-body{padding:10px 11px 0;display:flex;flex-direction:column;gap:5px;}
/* Two lines maximum: a long building name should not push the price out of
   alignment with the cards either side of it. */
.loc-card-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.loc-card-mrt{display:flex;align-items:center;gap:5px;font-size:10px;color:var(--ink-2);font-weight:600;}
.mrt-glyph{flex:none;width:12px;height:12px;fill:none;stroke:var(--teal-dark);stroke-width:1.7;stroke-linecap:round;}
.mrt-glyph circle{fill:var(--teal-dark);stroke:none;}
.loc-card-facts{font-size:10px;color:var(--grey-strong);}
/* Pushed to the bottom so the price sits on one line across a row of cards
   whatever the body above it came to. */
.loc-card-foot{margin-top:auto;padding:9px 11px 10px;display:flex;justify-content:flex-end;align-items:center;}
/* Prices are black everywhere, not brand red: the red is the accent that
   marks status and actions, and a price is neither. */
.loc-card-foot .price-tag{font-size:12.5px;color:var(--ink);}
@media (max-width:900px){.loc-card-body{padding:9px 10px 0;gap:4px;}.loc-card-foot{padding:8px 10px 9px;}}

/* ===== FILTER RAIL, TIGHTENED =====
   The rail overflowed its own height by 351px at 900px tall, and the two
   inline rows clipped their inputs: "Max price (SGD/mo)" takes 137px of a
   218px content width, leaving 76px for a field whose placeholder needs 45px
   plus padding - fine at a wide rail, cut off as soon as the label wraps or
   the rail narrows. Type comes down a step throughout and the inline rows
   stop competing for one line, which buys back the height and removes the
   clipping at any width.

   Layout and type only. Every control keeps its id, its classes and its
   handlers. */
.filter-rail{padding:10px 10px 26px;}
.filter-rail h2{font-size:10px;margin-bottom:10px;}
.filter-group{margin-bottom:9px;padding-bottom:9px;}
.filter-label{font-size:9.5px;letter-spacing:0.07em;margin-bottom:5px;}
.filter-search,.filter-select{padding:6px 7px;font-size:11px;}
/* The label sits above its field here as it does in every other group, so the
   field gets the full width and the placeholder can never be clipped. It also
   makes the two number filters look like the rest of the rail instead of a
   pair of exceptions. */
.filter-inline-row{display:block;}
.filter-inline-row .filter-label--inline{display:block;margin-bottom:5px;}
.filter-input-fixed{width:100%;flex:none;}
#priceMaxHint{font-size:9.5px;line-height:1.45;margin-top:4px !important;}
#mrtPinsHint{font-size:9.5px;line-height:1.45;margin-top:4px !important;}
.type-need-row{gap:6px;margin-top:6px;}
.toggle-row{font-size:11px;}
.clear-filters{padding:7px;font-size:10.5px;}
.legend{font-size:10.5px;gap:5px;}
.operator-legend{gap:5px 8px;font-size:10px;max-height:none;overflow:visible;}
/* The rail is the scroller, so the operator list no longer needs its own
   nested scrollbar - two scrollbars in a 220px column is one too many. */
@media (max-width:900px){
  .filter-rail{width:210px;}
  .filter-search,.filter-select{font-size:11px;}
}
