
:root{
  --c-purple-900:#5B3977;
  --c-purple-800:#7D5B99;
  --c-purple-700:#8557A8;
  --c-purple-600:#8E6FA7;
  --c-purple-300:#D5A4FF;
  --c-purple-100:#EBE3F2;
  --c-purple-50:var(--c-purple-100);
  --c-orange-700:#F97D03;
  --c-brown-600:#B5A99D;
  --c-yellow-500:#FFFB83;
  --c-yellow-100:#FFFEE0;
  --ink:#333333;
  --ink-soft:#666666;
  --ink-mute:#8C8C8C;
  --line:#EAEAEA;
  --bg:#F1F1F1;
  --card:#FFFFFF;
  --white:#FFFFFF;
  --ff:'Microsoft JhengHei',PingFang,STHeiti,sans-serif,serif;
  --r:8px;
  --sh:0 1px 3px 0 rgb(0 0 0/.1),0 1px 2px -1px rgb(0 0 0/.1);
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scrollbar-gutter:stable}
body{font-family:var(--ff);font-size:14px;color:var(--ink);background:var(--bg);min-height:100vh}
a{color:var(--c-purple-600);text-decoration:none}
button{font-family:var(--ff);cursor:pointer;border:none;background:none}
select,input{font-family:var(--ff)}

/* HEADER */
header{background:var(--c-purple-800);color:var(--white);height:56px;display:flex;align-items:stretch;box-shadow:0 2px 8px rgba(0,0,0,.15);transition:transform .25s ease}
.hdr-inner{max-width:1200px;width:100%;margin:0 auto;padding:0 20px;display:flex;align-items:center;justify-content:space-between}
.logo-wrap{display:flex;align-items:center;gap:12px}
.logo-wrap svg{height:36px;flex-shrink:0}
.header-sub{font-size:18px;color:var(--white);font-weight:700}
.data-badge{font-size:11px;background:rgba(255,255,255,.15);border-radius:4px;padding:2px 8px;color:var(--c-yellow-500)}
#h-city{background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.3);color:var(--white);border-radius:6px;padding:5px 10px;font-size:13px;cursor:pointer;outline:none;min-width:100px}
#h-city option{color:var(--ink);background:var(--white)}

/* NAV */
nav{background:var(--white);border-bottom:2px solid var(--line);position:sticky;top:0;z-index:100;box-shadow:var(--sh);transition:top .25s ease}
.nav-inner{max-width:1200px;margin:0 auto;display:flex;overflow-x:auto}
.nav-inner::-webkit-scrollbar{height:0}
.nt{padding:12px 18px;font-size:14px;font-weight:700;color:var(--ink-soft);border-bottom:3px solid transparent;white-space:nowrap;display:flex;align-items:center;gap:6px;transition:color .2s,border-color .2s;margin-bottom:-2px;background:none;border:none;border-bottom:3px solid transparent;cursor:pointer;text-decoration:none}
.nt:hover{color:var(--c-purple-600)}
.nt.active{color:var(--c-purple-800);border-bottom-color:var(--c-purple-800);font-weight:700}
.nt svg{width:16px;height:16px;flex-shrink:0}
.nt-short{display:none}
header.hdr-hidden{transform:translateY(-100%)}
/* Back to top */
#back-to-top{position:fixed;bottom:24px;right:20px;z-index:600;width:44px;height:44px;border-radius:50%;background:var(--c-brown-600);color:var(--white);border:none;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,.25);display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s,background .2s;transform:translateY(10px)}
#back-to-top.visible{opacity:1;pointer-events:auto;transform:translateY(0)}
#back-to-top:hover{background:var(--c-purple-800);opacity:1;transform:translateY(-2px)}
#back-to-top svg{width:20px;height:20px;flex-shrink:0}
@media(max-width:640px){
  .nav-inner{overflow-x:hidden}
  .nt{flex:1;flex-direction:column;padding:8px 2px;gap:3px;min-width:0;justify-content:center;overflow:hidden}
  .nt svg{display:none}
  .nt-full{display:none}
  .nt-short{display:block}
}

/* PAGES */
.page{display:none;min-height:calc(100vh - 112px);position:relative}
.page.active{display:block}
#page-map.active{display:flex}

/* MAP */
#page-map{flex-direction:row;height:calc(100vh - 112px);overflow:hidden;max-width:1200px;margin:0 auto}
#the-map{flex:1;min-width:0;overflow:hidden;background:#F2F2F4;position:relative;touch-action:none}
#the-map svg{width:100%;height:100%}
#map-overlay{position:absolute;inset:0;z-index:1;touch-action:none;cursor:inherit}
.map-inset{z-index:3}
#map-sb{width:300px;flex-shrink:0;background:var(--white);border-left:1px solid var(--line);display:flex;flex-direction:column;overflow:hidden}
.mode-bar{display:flex;border-bottom:1px solid var(--line);background:var(--c-purple-50)}
.mode-btn{flex:1;padding:10px;font-size:13px;font-weight:600;color:var(--ink-soft);text-align:center;cursor:pointer;border:none;background:none;transition:background .2s,color .2s}
.mode-btn.active{background:var(--c-purple-800);color:var(--white)}
.sb-scroll{overflow-y:auto;flex:1;padding:16px}
.sb-title{font-size:16px;font-weight:700;color:var(--c-purple-900);margin-bottom:12px}
.sb-hint{color:var(--ink-soft);font-size:13px;line-height:1.6;text-align:center;padding:20px 0}
.kpi-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px}
.kpi-card{background:var(--c-purple-50);border-radius:8px;padding:10px;text-align:center}
.kpi-val{font-size:18px;font-weight:700;color:var(--c-orange-700)}
.kpi-lab{font-size:11px;color:var(--ink-mute);margin-top:2px}
#map-legend{position:absolute;bottom:8px;right:8px;background:rgba(255,255,255,.93);border:1px solid var(--line);border-radius:8px;padding:8px 12px;min-width:160px;z-index:5;box-shadow:var(--sh)}
.legend-title{font-size:11px;font-weight:600;color:var(--ink-soft);margin-bottom:6px}
.legend-bar{display:flex;height:10px;border-radius:5px;overflow:hidden}
.legend-bar div{flex:1}
.legend-labels{display:flex;justify-content:space-between;font-size:10px;color:var(--ink-mute);margin-top:3px}
.tx-list{list-style:none}
.tx-item{padding:6px 0;border-bottom:1px solid var(--line);font-size:12px;display:flex;align-items:center;gap:4px}
.tx-item:last-child{border-bottom:none}
.tx-addr{color:var(--ink);font-weight:700;font-size:14px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tx-price{text-align:right;white-space:nowrap;min-width:86px;font-size:13px}
.tx-yoy{text-align:right;white-space:nowrap;min-width:58px;font-size:12px}
.city-path{stroke:var(--white);stroke-width:1px;cursor:pointer;transition:opacity .15s,filter .15s}
.city-path:hover,.city-path.active{opacity:.82;filter:brightness(1.06) drop-shadow(0 0 4px rgba(142,111,167,.4))}
.city-path.sb-hover{stroke:#F97D03!important;stroke-width:2px!important;vector-effect:non-scaling-stroke;opacity:.9}
.tx-item[data-city]{cursor:pointer}
.tx-item[data-city]:hover,.tx-item[data-city].sb-active{background:var(--c-purple-50);border-radius:4px}
.sb-btype-tabs{display:flex;gap:5px;margin-bottom:10px;position:sticky;top:0;background:var(--white);z-index:5;padding-bottom:6px;padding-top:2px}
.sb-btype-tab{flex:1;padding:4px 2px;font-size:12px;font-weight:600;border-radius:6px;border:1px solid var(--c-purple-300);cursor:pointer;text-align:center;background:var(--white);color:var(--c-purple-700);min-width:0;line-height:1.3;display:flex;align-items:center;justify-content:center;flex-direction:column}
.sb-btype-tab.active{background:var(--c-purple-600);color:#fff;border-color:var(--c-purple-600)}
.dist-path{stroke:var(--white);stroke-width:1px;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke;cursor:pointer;transition:opacity .15s,filter .15s}
.dist-path:hover,.dist-path.active{opacity:.82;filter:brightness(1.06) drop-shadow(0 0 3px rgba(142,111,167,.4))}
.dist-path.sb-hover{stroke:#F97D03!important;stroke-width:2px!important;vector-effect:non-scaling-stroke;opacity:.9}
.tx-item[data-dist]{cursor:pointer}
.tx-item[data-dist]:hover,.tx-item[data-dist].sb-active{background:var(--c-purple-50);border-radius:4px}
.back-map-btn{position:absolute;top:8px;left:8px;z-index:10;background:var(--white);border:1px solid var(--line);border-radius:6px;padding:5px 10px;font-size:12px;font-weight:600;cursor:pointer;display:none;box-shadow:var(--sh);color:var(--c-purple-800);transition:background .2s}
.back-map-btn:hover{background:var(--c-purple-50)}

/* Inset box for outlying islands */
.map-inset{position:absolute;bottom:8px;left:8px;background:rgba(255,255,255,.9);border:1px solid var(--line);border-radius:6px;padding:6px 8px;font-size:10px;color:var(--ink-mute)}
.map-inset svg{display:block;margin-bottom:4px}
.inset-label{font-size:9px;fill:#3A3A3A;font-weight:600}

/* Mobile */
#drawer-btn{display:none;position:fixed;bottom:20px;right:20px;z-index:500;background:var(--c-purple-800);color:var(--white);border-radius:50%;width:52px;height:52px;box-shadow:0 4px 12px rgba(0,0,0,.25);align-items:center;justify-content:center;border:none;cursor:pointer}
#dov{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:480;opacity:0;transition:opacity .3s}
#dov.open{display:block;opacity:1}
#mdrawer{display:none;position:fixed;bottom:0;left:0;right:0;z-index:500;background:var(--white);border-radius:16px 16px 0 0;box-shadow:0 -4px 20px rgba(0,0,0,.18);max-height:78vh;overflow-y:auto;padding:0 16px 16px;transform:translateY(110%);transition:transform .3s ease}
#mdrawer.open{transform:translateY(0)}
.drawer-hdr{position:sticky;top:0;background:var(--white);padding:10px 0 8px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);margin-bottom:12px}
.drawer-handle{position:absolute;left:50%;top:6px;transform:translateX(-50%);width:40px;height:4px;background:var(--line);border-radius:2px}
.drawer-title{font-size:14px;font-weight:700;color:var(--c-purple-800)}
.drawer-close{background:none;border:none;font-size:18px;line-height:1;color:var(--ink-soft);cursor:pointer;padding:4px 8px;border-radius:6px}
.drawer-close:hover{background:var(--c-purple-50);color:var(--c-purple-800)}

/* QUERY PAGES */
.query-page{max-width:1100px;margin:0 auto;padding:20px}
.filter-card{background:var(--card);border-radius:var(--r);padding:14px 16px;margin-bottom:16px;box-shadow:0 2px 8px rgba(0,0,0,.10);position:sticky;top:var(--fst,48px);z-index:98}
.filter-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:10px}
.filter-grid .fl{min-width:0}
.filter-grid input[type=number]{min-width:0;width:100%}
.results-sep{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:16px 0 16px;padding:10px 16px;background:var(--c-purple-50);border-radius:8px;border-left:3px solid var(--c-purple-400);font-size:15px;font-weight:600;color:var(--c-purple-800);box-shadow:0 2px 6px rgba(0,0,0,.06)}
.kpi-unit{font-size:12px;font-weight:400;color:var(--ink-soft);margin-left:2px}
.results-cond-tag{display:inline-block;background:var(--white);color:var(--c-purple-800);border:1px solid var(--c-purple-300);border-radius:4px;padding:1px 9px;font-size:12px;font-weight:600}
.table-toolbar{display:flex;align-items:center;gap:16px;margin-bottom:10px;flex-wrap:wrap}
.toolbar-title{font-size:14px;font-weight:700;color:var(--c-purple-900);display:flex;align-items:center;gap:6px;margin-right:auto}
.table-toolbar label{display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer}
.fl{display:flex;flex-direction:column;gap:2px}
.fl label{font-size:13px;font-weight:600;color:var(--ink-soft);line-height:1.4}
.fl select,.fl input{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;color:var(--ink);background:var(--white);outline:none;transition:border-color .2s}
.fl select:focus,.fl input:focus{border-color:var(--c-purple-600)}
.btn-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.btn{padding:8px 20px;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;transition:background .2s,color .2s;border:none}
.btn-primary{background:var(--c-purple-800);color:var(--white)}
.btn-primary:hover{background:var(--c-purple-900)}
.btn-ghost{background:none;color:var(--c-purple-600);border:1px solid var(--c-purple-300) !important}
.btn-ghost:hover{background:var(--c-purple-50)}

/* KPI */
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}
.kpi-b{background:var(--card);border-radius:var(--r);padding:16px;box-shadow:var(--sh);text-align:center}
.kpi-b .val{font-size:22px;font-weight:700;color:var(--c-orange-700)}
.kpi-b .lab{font-size:12px;color:var(--ink-mute);margin-top:4px}
.kpi-tag{font-size:10px;color:var(--ink-mute);margin-bottom:2px;letter-spacing:.02em}

/* Charts */
.charts-row{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:20px}
.fa-charts-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:20px}
.fa-charts-4{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:20px}
.chart-card{background:var(--card);border-radius:var(--r);padding:16px;box-shadow:var(--sh)}
.chart-card h3{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:10px}
/* HTML Charts */
.hc-bar-rows{display:flex;flex-direction:column;gap:7px}
.hc-bar-row{display:flex;align-items:center;gap:8px;cursor:default}
.hc-bar-lbl{font-size:12px;color:#1a1a1a;font-weight:400;text-align:right;flex-shrink:0;white-space:nowrap}
.hc-bar-track{flex:1;height:18px;border-radius:4px;background:var(--c-purple-50);overflow:hidden}
.hc-bar-fill{height:100%;border-radius:4px;background:var(--c-purple-600);transition:filter .15s}
.hc-bar-row:hover .hc-bar-fill{filter:brightness(1.15)}
.hc-bar-val{font-size:12px;font-weight:400;color:#1a1a1a;width:56px;flex-shrink:0}
#chart-tip{display:none;position:fixed;background:#1a1a1a;color:#fff;padding:4px 10px;border-radius:6px;font-size:12px;font-weight:600;pointer-events:none;z-index:9999;white-space:normal;max-width:300px;line-height:1.6;box-shadow:0 2px 8px rgba(0,0,0,.3)}
.hc-donut-rows{display:flex;flex-direction:column;gap:8px}
.hc-donut-row{display:flex;align-items:center;gap:8px}
.hc-donut-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.hc-donut-lbl{font-size:clamp(11px,3vw,12px);color:var(--ink);flex:1}
.hc-donut-pct{font-size:clamp(11px,3vw,12px);font-weight:700;color:var(--ink);width:36px;text-align:right}
.hc-donut-cnt{font-size:clamp(10px,2.8vw,11px);color:var(--ink-mute);width:36px;text-align:right}
.hc-donut-total{font-size:clamp(10px,2.8vw,11px);color:var(--ink-mute);text-align:right;margin-top:6px}

/* Price check */
.pcheck-card{background:var(--c-purple-50);border-radius:var(--r);padding:16px;margin-bottom:20px;border:1px solid var(--c-purple-300)}
.pcheck-card h3{font-size:14px;font-weight:700;color:var(--c-purple-900);margin-bottom:12px}
.pcheck-row{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.pcheck-result{margin-top:12px;padding:10px 14px;border-radius:8px;font-size:14px;font-weight:600;line-height:1.6}
.pcheck-low{background:#e8f5e9;color:#2e7d32}
.pcheck-mid-lo{background:#e3f2fd;color:#1565c0}
.pcheck-mid-hi{background:#fff3e0;color:#e65100}
.pcheck-high{background:#ffebee;color:#c62828}

/* Table */
.tbl-wrap{background:var(--card);border-radius:var(--r);box-shadow:var(--sh);overflow:auto;margin-bottom:4px}
table{width:100%;border-collapse:collapse;font-size:13px;min-width:600px}
th{background:var(--c-purple-50);color:var(--c-purple-900);padding:10px 12px;font-weight:700;text-align:left;white-space:nowrap}
th.sortable{cursor:pointer;user-select:none}
th.sortable:hover{background:var(--c-purple-100)}
th.sort-asc::after{content:' ▲';font-size:9px;opacity:.7}
th.sort-desc::after{content:' ▼';font-size:9px;opacity:.7}
/* Pager */
.pager{display:flex;align-items:center;gap:4px;padding:10px 12px;flex-wrap:wrap}
.pager button{padding:4px 10px;border:1px solid var(--line);border-radius:4px;background:var(--white);cursor:pointer;font-size:12px;color:var(--ink)}
.pager button:hover:not(:disabled){background:var(--c-purple-50)}
.pager button.active{background:var(--c-purple-800);color:var(--white);border-color:var(--c-purple-800)}
.pager button:disabled{opacity:.4;cursor:default}
.pager-info{font-size:12px;color:var(--ink-soft);margin-left:8px}
/* Mobile sort bar */
.mob-sort-bar{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--card);border-radius:8px;margin-bottom:8px;box-shadow:var(--sh)}
.mob-sort-lbl{font-size:12px;color:var(--ink-soft);white-space:nowrap;flex-shrink:0}
.mob-sort-sel{flex:1;min-width:0;padding:5px 8px;border:1px solid var(--line);border-radius:6px;font-size:13px;background:var(--white);color:var(--ink);font-family:var(--ff)}
.mob-sort-dir{flex-shrink:0;padding:5px 10px;border:1px solid var(--line);border-radius:6px;background:var(--white);font-size:14px;color:var(--c-purple-800);cursor:pointer}
.mob-sort-dir:hover{background:var(--c-purple-50)}
/* Mobile buy cards */
.buy-card{background:var(--card);border-radius:10px;box-shadow:var(--sh);padding:12px 14px;margin-bottom:8px}
.buy-card.row-flagged{opacity:.8;border-left:3px solid var(--c-purple-300)}
.bc-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:3px}
.bc-date{font-size:12px;color:var(--ink-soft);font-weight:600}
.bc-tags{display:flex;gap:4px;flex-shrink:0;align-items:center}
.bc-btype{font-size:11px;font-weight:700;border-radius:3px;padding:1px 5px;background:var(--c-purple-100);color:var(--c-purple-900)}
.bc-addr{font-size:13px;color:var(--ink);margin-bottom:6px;line-height:1.4;word-break:break-all}
.bc-price{font-size:16px;font-weight:700;color:var(--c-orange-700);margin-bottom:3px}
.bc-lbl{font-size:11px;font-weight:400;color:var(--ink);vertical-align:baseline}
.bc-meta{font-size:12px;color:var(--ink-soft);line-height:1.6}
.buy-cards-wrap{padding:0 0 4px}
.tag-spec,.tag-1f{display:inline-block;font-size:11px;font-weight:700;border-radius:3px;padding:0 4px;margin-left:4px;vertical-align:middle;cursor:help}
.tag-spec{background:#fce4ec;color:#b71c1c}
.tag-1f{background:#e3f2fd;color:#0d47a1}
.bc-rtag{font-size:11px;font-weight:600;border-radius:3px;padding:1px 5px;background:var(--c-purple-50);color:var(--c-purple-800);margin-left:3px}
.bc-social{font-size:11px;font-weight:700;border-radius:3px;padding:1px 5px;background:#e8f5e9;color:#2e7d32;margin-left:3px}
tr.row-flagged td{opacity:.75}
.note-badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;background:var(--c-purple-100);color:var(--c-purple-800);border-radius:3px;font-size:10px;font-weight:700;cursor:pointer;padding:0 3px;margin-left:4px;vertical-align:middle;flex-shrink:0;border:1px solid var(--c-purple-300)}
.note-badge:hover{background:var(--c-purple-300)}
.note-inline{display:block;font-size:11px;color:var(--ink-soft);margin-top:3px;cursor:pointer;line-height:1.5}
.note-inline:hover{color:var(--c-purple-600);text-decoration:underline}
.bc-note{font-size:11px;color:var(--ink-soft);margin-top:3px;cursor:pointer;line-height:1.5}
.bc-note:hover{color:var(--c-purple-600);text-decoration:underline}
.note-lb{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:9990;align-items:center;justify-content:center;padding:20px}
.note-lb-box{background:var(--white);border-radius:12px;padding:20px;max-width:360px;width:100%;box-shadow:0 8px 32px rgba(0,0,0,.25)}
.note-lb-title{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:10px}
.note-lb-text{font-size:13px;line-height:1.8;color:var(--ink);margin-bottom:16px;word-break:break-all}
.note-lb-close{display:block;width:100%;padding:10px;background:var(--c-purple-600);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer}
/* ── Listings (external API) ── */
.listings-section{margin-top:28px;margin-bottom:8px}
.listings-title{font-size:18px;font-weight:700;color:var(--c-purple-900);margin:0 0 14px;display:flex;align-items:center;gap:8px}
.listings-title svg{width:18px;height:18px;color:var(--c-purple-600);flex-shrink:0}
.listings-grid{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:14px;padding-bottom:10px;-webkit-overflow-scrolling:touch}
.listings-grid::-webkit-scrollbar{height:5px}
.listings-grid::-webkit-scrollbar-track{background:transparent}
.listings-grid::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
.listing-card{flex:0 0 calc(25% - 11px);min-width:200px;max-width:280px;scroll-snap-align:start;display:flex;flex-direction:column;background:var(--white);border:1px solid var(--line);border-radius:10px;overflow:hidden;text-decoration:none;color:inherit;transition:box-shadow .15s,transform .15s}
.listing-card:hover{box-shadow:0 4px 16px rgba(0,0,0,.12);transform:translateY(-2px)}
.listing-img{position:relative;width:100%;aspect-ratio:16/9;background:#eee;overflow:hidden;flex-shrink:0}
.listing-img img{width:100%;height:100%;object-fit:cover;display:block}
.listing-no-img{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:#aaa}
.listing-img-tag{position:absolute;bottom:6px;left:6px;background:rgba(0,0,0,.62);color:#fff;font-size:11px;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;max-width:calc(100% - 12px);overflow:hidden;text-overflow:ellipsis}
.listing-body{padding:10px 12px;flex:1;display:flex;flex-direction:column;gap:3px;text-align:left}
.listing-name{font-size:13px;font-weight:700;color:var(--ink);line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.listing-addr{font-size:12px;color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.listing-comm{font-size:12px;color:var(--c-purple-600);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-height:1.4em}
.listing-price{font-size:16px;font-weight:700;color:#F97D03;margin-top:4px}
.listing-unit{font-size:12px;font-weight:400;color:var(--ink-soft)}
.listing-meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px;min-height:24px}
.listing-meta span{font-size:13px;color:var(--ink-soft);background:var(--bg);padding:2px 7px;border-radius:4px}
.listings-carousel{position:relative;display:flex;align-items:center;gap:6px}
.carousel-btn{flex-shrink:0;width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:var(--white);color:var(--ink);font-size:22px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--sh);transition:background .15s,opacity .15s;padding:0;margin:0}
.carousel-btn:hover{background:var(--c-purple-50)}
.carousel-btn:disabled{opacity:.3;cursor:default}
.listings-cta{display:flex;justify-content:center;margin-top:16px}
.listings-msg{padding:20px;text-align:center;color:var(--ink-soft);font-size:13px}
td{padding:8px 12px;border-bottom:1px solid var(--line);vertical-align:middle}
tr:last-child td{border-bottom:none}
tr:hover td{background:var(--c-purple-50)}
.badge{display:inline-block;padding:2px 8px;border-radius:12px;font-size:11px;font-weight:600}
.badge-tower{background:#F0F0F0;color:#222}
.badge-mansion{background:#F0F0F0;color:#222}
.badge-apt{background:#F0F0F0;color:#222}
.badge-other{background:#F0F0F0;color:#222}

/* FEATURE */
.feat-page{max-width:1100px;margin:0 auto;padding:20px}
.hm-wrap{background:var(--card);border-radius:var(--r);padding:16px 16px 14px;box-shadow:var(--sh);overflow-x:auto;margin-bottom:16px}
.hm-wrap>h3{font-size:15px;font-weight:700;margin-bottom:2px;color:var(--c-purple-900)}
.hm-desc{font-size:12px;color:var(--ink-soft);margin-bottom:12px}
@keyframes hm-pulse{0%,100%{outline:3px solid transparent;outline-offset:0}50%{outline:3px solid var(--c-purple-600);outline-offset:3px}}
@keyframes hm-notice-pulse{0%,100%{border-color:var(--c-purple-300)}50%{border-color:var(--c-purple-600);box-shadow:0 0 0 3px rgba(133,87,168,.15)}}
.hm-click-hint{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--c-purple-900);background:var(--c-purple-100);border:1.5px solid var(--c-purple-300);border-radius:8px;padding:7px 14px;margin-bottom:12px;animation:hm-notice-pulse 1.8s ease-in-out 4;cursor:default}
.hm-click-hint svg{flex-shrink:0;color:var(--c-purple-600)}
table.hm{border-collapse:separate;border-spacing:4px;min-width:400px}
table.hm th{background:var(--c-purple-100);padding:8px 12px;font-size:14px;font-weight:700;border-radius:6px;white-space:nowrap;text-align:center}
table.hm td{text-align:center;cursor:pointer;border-radius:6px;font-size:14px;font-weight:700;transition:opacity .15s,outline .1s;min-width:70px;padding:10px 8px}
table.hm td:hover{opacity:.85;outline:2px solid var(--c-purple-300)}
table.hm td.hm-hint{animation:hm-pulse 1.2s ease-in-out 5}
table.hm td.selected{outline:3px solid var(--c-purple-600)!important;outline-offset:1px}
.hm-hint-label{display:block;font-size:10px;font-weight:500;opacity:.8;margin-top:3px;pointer-events:none}
.hm-n{font-size:10px;font-weight:400;opacity:.75;display:block}
#fa-detail-panel{margin-bottom:20px;scroll-margin-top:60px}
#fa-tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.fa-detail{background:var(--card);border-radius:var(--r);box-shadow:var(--sh);overflow:hidden}
.fa-detail-hdr{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:14px 20px;background:var(--c-purple-800);color:var(--white)}
.fa-detail-hdr-title{font-size:15px;font-weight:700;line-height:1.4}
.fa-detail-hdr-n{font-size:12px;opacity:.8;margin-top:3px;font-weight:400}
.fa-detail-body{padding:20px}
.close-btn{background:rgba(255,255,255,.15);border:none;color:var(--white);font-size:13px;cursor:pointer;padding:6px 12px;border-radius:6px;font-weight:600;flex-shrink:0;white-space:nowrap;line-height:1.4}
.close-btn:hover{background:rgba(255,255,255,.3)}
.fa-insight{font-size:13px;line-height:1.8;background:var(--c-purple-50);padding:13px 16px;border-radius:8px;margin-bottom:16px;border-left:3px solid var(--c-purple-300);color:var(--ink)}
.fa-kpi-4{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.fa-kpi-card{background:var(--white);border:1px solid var(--line);border-radius:8px;padding:12px;text-align:center}
.fa-kpi-val{font-size:22px;font-weight:700;color:var(--c-orange-700);line-height:1.2}
.fa-kpi-lab{font-size:11px;color:var(--ink-soft);margin-top:3px}
.fa-kpi-cmp{font-size:11px;font-weight:600;margin-top:3px}
.iqr-bar-wrap{margin:0 0 16px}
.iqr-bar-label{font-size:12px;color:var(--ink-soft);margin-bottom:6px;font-weight:600}
.iqr-bar{position:relative;height:20px;background:var(--c-purple-50);border-radius:10px;border:1px solid var(--line)}
.iqr-fill{position:absolute;top:3px;height:14px;background:var(--c-purple-300);border-radius:7px;opacity:.8}
.iqr-med{position:absolute;top:1px;width:3px;height:18px;background:var(--c-purple-800);border-radius:2px}
.iqr-ticks{display:flex;justify-content:space-between;font-size:10px;color:var(--ink-mute);margin-top:4px}
.fa-charts-row{display:grid;grid-template-columns:1fr 240px;gap:16px;margin-bottom:16px}
.fa-tx-hdr{font-weight:700;font-size:14px;margin:4px 0 8px;padding-top:16px;border-top:1px solid var(--line);display:flex;align-items:center;flex-wrap:wrap;gap:8px}
.fa-filter-row{display:inline-flex;gap:12px;align-items:center;flex-wrap:wrap}
.fa-filter-chk{font-size:12px;color:var(--ink-soft);cursor:pointer;display:inline-flex;align-items:center;gap:2px;font-weight:400}

.section-title{font-size:18px;font-weight:700;color:var(--c-purple-900);margin-bottom:16px;display:flex;align-items:center;gap:8px}
.section-title svg{width:20px;height:20px;color:var(--c-purple-600)}
.rcheck-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:12px}

/* RWD */
@media(max-width:900px){
  #page-map.active{flex-direction:column;overflow:hidden}
  #map-sb{display:contents}
  #sb-body{display:none!important}
  .mode-bar{order:-1;flex-shrink:0;border-bottom:1px solid var(--line)}
  #the-map{order:0;flex:0 0 auto;background:var(--white)}
  #map-legend{position:fixed;bottom:80px;right:8px;min-width:130px}
  body.tab-map #drawer-btn{display:flex!important}
  #mdrawer{display:block}
}
/* ── Fluid Typography (mobile) ── */
@media(max-width:768px){
  header{position:sticky;top:0;z-index:101}
  nav{top:56px}
  body{font-size:clamp(13px,3.5vw,15px)}
  .fl label{font-size:clamp(13px,3.4vw,14px)}
  .fl select,.fl input{font-size:clamp(14px,3.8vw,15px);padding:4px 10px}
  .fl select{padding-right:24px;background-position:right 4px center;padding-top:0;padding-bottom:0}
  .btn{font-size:clamp(13px,3.5vw,14px);padding:8px 16px}
  .chart-card h3{font-size:clamp(13px,3.5vw,14px)}
  .kpi-b .val{font-size:clamp(20px,5.2vw,26px)}
  .kpi-b .lab{font-size:clamp(11px,3vw,13px)}
  .kpi-val{font-size:clamp(18px,5vw,22px)}
  .kpi-lab{font-size:clamp(11px,3vw,13px)}
  .fa-kpi-val{font-size:clamp(18px,5vw,22px)}
  .fa-kpi-lab,.fa-kpi-cmp{font-size:clamp(11px,3vw,13px)}
  .results-sep{font-size:clamp(14px,3.8vw,16px)}
  .results-cond-tag{font-size:clamp(12px,3.2vw,14px)}
  .sb-btype-tab{font-size:clamp(12px,3.2vw,14px)}
  table{font-size:clamp(12px,3.2vw,14px)}
  th{font-size:clamp(12px,3.2vw,14px);padding:9px 10px}
  td{padding:9px 10px}
  .pager button,.pager-info{font-size:clamp(12px,3.2vw,14px)}
  .hc-bar-lbl{font-size:clamp(12px,3.2vw,14px)}
  .hc-bar-val{font-size:clamp(12px,3.2vw,14px);width:clamp(52px,14vw,64px)}
  .hc-bar-track{height:clamp(16px,4.5vw,22px)}
  .bc-date{font-size:clamp(12px,3.2vw,14px)}
  .bc-addr{font-size:clamp(13px,3.5vw,15px)}
  .bc-price{font-size:clamp(14px,4vw,18px)}
  .bc-meta{font-size:clamp(12px,3.2vw,14px)}
  .bc-btype,.tag-spec,.tag-1f,.bc-rtag{font-size:clamp(11px,3vw,13px)}
  .badge{font-size:clamp(11px,3vw,13px)}
  .nav-inner{overflow-x:hidden;padding:0}
  .nt{flex:1 1 0;min-width:0;justify-content:center;padding:10px 4px;font-size:clamp(14px,3.8vw,16px);gap:5px;white-space:nowrap;overflow:hidden}
  .mode-btn{font-size:clamp(14px,3.8vw,15px)}
  .toolbar-title{font-size:clamp(14px,3.8vw,16px)}
  .table-toolbar{gap:10px}
  .table-toolbar label{font-size:clamp(11px,3vw,13px)}
  .kpi-unit{font-size:clamp(10px,2.6vw,12px)}
}
@media(max-width:700px){
  .query-page{padding:12px}
  .filter-card{padding:10px 12px}
  .filter-grid{grid-template-columns:1fr 1fr;gap:4px}
  .charts-row,.fa-charts-3,.fa-charts-4{grid-template-columns:1fr}
  .kpi-row{grid-template-columns:1fr 1fr}
  .fa-charts-row{grid-template-columns:1fr}
  .fa-kpi-4{grid-template-columns:repeat(2,1fr)}
  /* 熱力矩陣篩選器：label + select 同一列（700px 以下） */
  #fa-filter-card .fl{flex-direction:row;align-items:center;gap:8px}
  #fa-filter-card .fl label{white-space:nowrap;flex-shrink:0;min-width:5em}
  #fa-filter-card .fl select{flex:1;min-width:0}
  /* M版 listing carousel：隱藏左右按鈕，改用 swipe；卡片佔 82vw */
  .listings-carousel .carousel-btn{display:none}
  .listing-card{flex:0 0 min(260px,82vw);min-width:0}
}
@media(max-width:600px){
  .nt{gap:3px;font-size:clamp(12px,3.2vw,13px)}
  .table-toolbar .toolbar-title{flex:0 0 100%;margin-right:0}
}
@media(max-width:480px){
  header{height:50px;position:sticky;top:0;z-index:101}
  nav{top:50px}
  .logo-wrap svg{height:28px}
  .hdr-inner{padding:0 12px}
  .nt{padding:8px 2px;font-size:clamp(14px,3.8vw,16px)}
  .kpi-row{grid-template-columns:1fr 1fr}
  .filter-grid{grid-template-columns:1fr}
  #b-filter-card .filter-grid,#r-filter-card .filter-grid{grid-template-columns:1fr}
  #b-area-preset option[value="custom"]{display:none}
  .query-page,.feat-page{padding:12px}
  .kpi-b .val{font-size:clamp(18px,5.2vw,24px);word-break:break-word}
  .fa-kpi-4{grid-template-columns:repeat(2,1fr)}
}
/* Skeleton shimmer */
@keyframes sk-shine{0%{background-position:-600px 0}100%{background-position:600px 0}}
.sk-shimmer{background:linear-gradient(90deg,#ebebeb 25%,#d8d8d8 50%,#ebebeb 75%);background-size:1200px 100%;animation:sk-shine 1.5s infinite linear}
#map-sk{position:absolute;inset:0;z-index:10;pointer-events:none}
.sb-sk-tabs{height:30px;margin-bottom:10px;border-radius:6px}
.sb-sk-row{height:34px;margin:6px 0;border-radius:6px}
.sk-kpi-ph{height:62px;border-radius:6px}
.sk-chart{height:160px;width:100%;border-radius:var(--r)}
.sk-tbl-ph{height:38px;border-radius:4px;margin:3px 0}
.sk-hm-grid{display:grid;gap:5px;padding:4px 0}
.sk-hm-cell{border-radius:4px}
@keyframes sep-flash{0%{background:var(--c-purple-200)}100%{background:var(--c-purple-50)}}
.results-sep.flashing{animation:sep-flash .6s ease-out forwards}
/* Detail-loading tab placeholder */
.detail-loading-msg{
  position:absolute;inset:0;z-index:10;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:12px;color:var(--ink-mute);font-size:14px;
  background:rgba(255,255,255,0.88);
}
.detail-loading-msg .ld-spinner{
  width:32px;height:32px;
  border:3px solid var(--c-purple-100);
  border-top-color:var(--c-purple-800);
  border-radius:50%;
  animation:ld-spin .75s linear infinite;
}
/* ─── Location Picker ─── */
.loc-trigger,.fl select{height:40px;padding:0 10px;border:1px solid var(--line);border-radius:8px;font-size:clamp(14px,3.8vw,15px);color:var(--ink);background:var(--white);-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;transition:border-color .2s;width:100%;box-sizing:border-box;cursor:pointer;font-family:inherit}
.loc-trigger{display:flex;align-items:center;justify-content:space-between;gap:6px;text-align:left}
.loc-trigger:focus,.loc-trigger.open,.fl select:focus{border-color:var(--c-purple-600)}
.loc-trigger.has-value,.fl select.has-value{color:var(--c-purple-800);font-weight:700}
.loc-trigger-caret{flex-shrink:0;transition:transform .2s;color:var(--ink-soft)}
.loc-trigger.open .loc-trigger-caret{transform:rotate(180deg)}
.loc-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left}
.fl select{padding-right:24px;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%239A9AA0%22%20stroke-width%3D%222%22%3E%3Cpolyline%20points%3D%226%209%2012%2015%2018%209%22%2F%3E%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:right 4px center}
.loc-panel{display:none;position:absolute;top:calc(100% + 4px);left:0;z-index:300;background:var(--white);border:1px solid var(--line);border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.14);width:100%;overflow:hidden}
.loc-panel.open{display:flex;flex-direction:column}
.loc-panel-body{display:flex}
.lp-city-col{width:110px;flex-shrink:0;border-right:1px solid var(--line);overflow-y:auto;max-height:320px;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.lp-dist-col{flex:1;min-width:0;overflow-y:auto;padding:4px;max-height:320px;display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));grid-auto-rows:min-content;align-content:start;gap:2px;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.lp-region-label{padding:6px 10px 3px;font-size:11px;font-weight:700;color:var(--ink-soft);letter-spacing:.04em;background:var(--bg)}
.lp-city{padding:11px 12px;font-size:14px;cursor:pointer;transition:background .12s;line-height:1.3}
.lp-city:hover{background:var(--c-purple-50);color:var(--c-purple-700)}
.lp-city.active{background:var(--c-purple-100);color:var(--c-purple-800);font-weight:600}
.lp-dist{padding:10px 12px;font-size:14px;cursor:pointer;border-radius:6px;text-align:left;transition:background .12s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;min-height:36px}
.lp-dist:hover{background:var(--c-purple-50)}
.lp-dist.active{background:var(--c-purple-600);color:var(--white);font-weight:600}
.lp-dist-hint{padding:24px 10px;text-align:center;font-size:13px;color:var(--ink-soft)}
/* ─── Area custom inputs ─── */
.area-custom-row{display:flex;gap:4px;align-items:stretch;height:40px}
.area-custom-row input{min-width:0;flex:1;height:100%;padding:0 8px;border:1px solid var(--line);border-radius:8px;font-size:clamp(14px,3.8vw,15px);color:var(--ink);background:var(--white);box-sizing:border-box;appearance:none;-webkit-appearance:none}
.area-custom-row input:focus{border-color:var(--c-purple-600);outline:none}
.area-reset-btn{flex-shrink:0;width:40px;height:100%;border:1px solid var(--line);border-radius:6px;background:var(--white);color:var(--ink-soft);cursor:pointer;font-size:14px;line-height:1;padding:0;box-sizing:border-box}
.area-reset-btn:hover{background:var(--c-purple-50);border-color:var(--c-purple-300);color:var(--c-purple-600)}
.area-sep{color:var(--ink-soft);font-size:12px;flex-shrink:0;align-self:center}
/* ─── Filter-grid layout for buy/rent (3 items, lp-wrap takes full row) ─── */
#b-filter-card .filter-grid,#r-filter-card .filter-grid{grid-template-columns:1.5fr 1fr 1fr;margin-bottom:0}
.lp-wrap{min-width:0;position:relative}
/* feat-page filter 不需置頂 */
#fa-filter-card.filter-card{position:static;top:auto;box-shadow:none}
@media(max-width:700px){
  /* 此 @media 出現在 base 規則（2fr 1fr 1fr）之後，specificity 相同故此處可正確覆蓋 */
  #b-filter-card .filter-grid,#r-filter-card .filter-grid{grid-template-columns:1.5fr 1fr 1fr}
  .loc-trigger{padding-right:24px}
  .lp-wrap{min-width:0}
  .loc-panel{width:min(300px,calc(100vw - 20px))}
  .lp-city-col{width:88px}
  .lp-dist-col{grid-template-columns:1fr}
  .lp-dist{font-size:15px;padding:12px 14px}
}
/* ─── Footer ─── */
footer{background:#f1f1f1}
.ft-wrap{display:flex;flex-direction:column;max-width:1200px;margin:0 auto;padding:40px 20px 24px;gap:24px}
.ft-top{display:grid;grid-template-columns:repeat(5,1fr);gap:16px}
.ft-col{display:flex;flex-direction:column;gap:12px}
.ft-col-head{font-size:14px;font-weight:700;color:var(--ink-soft);line-height:25px}
.ft-subcols{display:flex;flex-direction:row;gap:24px}
.ft-subcol{display:flex;flex-direction:column}
.ft-link{display:block;font-size:14px;color:var(--ink);text-decoration:none;padding:2px 0;line-height:23px}
.ft-link:hover{color:var(--c-purple-600);text-decoration:none}
.ft-bottom{display:flex;flex-direction:column;gap:8px}
.ft-bottom-main{display:flex;flex-direction:row;gap:20px;align-items:flex-end;padding-bottom:16px;border-bottom:1px solid #b5a99d}
.ft-logo-wrap{flex:1}
.ft-logo{height:34px;width:auto}
.ft-right{display:flex;flex-direction:row;gap:8px;align-items:center}
.ft-socials{display:flex;flex-direction:row;gap:8px;align-items:center}
.ft-social-icon{position:relative;display:inline-flex;width:38px;height:38px;flex-shrink:0}
.ft-social-icon .si-d,.ft-social-icon .si-h{width:38px;height:38px;display:block;transition:opacity .18s}
.ft-social-icon .si-h{position:absolute;inset:0;opacity:0;pointer-events:none}
.ft-social-icon:hover .si-d{opacity:0}
.ft-social-icon:hover .si-h{opacity:1}
.ft-app-icon{position:relative;display:inline-flex;flex-shrink:0}
.ft-app-icon .si-d,.ft-app-icon .si-h{height:36px;width:auto;display:block;transition:opacity .18s}
.ft-app-icon .si-h{position:absolute;left:0;top:0;height:36px;opacity:0;pointer-events:none}
.ft-app-icon:hover .si-d{opacity:0}
.ft-app-icon:hover .si-h{opacity:1}
.ft-apps{display:flex;flex-direction:row;gap:8px;align-items:center}
.ft-app-img{height:38px;width:140px;object-fit:contain;display:block}
.ft-copy{font-size:12px;color:var(--ink-soft);line-height:16px}
/* FOOTER MOBILE */
.footer-mobile{display:none;background:var(--bg)}
.facc-item{border-bottom:1px solid var(--line)}
.facc-head{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;font-size:16px;font-weight:700;color:var(--ink-soft);cursor:pointer;user-select:none;background:var(--bg)}
.facc-head .facc-chev{width:20px;height:20px;color:var(--ink-mute);transition:transform .2s;flex-shrink:0}
.facc-head.open .facc-chev{transform:rotate(180deg)}
.facc-body{display:none;padding:4px 16px 12px;background:var(--bg)}
.facc-body.open{display:block}
.facc-body a{display:block;padding:6px 0;font-size:16px;color:var(--ink);transition:color .15s}
.facc-body a:hover{color:var(--c-purple-600)}
.ft-mob-bottom{padding:24px 16px;display:flex;flex-direction:column;align-items:center;gap:16px;background:var(--bg)}
.ft-mob-logo{height:34px;width:auto;display:block}
.ft-mob-socials{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
.ft-mob-apps{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
.ft-mob-copy{font-size:12px;color:var(--ink-soft);text-align:center}
@media(max-width:960px){
  .ft-wrap{display:none}
  .footer-mobile{display:block}
}
body.tab-map footer{display:none}